From 53a1c427e4a2088312a653c37915cfc451bd52c8 Mon Sep 17 00:00:00 2001 From: Jack Hsu Date: Fri, 24 Feb 2023 10:54:08 -0500 Subject: [PATCH] fix(bundling): copy initial assets correctly in watch mode for esbuild (#15230) --- e2e/esbuild/src/esbuild.test.ts | 26 ++++++++++++++++++++++++++ packages/js/src/utils/assets/index.ts | 25 +++++++++++++------------ 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/e2e/esbuild/src/esbuild.test.ts b/e2e/esbuild/src/esbuild.test.ts index 9ff1bbdb0a54e..b2cdffa439776 100644 --- a/e2e/esbuild/src/esbuild.test.ts +++ b/e2e/esbuild/src/esbuild.test.ts @@ -13,6 +13,7 @@ import { packageInstall, rmDist, runCommandUntil, + waitUntil, } from '@nrwl/e2e/utils'; describe('EsBuild Plugin', () => { @@ -67,6 +68,31 @@ describe('EsBuild Plugin', () => { expect(() => runCLI(`build ${myPkg}`)).toThrow(); expect(() => runCLI(`build ${myPkg} --skipTypeCheck`)).not.toThrow(); expect(runCommand(`node dist/libs/${myPkg}/index.js`)).toMatch(/Bye/); + // Reset file + updateFile( + `libs/${myPkg}/src/index.ts`, + ` + console.log('Hello'); + ` + ); + + /* Test that watch mode copies assets on start, and again on update. + */ + updateFile(`libs/${myPkg}/assets/a.md`, 'initial a'); + const watchProcess = await runCommandUntil( + `build ${myPkg} --watch`, + (output) => { + return output.includes('watching for changes'); + } + ); + readFile(`dist/libs/${myPkg}/assets/a.md`).includes('initial a'); + updateFile(`libs/${myPkg}/assets/a.md`, 'updated a'); + await expect( + waitUntil(() => + readFile(`dist/libs/${myPkg}/assets/a.md`).includes('updated a') + ) + ).resolves.not.toThrow(); + watchProcess.kill(); }, 300_000); it('should support bundling everything or only workspace libs', async () => { diff --git a/packages/js/src/utils/assets/index.ts b/packages/js/src/utils/assets/index.ts index a18aabd2c3ce3..25af25db32f7d 100644 --- a/packages/js/src/utils/assets/index.ts +++ b/packages/js/src/utils/assets/index.ts @@ -31,18 +31,19 @@ export async function copyAssets( callback: typeof options?.watch === 'object' ? options.watch.onCopy : undefined, }); + const result: CopyAssetsResult = { + success: true, + }; + if (options.watch) { - const dispose = await assetHandler.watchAndProcessOnAssetChange(); - return { - success: true, - stop: dispose, - }; - } else { - try { - await assetHandler.processAllAssetsOnce(); - } catch { - return { success: false }; - } - return { success: true }; + result.stop = await assetHandler.watchAndProcessOnAssetChange(); + } + + try { + await assetHandler.processAllAssetsOnce(); + } catch { + result.success = false; } + + return result; }