diff --git a/packages/core/admin/_internal/node/develop.ts b/packages/core/admin/_internal/node/develop.ts index 6934eab865..2387fcd690 100644 --- a/packages/core/admin/_internal/node/develop.ts +++ b/packages/core/admin/_internal/node/develop.ts @@ -85,7 +85,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, ...options }: DevelopOp EE.init(cwd); await writeStaticClientFiles(ctx); - await watchWebpack(ctx); + const webpackWatcher = await watchWebpack(ctx); const adminDuration = timer.end('creatingAdmin'); adminSpinner.text = `Creating admin (${adminDuration}ms)`; @@ -165,6 +165,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, ...options }: DevelopOp ); await watcher.close(); await strapiInstance.destroy(); + webpackWatcher.close(); process.send?.('killed'); break; } diff --git a/packages/core/admin/_internal/node/webpack/watch.ts b/packages/core/admin/_internal/node/webpack/watch.ts index 838ff4f2a2..cf87e67772 100644 --- a/packages/core/admin/_internal/node/webpack/watch.ts +++ b/packages/core/admin/_internal/node/webpack/watch.ts @@ -1,5 +1,6 @@ import os from 'node:os'; import path from 'node:path'; +import { promisify } from 'node:util'; import webpackDevMiddleware from 'webpack-dev-middleware'; import webpackHotMiddleware from 'webpack-hot-middleware'; import { webpack } from 'webpack'; @@ -7,13 +8,17 @@ import type { BuildContext } from '../createBuildContext'; import { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config'; import { Common } from '@strapi/types'; -const watch = async (ctx: BuildContext) => { +interface Closer { + close(): Promise; +} + +const watch = async (ctx: BuildContext): Promise => { const config = await resolveDevelopmentConfig(ctx); const finalConfig = await mergeConfigWithUserConfig(config, ctx); ctx.logger.debug('Final webpack config:', os.EOL, finalConfig); - return new Promise((res) => { + return new Promise((res) => { const compiler = webpack(finalConfig); const devMiddleware = webpackDevMiddleware(compiler); @@ -91,7 +96,15 @@ const watch = async (ctx: BuildContext) => { ]); devMiddleware.waitUntilValid(() => { - res(true); + res({ + async close() { + await Promise.all([ + promisify(devMiddleware.close.bind(devMiddleware))(), + hotMiddleware.close(), + promisify(compiler.close.bind(compiler))(), + ]); + }, + }); }); }); };