From 08804c361ccc0e05b6daedd704ce78401fd5ab0e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 26 Jan 2024 18:18:54 +0100 Subject: [PATCH] cli: fix module discovery race Signed-off-by: Patrik Oldsberg --- .changeset/two-geese-explain.md | 5 +++++ packages/cli/package.json | 1 + .../cli/src/lib/bundler/packageDetection.ts | 18 ++++++++++++------ yarn.lock | 1 + 4 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 .changeset/two-geese-explain.md diff --git a/.changeset/two-geese-explain.md b/.changeset/two-geese-explain.md new file mode 100644 index 0000000000..12ae307cfe --- /dev/null +++ b/.changeset/two-geese-explain.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Fixed an issue that would cause an invalid `__backstage-autodetected-plugins__.js` to be written when using experimental module discovery. diff --git a/packages/cli/package.json b/packages/cli/package.json index 5ca7d675d3..96dc2e5db8 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -112,6 +112,7 @@ "node-libs-browser": "^2.2.1", "npm-packlist": "^5.0.0", "ora": "^5.3.0", + "p-queue": "^6.6.2", "postcss": "^8.1.0", "process": "^0.11.10", "react-dev-utils": "^12.0.0-next.60", diff --git a/packages/cli/src/lib/bundler/packageDetection.ts b/packages/cli/src/lib/bundler/packageDetection.ts index 3aa0955c06..0c357fe79e 100644 --- a/packages/cli/src/lib/bundler/packageDetection.ts +++ b/packages/cli/src/lib/bundler/packageDetection.ts @@ -18,6 +18,7 @@ import { BackstagePackageJson } from '@backstage/cli-node'; import { Config, ConfigReader } from '@backstage/config'; import chokidar from 'chokidar'; import fs from 'fs-extra'; +import PQueue from 'p-queue'; import { join as joinPath, resolve as resolvePath } from 'path'; import { paths as cliPaths } from '../paths'; @@ -104,6 +105,9 @@ async function detectPackages( }); } +// Make sure we're not issuing multiple writes at the same time, which can cause partial overwrites +const writeQueue = new PQueue({ concurrency: 1 }); + async function writeDetectedPackagesModule( pkgs: { name: string; export?: string; import: string }[], ) { @@ -116,13 +120,15 @@ async function writeDetectedPackagesModule( ) .join(','); - await fs.writeFile( - joinPath( - cliPaths.targetRoot, - 'node_modules', - `${DETECTED_MODULES_MODULE_NAME}.js`, + await writeQueue.add(() => + fs.writeFile( + joinPath( + cliPaths.targetRoot, + 'node_modules', + `${DETECTED_MODULES_MODULE_NAME}.js`, + ), + `window['__@backstage/discovered__'] = { modules: [${requirePackageScript}] };`, ), - `window['__@backstage/discovered__'] = { modules: [${requirePackageScript}] };`, ); } diff --git a/yarn.lock b/yarn.lock index 1c83813e10..ad55841387 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3649,6 +3649,7 @@ __metadata: nodemon: ^3.0.1 npm-packlist: ^5.0.0 ora: ^5.3.0 + p-queue: ^6.6.2 postcss: ^8.1.0 process: ^0.11.10 react-dev-utils: ^12.0.0-next.60