From 63ad9f3ba3616173552ea6578dd12593ae857354 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 7 Jul 2021 17:46:39 +0800 Subject: [PATCH] Merge pull request #15483 from storybookjs/fix/15227-storybook-hangs-on-angular Webpack5: Quit process after finishing a static build --- app/angular/src/server/build.ts | 11 ++++++++++- lib/builder-webpack5/src/index.ts | 23 +++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app/angular/src/server/build.ts b/app/angular/src/server/build.ts index d8abf06a4396..fe1ed4fb11e3 100644 --- a/app/angular/src/server/build.ts +++ b/app/angular/src/server/build.ts @@ -1,4 +1,13 @@ import { buildStatic } from '@storybook/core/server'; +import { logger } from '@storybook/node-logger'; import options from './options'; -buildStatic(options); +async function build() { + try { + await buildStatic(options); + } catch (error) { + logger.error(error); + } +} + +build(); diff --git a/lib/builder-webpack5/src/index.ts b/lib/builder-webpack5/src/index.ts index 9c19be3b15e8..a5b2ccfef910 100644 --- a/lib/builder-webpack5/src/index.ts +++ b/lib/builder-webpack5/src/index.ts @@ -121,14 +121,19 @@ export const build: WebpackBuilder['build'] = async ({ options, startTime }) => const config = await getConfig(options); return new Promise((succeed, fail) => { - webpackInstance(config).run((error, stats) => { + const compiler = webpackInstance(config); + + compiler.run((error, stats) => { if (error || !stats || stats.hasErrors()) { logger.error('=> Failed to build the preview'); process.exitCode = 1; if (error) { logger.error(error.message); - return fail(error); + + compiler.close(() => fail(error)); + + return; } if (stats && (stats.hasErrors() || stats.hasWarnings())) { @@ -137,7 +142,9 @@ export const build: WebpackBuilder['build'] = async ({ options, startTime }) => errors.forEach((e) => logger.error(e.message)); warnings.forEach((e) => logger.error(e.message)); - return fail(stats); + compiler.close(() => fail(stats)); + + return; } } @@ -146,7 +153,15 @@ export const build: WebpackBuilder['build'] = async ({ options, startTime }) => stats.toJson({ warnings: true }).warnings.forEach((e) => logger.warn(e.message)); } - return succeed(stats); + // https://webpack.js.org/api/node/#run + // #15227 + compiler.close((closeErr) => { + if (closeErr) { + return fail(closeErr); + } + + return succeed(stats); + }); }); }); };