@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.
- package/lib/categoryGeneratedIndex.d.ts +12 -0
- package/lib/categoryGeneratedIndex.js +35 -0
- package/lib/cli.d.ts +2 -2
- package/lib/cli.js +37 -51
- package/lib/client/docsClientUtils.d.ts +6 -26
- package/lib/client/docsClientUtils.js +28 -34
- package/lib/{theme/hooks/useDocs.d.ts → client/index.d.ts} +4 -3
- package/lib/{theme/hooks/useDocs.js → client/index.js} +28 -25
- package/lib/docs.d.ts +31 -4
- package/lib/docs.js +160 -54
- package/{src/__tests__/__fixtures__/simple-site/docusaurus.config.js → lib/frontMatter.d.ts} +4 -8
- package/lib/{docFrontMatter.js → frontMatter.js} +13 -6
- package/lib/globalData.d.ts +2 -2
- package/lib/globalData.js +32 -3
- package/lib/index.d.ts +4 -3
- package/lib/index.js +123 -136
- package/lib/lastUpdate.d.ts +4 -6
- package/lib/lastUpdate.js +22 -26
- package/lib/markdown/index.d.ts +3 -6
- package/lib/markdown/index.js +3 -3
- package/lib/markdown/linkify.d.ts +1 -1
- package/lib/markdown/linkify.js +7 -3
- package/lib/numberPrefix.d.ts +1 -1
- package/lib/numberPrefix.js +16 -21
- package/lib/options.d.ts +3 -5
- package/lib/options.js +55 -19
- package/lib/props.d.ts +7 -2
- package/lib/props.js +70 -14
- package/lib/routes.d.ts +28 -0
- package/lib/routes.js +110 -0
- package/lib/server-export.d.ts +8 -0
- package/lib/server-export.js +23 -0
- package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +1 -6
- package/lib/sidebars/generator.js +209 -0
- package/lib/sidebars/index.d.ts +13 -0
- package/lib/sidebars/index.js +94 -0
- package/lib/sidebars/normalization.d.ts +13 -0
- package/lib/sidebars/normalization.js +55 -0
- package/lib/sidebars/postProcessor.d.ts +8 -0
- package/lib/sidebars/postProcessor.js +65 -0
- package/lib/sidebars/processor.d.ts +10 -0
- package/lib/sidebars/processor.js +79 -0
- package/lib/sidebars/types.d.ts +174 -0
- package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/sidebars/types.js} +2 -10
- package/lib/sidebars/utils.d.ts +54 -0
- package/lib/sidebars/utils.js +255 -0
- package/lib/sidebars/validation.d.ts +11 -0
- package/lib/sidebars/validation.js +138 -0
- package/lib/slug.d.ts +6 -4
- package/lib/slug.js +29 -19
- package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js → lib/tags.d.ts} +2 -8
- package/lib/tags.js +21 -0
- package/lib/translations.d.ts +2 -2
- package/lib/translations.js +89 -49
- package/lib/types.d.ts +60 -130
- package/lib/versions.d.ts +29 -4
- package/lib/versions.js +134 -97
- package/package.json +30 -26
- package/src/categoryGeneratedIndex.ts +55 -0
- package/src/cli.ts +47 -63
- package/src/client/docsClientUtils.ts +38 -73
- package/src/{theme/hooks/useDocs.ts → client/index.ts} +16 -11
- package/{types.d.ts → src/deps.d.ts} +1 -1
- package/src/docs.ts +212 -46
- package/src/{docFrontMatter.ts → frontMatter.ts} +21 -26
- package/src/globalData.ts +53 -3
- package/src/index.ts +168 -178
- package/src/lastUpdate.ts +26 -33
- package/src/markdown/index.ts +10 -16
- package/src/markdown/linkify.ts +6 -2
- package/src/numberPrefix.ts +19 -26
- package/src/options.ts +60 -32
- package/src/plugin-content-docs.d.ts +263 -40
- package/src/props.ts +105 -21
- package/src/routes.ts +185 -0
- package/src/server-export.ts +24 -0
- package/src/sidebars/README.md +9 -0
- package/src/sidebars/generator.ts +292 -0
- package/src/sidebars/index.ts +120 -0
- package/src/sidebars/normalization.ts +85 -0
- package/src/sidebars/postProcessor.ts +89 -0
- package/src/sidebars/processor.ts +120 -0
- package/src/sidebars/types.ts +274 -0
- package/src/sidebars/utils.ts +388 -0
- package/src/sidebars/validation.ts +174 -0
- package/src/slug.ts +40 -23
- package/src/tags.ts +19 -0
- package/src/translations.ts +124 -66
- package/src/types.ts +67 -187
- package/src/versions.ts +205 -110
- package/lib/.tsbuildinfo +0 -4717
- package/lib/docFrontMatter.d.ts +0 -21
- package/lib/sidebarItemsGenerator.js +0 -211
- package/lib/sidebars.d.ts +0 -42
- package/lib/sidebars.js +0 -309
- package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
- package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
- package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
- package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
- package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
- package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
- package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
- package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
- package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
- package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
- package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
- package/src/__tests__/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -20
- package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
- package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
- package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
- package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
- package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
- package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
- package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
- package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -67
- package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
- package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -52
- package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
- package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
- package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
- package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
- package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
- package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
- package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
- package/src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js +0 -14
- package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
- package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
- package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
- package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
- package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
- package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
- package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
- package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
- package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
- package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
- package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
- package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1907
- package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
- package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
- package/src/__tests__/cli.test.ts +0 -333
- package/src/__tests__/docFrontMatter.test.ts +0 -204
- package/src/__tests__/docs.test.ts +0 -875
- package/src/__tests__/index.test.ts +0 -1831
- package/src/__tests__/lastUpdate.test.ts +0 -68
- package/src/__tests__/numberPrefix.test.ts +0 -199
- package/src/__tests__/options.test.ts +0 -232
- package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
- package/src/__tests__/sidebars.test.ts +0 -638
- package/src/__tests__/slug.test.ts +0 -109
- package/src/__tests__/translations.test.ts +0 -159
- package/src/__tests__/versions.test.ts +0 -718
- package/src/client/__tests__/docsClientUtils.test.ts +0 -372
- package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
- package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
- package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
- package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
- package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
- package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
- package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
- package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
- package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
- package/src/markdown/__tests__/linkify.test.ts +0 -190
- package/src/sidebarItemsGenerator.ts +0 -307
- package/src/sidebars.ts +0 -489
- package/tsconfig.json +0 -9
package/src/index.ts
CHANGED
|
@@ -7,10 +7,6 @@
|
|
|
7
7
|
|
|
8
8
|
import path from 'path';
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
STATIC_DIR_NAME,
|
|
12
|
-
DEFAULT_PLUGIN_ID,
|
|
13
|
-
} from '@docusaurus/core/lib/constants';
|
|
14
10
|
import {
|
|
15
11
|
normalizeUrl,
|
|
16
12
|
docuHash,
|
|
@@ -18,47 +14,59 @@ import {
|
|
|
18
14
|
reportMessage,
|
|
19
15
|
posixPath,
|
|
20
16
|
addTrailingPathSeparator,
|
|
17
|
+
createAbsoluteFilePathMatcher,
|
|
18
|
+
createSlugger,
|
|
19
|
+
DEFAULT_PLUGIN_ID,
|
|
21
20
|
} from '@docusaurus/utils';
|
|
22
|
-
import {LoadContext, Plugin
|
|
23
|
-
import {loadSidebars
|
|
24
|
-
import {
|
|
21
|
+
import type {LoadContext, Plugin} from '@docusaurus/types';
|
|
22
|
+
import {loadSidebars} from './sidebars';
|
|
23
|
+
import {CategoryMetadataFilenamePattern} from './sidebars/generator';
|
|
24
|
+
import {
|
|
25
|
+
readVersionDocs,
|
|
26
|
+
processDocMetadata,
|
|
27
|
+
addDocNavigation,
|
|
28
|
+
getMainDocId,
|
|
29
|
+
} from './docs';
|
|
25
30
|
import {getDocsDirPaths, readVersionsMetadata} from './versions';
|
|
26
31
|
|
|
27
|
-
import {
|
|
28
|
-
PluginOptions,
|
|
32
|
+
import type {
|
|
29
33
|
LoadedContent,
|
|
30
34
|
SourceToPermalink,
|
|
31
35
|
DocMetadataBase,
|
|
32
|
-
DocMetadata,
|
|
33
|
-
GlobalPluginData,
|
|
34
36
|
VersionMetadata,
|
|
35
|
-
DocNavLink,
|
|
36
37
|
LoadedVersion,
|
|
37
38
|
DocFile,
|
|
38
39
|
DocsMarkdownOption,
|
|
40
|
+
VersionTag,
|
|
41
|
+
DocFrontMatter,
|
|
39
42
|
} from './types';
|
|
40
|
-
import {
|
|
41
|
-
import {RuleSetRule} from 'webpack';
|
|
43
|
+
import type {RuleSetRule} from 'webpack';
|
|
42
44
|
import {cliDocsVersionCommand} from './cli';
|
|
43
45
|
import {VERSIONS_JSON_FILE} from './constants';
|
|
44
|
-
import {flatten, keyBy, compact} from 'lodash';
|
|
45
46
|
import {toGlobalDataVersion} from './globalData';
|
|
46
|
-
import {
|
|
47
|
+
import {toTagDocListProp} from './props';
|
|
47
48
|
import {
|
|
48
49
|
translateLoadedContent,
|
|
49
50
|
getLoadedContentTranslationFiles,
|
|
50
51
|
} from './translations';
|
|
51
|
-
import
|
|
52
|
+
import logger from '@docusaurus/logger';
|
|
53
|
+
import {getVersionTags} from './tags';
|
|
54
|
+
import {createVersionRoutes} from './routes';
|
|
55
|
+
import type {
|
|
56
|
+
PropTagsListPage,
|
|
57
|
+
PluginOptions,
|
|
58
|
+
} from '@docusaurus/plugin-content-docs';
|
|
59
|
+
import {createSidebarsUtils} from './sidebars/utils';
|
|
60
|
+
import {getCategoryGeneratedIndexMetadataList} from './categoryGeneratedIndex';
|
|
52
61
|
|
|
53
|
-
export default function pluginContentDocs(
|
|
62
|
+
export default async function pluginContentDocs(
|
|
54
63
|
context: LoadContext,
|
|
55
64
|
options: PluginOptions,
|
|
56
|
-
): Plugin<LoadedContent
|
|
65
|
+
): Promise<Plugin<LoadedContent>> {
|
|
57
66
|
const {siteDir, generatedFilesDir, baseUrl, siteConfig} = context;
|
|
58
67
|
|
|
59
|
-
const versionsMetadata = readVersionsMetadata({context, options});
|
|
68
|
+
const versionsMetadata = await readVersionsMetadata({context, options});
|
|
60
69
|
|
|
61
|
-
const sourceToPermalink: SourceToPermalink = {};
|
|
62
70
|
const pluginId = options.id ?? DEFAULT_PLUGIN_ID;
|
|
63
71
|
|
|
64
72
|
const pluginDataDirRoot = path.join(
|
|
@@ -72,14 +80,6 @@ export default function pluginContentDocs(
|
|
|
72
80
|
return {
|
|
73
81
|
name: 'docusaurus-plugin-content-docs',
|
|
74
82
|
|
|
75
|
-
getThemePath() {
|
|
76
|
-
return path.resolve(__dirname, './theme');
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
getTypeScriptThemePath() {
|
|
80
|
-
return path.resolve(__dirname, '..', 'src', 'theme');
|
|
81
|
-
},
|
|
82
|
-
|
|
83
83
|
extendCli(cli) {
|
|
84
84
|
const isDefaultPluginId = pluginId === DEFAULT_PLUGIN_ID;
|
|
85
85
|
|
|
@@ -100,6 +100,8 @@ export default function pluginContentDocs(
|
|
|
100
100
|
cliDocsVersionCommand(version, siteDir, pluginId, {
|
|
101
101
|
path: options.path,
|
|
102
102
|
sidebarPath: options.sidebarPath,
|
|
103
|
+
sidebarCollapsed: options.sidebarCollapsed,
|
|
104
|
+
sidebarCollapsible: options.sidebarCollapsible,
|
|
103
105
|
});
|
|
104
106
|
});
|
|
105
107
|
},
|
|
@@ -108,22 +110,12 @@ export default function pluginContentDocs(
|
|
|
108
110
|
return getLoadedContentTranslationFiles(content);
|
|
109
111
|
},
|
|
110
112
|
|
|
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
113
|
getPathsToWatch() {
|
|
120
114
|
function getVersionPathsToWatch(version: VersionMetadata): string[] {
|
|
121
115
|
const result = [
|
|
122
|
-
...
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
(docsDirPath) => `${docsDirPath}/${pattern}`,
|
|
126
|
-
),
|
|
116
|
+
...options.include.flatMap((pattern) =>
|
|
117
|
+
getDocsDirPaths(version).map(
|
|
118
|
+
(docsDirPath) => `${docsDirPath}/${pattern}`,
|
|
127
119
|
),
|
|
128
120
|
),
|
|
129
121
|
`${version.contentPath}/**/${CategoryMetadataFilenamePattern}`,
|
|
@@ -134,7 +126,7 @@ export default function pluginContentDocs(
|
|
|
134
126
|
return result;
|
|
135
127
|
}
|
|
136
128
|
|
|
137
|
-
return
|
|
129
|
+
return versionsMetadata.flatMap(getVersionPathsToWatch);
|
|
138
130
|
},
|
|
139
131
|
|
|
140
132
|
async loadContent() {
|
|
@@ -144,12 +136,12 @@ export default function pluginContentDocs(
|
|
|
144
136
|
const docFiles = await readVersionDocs(versionMetadata, options);
|
|
145
137
|
if (docFiles.length === 0) {
|
|
146
138
|
throw new Error(
|
|
147
|
-
`Docs version ${
|
|
139
|
+
`Docs version "${
|
|
148
140
|
versionMetadata.versionName
|
|
149
|
-
} has no docs! At least one doc should exist at
|
|
141
|
+
}" has no docs! At least one doc should exist at "${path.relative(
|
|
150
142
|
siteDir,
|
|
151
143
|
versionMetadata.contentPath,
|
|
152
|
-
)}
|
|
144
|
+
)}".`,
|
|
153
145
|
);
|
|
154
146
|
}
|
|
155
147
|
async function processVersionDoc(docFile: DocFile) {
|
|
@@ -163,101 +155,52 @@ export default function pluginContentDocs(
|
|
|
163
155
|
return Promise.all(docFiles.map(processVersionDoc));
|
|
164
156
|
}
|
|
165
157
|
|
|
166
|
-
async function
|
|
158
|
+
async function doLoadVersion(
|
|
167
159
|
versionMetadata: VersionMetadata,
|
|
168
160
|
): Promise<LoadedVersion> {
|
|
169
|
-
const
|
|
170
|
-
versionMetadata.sidebarFilePath,
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
const docsBase: DocMetadataBase[] = await loadVersionDocsBase(
|
|
161
|
+
const docs: DocMetadataBase[] = await loadVersionDocsBase(
|
|
174
162
|
versionMetadata,
|
|
175
163
|
);
|
|
176
|
-
const docsBaseById: Record<string, DocMetadataBase> = keyBy(
|
|
177
|
-
docsBase,
|
|
178
|
-
(doc) => doc.id,
|
|
179
|
-
);
|
|
180
164
|
|
|
181
|
-
const sidebars = await
|
|
165
|
+
const sidebars = await loadSidebars(versionMetadata.sidebarFilePath, {
|
|
182
166
|
sidebarItemsGenerator: options.sidebarItemsGenerator,
|
|
183
167
|
numberPrefixParser: options.numberPrefixParser,
|
|
184
|
-
|
|
185
|
-
docs: docsBase,
|
|
168
|
+
docs,
|
|
186
169
|
version: versionMetadata,
|
|
170
|
+
sidebarOptions: {
|
|
171
|
+
sidebarCollapsed: options.sidebarCollapsed,
|
|
172
|
+
sidebarCollapsible: options.sidebarCollapsible,
|
|
173
|
+
},
|
|
174
|
+
categoryLabelSlugger: createSlugger(),
|
|
187
175
|
});
|
|
188
176
|
|
|
189
177
|
const sidebarsUtils = createSidebarsUtils(sidebars);
|
|
190
178
|
|
|
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
179
|
return {
|
|
253
180
|
...versionMetadata,
|
|
254
|
-
|
|
181
|
+
docs: addDocNavigation(
|
|
182
|
+
docs,
|
|
183
|
+
sidebarsUtils,
|
|
184
|
+
versionMetadata.sidebarFilePath as string,
|
|
185
|
+
),
|
|
255
186
|
sidebars,
|
|
256
|
-
|
|
257
|
-
|
|
187
|
+
mainDocId: getMainDocId({docs, sidebarsUtils}),
|
|
188
|
+
categoryGeneratedIndices: getCategoryGeneratedIndexMetadataList({
|
|
189
|
+
docs,
|
|
190
|
+
sidebarsUtils,
|
|
191
|
+
}),
|
|
258
192
|
};
|
|
259
193
|
}
|
|
260
194
|
|
|
195
|
+
async function loadVersion(versionMetadata: VersionMetadata) {
|
|
196
|
+
try {
|
|
197
|
+
return await doLoadVersion(versionMetadata);
|
|
198
|
+
} catch (err) {
|
|
199
|
+
logger.error`Loading of version failed for version name=${versionMetadata.versionName}`;
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
261
204
|
return {
|
|
262
205
|
loadedVersions: await Promise.all(versionsMetadata.map(loadVersion)),
|
|
263
206
|
};
|
|
@@ -269,71 +212,94 @@ export default function pluginContentDocs(
|
|
|
269
212
|
|
|
270
213
|
async contentLoaded({content, actions}) {
|
|
271
214
|
const {loadedVersions} = content;
|
|
272
|
-
const {
|
|
215
|
+
const {
|
|
216
|
+
docLayoutComponent,
|
|
217
|
+
docItemComponent,
|
|
218
|
+
docCategoryGeneratedIndexComponent,
|
|
219
|
+
breadcrumbs,
|
|
220
|
+
} = options;
|
|
273
221
|
const {addRoute, createData, setGlobalData} = actions;
|
|
274
222
|
|
|
275
|
-
|
|
276
|
-
docs
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
223
|
+
async function createVersionTagsRoutes(version: LoadedVersion) {
|
|
224
|
+
const versionTags = getVersionTags(version.docs);
|
|
225
|
+
|
|
226
|
+
// TODO tags should be a sub route of the version route
|
|
227
|
+
async function createTagsListPage() {
|
|
228
|
+
const tagsProp: PropTagsListPage['tags'] = Object.values(
|
|
229
|
+
versionTags,
|
|
230
|
+
).map((tagValue) => ({
|
|
231
|
+
name: tagValue.name,
|
|
232
|
+
permalink: tagValue.permalink,
|
|
233
|
+
count: tagValue.docIds.length,
|
|
234
|
+
}));
|
|
235
|
+
|
|
236
|
+
// Only create /tags page if there are tags.
|
|
237
|
+
if (Object.keys(tagsProp).length > 0) {
|
|
238
|
+
const tagsPropPath = await createData(
|
|
239
|
+
`${docuHash(`tags-list-${version.versionName}-prop`)}.json`,
|
|
240
|
+
JSON.stringify(tagsProp, null, 2),
|
|
285
241
|
);
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
path: metadataItem.permalink,
|
|
289
|
-
component: docItemComponent,
|
|
242
|
+
addRoute({
|
|
243
|
+
path: version.tagsPath,
|
|
290
244
|
exact: true,
|
|
245
|
+
component: options.docTagsListComponent,
|
|
291
246
|
modules: {
|
|
292
|
-
|
|
247
|
+
tags: aliasedSource(tagsPropPath),
|
|
293
248
|
},
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
return routes.sort((a, b) => a.path.localeCompare(b.path));
|
|
299
|
-
};
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
300
252
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
253
|
+
// TODO tags should be a sub route of the version route
|
|
254
|
+
async function createTagDocListPage(tag: VersionTag) {
|
|
255
|
+
const tagProps = toTagDocListProp({
|
|
256
|
+
allTagsPath: version.tagsPath,
|
|
257
|
+
tag,
|
|
258
|
+
docs: version.docs,
|
|
259
|
+
});
|
|
260
|
+
const tagPropPath = await createData(
|
|
261
|
+
`${docuHash(`tag-${tag.permalink}`)}.json`,
|
|
262
|
+
JSON.stringify(tagProps, null, 2),
|
|
263
|
+
);
|
|
264
|
+
addRoute({
|
|
265
|
+
path: tag.permalink,
|
|
266
|
+
component: options.docTagDocListComponent,
|
|
267
|
+
exact: true,
|
|
268
|
+
modules: {
|
|
269
|
+
tag: aliasedSource(tagPropPath),
|
|
270
|
+
},
|
|
271
|
+
});
|
|
272
|
+
}
|
|
312
273
|
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
});
|
|
274
|
+
await createTagsListPage();
|
|
275
|
+
await Promise.all(Object.values(versionTags).map(createTagDocListPage));
|
|
326
276
|
}
|
|
327
277
|
|
|
328
|
-
await Promise.all(
|
|
278
|
+
await Promise.all(
|
|
279
|
+
loadedVersions.map((loadedVersion) =>
|
|
280
|
+
createVersionRoutes({
|
|
281
|
+
loadedVersion,
|
|
282
|
+
docItemComponent,
|
|
283
|
+
docLayoutComponent,
|
|
284
|
+
docCategoryGeneratedIndexComponent,
|
|
285
|
+
pluginId,
|
|
286
|
+
aliasedSource,
|
|
287
|
+
actions,
|
|
288
|
+
}),
|
|
289
|
+
),
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
// TODO tags should be a sub route of the version route
|
|
293
|
+
await Promise.all(loadedVersions.map(createVersionTagsRoutes));
|
|
329
294
|
|
|
330
|
-
setGlobalData
|
|
295
|
+
setGlobalData({
|
|
331
296
|
path: normalizeUrl([baseUrl, options.routeBasePath]),
|
|
332
297
|
versions: loadedVersions.map(toGlobalDataVersion),
|
|
298
|
+
breadcrumbs,
|
|
333
299
|
});
|
|
334
300
|
},
|
|
335
301
|
|
|
336
|
-
configureWebpack(_config, isServer, utils) {
|
|
302
|
+
configureWebpack(_config, isServer, utils, content) {
|
|
337
303
|
const {getJSLoader} = utils;
|
|
338
304
|
const {
|
|
339
305
|
rehypePlugins,
|
|
@@ -342,9 +308,16 @@ export default function pluginContentDocs(
|
|
|
342
308
|
beforeDefaultRemarkPlugins,
|
|
343
309
|
} = options;
|
|
344
310
|
|
|
311
|
+
function getSourceToPermalink(): SourceToPermalink {
|
|
312
|
+
const allDocs = content.loadedVersions.flatMap((v) => v.docs);
|
|
313
|
+
return Object.fromEntries(
|
|
314
|
+
allDocs.map(({source, permalink}) => [source, permalink]),
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
|
|
345
318
|
const docsMarkdownOptions: DocsMarkdownOption = {
|
|
346
319
|
siteDir,
|
|
347
|
-
sourceToPermalink,
|
|
320
|
+
sourceToPermalink: getSourceToPermalink(),
|
|
348
321
|
versionsMetadata,
|
|
349
322
|
onBrokenMarkdownLink: (brokenMarkdownLink) => {
|
|
350
323
|
if (siteConfig.onBrokenMarkdownLinks === 'ignore') {
|
|
@@ -358,12 +331,13 @@ export default function pluginContentDocs(
|
|
|
358
331
|
};
|
|
359
332
|
|
|
360
333
|
function createMDXLoaderRule(): RuleSetRule {
|
|
334
|
+
const contentDirs = versionsMetadata.flatMap(getDocsDirPaths);
|
|
361
335
|
return {
|
|
362
|
-
test:
|
|
363
|
-
include:
|
|
336
|
+
test: /\.mdx?$/i,
|
|
337
|
+
include: contentDirs
|
|
364
338
|
// Trailing slash is important, see https://github.com/facebook/docusaurus/pull/3970
|
|
365
339
|
.map(addTrailingPathSeparator),
|
|
366
|
-
use:
|
|
340
|
+
use: [
|
|
367
341
|
getJSLoader({isServer}),
|
|
368
342
|
{
|
|
369
343
|
loader: require.resolve('@docusaurus/mdx-loader'),
|
|
@@ -372,20 +346,36 @@ export default function pluginContentDocs(
|
|
|
372
346
|
rehypePlugins,
|
|
373
347
|
beforeDefaultRehypePlugins,
|
|
374
348
|
beforeDefaultRemarkPlugins,
|
|
375
|
-
|
|
349
|
+
staticDirs: siteConfig.staticDirectories.map((dir) =>
|
|
350
|
+
path.resolve(siteDir, dir),
|
|
351
|
+
),
|
|
352
|
+
siteDir,
|
|
353
|
+
isMDXPartial: createAbsoluteFilePathMatcher(
|
|
354
|
+
options.exclude,
|
|
355
|
+
contentDirs,
|
|
356
|
+
),
|
|
376
357
|
metadataPath: (mdxPath: string) => {
|
|
377
358
|
// Note that metadataPath must be the same/in-sync as
|
|
378
359
|
// the path from createData for each MDX.
|
|
379
360
|
const aliasedPath = aliasedSitePath(mdxPath, siteDir);
|
|
380
361
|
return path.join(dataDir, `${docuHash(aliasedPath)}.json`);
|
|
381
362
|
},
|
|
363
|
+
// Assets allow to convert some relative images paths to
|
|
364
|
+
// require(...) calls
|
|
365
|
+
createAssets: ({
|
|
366
|
+
frontMatter,
|
|
367
|
+
}: {
|
|
368
|
+
frontMatter: DocFrontMatter;
|
|
369
|
+
}) => ({
|
|
370
|
+
image: frontMatter.image,
|
|
371
|
+
}),
|
|
382
372
|
},
|
|
383
373
|
},
|
|
384
374
|
{
|
|
385
375
|
loader: path.resolve(__dirname, './markdown/index.js'),
|
|
386
376
|
options: docsMarkdownOptions,
|
|
387
377
|
},
|
|
388
|
-
]),
|
|
378
|
+
].filter(Boolean),
|
|
389
379
|
};
|
|
390
380
|
}
|
|
391
381
|
|
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
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
19
|
filePath?: string,
|
|
19
|
-
): Promise<
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/markdown/index.ts
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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()
|
|
21
|
-
return (
|
|
22
|
-
|
|
23
|
-
);
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export default markdownLoader;
|
|
18
|
+
const options = this.getOptions();
|
|
19
|
+
return callback?.(null, linkify(fileString, this.resourcePath, options));
|
|
20
|
+
}
|
package/src/markdown/linkify.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {DocsMarkdownOption} from '../types';
|
|
8
|
+
import type {DocsMarkdownOption} from '../types';
|
|
9
9
|
import {getDocsDirPaths} from '../versions';
|
|
10
10
|
import {replaceMarkdownLinks} from '@docusaurus/utils';
|
|
11
11
|
|
|
@@ -15,9 +15,13 @@ function getVersion(filePath: string, options: DocsMarkdownOption) {
|
|
|
15
15
|
filePath.startsWith(docsDirPath),
|
|
16
16
|
),
|
|
17
17
|
);
|
|
18
|
+
// At this point, this should never happen, because the MDX loaders' paths are
|
|
19
|
+
// literally using the version content paths; but if we allow sourcing content
|
|
20
|
+
// from outside the docs directory (through the `include` option, for example;
|
|
21
|
+
// is there a compelling use-case?), this would actually be testable
|
|
18
22
|
if (!versionFound) {
|
|
19
23
|
throw new Error(
|
|
20
|
-
`Unexpected
|
|
24
|
+
`Unexpected error: Markdown file at "${filePath}" does not belong to any docs version!`,
|
|
21
25
|
);
|
|
22
26
|
}
|
|
23
27
|
return versionFound;
|