From 215e47b82bf676a3f860d2ed297afc9b1b696dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Maisse?= Date: Mon, 23 Nov 2020 20:40:51 +0100 Subject: [PATCH 1/2] fix: ensure `public` cache directory exist before writing files in it --- lib/core/src/server/build-dev.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/core/src/server/build-dev.ts b/lib/core/src/server/build-dev.ts index 21271fc5178f..969a79e915f8 100644 --- a/lib/core/src/server/build-dev.ts +++ b/lib/core/src/server/build-dev.ts @@ -25,11 +25,9 @@ const cache = Cache({ }); const writeStats = async (name: string, stats: Stats) => { - await fs.writeFile( - resolvePathInStorybookCache(`public/${name}-stats.json`), - JSON.stringify(stats.toJson(), null, 2), - 'utf8' - ); + const statsFilePath = resolvePathInStorybookCache(`public/${name}-stats.json`); + await fs.ensureFile(statsFilePath); + await fs.writeFile(statsFilePath, JSON.stringify(stats.toJson(), null, 2), 'utf8'); }; const getFreePort = (port: number) => From 676bda6e8a9547e2c417a0ac525dc6758b765cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Maisse?= Date: Mon, 23 Nov 2020 20:43:28 +0100 Subject: [PATCH 2/2] fix: handle cases where there is no stats to write for the manager Also strengthen the checks for the preview part and improve types. --- lib/core/src/server/build-dev.ts | 10 ++++++---- lib/core/src/server/dev-server.ts | 4 ++-- lib/core/src/server/types.ts | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/core/src/server/build-dev.ts b/lib/core/src/server/build-dev.ts index 969a79e915f8..b27d3a72c46f 100644 --- a/lib/core/src/server/build-dev.ts +++ b/lib/core/src/server/build-dev.ts @@ -218,11 +218,13 @@ function outputStartupInformation(options: { ); } -async function outputStats(previewStats: Stats, managerStats: Stats) { +async function outputStats(previewStats: Stats | undefined, managerStats: Stats | undefined) { if (previewStats) { await writeStats('preview', previewStats); } - await writeStats('manager', managerStats); + if (managerStats) { + await writeStats('manager', managerStats); + } logger.info( `stats written to => ${chalk.cyan(resolvePathInStorybookCache('public/[name].json'))}` ); @@ -282,9 +284,9 @@ export async function buildDevStandalone( if (options.smokeTest) { await outputStats(previewStats, managerStats); - const managerWarnings = (managerStats as any).toJson().warnings.length > 0; + const managerWarnings = !!managerStats && managerStats.toJson().warnings.length > 0; const previewWarnings = - !options.ignorePreview && (previewStats as any).toJson().warnings.length > 0; + !options.ignorePreview && !!previewStats && previewStats.toJson().warnings.length > 0; process.exit(managerWarnings || previewWarnings ? 1 : 0); return; } diff --git a/lib/core/src/server/dev-server.ts b/lib/core/src/server/dev-server.ts index 267bfebba3e9..49e69f2fb2d7 100644 --- a/lib/core/src/server/dev-server.ts +++ b/lib/core/src/server/dev-server.ts @@ -258,7 +258,7 @@ const startManager = async ({ } if (!managerConfig) { - return { managerStats: {}, managerTotalTime: [0, 0] } as ManagerResult; + return { managerTotalTime: [0, 0] }; } const compiler = webpack(managerConfig); @@ -311,7 +311,7 @@ const startPreview = async ({ outputDir, }: any): Promise => { if (options.ignorePreview) { - return { previewStats: {}, previewTotalTime: [0, 0] } as PreviewResult; + return { previewTotalTime: [0, 0] }; } const previewConfig = await loadConfig({ diff --git a/lib/core/src/server/types.ts b/lib/core/src/server/types.ts index 6993a9dd0dbf..bebd3ef1c2a4 100644 --- a/lib/core/src/server/types.ts +++ b/lib/core/src/server/types.ts @@ -94,12 +94,12 @@ export interface ReleaseNotesData { } export interface PreviewResult { - previewStats: Stats; + previewStats?: Stats; previewTotalTime: [number, number]; } export interface ManagerResult { - managerStats: Stats; + managerStats?: Stats; managerTotalTime: [number, number]; }