Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions code/builders/builder-vite/src/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,13 @@ export async function build(options: Options) {

finalConfig.customLogger ??= await createViteLogger();

if (options.watch) {
finalConfig.build = {
...finalConfig.build,
watch: finalConfig.build?.watch ?? {},
};
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

await viteBuild(finalConfig);

const statsPlugin = findPlugin(
Expand Down
99 changes: 77 additions & 22 deletions code/builders/builder-webpack5/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -268,36 +268,91 @@ const builder: BuilderFunction = async function* builderGeneratorFn({ startTime,
}

const webpackCompilation = new Promise<Stats>((succeed, fail) => {
compiler.run((error, stats) => {
if (error) {
compiler.close(() => fail(new WebpackInvocationError({ error })));
return;
}
if (options.watch) {
let isFirstBuild = true;
let rebuildStartTime = startTime;
logger.info('Watching for changes...');
compiler.watch(config.watchOptions || {}, (error, stats) => {
const currentRebuildStart = rebuildStartTime;
rebuildStartTime = process.hrtime();
if (error) {
logger.error(error.message);
if (isFirstBuild) {
isFirstBuild = false;
fail(new WebpackInvocationError({ error }));
}
return;
}

if (!stats) {
throw new WebpackMissingStatsError();
}
if (!stats) {
if (isFirstBuild) {
isFirstBuild = false;
fail(new WebpackMissingStatsError());
}
return;
}

const { warnings, errors } = getWebpackStats({ config, stats });
const { warnings, errors } = getWebpackStats({ config, stats });

if (warnings.length > 0) {
warnings?.forEach((e) => logger.warn(e.message));
}
if (warnings.length > 0) {
warnings?.forEach((e) => logger.warn(e.message));
}

if (errors.length > 0) {
errors.forEach((e) => logger.error(e.message));
compiler.close(() => fail(new WebpackCompilationError({ errors })));
return;
}
if (errors.length > 0) {
errors.forEach((e) => logger.error(e.message));
if (isFirstBuild) {
isFirstBuild = false;
fail(new WebpackCompilationError({ errors }));
}
return;
}

compiler.close((closeErr) => {
if (closeErr) {
return fail(new WebpackInvocationError({ error: closeErr }));
if (isFirstBuild) {
isFirstBuild = false;
succeed(stats);
} else {
logger.info(`Rebuild completed in ${printDuration(currentRebuildStart)}`);
}
logger.info('Watching for changes...');
});
} else {
compiler.run((error, stats) => {
if (error) {
compiler.close(() => fail(new WebpackInvocationError({ error })));
return;
}

return succeed(stats as Stats);
if (!stats) {
compiler.close((closeErr) => {
if (closeErr) {
return fail(new WebpackInvocationError({ error: closeErr }));
}
return fail(new WebpackMissingStatsError());
});
return;
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

const { warnings, errors } = getWebpackStats({ config, stats });

if (warnings.length > 0) {
warnings?.forEach((e) => logger.warn(e.message));
}

if (errors.length > 0) {
errors.forEach((e) => logger.error(e.message));
compiler.close(() => fail(new WebpackCompilationError({ errors })));
return;
}

compiler.close((closeErr) => {
if (closeErr) {
return fail(new WebpackInvocationError({ error: closeErr }));
}

return succeed(stats as Stats);
});
});
});
}
});

const previewResolvedDir = join(corePath, 'dist/preview');
Expand Down
5 changes: 4 additions & 1 deletion code/core/src/bin/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ command('dev')
command('build')
.option('-o, --output-dir <dir-name>', 'Directory where to store built files')
.option('-c, --config-dir <dir-name>', 'Directory where to load Storybook configurations from')
.option('-w, --watch', 'Watch for changes and rebuild automatically')
.option('--quiet', 'Suppress verbose build output')
.option('--debug-webpack', 'Display final webpack configurations for debugging purposes')
.option(
Expand Down Expand Up @@ -188,7 +189,9 @@ command('build')
process.exit(1);
});

logger.outro('Storybook build completed successfully');
if (!options.watch) {
logger.outro('Storybook build completed successfully');
}
});

command('index')
Expand Down
2 changes: 2 additions & 0 deletions code/core/src/core-server/build-static.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,8 @@ export async function buildStaticStandalone(options: BuildStaticStandaloneOption

if (options.ignorePreview) {
logger.info(`Not building preview`);
} else if (options.watch) {
logger.info('Building preview in watch mode..');
} else {
logger.info('Building preview..');
}
Expand Down
1 change: 1 addition & 0 deletions code/core/src/types/modules/core-common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ export interface CLIOptions extends CLIBaseOptions {
statsJson?: string | boolean;
outputDir?: string;
previewOnly?: boolean;
watch?: boolean;
}

export interface BuilderOptions {
Expand Down