@docusaurus/plugin-content-docs 2.0.0-beta.15a2b59f9 → 2.0.0-beta.17
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 +38 -0
- package/lib/cli.d.ts +2 -2
- package/lib/cli.js +27 -44
- package/lib/client/docsClientUtils.d.ts +3 -25
- package/lib/client/docsClientUtils.js +25 -24
- package/lib/{theme/hooks/useDocs.d.ts → client/index.d.ts} +1 -2
- package/lib/{theme/hooks/useDocs.js → client/index.js} +26 -26
- package/lib/docFrontMatter.d.ts +1 -1
- package/lib/docFrontMatter.js +9 -3
- package/lib/docs.d.ts +39 -3
- package/lib/docs.js +157 -53
- package/lib/globalData.d.ts +5 -1
- package/lib/globalData.js +35 -2
- package/lib/index.d.ts +4 -3
- package/lib/index.js +110 -144
- package/lib/lastUpdate.js +15 -28
- 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 +2 -2
- package/lib/numberPrefix.d.ts +1 -1
- package/lib/numberPrefix.js +9 -9
- package/lib/options.d.ts +3 -3
- package/lib/options.js +50 -10
- package/lib/props.d.ts +7 -2
- package/lib/props.js +66 -11
- 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 +193 -0
- package/lib/sidebars/index.d.ts +13 -0
- package/lib/sidebars/index.js +88 -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 +70 -0
- package/lib/sidebars/processor.d.ts +8 -0
- package/lib/sidebars/processor.js +79 -0
- package/lib/sidebars/types.d.ts +166 -0
- package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/sidebars/types.js} +2 -10
- package/lib/sidebars/utils.d.ts +43 -0
- package/lib/sidebars/utils.js +259 -0
- package/lib/sidebars/validation.d.ts +9 -0
- package/lib/sidebars/validation.js +137 -0
- package/lib/slug.d.ts +6 -4
- package/lib/slug.js +28 -17
- package/{src/__tests__/__fixtures__/site-with-doc-label/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 +91 -49
- package/lib/types.d.ts +40 -126
- package/lib/versions.d.ts +29 -4
- package/lib/versions.js +92 -87
- package/package.json +30 -27
- package/src/categoryGeneratedIndex.ts +59 -0
- package/src/cli.ts +34 -54
- package/src/client/docsClientUtils.ts +32 -57
- package/src/{theme/hooks/useDocs.ts → client/index.ts} +11 -10
- package/{types.d.ts → src/deps.d.ts} +0 -0
- package/src/docFrontMatter.ts +12 -5
- package/src/docs.ts +213 -47
- package/src/globalData.ts +53 -2
- package/src/index.ts +151 -197
- package/src/lastUpdate.ts +14 -37
- package/src/markdown/index.ts +9 -13
- package/src/markdown/linkify.ts +1 -1
- package/src/numberPrefix.ts +11 -8
- package/src/options.ts +59 -15
- package/src/plugin-content-docs.d.ts +249 -54
- package/src/props.ts +97 -18
- 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 +269 -0
- package/src/sidebars/index.ts +113 -0
- package/src/sidebars/normalization.ts +85 -0
- package/src/sidebars/postProcessor.ts +94 -0
- package/src/sidebars/processor.ts +126 -0
- package/src/sidebars/types.ts +273 -0
- package/src/sidebars/utils.ts +392 -0
- package/src/sidebars/validation.ts +173 -0
- package/src/slug.ts +39 -21
- package/src/tags.ts +19 -0
- package/src/translations.ts +121 -62
- package/src/types.ts +46 -183
- package/src/versions.ts +136 -102
- package/lib/.tsbuildinfo +0 -1
- package/lib/sidebarItemsGenerator.js +0 -211
- package/lib/sidebars.d.ts +0 -43
- package/lib/sidebars.js +0 -320
- 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 -70
- package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
- package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -53
- 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/docusaurus.config.js +0 -14
- 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/docusaurus.config.js +0 -14
- 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/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 -1916
- 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 -244
- package/src/__tests__/docs.test.ts +0 -878
- package/src/__tests__/index.test.ts +0 -1871
- package/src/__tests__/lastUpdate.test.ts +0 -69
- package/src/__tests__/numberPrefix.test.ts +0 -199
- package/src/__tests__/options.test.ts +0 -231
- package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
- package/src/__tests__/sidebars.test.ts +0 -639
- package/src/__tests__/slug.test.ts +0 -109
- package/src/__tests__/translations.test.ts +0 -159
- package/src/__tests__/versions.test.ts +0 -741
- package/src/client/__tests__/docsClientUtils.test.ts +0 -371
- 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 -522
- 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,46 +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, mapValues} 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
|
|
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 type {GlobalPluginData} from '@docusaurus/plugin-content-docs/client';
|
|
60
|
+
import {createSidebarsUtils} from './sidebars/utils';
|
|
61
|
+
import {getCategoryGeneratedIndexMetadataList} from './categoryGeneratedIndex';
|
|
53
62
|
|
|
54
|
-
export default function pluginContentDocs(
|
|
63
|
+
export default async function pluginContentDocs(
|
|
55
64
|
context: LoadContext,
|
|
56
65
|
options: PluginOptions,
|
|
57
|
-
): Plugin<LoadedContent
|
|
66
|
+
): Promise<Plugin<LoadedContent>> {
|
|
58
67
|
const {siteDir, generatedFilesDir, baseUrl, siteConfig} = context;
|
|
59
68
|
|
|
60
|
-
const versionsMetadata = readVersionsMetadata({context, options});
|
|
69
|
+
const versionsMetadata = await readVersionsMetadata({context, options});
|
|
61
70
|
|
|
62
71
|
const pluginId = options.id ?? DEFAULT_PLUGIN_ID;
|
|
63
72
|
|
|
@@ -72,14 +81,6 @@ export default function pluginContentDocs(
|
|
|
72
81
|
return {
|
|
73
82
|
name: 'docusaurus-plugin-content-docs',
|
|
74
83
|
|
|
75
|
-
getThemePath() {
|
|
76
|
-
return path.resolve(__dirname, './theme');
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
getTypeScriptThemePath() {
|
|
80
|
-
return path.resolve(__dirname, '..', 'src', 'theme');
|
|
81
|
-
},
|
|
82
|
-
|
|
83
84
|
extendCli(cli) {
|
|
84
85
|
const isDefaultPluginId = pluginId === DEFAULT_PLUGIN_ID;
|
|
85
86
|
|
|
@@ -100,6 +101,8 @@ export default function pluginContentDocs(
|
|
|
100
101
|
cliDocsVersionCommand(version, siteDir, pluginId, {
|
|
101
102
|
path: options.path,
|
|
102
103
|
sidebarPath: options.sidebarPath,
|
|
104
|
+
sidebarCollapsed: options.sidebarCollapsed,
|
|
105
|
+
sidebarCollapsible: options.sidebarCollapsible,
|
|
103
106
|
});
|
|
104
107
|
});
|
|
105
108
|
},
|
|
@@ -108,22 +111,12 @@ export default function pluginContentDocs(
|
|
|
108
111
|
return getLoadedContentTranslationFiles(content);
|
|
109
112
|
},
|
|
110
113
|
|
|
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
114
|
getPathsToWatch() {
|
|
120
115
|
function getVersionPathsToWatch(version: VersionMetadata): string[] {
|
|
121
116
|
const result = [
|
|
122
|
-
...
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
(docsDirPath) => `${docsDirPath}/${pattern}`,
|
|
126
|
-
),
|
|
117
|
+
...options.include.flatMap((pattern) =>
|
|
118
|
+
getDocsDirPaths(version).map(
|
|
119
|
+
(docsDirPath) => `${docsDirPath}/${pattern}`,
|
|
127
120
|
),
|
|
128
121
|
),
|
|
129
122
|
`${version.contentPath}/**/${CategoryMetadataFilenamePattern}`,
|
|
@@ -134,7 +127,7 @@ export default function pluginContentDocs(
|
|
|
134
127
|
return result;
|
|
135
128
|
}
|
|
136
129
|
|
|
137
|
-
return
|
|
130
|
+
return versionsMetadata.flatMap(getVersionPathsToWatch);
|
|
138
131
|
},
|
|
139
132
|
|
|
140
133
|
async loadContent() {
|
|
@@ -166,111 +159,46 @@ export default function pluginContentDocs(
|
|
|
166
159
|
async function doLoadVersion(
|
|
167
160
|
versionMetadata: VersionMetadata,
|
|
168
161
|
): Promise<LoadedVersion> {
|
|
169
|
-
const
|
|
170
|
-
versionMetadata.sidebarFilePath,
|
|
171
|
-
);
|
|
172
|
-
|
|
173
|
-
const docsBase: DocMetadataBase[] = await loadVersionDocsBase(
|
|
162
|
+
const docs: DocMetadataBase[] = await loadVersionDocsBase(
|
|
174
163
|
versionMetadata,
|
|
175
164
|
);
|
|
176
|
-
const docsBaseById: Record<string, DocMetadataBase> = keyBy(
|
|
177
|
-
docsBase,
|
|
178
|
-
(doc) => doc.id,
|
|
179
|
-
);
|
|
180
165
|
|
|
181
|
-
const sidebars = await
|
|
166
|
+
const sidebars = await loadSidebars(versionMetadata.sidebarFilePath, {
|
|
182
167
|
sidebarItemsGenerator: options.sidebarItemsGenerator,
|
|
183
168
|
numberPrefixParser: options.numberPrefixParser,
|
|
184
|
-
|
|
185
|
-
docs: docsBase,
|
|
169
|
+
docs,
|
|
186
170
|
version: versionMetadata,
|
|
171
|
+
sidebarOptions: {
|
|
172
|
+
sidebarCollapsed: options.sidebarCollapsed,
|
|
173
|
+
sidebarCollapsible: options.sidebarCollapsible,
|
|
174
|
+
},
|
|
175
|
+
categoryLabelSlugger: createSlugger(),
|
|
187
176
|
});
|
|
188
177
|
|
|
189
178
|
const sidebarsUtils = createSidebarsUtils(sidebars);
|
|
190
179
|
|
|
191
|
-
const validDocIds = Object.keys(docsBaseById);
|
|
192
|
-
sidebarsUtils.checkSidebarsDocIds(
|
|
193
|
-
validDocIds,
|
|
194
|
-
versionMetadata.sidebarFilePath as string,
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
// Add sidebar/next/previous to the docs
|
|
198
|
-
function addNavData(doc: DocMetadataBase): DocMetadata {
|
|
199
|
-
const {
|
|
200
|
-
sidebarName,
|
|
201
|
-
previousId,
|
|
202
|
-
nextId,
|
|
203
|
-
} = sidebarsUtils.getDocNavigation(doc.id);
|
|
204
|
-
const toDocNavLink = (navDocId: string): DocNavLink => {
|
|
205
|
-
const {title, permalink, frontMatter} = docsBaseById[navDocId];
|
|
206
|
-
return {
|
|
207
|
-
title:
|
|
208
|
-
frontMatter.pagination_label ??
|
|
209
|
-
frontMatter.sidebar_label ??
|
|
210
|
-
title,
|
|
211
|
-
permalink,
|
|
212
|
-
};
|
|
213
|
-
};
|
|
214
|
-
return {
|
|
215
|
-
...doc,
|
|
216
|
-
sidebar: sidebarName,
|
|
217
|
-
previous: previousId ? toDocNavLink(previousId) : undefined,
|
|
218
|
-
next: nextId ? toDocNavLink(nextId) : undefined,
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
const docs = docsBase.map(addNavData);
|
|
223
|
-
|
|
224
|
-
// sort to ensure consistent output for tests
|
|
225
|
-
docs.sort((a, b) => a.id.localeCompare(b.id));
|
|
226
|
-
|
|
227
|
-
// TODO really useful? replace with global state logic?
|
|
228
|
-
const permalinkToSidebar: PermalinkToSidebar = {};
|
|
229
|
-
Object.values(docs).forEach((doc) => {
|
|
230
|
-
if (doc.sidebar) {
|
|
231
|
-
permalinkToSidebar[doc.permalink] = doc.sidebar;
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
// The "main doc" is the "version entry point"
|
|
236
|
-
// We browse this doc by clicking on a version:
|
|
237
|
-
// - the "home" doc (at '/docs/')
|
|
238
|
-
// - the first doc of the first sidebar
|
|
239
|
-
// - a random doc (if no docs are in any sidebar... edge case)
|
|
240
|
-
function getMainDoc(): DocMetadata {
|
|
241
|
-
const versionHomeDoc = docs.find(
|
|
242
|
-
(doc) =>
|
|
243
|
-
doc.unversionedId === options.homePageId || doc.slug === '/',
|
|
244
|
-
);
|
|
245
|
-
const firstDocIdOfFirstSidebar = sidebarsUtils.getFirstDocIdOfFirstSidebar();
|
|
246
|
-
if (versionHomeDoc) {
|
|
247
|
-
return versionHomeDoc;
|
|
248
|
-
} else if (firstDocIdOfFirstSidebar) {
|
|
249
|
-
return docs.find((doc) => doc.id === firstDocIdOfFirstSidebar)!;
|
|
250
|
-
} else {
|
|
251
|
-
return docs[0];
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
180
|
return {
|
|
256
181
|
...versionMetadata,
|
|
257
|
-
|
|
182
|
+
docs: addDocNavigation(
|
|
183
|
+
docs,
|
|
184
|
+
sidebarsUtils,
|
|
185
|
+
versionMetadata.sidebarFilePath as string,
|
|
186
|
+
),
|
|
258
187
|
sidebars,
|
|
259
|
-
|
|
260
|
-
|
|
188
|
+
mainDocId: getMainDocId({docs, sidebarsUtils}),
|
|
189
|
+
categoryGeneratedIndices: getCategoryGeneratedIndexMetadataList({
|
|
190
|
+
docs,
|
|
191
|
+
sidebarsUtils,
|
|
192
|
+
}),
|
|
261
193
|
};
|
|
262
194
|
}
|
|
263
195
|
|
|
264
196
|
async function loadVersion(versionMetadata: VersionMetadata) {
|
|
265
197
|
try {
|
|
266
198
|
return await doLoadVersion(versionMetadata);
|
|
267
|
-
} catch (
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
`Loading of version failed for version "${versionMetadata.versionName}"`,
|
|
271
|
-
),
|
|
272
|
-
);
|
|
273
|
-
throw e;
|
|
199
|
+
} catch (err) {
|
|
200
|
+
logger.error`Loading of version failed for version name=${versionMetadata.versionName}`;
|
|
201
|
+
throw err;
|
|
274
202
|
}
|
|
275
203
|
}
|
|
276
204
|
|
|
@@ -285,80 +213,90 @@ export default function pluginContentDocs(
|
|
|
285
213
|
|
|
286
214
|
async contentLoaded({content, actions}) {
|
|
287
215
|
const {loadedVersions} = content;
|
|
288
|
-
const {
|
|
216
|
+
const {
|
|
217
|
+
docLayoutComponent,
|
|
218
|
+
docItemComponent,
|
|
219
|
+
docCategoryGeneratedIndexComponent,
|
|
220
|
+
breadcrumbs,
|
|
221
|
+
} = options;
|
|
289
222
|
const {addRoute, createData, setGlobalData} = actions;
|
|
290
223
|
|
|
291
|
-
|
|
292
|
-
docs
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
224
|
+
async function createVersionTagsRoutes(version: LoadedVersion) {
|
|
225
|
+
const versionTags = getVersionTags(version.docs);
|
|
226
|
+
|
|
227
|
+
// TODO tags should be a sub route of the version route
|
|
228
|
+
async function createTagsListPage() {
|
|
229
|
+
const tagsProp: PropTagsListPage['tags'] = Object.values(
|
|
230
|
+
versionTags,
|
|
231
|
+
).map((tagValue) => ({
|
|
232
|
+
name: tagValue.name,
|
|
233
|
+
permalink: tagValue.permalink,
|
|
234
|
+
count: tagValue.docIds.length,
|
|
235
|
+
}));
|
|
236
|
+
|
|
237
|
+
// Only create /tags page if there are tags.
|
|
238
|
+
if (Object.keys(tagsProp).length > 0) {
|
|
239
|
+
const tagsPropPath = await createData(
|
|
240
|
+
`${docuHash(`tags-list-${version.versionName}-prop`)}.json`,
|
|
241
|
+
JSON.stringify(tagsProp, null, 2),
|
|
301
242
|
);
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
path: metadataItem.permalink,
|
|
305
|
-
component: docItemComponent,
|
|
243
|
+
addRoute({
|
|
244
|
+
path: version.tagsPath,
|
|
306
245
|
exact: true,
|
|
246
|
+
component: options.docTagsListComponent,
|
|
307
247
|
modules: {
|
|
308
|
-
|
|
248
|
+
tags: aliasedSource(tagsPropPath),
|
|
309
249
|
},
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
return routes.sort((a, b) => a.path.localeCompare(b.path));
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
async function doCreateVersionRoutes(loadedVersion: LoadedVersion) {
|
|
318
|
-
const versionMetadataPropPath = await createData(
|
|
319
|
-
`${docuHash(
|
|
320
|
-
`version-${loadedVersion.versionName}-metadata-prop`,
|
|
321
|
-
)}.json`,
|
|
322
|
-
JSON.stringify(
|
|
323
|
-
toVersionMetadataProp(pluginId, loadedVersion),
|
|
324
|
-
null,
|
|
325
|
-
2,
|
|
326
|
-
),
|
|
327
|
-
);
|
|
328
|
-
|
|
329
|
-
addRoute({
|
|
330
|
-
path: loadedVersion.versionPath,
|
|
331
|
-
// allow matching /docs/* as well
|
|
332
|
-
exact: false,
|
|
333
|
-
// main docs component (DocPage)
|
|
334
|
-
component: docLayoutComponent,
|
|
335
|
-
// sub-routes for each doc
|
|
336
|
-
routes: await createDocRoutes(loadedVersion.docs),
|
|
337
|
-
modules: {
|
|
338
|
-
versionMetadata: aliasedSource(versionMetadataPropPath),
|
|
339
|
-
},
|
|
340
|
-
priority: loadedVersion.routePriority,
|
|
341
|
-
});
|
|
342
|
-
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
343
253
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
254
|
+
// TODO tags should be a sub route of the version route
|
|
255
|
+
async function createTagDocListPage(tag: VersionTag) {
|
|
256
|
+
const tagProps = toTagDocListProp({
|
|
257
|
+
allTagsPath: version.tagsPath,
|
|
258
|
+
tag,
|
|
259
|
+
docs: version.docs,
|
|
260
|
+
});
|
|
261
|
+
const tagPropPath = await createData(
|
|
262
|
+
`${docuHash(`tag-${tag.permalink}`)}.json`,
|
|
263
|
+
JSON.stringify(tagProps, null, 2),
|
|
352
264
|
);
|
|
353
|
-
|
|
265
|
+
addRoute({
|
|
266
|
+
path: tag.permalink,
|
|
267
|
+
component: options.docTagDocListComponent,
|
|
268
|
+
exact: true,
|
|
269
|
+
modules: {
|
|
270
|
+
tag: aliasedSource(tagPropPath),
|
|
271
|
+
},
|
|
272
|
+
});
|
|
354
273
|
}
|
|
274
|
+
|
|
275
|
+
await createTagsListPage();
|
|
276
|
+
await Promise.all(Object.values(versionTags).map(createTagDocListPage));
|
|
355
277
|
}
|
|
356
278
|
|
|
357
|
-
await Promise.all(
|
|
279
|
+
await Promise.all(
|
|
280
|
+
loadedVersions.map((loadedVersion) =>
|
|
281
|
+
createVersionRoutes({
|
|
282
|
+
loadedVersion,
|
|
283
|
+
docItemComponent,
|
|
284
|
+
docLayoutComponent,
|
|
285
|
+
docCategoryGeneratedIndexComponent,
|
|
286
|
+
pluginId,
|
|
287
|
+
aliasedSource,
|
|
288
|
+
actions,
|
|
289
|
+
}),
|
|
290
|
+
),
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
// TODO tags should be a sub route of the version route
|
|
294
|
+
await Promise.all(loadedVersions.map(createVersionTagsRoutes));
|
|
358
295
|
|
|
359
296
|
setGlobalData<GlobalPluginData>({
|
|
360
297
|
path: normalizeUrl([baseUrl, options.routeBasePath]),
|
|
361
298
|
versions: loadedVersions.map(toGlobalDataVersion),
|
|
299
|
+
breadcrumbs,
|
|
362
300
|
});
|
|
363
301
|
},
|
|
364
302
|
|
|
@@ -372,10 +310,9 @@ export default function pluginContentDocs(
|
|
|
372
310
|
} = options;
|
|
373
311
|
|
|
374
312
|
function getSourceToPermalink(): SourceToPermalink {
|
|
375
|
-
const allDocs =
|
|
376
|
-
return
|
|
377
|
-
|
|
378
|
-
(d) => d.permalink,
|
|
313
|
+
const allDocs = content.loadedVersions.flatMap((v) => v.docs);
|
|
314
|
+
return Object.fromEntries(
|
|
315
|
+
allDocs.map(({source, permalink}) => [source, permalink]),
|
|
379
316
|
);
|
|
380
317
|
}
|
|
381
318
|
|
|
@@ -395,12 +332,13 @@ export default function pluginContentDocs(
|
|
|
395
332
|
};
|
|
396
333
|
|
|
397
334
|
function createMDXLoaderRule(): RuleSetRule {
|
|
335
|
+
const contentDirs = versionsMetadata.flatMap(getDocsDirPaths);
|
|
398
336
|
return {
|
|
399
|
-
test:
|
|
400
|
-
include:
|
|
337
|
+
test: /\.mdx?$/i,
|
|
338
|
+
include: contentDirs
|
|
401
339
|
// Trailing slash is important, see https://github.com/facebook/docusaurus/pull/3970
|
|
402
340
|
.map(addTrailingPathSeparator),
|
|
403
|
-
use:
|
|
341
|
+
use: [
|
|
404
342
|
getJSLoader({isServer}),
|
|
405
343
|
{
|
|
406
344
|
loader: require.resolve('@docusaurus/mdx-loader'),
|
|
@@ -409,20 +347,36 @@ export default function pluginContentDocs(
|
|
|
409
347
|
rehypePlugins,
|
|
410
348
|
beforeDefaultRehypePlugins,
|
|
411
349
|
beforeDefaultRemarkPlugins,
|
|
412
|
-
|
|
350
|
+
staticDirs: siteConfig.staticDirectories.map((dir) =>
|
|
351
|
+
path.resolve(siteDir, dir),
|
|
352
|
+
),
|
|
353
|
+
siteDir,
|
|
354
|
+
isMDXPartial: createAbsoluteFilePathMatcher(
|
|
355
|
+
options.exclude,
|
|
356
|
+
contentDirs,
|
|
357
|
+
),
|
|
413
358
|
metadataPath: (mdxPath: string) => {
|
|
414
359
|
// Note that metadataPath must be the same/in-sync as
|
|
415
360
|
// the path from createData for each MDX.
|
|
416
361
|
const aliasedPath = aliasedSitePath(mdxPath, siteDir);
|
|
417
362
|
return path.join(dataDir, `${docuHash(aliasedPath)}.json`);
|
|
418
363
|
},
|
|
364
|
+
// Assets allow to convert some relative images paths to
|
|
365
|
+
// require(...) calls
|
|
366
|
+
createAssets: ({
|
|
367
|
+
frontMatter,
|
|
368
|
+
}: {
|
|
369
|
+
frontMatter: DocFrontMatter;
|
|
370
|
+
}) => ({
|
|
371
|
+
image: frontMatter.image,
|
|
372
|
+
}),
|
|
419
373
|
},
|
|
420
374
|
},
|
|
421
375
|
{
|
|
422
376
|
loader: path.resolve(__dirname, './markdown/index.js'),
|
|
423
377
|
options: docsMarkdownOptions,
|
|
424
378
|
},
|
|
425
|
-
]),
|
|
379
|
+
].filter(Boolean),
|
|
426
380
|
};
|
|
427
381
|
}
|
|
428
382
|
|
package/src/lastUpdate.ts
CHANGED
|
@@ -5,14 +5,11 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import path from 'path';
|
|
8
|
+
import logger from '@docusaurus/logger';
|
|
9
|
+
import {getFileCommitDate, GitNotFoundError} from '@docusaurus/utils';
|
|
11
10
|
|
|
12
11
|
type FileLastUpdateData = {timestamp?: number; author?: string};
|
|
13
12
|
|
|
14
|
-
const GIT_COMMIT_TIMESTAMP_AUTHOR_REGEX = /^(\d+), (.+)$/;
|
|
15
|
-
|
|
16
13
|
let showedGitRequirementError = false;
|
|
17
14
|
|
|
18
15
|
export async function getFileLastUpdate(
|
|
@@ -21,42 +18,22 @@ export async function getFileLastUpdate(
|
|
|
21
18
|
if (!filePath) {
|
|
22
19
|
return null;
|
|
23
20
|
}
|
|
24
|
-
function getTimestampAndAuthor(str: string): FileLastUpdateData | null {
|
|
25
|
-
if (!str) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const temp = str.match(GIT_COMMIT_TIMESTAMP_AUTHOR_REGEX);
|
|
30
|
-
return !temp || temp.length < 3
|
|
31
|
-
? null
|
|
32
|
-
: {timestamp: +temp[1], author: temp[2]};
|
|
33
|
-
}
|
|
34
21
|
|
|
35
22
|
// Wrap in try/catch in case the shell commands fail
|
|
36
23
|
// (e.g. project doesn't use Git, etc).
|
|
37
24
|
try {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
25
|
+
const result = getFileCommitDate(filePath, {
|
|
26
|
+
age: 'newest',
|
|
27
|
+
includeAuthor: true,
|
|
28
|
+
});
|
|
29
|
+
return {timestamp: result.timestamp, author: result.author};
|
|
30
|
+
} catch (err) {
|
|
31
|
+
if (err instanceof GitNotFoundError && !showedGitRequirementError) {
|
|
32
|
+
logger.warn('Sorry, the docs plugin last update options require Git.');
|
|
33
|
+
showedGitRequirementError = true;
|
|
34
|
+
} else {
|
|
35
|
+
logger.error(err);
|
|
45
36
|
}
|
|
46
|
-
|
|
47
|
-
const fileBasename = path.basename(filePath);
|
|
48
|
-
const fileDirname = path.dirname(filePath);
|
|
49
|
-
const {stdout} = await execa(
|
|
50
|
-
'git',
|
|
51
|
-
['log', '-1', '--format=%ct, %an', fileBasename],
|
|
52
|
-
{
|
|
53
|
-
cwd: fileDirname,
|
|
54
|
-
},
|
|
55
|
-
);
|
|
56
|
-
return getTimestampAndAuthor(stdout);
|
|
57
|
-
} catch (error) {
|
|
58
|
-
console.error(error);
|
|
37
|
+
return null;
|
|
59
38
|
}
|
|
60
|
-
|
|
61
|
-
return null;
|
|
62
39
|
}
|
package/src/markdown/index.ts
CHANGED
|
@@ -6,21 +6,17 @@
|
|
|
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()
|
|
18
|
+
const options = this.getOptions();
|
|
21
19
|
return (
|
|
22
20
|
callback && callback(null, linkify(fileString, this.resourcePath, options))
|
|
23
21
|
);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export default markdownLoader;
|
|
22
|
+
}
|
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
|
|
package/src/numberPrefix.ts
CHANGED
|
@@ -5,25 +5,28 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {NumberPrefixParser} from '
|
|
8
|
+
import type {NumberPrefixParser} from '@docusaurus/plugin-content-docs';
|
|
9
9
|
|
|
10
10
|
// Best-effort to avoid parsing some patterns as number prefix
|
|
11
|
-
const IgnoredPrefixPatterns = (
|
|
11
|
+
const IgnoredPrefixPatterns = (() => {
|
|
12
12
|
// ignore common date-like patterns: https://github.com/facebook/docusaurus/issues/4640
|
|
13
|
-
const DateLikePrefixRegex =
|
|
13
|
+
const DateLikePrefixRegex =
|
|
14
|
+
/^(?:\d{2}|\d{4})[-_.]\d{2}(?:[-_.](?:\d{2}|\d{4}))?.*$/;
|
|
14
15
|
|
|
15
16
|
// ignore common versioning patterns: https://github.com/facebook/docusaurus/issues/4653
|
|
16
|
-
// note: we could try to parse float numbers in filenames but that is
|
|
17
|
-
// as a version such as "8.0" can be interpreted as both
|
|
18
|
-
// User can configure
|
|
19
|
-
|
|
17
|
+
// note: we could try to parse float numbers in filenames but that is
|
|
18
|
+
// probably not worth it as a version such as "8.0" can be interpreted as both
|
|
19
|
+
// a version and a float. User can configure her own NumberPrefixParser if
|
|
20
|
+
// she wants 8.0 to be interpreted as a float
|
|
21
|
+
const VersionLikePrefixRegex = /^\d+[-_.]\d+.*$/;
|
|
20
22
|
|
|
21
23
|
return new RegExp(
|
|
22
24
|
`${DateLikePrefixRegex.source}|${VersionLikePrefixRegex.source}`,
|
|
23
25
|
);
|
|
24
26
|
})();
|
|
25
27
|
|
|
26
|
-
const NumberPrefixRegex =
|
|
28
|
+
const NumberPrefixRegex =
|
|
29
|
+
/^(?<numberPrefix>\d+)(?<separator>\s*[-_.]+\s*)(?<suffix>.*)$/;
|
|
27
30
|
|
|
28
31
|
// 0-myDoc => {filename: myDoc, numberPrefix: 0}
|
|
29
32
|
// 003 - myDoc => {filename: myDoc, numberPrefix: 3}
|