@docusaurus/core 2.0.0-beta.1 → 2.0.0-beta.10

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 (115) hide show
  1. package/bin/beforeCli.js +125 -0
  2. package/bin/docusaurus.js +36 -105
  3. package/lib/.tsbuildinfo +1 -1
  4. package/lib/babel/preset.d.ts +6 -0
  5. package/lib/babel/preset.js +3 -3
  6. package/lib/choosePort.js +12 -13
  7. package/lib/client/.eslintrc.js +0 -1
  8. package/lib/client/.tsbuildinfo +1 -1
  9. package/lib/client/App.js +12 -22
  10. package/lib/client/LinksCollector.d.ts +2 -2
  11. package/lib/client/LinksCollector.js +4 -8
  12. package/lib/client/PendingNavigation.d.ts +24 -1
  13. package/lib/client/PendingNavigation.js +1 -1
  14. package/lib/client/baseUrlIssueBanner/BaseUrlIssueBanner.d.ts +5 -0
  15. package/lib/client/client-lifecycles-dispatcher.d.ts +2 -2
  16. package/lib/client/client-lifecycles-dispatcher.js +0 -2
  17. package/lib/client/docusaurus.d.ts +6 -0
  18. package/lib/client/docusaurus.js +11 -19
  19. package/lib/client/exports/BrowserOnly.js +5 -3
  20. package/lib/client/exports/ErrorBoundary.d.ts +18 -0
  21. package/lib/client/exports/ErrorBoundary.js +35 -0
  22. package/lib/client/exports/Interpolate.js +12 -15
  23. package/lib/client/exports/Link.js +11 -11
  24. package/lib/client/exports/Translate.d.ts +2 -2
  25. package/lib/client/exports/Translate.js +13 -9
  26. package/lib/client/exports/browserContext.d.ts +11 -0
  27. package/lib/client/exports/browserContext.js +21 -0
  28. package/lib/client/exports/constants.js +1 -11
  29. package/lib/client/exports/{context.d.ts → docusaurusContext.d.ts} +5 -3
  30. package/lib/client/exports/docusaurusContext.js +25 -0
  31. package/lib/client/exports/useBaseUrl.js +2 -4
  32. package/lib/client/exports/useDocusaurusContext.js +2 -7
  33. package/lib/client/exports/useGlobalData.js +1 -5
  34. package/lib/client/exports/{context.js → useIsBrowser.d.ts} +1 -2
  35. package/lib/{webpack/sharedModuleAliases.d.ts → client/exports/useIsBrowser.js} +5 -4
  36. package/lib/client/flat.d.ts +2 -1
  37. package/lib/client/flat.js +7 -9
  38. package/lib/client/normalizeLocation.d.ts +1 -3
  39. package/lib/client/prefetch.js +0 -1
  40. package/lib/client/serverEntry.js +15 -31
  41. package/lib/client/theme-fallback/Error/index.js +47 -0
  42. package/lib/client/theme-fallback/Layout/index.js +1 -1
  43. package/lib/client/theme-fallback/Loading/index.js +2 -2
  44. package/lib/client/theme-fallback/Root/index.js +1 -3
  45. package/lib/commands/build.js +37 -40
  46. package/lib/commands/clear.d.ts +6 -0
  47. package/lib/commands/clear.js +9 -9
  48. package/lib/commands/commandUtils.d.ts +6 -0
  49. package/lib/commands/commandUtils.js +7 -7
  50. package/lib/commands/deploy.d.ts +3 -0
  51. package/lib/commands/deploy.js +98 -53
  52. package/lib/commands/external.js +4 -4
  53. package/lib/commands/serve.js +13 -13
  54. package/lib/commands/start.js +83 -73
  55. package/lib/commands/swizzle.js +49 -49
  56. package/lib/commands/writeHeadingIds.d.ts +9 -6
  57. package/lib/commands/writeHeadingIds.js +32 -32
  58. package/lib/commands/writeTranslations.js +31 -11
  59. package/lib/server/brokenLinks.js +13 -17
  60. package/lib/server/client-modules/index.js +1 -3
  61. package/lib/server/config.js +4 -4
  62. package/lib/server/configValidation.d.ts +1 -1
  63. package/lib/server/configValidation.js +12 -7
  64. package/lib/server/duplicateRoutes.js +8 -2
  65. package/lib/server/html-tags/htmlTags.js +5 -6
  66. package/lib/server/html-tags/index.d.ts +2 -2
  67. package/lib/server/html-tags/index.js +3 -3
  68. package/lib/server/i18n.js +16 -13
  69. package/lib/server/index.js +129 -71
  70. package/lib/server/loadSetup.js +3 -3
  71. package/lib/server/moduleShorthand.d.ts +9 -0
  72. package/lib/server/moduleShorthand.js +42 -0
  73. package/lib/server/plugins/applyRouteTrailingSlash.d.ts +2 -1
  74. package/lib/server/plugins/applyRouteTrailingSlash.js +3 -3
  75. package/lib/server/plugins/index.d.ts +3 -4
  76. package/lib/server/plugins/index.js +44 -33
  77. package/lib/server/plugins/init.d.ts +2 -6
  78. package/lib/server/plugins/init.js +9 -12
  79. package/lib/server/plugins/pluginIds.d.ts +2 -2
  80. package/lib/server/plugins/pluginIds.js +6 -4
  81. package/lib/server/presets/index.js +12 -12
  82. package/lib/server/routes.js +41 -23
  83. package/lib/server/themes/alias.d.ts +3 -2
  84. package/lib/server/themes/alias.js +22 -12
  85. package/lib/server/themes/index.d.ts +6 -2
  86. package/lib/server/themes/index.js +32 -21
  87. package/lib/server/translations/translations.d.ts +10 -5
  88. package/lib/server/translations/translations.js +15 -17
  89. package/lib/server/translations/translationsExtractor.d.ts +8 -3
  90. package/lib/server/translations/translationsExtractor.js +65 -56
  91. package/lib/server/utils.d.ts +8 -2
  92. package/lib/server/utils.js +8 -10
  93. package/lib/server/versions/__fixtures__/dummy-plugin.d.ts +0 -0
  94. package/lib/server/versions/__tests/index.test.js +5 -5
  95. package/lib/server/versions/index.js +6 -6
  96. package/lib/webpack/base.js +29 -21
  97. package/lib/webpack/client.js +8 -17
  98. package/lib/webpack/plugins/CleanWebpackPlugin.js +4 -11
  99. package/lib/webpack/plugins/LogPlugin.js +5 -6
  100. package/lib/webpack/plugins/WaitPlugin.js +4 -4
  101. package/lib/webpack/server.js +13 -9
  102. package/lib/webpack/utils.d.ts +2 -23
  103. package/lib/webpack/utils.js +29 -127
  104. package/package.json +56 -51
  105. package/tsconfig.client.json +1 -2
  106. package/tsconfig.json +5 -4
  107. package/lib/commands/buildRemoteBranchUrl.d.ts +0 -7
  108. package/lib/commands/buildRemoteBranchUrl.js +0 -27
  109. package/lib/constants.d.ts +0 -18
  110. package/lib/constants.js +0 -23
  111. package/lib/webpack/react-dev-utils-webpack5/README.md +0 -11
  112. package/lib/webpack/react-dev-utils-webpack5/evalSourceMapMiddleware.js +0 -57
  113. package/lib/webpack/react-dev-utils-webpack5/formatWebpackMessages.js +0 -138
  114. package/lib/webpack/react-dev-utils-webpack5/webpackHotDevClient.js +0 -285
  115. package/lib/webpack/sharedModuleAliases.js +0 -18
@@ -7,9 +7,9 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  const tslib_1 = require("tslib");
10
- const module_1 = tslib_1.__importDefault(require("module"));
11
- const import_fresh_1 = tslib_1.__importDefault(require("import-fresh"));
12
- const constants_1 = require("../../constants");
10
+ const module_1 = require("module");
11
+ const import_fresh_1 = (0, tslib_1.__importDefault)(require("import-fresh"));
12
+ const utils_1 = require("@docusaurus/utils");
13
13
  const versions_1 = require("../versions");
14
14
  const pluginIds_1 = require("./pluginIds");
15
15
  const utils_validation_1 = require("@docusaurus/utils-validation");
@@ -19,7 +19,7 @@ function normalizePluginConfig(pluginConfig, pluginRequire) {
19
19
  if (typeof pluginConfig === 'string') {
20
20
  const pluginModuleImport = pluginConfig;
21
21
  const pluginPath = pluginRequire.resolve(pluginModuleImport);
22
- const pluginModule = import_fresh_1.default(pluginPath);
22
+ const pluginModule = (0, import_fresh_1.default)(pluginPath);
23
23
  return {
24
24
  plugin: (_a = pluginModule === null || pluginModule === void 0 ? void 0 : pluginModule.default) !== null && _a !== void 0 ? _a : pluginModule,
25
25
  options: {},
@@ -43,7 +43,7 @@ function normalizePluginConfig(pluginConfig, pluginRequire) {
43
43
  if (typeof pluginConfig[0] === 'string') {
44
44
  const pluginModuleImport = pluginConfig[0];
45
45
  const pluginPath = pluginRequire.resolve(pluginModuleImport);
46
- const pluginModule = import_fresh_1.default(pluginPath);
46
+ const pluginModule = (0, import_fresh_1.default)(pluginPath);
47
47
  return {
48
48
  plugin: (_b = pluginModule === null || pluginModule === void 0 ? void 0 : pluginModule.default) !== null && _b !== void 0 ? _b : pluginModule,
49
49
  options: (_c = pluginConfig[1]) !== null && _c !== void 0 ? _c : {},
@@ -88,16 +88,13 @@ function getThemeValidationFunction(normalizedPluginConfig) {
88
88
  function initPlugins({ pluginConfigs, context, }) {
89
89
  // We need to resolve plugins from the perspective of the siteDir, since the siteDir's package.json
90
90
  // declares the dependency on these plugins.
91
- // We need to fallback to createRequireFromPath since createRequire is only available in node v12.
92
- // See: https://nodejs.org/api/modules.html#modules_module_createrequire_filename
93
- const createRequire = module_1.default.createRequire || module_1.default.createRequireFromPath;
94
- const pluginRequire = createRequire(context.siteConfigPath);
91
+ const pluginRequire = (0, module_1.createRequire)(context.siteConfigPath);
95
92
  function doGetPluginVersion(normalizedPluginConfig) {
96
93
  var _a, _b;
97
94
  // get plugin version
98
95
  if ((_a = normalizedPluginConfig.pluginModule) === null || _a === void 0 ? void 0 : _a.path) {
99
96
  const pluginPath = pluginRequire.resolve((_b = normalizedPluginConfig.pluginModule) === null || _b === void 0 ? void 0 : _b.path);
100
- return versions_1.getPluginVersion(pluginPath, context.siteDir);
97
+ return (0, versions_1.getPluginVersion)(pluginPath, context.siteDir);
101
98
  }
102
99
  else {
103
100
  return { type: 'local' };
@@ -129,7 +126,7 @@ function initPlugins({ pluginConfigs, context, }) {
129
126
  // as we don't go through the Joi schema that adds it
130
127
  return {
131
128
  ...normalizedPluginConfig.options,
132
- id: (_a = normalizedPluginConfig.options.id) !== null && _a !== void 0 ? _a : constants_1.DEFAULT_PLUGIN_ID,
129
+ id: (_a = normalizedPluginConfig.options.id) !== null && _a !== void 0 ? _a : utils_1.DEFAULT_PLUGIN_ID,
133
130
  };
134
131
  }
135
132
  }
@@ -154,7 +151,7 @@ function initPlugins({ pluginConfigs, context, }) {
154
151
  };
155
152
  })
156
153
  .filter((item) => Boolean(item));
157
- pluginIds_1.ensureUniquePluginInstanceIds(plugins);
154
+ (0, pluginIds_1.ensureUniquePluginInstanceIds)(plugins);
158
155
  return plugins;
159
156
  }
160
157
  exports.default = initPlugins;
@@ -4,5 +4,5 @@
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 { InitPlugin } from './init';
8
- export declare function ensureUniquePluginInstanceIds(plugins: InitPlugin[]): void;
7
+ import { InitializedPlugin } from '@docusaurus/types';
8
+ export declare function ensureUniquePluginInstanceIds(plugins: InitializedPlugin[]): void;
@@ -8,16 +8,18 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.ensureUniquePluginInstanceIds = void 0;
10
10
  const lodash_1 = require("lodash");
11
- const constants_1 = require("../../constants");
11
+ const utils_1 = require("@docusaurus/utils");
12
12
  // It is forbidden to have 2 plugins of the same name sharing the same id
13
13
  // this is required to support multi-instance plugins without conflict
14
14
  function ensureUniquePluginInstanceIds(plugins) {
15
- const pluginsByName = lodash_1.groupBy(plugins, (p) => p.name);
15
+ const pluginsByName = (0, lodash_1.groupBy)(plugins, (p) => p.name);
16
16
  Object.entries(pluginsByName).forEach(([pluginName, pluginInstances]) => {
17
- const pluginInstancesById = lodash_1.groupBy(pluginInstances, (p) => { var _a; return (_a = p.options.id) !== null && _a !== void 0 ? _a : constants_1.DEFAULT_PLUGIN_ID; });
17
+ const pluginInstancesById = (0, lodash_1.groupBy)(pluginInstances, (p) => { var _a; return (_a = p.options.id) !== null && _a !== void 0 ? _a : utils_1.DEFAULT_PLUGIN_ID; });
18
18
  Object.entries(pluginInstancesById).forEach(([pluginId, pluginInstancesWithId]) => {
19
19
  if (pluginInstancesWithId.length !== 1) {
20
- throw new Error(`Plugin "${pluginName}" is used ${pluginInstancesWithId.length} times with id ${pluginId}.\nTo use the same plugin multiple times on a Docusaurus site, you need to assign a unique id to each plugin instance.`);
20
+ throw new Error(`Plugin "${pluginName}" is used ${pluginInstancesWithId.length} times with ID "${pluginId}".\nTo use the same plugin multiple times on a Docusaurus site, you need to assign a unique ID to each plugin instance.${pluginId === utils_1.DEFAULT_PLUGIN_ID
21
+ ? `\n\nThe plugin ID is "${utils_1.DEFAULT_PLUGIN_ID}" by default. It's possible that the preset you are using already includes a plugin instance, in which case you either want to disable the plugin in the preset (to use a single instance), or assign another ID to your extra plugin instance (to use multiple instances).`
22
+ : ''}`);
21
23
  }
22
24
  });
23
25
  });
@@ -7,19 +7,18 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  const tslib_1 = require("tslib");
10
- const module_1 = tslib_1.__importDefault(require("module"));
11
- const import_fresh_1 = tslib_1.__importDefault(require("import-fresh"));
10
+ const module_1 = require("module");
11
+ const import_fresh_1 = (0, tslib_1.__importDefault)(require("import-fresh"));
12
+ const moduleShorthand_1 = require("../moduleShorthand");
12
13
  function loadPresets(context) {
13
- // We need to resolve plugins from the perspective of the siteDir, since the siteDir's package.json
14
- // declares the dependency on these plugins.
15
- // We need to fallback to createRequireFromPath since createRequire is only available in node v12.
16
- // See: https://nodejs.org/api/modules.html#modules_module_createrequire_filename
17
- const createRequire = module_1.default.createRequire || module_1.default.createRequireFromPath;
18
- const pluginRequire = createRequire(context.siteConfigPath);
14
+ // We need to resolve presets from the perspective of the siteDir, since the siteDir's package.json
15
+ // declares the dependency on these presets.
16
+ const presetRequire = (0, module_1.createRequire)(context.siteConfigPath);
19
17
  const presets = (context.siteConfig || {}).presets || [];
20
18
  const unflatPlugins = [];
21
19
  const unflatThemes = [];
22
20
  presets.forEach((presetItem) => {
21
+ var _a;
23
22
  let presetModuleImport;
24
23
  let presetOptions = {};
25
24
  if (typeof presetItem === 'string') {
@@ -31,8 +30,9 @@ function loadPresets(context) {
31
30
  else {
32
31
  throw new Error('Invalid presets format detected in config.');
33
32
  }
34
- const presetModule = import_fresh_1.default(pluginRequire.resolve(presetModuleImport));
35
- const preset = (presetModule.default || presetModule)(context, presetOptions);
33
+ const presetName = (0, moduleShorthand_1.resolveModuleName)(presetModuleImport, presetRequire, 'preset');
34
+ const presetModule = (0, import_fresh_1.default)(presetRequire.resolve(presetName));
35
+ const preset = ((_a = presetModule.default) !== null && _a !== void 0 ? _a : presetModule)(context, presetOptions);
36
36
  if (preset.plugins) {
37
37
  unflatPlugins.push(preset.plugins);
38
38
  }
@@ -41,8 +41,8 @@ function loadPresets(context) {
41
41
  }
42
42
  });
43
43
  return {
44
- plugins: [].concat(...unflatPlugins).filter(Boolean),
45
- themes: [].concat(...unflatThemes).filter(Boolean),
44
+ plugins: unflatPlugins.flat().filter(Boolean),
45
+ themes: unflatThemes.flat().filter(Boolean),
46
46
  };
47
47
  }
48
48
  exports.default = loadPresets;
@@ -9,18 +9,33 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  const utils_1 = require("@docusaurus/utils");
10
10
  const lodash_1 = require("lodash");
11
11
  const querystring_1 = require("querystring");
12
- const createRouteCodeString = ({ routePath, routeHash, exact, subroutesCodeStrings, }) => {
13
- const str = `{
14
- path: '${routePath}',
15
- component: ComponentCreator('${routePath}','${routeHash}'),
16
- ${exact ? `exact: true,` : ''}
17
- ${subroutesCodeStrings
18
- ? ` routes: [
19
- ${utils_1.removeSuffix(subroutesCodeStrings.join(',\n'), ',\n')},
20
- ]
21
- `
22
- : ''}}`;
23
- return str;
12
+ function indent(str) {
13
+ const spaces = ' ';
14
+ return `${spaces}${str.replace(/(\n)/g, `\n${spaces}`)}`;
15
+ }
16
+ const createRouteCodeString = ({ routePath, routeHash, exact, subroutesCodeStrings, props, }) => {
17
+ const parts = [
18
+ `path: '${routePath}'`,
19
+ `component: ComponentCreator('${routePath}','${routeHash}')`,
20
+ ];
21
+ if (exact) {
22
+ parts.push(`exact: true`);
23
+ }
24
+ if (subroutesCodeStrings) {
25
+ parts.push(`routes: [
26
+ ${indent((0, utils_1.removeSuffix)(subroutesCodeStrings.join(',\n'), ',\n'))}
27
+ ]`);
28
+ }
29
+ Object.entries(props).forEach(([propName, propValue]) => {
30
+ // Figure out how to "unquote" JS attributes that don't need to be quoted
31
+ // Is this lib reliable? https://github.com/armanozak/should-quote
32
+ const shouldQuote = true; // TODO
33
+ const key = shouldQuote ? `'${propName}'` : propName;
34
+ parts.push(`${key}: ${JSON.stringify(propValue)}`);
35
+ });
36
+ return `{
37
+ ${indent(parts.join(',\n'))}
38
+ }`;
24
39
  };
25
40
  const NotFoundRouteCode = `{
26
41
  path: '*',
@@ -31,10 +46,10 @@ const RoutesImportsCode = [
31
46
  `import ComponentCreator from '@docusaurus/ComponentCreator';`,
32
47
  ].join('\n');
33
48
  function isModule(value) {
34
- if (lodash_1.isString(value)) {
49
+ if ((0, lodash_1.isString)(value)) {
35
50
  return true;
36
51
  }
37
- if (lodash_1.isPlainObject(value) && lodash_1.has(value, '__import') && lodash_1.has(value, 'path')) {
52
+ if ((0, lodash_1.isPlainObject)(value) && (0, lodash_1.has)(value, '__import') && (0, lodash_1.has)(value, 'path')) {
38
53
  return true;
39
54
  }
40
55
  return false;
@@ -43,17 +58,17 @@ function getModulePath(target) {
43
58
  if (typeof target === 'string') {
44
59
  return target;
45
60
  }
46
- const queryStr = target.query ? `?${querystring_1.stringify(target.query)}` : '';
61
+ const queryStr = target.query ? `?${(0, querystring_1.stringify)(target.query)}` : '';
47
62
  return `${target.path}${queryStr}`;
48
63
  }
49
64
  async function loadRoutes(pluginsRouteConfigs, baseUrl) {
50
65
  const registry = {};
51
- const routesPaths = [utils_1.normalizeUrl([baseUrl, '404.html'])];
66
+ const routesPaths = [(0, utils_1.normalizeUrl)([baseUrl, '404.html'])];
52
67
  const routesChunkNames = {};
53
68
  // This is the higher level overview of route code generation.
54
69
  function generateRouteCode(routeConfig) {
55
- const { path: routePath, component, modules = {}, routes: subroutes, exact, } = routeConfig;
56
- if (!lodash_1.isString(routePath) || !component) {
70
+ const { path: routePath, component, modules = {}, routes: subroutes, exact, priority, ...props } = routeConfig;
71
+ if (!(0, lodash_1.isString)(routePath) || !component) {
57
72
  throw new Error(`Invalid route config: path must be a string and component is required.\n${JSON.stringify(routeConfig)}`);
58
73
  }
59
74
  // Collect all page paths for injecting it later in the plugin lifecycle
@@ -65,7 +80,7 @@ async function loadRoutes(pluginsRouteConfigs, baseUrl) {
65
80
  // We hash the route to generate the key, because 2 routes can conflict with
66
81
  // each others if they have the same path, ex: parent=/docs, child=/docs
67
82
  // see https://github.com/facebook/docusaurus/issues/2917
68
- const routeHash = utils_1.simpleHash(JSON.stringify(routeConfig), 3);
83
+ const routeHash = (0, utils_1.simpleHash)(JSON.stringify(routeConfig), 3);
69
84
  const chunkNamesKey = `${routePath}-${routeHash}`;
70
85
  routesChunkNames[chunkNamesKey] = {
71
86
  ...genRouteChunkNames(registry, { component }, 'component', component),
@@ -76,14 +91,17 @@ async function loadRoutes(pluginsRouteConfigs, baseUrl) {
76
91
  routeHash,
77
92
  exact,
78
93
  subroutesCodeStrings: subroutes === null || subroutes === void 0 ? void 0 : subroutes.map(generateRouteCode),
94
+ props,
79
95
  });
80
96
  }
81
97
  const routesConfig = `
82
98
  ${RoutesImportsCode}
99
+
83
100
  export default [
84
- ${pluginsRouteConfigs.map(generateRouteCode).join(',\n')},
85
- ${NotFoundRouteCode}
86
- ];\n`;
101
+ ${indent(`${pluginsRouteConfigs.map(generateRouteCode).join(',\n')},`)}
102
+ ${indent(NotFoundRouteCode)}
103
+ ];
104
+ `;
87
105
  return {
88
106
  registry,
89
107
  routesConfig,
@@ -103,7 +121,7 @@ registry, value, prefix, name) {
103
121
  }
104
122
  if (isModule(value)) {
105
123
  const modulePath = getModulePath(value);
106
- const chunkName = utils_1.genChunkName(modulePath, prefix, name);
124
+ const chunkName = (0, utils_1.genChunkName)(modulePath, prefix, name);
107
125
  // We need to JSON.stringify so that if its on windows, backslashes are escaped.
108
126
  const loader = `() => import(/* webpackChunkName: '${chunkName}' */ ${JSON.stringify(modulePath)})`;
109
127
  registry[chunkName] = {
@@ -4,5 +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 { ThemeAlias } from '@docusaurus/types';
8
- export default function themeAlias(themePath: string, addOriginalAlias: boolean): ThemeAlias;
7
+ import { ThemeAliases } from '@docusaurus/types';
8
+ export declare function sortAliases(aliases: ThemeAliases): ThemeAliases;
9
+ export default function themeAlias(themePath: string, addOriginalAlias: boolean): ThemeAliases;
@@ -6,34 +6,44 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.sortAliases = void 0;
9
10
  const tslib_1 = require("tslib");
10
- const globby_1 = tslib_1.__importDefault(require("globby"));
11
- const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
12
- const path_1 = tslib_1.__importDefault(require("path"));
11
+ const fs_extra_1 = (0, tslib_1.__importDefault)(require("fs-extra"));
12
+ const path_1 = (0, tslib_1.__importDefault)(require("path"));
13
13
  const utils_1 = require("@docusaurus/utils");
14
14
  const lodash_1 = require("lodash");
15
+ // Order of Webpack aliases is important because one alias can shadow another
16
+ // This ensure @theme/NavbarItem alias is after @theme/NavbarItem/LocaleDropdown
17
+ // See https://github.com/facebook/docusaurus/pull/3922
18
+ // See https://github.com/facebook/docusaurus/issues/5382
19
+ function sortAliases(aliases) {
20
+ // Alphabetical order by default
21
+ const entries = (0, lodash_1.sortBy)(Object.entries(aliases), ([alias]) => alias);
22
+ // @theme/NavbarItem should be after @theme/NavbarItem/LocaleDropdown
23
+ entries.sort(([alias1], [alias2]) => alias1.includes(`${alias2}/`) ? -1 : 0);
24
+ return Object.fromEntries(entries);
25
+ }
26
+ exports.sortAliases = sortAliases;
27
+ // TODO make async
15
28
  function themeAlias(themePath, addOriginalAlias) {
16
29
  if (!fs_extra_1.default.pathExistsSync(themePath)) {
17
30
  return {};
18
31
  }
19
- const themeComponentFiles = globby_1.default.sync(['**/*.{js,jsx,ts,tsx}'], {
32
+ const themeComponentFiles = utils_1.Globby.sync(['**/*.{js,jsx,ts,tsx}'], {
20
33
  cwd: themePath,
21
34
  });
22
- // See https://github.com/facebook/docusaurus/pull/3922
23
- // ensure @theme/NavbarItem alias is created after @theme/NavbarItem/LocaleDropdown
24
- const sortedThemeComponentFiles = lodash_1.sortBy(themeComponentFiles, (file) => file.endsWith('/index.js'));
25
35
  const aliases = {};
26
- sortedThemeComponentFiles.forEach((relativeSource) => {
36
+ themeComponentFiles.forEach((relativeSource) => {
27
37
  const filePath = path_1.default.join(themePath, relativeSource);
28
- const fileName = utils_1.fileToPath(relativeSource);
29
- const aliasName = utils_1.posixPath(utils_1.normalizeUrl(['@theme', fileName]).replace(/\/$/, ''));
38
+ const fileName = (0, utils_1.fileToPath)(relativeSource);
39
+ const aliasName = (0, utils_1.posixPath)((0, utils_1.normalizeUrl)(['@theme', fileName]).replace(/\/$/, ''));
30
40
  aliases[aliasName] = filePath;
31
41
  if (addOriginalAlias) {
32
42
  // For swizzled components to access the original.
33
- const originalAliasName = utils_1.posixPath(utils_1.normalizeUrl(['@theme-original', fileName]).replace(/\/$/, ''));
43
+ const originalAliasName = (0, utils_1.posixPath)((0, utils_1.normalizeUrl)(['@theme-original', fileName]).replace(/\/$/, ''));
34
44
  aliases[originalAliasName] = filePath;
35
45
  }
36
46
  });
37
- return aliases;
47
+ return sortAliases(aliases);
38
48
  }
39
49
  exports.default = themeAlias;
@@ -4,5 +4,9 @@
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 { ThemeAlias } from '@docusaurus/types';
8
- export default function loadThemeAlias(themePaths: string[], userThemePaths?: string[]): ThemeAlias;
7
+ import { ThemeAliases, LoadedPlugin } from '@docusaurus/types';
8
+ export declare function loadThemeAliases(themePaths: string[], userThemePaths: string[]): ThemeAliases;
9
+ export declare function loadPluginsThemeAliases({ siteDir, plugins, }: {
10
+ siteDir: string;
11
+ plugins: LoadedPlugin[];
12
+ }): ThemeAliases;
@@ -6,30 +6,41 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.loadPluginsThemeAliases = exports.loadThemeAliases = void 0;
9
10
  const tslib_1 = require("tslib");
10
- const alias_1 = tslib_1.__importDefault(require("./alias"));
11
- function buildThemeAliases(themeAliases, aliases = {}) {
12
- Object.keys(themeAliases).forEach((aliasKey) => {
13
- if (aliasKey in aliases) {
14
- const componentName = aliasKey.substring(aliasKey.indexOf('/') + 1);
15
- // eslint-disable-next-line no-param-reassign
16
- aliases[`@theme-init/${componentName}`] = aliases[aliasKey];
17
- }
18
- // eslint-disable-next-line no-param-reassign
19
- aliases[aliasKey] = themeAliases[aliasKey];
20
- });
21
- return aliases;
22
- }
23
- function loadThemeAlias(themePaths, userThemePaths = []) {
24
- let aliases = {};
11
+ const path_1 = (0, tslib_1.__importDefault)(require("path"));
12
+ const utils_1 = require("@docusaurus/utils");
13
+ const alias_1 = (0, tslib_1.__importStar)(require("./alias"));
14
+ const ThemeFallbackDir = path_1.default.resolve(__dirname, '../../client/theme-fallback');
15
+ function loadThemeAliases(themePaths, userThemePaths) {
16
+ const aliases = {};
25
17
  themePaths.forEach((themePath) => {
26
- const themeAliases = alias_1.default(themePath, true);
27
- aliases = { ...aliases, ...buildThemeAliases(themeAliases, aliases) };
18
+ const themeAliases = (0, alias_1.default)(themePath, true);
19
+ Object.keys(themeAliases).forEach((aliasKey) => {
20
+ // If this alias shadows a previous one, use @theme-init to preserve the initial one.
21
+ // @theme-init is only applied once: to the initial theme that provided this component
22
+ if (aliasKey in aliases) {
23
+ const componentName = aliasKey.substring(aliasKey.indexOf('/') + 1);
24
+ const initAlias = `@theme-init/${componentName}`;
25
+ if (!(initAlias in aliases)) {
26
+ aliases[initAlias] = aliases[aliasKey];
27
+ }
28
+ }
29
+ aliases[aliasKey] = themeAliases[aliasKey];
30
+ });
28
31
  });
29
32
  userThemePaths.forEach((themePath) => {
30
- const userThemeAliases = alias_1.default(themePath, false);
31
- aliases = { ...aliases, ...buildThemeAliases(userThemeAliases, aliases) };
33
+ const userThemeAliases = (0, alias_1.default)(themePath, false);
34
+ Object.assign(aliases, userThemeAliases);
32
35
  });
33
- return aliases;
36
+ return (0, alias_1.sortAliases)(aliases);
37
+ }
38
+ exports.loadThemeAliases = loadThemeAliases;
39
+ function loadPluginsThemeAliases({ siteDir, plugins, }) {
40
+ const pluginThemes = plugins
41
+ .map((plugin) => (plugin.getThemePath ? plugin.getThemePath() : undefined))
42
+ .filter((x) => Boolean(x));
43
+ const userTheme = path_1.default.resolve(siteDir, utils_1.THEME_PATH);
44
+ return loadThemeAliases([ThemeFallbackDir, ...pluginThemes], [userTheme]);
34
45
  }
35
- exports.default = loadThemeAlias;
46
+ exports.loadPluginsThemeAliases = loadPluginsThemeAliases;
@@ -1,5 +1,10 @@
1
- import { InitPlugin } from '../plugins/init';
2
- import { TranslationFileContent, TranslationFile, TranslationMessage } from '@docusaurus/types';
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { TranslationFileContent, TranslationFile, TranslationMessage, InitializedPlugin } from '@docusaurus/types';
3
8
  export declare type WriteTranslationsOptions = {
4
9
  override?: boolean;
5
10
  messagePrefix?: string;
@@ -21,15 +26,15 @@ export declare function getCodeTranslationsFilePath(context: TranslationContext)
21
26
  export declare function readCodeTranslationFileContent(context: TranslationContext): Promise<TranslationFileContent | undefined>;
22
27
  export declare function writeCodeTranslations(context: TranslationContext, content: TranslationFileContent, options: WriteTranslationsOptions): Promise<void>;
23
28
  export declare function writePluginTranslations({ siteDir, plugin, locale, translationFile, options, }: TranslationContext & {
24
- plugin: InitPlugin;
29
+ plugin: InitializedPlugin;
25
30
  translationFile: TranslationFile;
26
31
  options?: WriteTranslationsOptions;
27
32
  }): Promise<void>;
28
33
  export declare function localizePluginTranslationFile({ siteDir, plugin, locale, translationFile, }: TranslationContext & {
29
- plugin: InitPlugin;
34
+ plugin: InitializedPlugin;
30
35
  translationFile: TranslationFile;
31
36
  }): Promise<TranslationFile>;
32
- export declare function getPluginsDefaultCodeTranslationMessages(plugins: InitPlugin[]): Promise<Record<string, string>>;
37
+ export declare function getPluginsDefaultCodeTranslationMessages(plugins: InitializedPlugin[]): Promise<Record<string, string>>;
33
38
  export declare function applyDefaultCodeTranslations({ extractedCodeTranslations, defaultCodeMessages, }: {
34
39
  extractedCodeTranslations: Record<string, TranslationMessage>;
35
40
  defaultCodeMessages: Record<string, string>;
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applyDefaultCodeTranslations = exports.getPluginsDefaultCodeTranslationMessages = exports.localizePluginTranslationFile = exports.writePluginTranslations = exports.writeCodeTranslations = exports.readCodeTranslationFileContent = exports.getCodeTranslationsFilePath = exports.getTranslationsLocaleDirPath = exports.getTranslationsDirPath = exports.writeTranslationFileContent = exports.readTranslationFileContent = exports.ensureTranslationFileContent = void 0;
4
- const tslib_1 = require("tslib");
5
2
  /**
6
3
  * Copyright (c) Facebook, Inc. and its affiliates.
7
4
  *
8
5
  * This source code is licensed under the MIT license found in the
9
6
  * LICENSE file in the root directory of this source tree.
10
7
  */
11
- const path_1 = tslib_1.__importDefault(require("path"));
12
- const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.applyDefaultCodeTranslations = exports.getPluginsDefaultCodeTranslationMessages = exports.localizePluginTranslationFile = exports.writePluginTranslations = exports.writeCodeTranslations = exports.readCodeTranslationFileContent = exports.getCodeTranslationsFilePath = exports.getTranslationsLocaleDirPath = exports.getTranslationsDirPath = exports.writeTranslationFileContent = exports.readTranslationFileContent = exports.ensureTranslationFileContent = void 0;
10
+ const tslib_1 = require("tslib");
11
+ const path_1 = (0, tslib_1.__importDefault)(require("path"));
12
+ const fs_extra_1 = (0, tslib_1.__importDefault)(require("fs-extra"));
13
13
  const lodash_1 = require("lodash");
14
14
  const utils_1 = require("@docusaurus/utils");
15
15
  const utils_validation_1 = require("@docusaurus/utils-validation");
16
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
16
+ const chalk_1 = (0, tslib_1.__importDefault)(require("chalk"));
17
17
  const TranslationFileContentSchema = utils_validation_1.Joi.object()
18
18
  .pattern(utils_validation_1.Joi.string(), utils_validation_1.Joi.object({
19
19
  message: utils_validation_1.Joi.string().allow('').required(),
@@ -44,7 +44,7 @@ async function readTranslationFileContent(filePath) {
44
44
  exports.readTranslationFileContent = readTranslationFileContent;
45
45
  function mergeTranslationFileContent({ existingContent = {}, newContent, options, }) {
46
46
  // Apply messagePrefix to all messages
47
- const newContentTransformed = lodash_1.mapValues(newContent, (value) => {
47
+ const newContentTransformed = (0, lodash_1.mapValues)(newContent, (value) => {
48
48
  var _a;
49
49
  return ({
50
50
  ...value,
@@ -68,7 +68,7 @@ function mergeTranslationFileContent({ existingContent = {}, newContent, options
68
68
  async function writeTranslationFileContent({ filePath, content: newContent, options = {}, }) {
69
69
  const existingContent = await readTranslationFileContent(filePath);
70
70
  // Warn about potential legacy keys
71
- const unknownKeys = lodash_1.difference(Object.keys(existingContent !== null && existingContent !== void 0 ? existingContent : {}), Object.keys(newContent));
71
+ const unknownKeys = (0, lodash_1.difference)(Object.keys(existingContent !== null && existingContent !== void 0 ? existingContent : {}), Object.keys(newContent));
72
72
  if (unknownKeys.length > 0) {
73
73
  console.warn(chalk_1.default.yellow(`Some translation keys looks unknown to us in file ${filePath}
74
74
  Maybe you should remove them?
@@ -83,7 +83,7 @@ Maybe you should remove them?
83
83
  if (Object.keys(mergedContent).length > 0) {
84
84
  console.log(`${Object.keys(mergedContent)
85
85
  .length.toString()
86
- .padStart(3, ' ')} translations will be written at "${utils_1.toMessageRelativeFilePath(filePath)}".`);
86
+ .padStart(3, ' ')} translations will be written at "${(0, utils_1.toMessageRelativeFilePath)(filePath)}".`);
87
87
  await fs_extra_1.default.ensureDir(path_1.default.dirname(filePath));
88
88
  await fs_extra_1.default.writeFile(filePath, JSON.stringify(mergedContent, null, 2));
89
89
  }
@@ -124,7 +124,7 @@ function addTranslationFileExtension(translationFilePath) {
124
124
  return `${translationFilePath}.json`;
125
125
  }
126
126
  function getPluginTranslationFilePath({ siteDir, plugin, locale, translationFilePath, }) {
127
- const dirPath = utils_1.getPluginI18nPath({
127
+ const dirPath = (0, utils_1.getPluginI18nPath)({
128
128
  siteDir,
129
129
  locale,
130
130
  pluginName: plugin.name,
@@ -172,25 +172,23 @@ async function localizePluginTranslationFile({ siteDir, plugin, locale, translat
172
172
  exports.localizePluginTranslationFile = localizePluginTranslationFile;
173
173
  async function getPluginsDefaultCodeTranslationMessages(plugins) {
174
174
  const pluginsMessages = await Promise.all(plugins.map((plugin) => { var _a, _b; return (_b = (_a = plugin.getDefaultCodeTranslationMessages) === null || _a === void 0 ? void 0 : _a.call(plugin)) !== null && _b !== void 0 ? _b : {}; }));
175
- return pluginsMessages.reduce((allMessages, pluginMessages) => {
176
- return { ...allMessages, ...pluginMessages };
177
- }, {});
175
+ return pluginsMessages.reduce((allMessages, pluginMessages) => ({ ...allMessages, ...pluginMessages }), {});
178
176
  }
179
177
  exports.getPluginsDefaultCodeTranslationMessages = getPluginsDefaultCodeTranslationMessages;
180
178
  function applyDefaultCodeTranslations({ extractedCodeTranslations, defaultCodeMessages, }) {
181
- const unusedDefaultCodeMessages = lodash_1.difference(Object.keys(defaultCodeMessages), Object.keys(extractedCodeTranslations));
179
+ const unusedDefaultCodeMessages = (0, lodash_1.difference)(Object.keys(defaultCodeMessages), Object.keys(extractedCodeTranslations));
182
180
  if (unusedDefaultCodeMessages.length > 0) {
183
181
  console.warn(chalk_1.default.yellow(`Unused default message codes found.
184
182
  Please report this Docusaurus issue.
185
183
  - ${unusedDefaultCodeMessages.join('\n- ')}
186
184
  `));
187
185
  }
188
- return lodash_1.mapValues(extractedCodeTranslations, (messageTranslation, messageId) => {
186
+ return (0, lodash_1.mapValues)(extractedCodeTranslations, (messageTranslation, messageId) => {
189
187
  var _a;
190
- return {
188
+ return ({
191
189
  ...messageTranslation,
192
190
  message: (_a = defaultCodeMessages[messageId]) !== null && _a !== void 0 ? _a : messageTranslation.message,
193
- };
191
+ });
194
192
  });
195
193
  }
196
194
  exports.applyDefaultCodeTranslations = applyDefaultCodeTranslations;
@@ -1,8 +1,13 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
1
7
  import { TransformOptions } from '@babel/core';
2
- import { TranslationFileContent, TranslationMessage } from '@docusaurus/types';
3
- import { InitPlugin } from '../plugins/init';
8
+ import { InitializedPlugin, TranslationFileContent, TranslationMessage } from '@docusaurus/types';
4
9
  export declare function globSourceCodeFilePaths(dirPaths: string[]): Promise<string[]>;
5
- export declare function extractSiteSourceCodeTranslations(siteDir: string, plugins: InitPlugin[], babelOptions: TransformOptions): Promise<TranslationFileContent>;
10
+ export declare function extractSiteSourceCodeTranslations(siteDir: string, plugins: InitializedPlugin[], babelOptions: TransformOptions, extraSourceCodeFilePaths?: string[]): Promise<TranslationFileContent>;
6
11
  declare type SourceCodeFileTranslations = {
7
12
  sourceCodeFilePath: string;
8
13
  translations: Record<string, TranslationMessage>;