From 9fa2fae3c297c369e1bc69a39205075f70415a95 Mon Sep 17 00:00:00 2001 From: Jack Palmer Date: Tue, 25 Jul 2023 12:09:10 +0100 Subject: [PATCH] feat: Add watching functionality to plugin detection Signed-off-by: Jack Palmer --- packages/cli/src/lib/bundler/discover.ts | 21 +++++++++++++++++++-- packages/cli/src/lib/bundler/server.ts | 7 +++++-- 2 files changed, 24 insertions(+), 4 deletions(-) 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);