diff --git a/packages/cli/src/lib/bundler/discover.ts b/packages/cli/src/lib/bundler/discover.ts index 6f85210f80..5db8517f32 100644 --- a/packages/cli/src/lib/bundler/discover.ts +++ b/packages/cli/src/lib/bundler/discover.ts @@ -18,13 +18,30 @@ import { BackstagePackageJson } from '@backstage/cli-node'; import { Config } from '@backstage/config'; import fs from 'fs-extra'; import path from 'path'; +import chokidar from 'chokidar'; import { paths as cliPaths } from '../../lib/paths'; import { BundlingPathsOptions, resolveBundlingPaths } from './paths'; -type Options = { config: Config } & BundlingPathsOptions; +type Options = { config: Config; watch: () => void } & BundlingPathsOptions; -export async function writeDetectedPluginsModule(options: Options) { +export async function buildDetectedPlugins(options: Options) { + const { entry, targetDir } = options; + const { targetPackageJson } = resolveBundlingPaths({ entry, targetDir }); + + if (!!options.watch) { + const watcher = chokidar.watch(targetPackageJson); + + watcher.on('change', async () => { + await writeDetectedPluginsModule(options); + options.watch(); + }); + } + + await writeDetectedPluginsModule(options); +} + +async function writeDetectedPluginsModule(options: Options) { const requirePackageScript = (await detectPlugins(options)) ?.map(pkg => `{name: '${pkg}', module: require('${pkg}')}`) .join(','); diff --git a/packages/cli/src/lib/bundler/server.ts b/packages/cli/src/lib/bundler/server.ts index a726d04ba8..038d27ed56 100644 --- a/packages/cli/src/lib/bundler/server.ts +++ b/packages/cli/src/lib/bundler/server.ts @@ -31,7 +31,7 @@ import { paths as libPaths } from '../../lib/paths'; import { loadCliConfig } from '../config'; import { Lockfile } from '../versioning'; import { createConfig, resolveBaseUrl } from './config'; -import { writeDetectedPluginsModule } from './discover'; +import { buildDetectedPlugins } from './discover'; import { resolveBundlingPaths } from './paths'; import { ServeOptions } from './types'; @@ -131,10 +131,13 @@ export async function serveBundle(options: ServeOptions) { }, }); - await writeDetectedPluginsModule({ + await buildDetectedPlugins({ config: fullConfig, entry: options.entry, targetDir: options.targetDir, + watch() { + server?.invalidate(); + }, }); const compiler = webpack(config);