@docusaurus/core 0.0.0-6109 → 0.0.0-6111

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.
@@ -5,5 +5,5 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
  import type { AppRenderer } from '../common';
8
- declare const render: AppRenderer;
8
+ declare const render: AppRenderer['render'];
9
9
  export default render;
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { type LoadContextParams } from '../server/site';
7
+ import { type LoadContextParams } from '../../server/site';
8
8
  export type BuildCLIOptions = Pick<LoadContextParams, 'config' | 'locale' | 'outDir'> & {
9
9
  bundleAnalyzer?: boolean;
10
10
  minify?: boolean;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Facebook, Inc. and its affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.build = build;
10
+ const tslib_1 = require("tslib");
11
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
12
+ const logger_1 = tslib_1.__importStar(require("@docusaurus/logger"));
13
+ const utils_1 = require("@docusaurus/utils");
14
+ const site_1 = require("../../server/site");
15
+ const i18n_1 = require("../../server/i18n");
16
+ const buildLocale_1 = require("./buildLocale");
17
+ async function build(siteDirParam = '.', cliOptions = {}) {
18
+ process.env.BABEL_ENV = 'production';
19
+ process.env.NODE_ENV = 'production';
20
+ process.env.DOCUSAURUS_CURRENT_LOCALE = cliOptions.locale;
21
+ if (cliOptions.dev) {
22
+ logger_1.default.info `Building in dev mode`;
23
+ process.env.BABEL_ENV = 'development';
24
+ process.env.NODE_ENV = 'development';
25
+ }
26
+ const siteDir = await fs_extra_1.default.realpath(siteDirParam);
27
+ ['SIGINT', 'SIGTERM'].forEach((sig) => {
28
+ process.on(sig, () => process.exit());
29
+ });
30
+ const locales = await logger_1.PerfLogger.async('Get locales to build', () => getLocalesToBuild({ siteDir, cliOptions }));
31
+ if (locales.length > 1) {
32
+ logger_1.default.info `Website will be built for all these locales: ${locales}`;
33
+ }
34
+ await logger_1.PerfLogger.async(`Build`, () => (0, utils_1.mapAsyncSequential)(locales, async (locale) => {
35
+ await tryToBuildLocale({ siteDir, locale, cliOptions });
36
+ }));
37
+ logger_1.default.info `Use code=${'npm run serve'} command to test your build locally.`;
38
+ }
39
+ async function getLocalesToBuild({ siteDir, cliOptions, }) {
40
+ if (cliOptions.locale) {
41
+ return [cliOptions.locale];
42
+ }
43
+ const context = await (0, site_1.loadContext)({
44
+ siteDir,
45
+ outDir: cliOptions.outDir,
46
+ config: cliOptions.config,
47
+ locale: cliOptions.locale,
48
+ localizePath: cliOptions.locale ? false : undefined,
49
+ });
50
+ const i18n = await (0, i18n_1.loadI18n)(context.siteConfig, {
51
+ locale: cliOptions.locale,
52
+ });
53
+ if (i18n.locales.length > 1) {
54
+ logger_1.default.info `Website will be built for all these locales: ${i18n.locales}`;
55
+ }
56
+ // We need the default locale to always be the 1st in the list. If we build it
57
+ // last, it would "erase" the localized sites built in sub-folders
58
+ return [
59
+ i18n.defaultLocale,
60
+ ...i18n.locales.filter((locale) => locale !== i18n.defaultLocale),
61
+ ];
62
+ }
63
+ async function tryToBuildLocale(params) {
64
+ try {
65
+ await logger_1.PerfLogger.async(`${logger_1.default.name(params.locale)}`, async () => {
66
+ // Note: I tried to run buildLocale in worker_threads (still sequentially)
67
+ // It didn't work and I got SIGSEGV / SIGBUS errors
68
+ // See https://x.com/sebastienlorber/status/1848413716372480338
69
+ await runBuildLocaleTask(params);
70
+ });
71
+ }
72
+ catch (err) {
73
+ throw new Error(logger_1.default.interpolate `Unable to build website for locale name=${params.locale}.`, {
74
+ cause: err,
75
+ });
76
+ }
77
+ }
78
+ async function runBuildLocaleTask(params) {
79
+ // Note: I tried to run buildLocale task in worker_threads (sequentially)
80
+ // It didn't work and I got SIGSEGV / SIGBUS errors
81
+ // Goal was to isolate memory of each localized site build
82
+ // See also https://x.com/sebastienlorber/status/1848413716372480338
83
+ //
84
+ // Running in child_process worked but is more complex and requires
85
+ // specifying the memory of the child process + weird logging issues to fix
86
+ //
87
+ // Note in the future we could try to enable concurrent localized site builds
88
+ await (0, buildLocale_1.buildLocale)(params);
89
+ }
@@ -0,0 +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
+ */
7
+ import { BuildCLIOptions } from './build';
8
+ export type BuildLocaleParams = {
9
+ siteDir: string;
10
+ locale: string;
11
+ cliOptions: Partial<BuildCLIOptions>;
12
+ };
13
+ export declare function buildLocale({ siteDir, locale, cliOptions, }: BuildLocaleParams): Promise<void>;
@@ -6,81 +6,19 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.build = build;
9
+ exports.buildLocale = buildLocale;
10
10
  const tslib_1 = require("tslib");
11
11
  const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
12
12
  const path_1 = tslib_1.__importDefault(require("path"));
13
13
  const lodash_1 = tslib_1.__importDefault(require("lodash"));
14
14
  const bundler_1 = require("@docusaurus/bundler");
15
15
  const logger_1 = tslib_1.__importStar(require("@docusaurus/logger"));
16
- const utils_1 = require("@docusaurus/utils");
17
- const site_1 = require("../server/site");
18
- const brokenLinks_1 = require("../server/brokenLinks");
19
- const client_1 = require("../webpack/client");
20
- const server_1 = tslib_1.__importDefault(require("../webpack/server"));
21
- const configure_1 = require("../webpack/configure");
22
- const i18n_1 = require("../server/i18n");
23
- const ssgExecutor_1 = require("../ssg/ssgExecutor");
24
- async function build(siteDirParam = '.', cliOptions = {}) {
25
- process.env.BABEL_ENV = 'production';
26
- process.env.NODE_ENV = 'production';
27
- process.env.DOCUSAURUS_CURRENT_LOCALE = cliOptions.locale;
28
- if (cliOptions.dev) {
29
- logger_1.default.info `Building in dev mode`;
30
- process.env.BABEL_ENV = 'development';
31
- process.env.NODE_ENV = 'development';
32
- }
33
- const siteDir = await fs_extra_1.default.realpath(siteDirParam);
34
- ['SIGINT', 'SIGTERM'].forEach((sig) => {
35
- process.on(sig, () => process.exit());
36
- });
37
- async function tryToBuildLocale({ locale }) {
38
- try {
39
- await logger_1.PerfLogger.async(`${logger_1.default.name(locale)}`, () => buildLocale({
40
- siteDir,
41
- locale,
42
- cliOptions,
43
- }));
44
- }
45
- catch (err) {
46
- throw new Error(logger_1.default.interpolate `Unable to build website for locale name=${locale}.`, {
47
- cause: err,
48
- });
49
- }
50
- }
51
- const locales = await logger_1.PerfLogger.async('Get locales to build', () => getLocalesToBuild({ siteDir, cliOptions }));
52
- if (locales.length > 1) {
53
- logger_1.default.info `Website will be built for all these locales: ${locales}`;
54
- }
55
- await logger_1.PerfLogger.async(`Build`, () => (0, utils_1.mapAsyncSequential)(locales, async (locale) => {
56
- await tryToBuildLocale({ locale });
57
- }));
58
- logger_1.default.info `Use code=${'npm run serve'} command to test your build locally.`;
59
- }
60
- async function getLocalesToBuild({ siteDir, cliOptions, }) {
61
- if (cliOptions.locale) {
62
- return [cliOptions.locale];
63
- }
64
- const context = await (0, site_1.loadContext)({
65
- siteDir,
66
- outDir: cliOptions.outDir,
67
- config: cliOptions.config,
68
- locale: cliOptions.locale,
69
- localizePath: cliOptions.locale ? false : undefined,
70
- });
71
- const i18n = await (0, i18n_1.loadI18n)(context.siteConfig, {
72
- locale: cliOptions.locale,
73
- });
74
- if (i18n.locales.length > 1) {
75
- logger_1.default.info `Website will be built for all these locales: ${i18n.locales}`;
76
- }
77
- // We need the default locale to always be the 1st in the list. If we build it
78
- // last, it would "erase" the localized sites built in sub-folders
79
- return [
80
- i18n.defaultLocale,
81
- ...i18n.locales.filter((locale) => locale !== i18n.defaultLocale),
82
- ];
83
- }
16
+ const site_1 = require("../../server/site");
17
+ const brokenLinks_1 = require("../../server/brokenLinks");
18
+ const client_1 = require("../../webpack/client");
19
+ const server_1 = tslib_1.__importDefault(require("../../webpack/server"));
20
+ const configure_1 = require("../../webpack/configure");
21
+ const ssgExecutor_1 = require("../../ssg/ssgExecutor");
84
22
  async function buildLocale({ siteDir, locale, cliOptions, }) {
85
23
  // Temporary workaround to unlock the ability to translate the site config
86
24
  // We'll remove it if a better official API can be designed
@@ -15,7 +15,7 @@ const logger_1 = tslib_1.__importDefault(require("@docusaurus/logger"));
15
15
  const shelljs_1 = tslib_1.__importDefault(require("shelljs"));
16
16
  const utils_1 = require("@docusaurus/utils");
17
17
  const site_1 = require("../server/site");
18
- const build_1 = require("./build");
18
+ const build_1 = require("./build/build");
19
19
  // GIT_PASS env variable should not appear in logs
20
20
  function obfuscateGitPass(str) {
21
21
  const gitPass = process.env.GIT_PASS;
@@ -17,7 +17,7 @@ const serve_handler_1 = tslib_1.__importDefault(require("serve-handler"));
17
17
  const openBrowser_1 = tslib_1.__importDefault(require("react-dev-utils/openBrowser"));
18
18
  const utils_common_1 = require("@docusaurus/utils-common");
19
19
  const config_1 = require("../server/config");
20
- const build_1 = require("./build");
20
+ const build_1 = require("./build/build");
21
21
  const getHostPort_1 = require("../server/getHostPort");
22
22
  function redirect(res, location) {
23
23
  res.writeHead(302, {
package/lib/index.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- export { build } from './commands/build';
7
+ export { build } from './commands/build/build';
8
8
  export { clear } from './commands/clear';
9
9
  export { deploy } from './commands/deploy';
10
10
  export { externalCommand } from './commands/external';
package/lib/index.js CHANGED
@@ -7,7 +7,7 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.writeTranslations = exports.writeHeadingIds = exports.swizzle = exports.start = exports.serve = exports.externalCommand = exports.deploy = exports.clear = exports.build = void 0;
10
- var build_1 = require("./commands/build");
10
+ var build_1 = require("./commands/build/build");
11
11
  Object.defineProperty(exports, "build", { enumerable: true, get: function () { return build_1.build; } });
12
12
  var clear_1 = require("./commands/clear");
13
13
  Object.defineProperty(exports, "clear", { enumerable: true, get: function () { return clear_1.clear; } });
package/lib/ssg/ssg.js CHANGED
@@ -11,19 +11,22 @@ exports.printSSGWarnings = printSSGWarnings;
11
11
  exports.generateStaticFiles = generateStaticFiles;
12
12
  const tslib_1 = require("tslib");
13
13
  const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
14
- const module_1 = require("module");
15
14
  const path_1 = tslib_1.__importDefault(require("path"));
16
15
  const lodash_1 = tslib_1.__importDefault(require("lodash"));
16
+ // TODO eval is archived / unmaintained: https://github.com/pierrec/node-eval
17
+ // We should internalize/modernize it
17
18
  const eval_1 = tslib_1.__importDefault(require("eval"));
18
19
  const p_map_1 = tslib_1.__importDefault(require("p-map"));
19
20
  const logger_1 = tslib_1.__importStar(require("@docusaurus/logger"));
20
21
  const bundler_1 = require("@docusaurus/bundler");
21
22
  const ssgTemplate_1 = require("./ssgTemplate");
22
23
  const ssgUtils_1 = require("./ssgUtils");
24
+ const ssgNodeRequire_1 = require("./ssgNodeRequire");
23
25
  async function loadAppRenderer({ serverBundlePath, }) {
24
26
  const source = await logger_1.PerfLogger.async(`Load server bundle`, () => fs_extra_1.default.readFile(serverBundlePath));
25
27
  logger_1.PerfLogger.log(`Server bundle size = ${(source.length / 1024000).toFixed(3)} MB`);
26
28
  const filename = path_1.default.basename(serverBundlePath);
29
+ const ssgRequire = (0, ssgNodeRequire_1.createSSGRequire)(serverBundlePath);
27
30
  const globals = {
28
31
  // When using "new URL('file.js', import.meta.url)", Webpack will emit
29
32
  // __filename, and this plugin will throw. not sure the __filename value
@@ -32,7 +35,7 @@ async function loadAppRenderer({ serverBundlePath, }) {
32
35
  __filename: '',
33
36
  // This uses module.createRequire() instead of very old "require-like" lib
34
37
  // See also: https://github.com/pierrec/node-eval/issues/33
35
- require: (0, module_1.createRequire)(serverBundlePath),
38
+ require: ssgRequire.require,
36
39
  };
37
40
  const serverEntry = await logger_1.PerfLogger.async(`Evaluate server bundle`, () => (0, eval_1.default)(source,
38
41
  /* filename: */ filename,
@@ -41,7 +44,13 @@ async function loadAppRenderer({ serverBundlePath, }) {
41
44
  if (!serverEntry?.default || typeof serverEntry.default !== 'function') {
42
45
  throw new Error(`Server bundle export from "${filename}" must be a function that renders the Docusaurus React app.`);
43
46
  }
44
- return serverEntry.default;
47
+ async function shutdown() {
48
+ ssgRequire.cleanup();
49
+ }
50
+ return {
51
+ render: serverEntry.default,
52
+ shutdown,
53
+ };
45
54
  }
46
55
  function printSSGWarnings(results) {
47
56
  // Escape hatch because SWC is quite aggressive to report errors
@@ -108,6 +117,7 @@ async function generateStaticFiles({ pathnames, params, }) {
108
117
  error: error,
109
118
  warnings: [],
110
119
  })), { concurrency: ssgUtils_1.SSGConcurrency });
120
+ await renderer.shutdown();
111
121
  printSSGWarnings(results);
112
122
  const [allSSGErrors, allSSGSuccesses] = lodash_1.default.partition(results, (result) => !!result.error);
113
123
  if (allSSGErrors.length > 0) {
@@ -129,7 +139,7 @@ async function generateStaticFiles({ pathnames, params, }) {
129
139
  async function generateStaticFile({ pathname, renderer, params, htmlMinifier, ssgTemplate, }) {
130
140
  try {
131
141
  // This only renders the app HTML
132
- const result = await renderer({
142
+ const result = await renderer.render({
133
143
  pathname,
134
144
  });
135
145
  // This renders the full page HTML, including head tags...
@@ -0,0 +1,11 @@
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
+ export type SSGNodeRequire = {
8
+ require: NodeJS.Require;
9
+ cleanup: () => void;
10
+ };
11
+ export declare function createSSGRequire(serverBundlePath: string): SSGNodeRequire;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Facebook, Inc. and its affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createSSGRequire = createSSGRequire;
10
+ const module_1 = require("module");
11
+ // The eval/vm.Script used for running the server bundle need a require() impl
12
+ // This impl has to be relative to the server bundler path
13
+ // This enables the server bundle to resolve relative paths such as:
14
+ // - require('./assets/js/some-chunk.123456.js')
15
+ //
16
+ // Unfortunately, Node.js vm.Script doesn't isolate memory / require.cache
17
+ // This means that if we build multiple Docusaurus localized sites in a row
18
+ // The Node.js require cache will keep growing and retain in memory the JS
19
+ // assets of the former SSG builds
20
+ // We have to clean up the node require cache manually to avoid leaking memory!
21
+ // See also https://x.com/sebastienlorber/status/1848399310116831702
22
+ function createSSGRequire(serverBundlePath) {
23
+ const realRequire = (0, module_1.createRequire)(serverBundlePath);
24
+ const allRequiredIds = [];
25
+ const ssgRequireFunction = (id) => {
26
+ const module = realRequire(id);
27
+ allRequiredIds.push(id);
28
+ return module;
29
+ };
30
+ const cleanup = () => {
31
+ allRequiredIds.forEach((id) => {
32
+ delete realRequire.cache[realRequire.resolve(id)];
33
+ });
34
+ };
35
+ ssgRequireFunction.resolve = realRequire.resolve;
36
+ ssgRequireFunction.cache = realRequire.cache;
37
+ ssgRequireFunction.extensions = realRequire.extensions;
38
+ ssgRequireFunction.main = realRequire.main;
39
+ return { require: ssgRequireFunction, cleanup };
40
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@docusaurus/core",
3
3
  "description": "Easy to Maintain Open Source Documentation Websites",
4
- "version": "0.0.0-6109",
4
+ "version": "0.0.0-6111",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -33,13 +33,13 @@
33
33
  "url": "https://github.com/facebook/docusaurus/issues"
34
34
  },
35
35
  "dependencies": {
36
- "@docusaurus/babel": "0.0.0-6109",
37
- "@docusaurus/bundler": "0.0.0-6109",
38
- "@docusaurus/logger": "0.0.0-6109",
39
- "@docusaurus/mdx-loader": "0.0.0-6109",
40
- "@docusaurus/utils": "0.0.0-6109",
41
- "@docusaurus/utils-common": "0.0.0-6109",
42
- "@docusaurus/utils-validation": "0.0.0-6109",
36
+ "@docusaurus/babel": "0.0.0-6111",
37
+ "@docusaurus/bundler": "0.0.0-6111",
38
+ "@docusaurus/logger": "0.0.0-6111",
39
+ "@docusaurus/mdx-loader": "0.0.0-6111",
40
+ "@docusaurus/utils": "0.0.0-6111",
41
+ "@docusaurus/utils-common": "0.0.0-6111",
42
+ "@docusaurus/utils-validation": "0.0.0-6111",
43
43
  "boxen": "^6.2.1",
44
44
  "chalk": "^4.1.2",
45
45
  "chokidar": "^3.5.3",
@@ -78,8 +78,8 @@
78
78
  "webpack-merge": "^6.0.1"
79
79
  },
80
80
  "devDependencies": {
81
- "@docusaurus/module-type-aliases": "0.0.0-6109",
82
- "@docusaurus/types": "0.0.0-6109",
81
+ "@docusaurus/module-type-aliases": "0.0.0-6111",
82
+ "@docusaurus/types": "0.0.0-6111",
83
83
  "@total-typescript/shoehorn": "^0.1.2",
84
84
  "@types/detect-port": "^1.3.3",
85
85
  "@types/react-dom": "^18.2.7",
@@ -100,5 +100,5 @@
100
100
  "engines": {
101
101
  "node": ">=18.0"
102
102
  },
103
- "gitHead": "d1f5cd6af4cb380de04e370bdf94781615cecd58"
103
+ "gitHead": "d55731cf6fb644eab1a129d60d7f31c12adc81bd"
104
104
  }