diff --git a/packages/infrastructure/webpack/package.json b/packages/infrastructure/webpack/package.json index 4f953e809d..d914cc930c 100644 --- a/packages/infrastructure/webpack/package.json +++ b/packages/infrastructure/webpack/package.json @@ -36,7 +36,8 @@ "tailwindcss": "^3.3.2", "ts-loader": "^9.4.1", "webpack": "^5.81.0", - "webpack-cli": "^4.10.0" + "webpack-cli": "^4.10.0", + "@ogre-tools/linkable": "^15.8.0" }, "peerDependencies": { "@ogre-tools/fp": "^15.8.0", diff --git a/packages/infrastructure/webpack/src/scripts/do-webpack-build.test.ts b/packages/infrastructure/webpack/src/scripts/do-webpack-build.test.ts index 4aed90076d..a5484783c6 100644 --- a/packages/infrastructure/webpack/src/scripts/do-webpack-build.test.ts +++ b/packages/infrastructure/webpack/src/scripts/do-webpack-build.test.ts @@ -47,10 +47,68 @@ describe("do-webpack-build", () => { expect(logSuccessMock).toHaveBeenCalledWith("some-stdout"); }); - it("script finishes", async () => { + it("makes the built package available for local packages in development that link to it", () => { + expect(execMock).toHaveBeenCalledWith("linkable-push"); + }); + + it("does not finish script yet", async () => { const promiseStatus = await getPromiseStatus(actualPromise); - expect(promiseStatus.fulfilled).toBe(true); + expect(promiseStatus.fulfilled).toBe(false); + }); + + describe("when linking resolves with stdout", () => { + beforeEach(async () => { + logSuccessMock.mockClear(); + + await execMock.resolve({ stdout: "some-other-stdout", stderr: "" }); + }); + + it("logs the stdout", () => { + expect(logSuccessMock).toHaveBeenCalledWith("some-other-stdout"); + }); + + it("script finishes", async () => { + const promiseStatus = await getPromiseStatus(actualPromise); + + expect(promiseStatus.fulfilled).toBe(true); + }); + }); + + describe("when linking resolves with stderr", () => { + beforeEach(() => { + logSuccessMock.mockClear(); + + execMock.resolve({ stdout: "", stderr: "some-other-stderr" }); + }); + + it("does not log success", () => { + actualPromise.catch(() => {}); + + expect(logSuccessMock).not.toHaveBeenCalled(); + }); + + it("throws", () => { + return expect(actualPromise).rejects.toThrow("some-other-stderr"); + }); + }); + + describe("when linking rejects", () => { + beforeEach(() => { + logSuccessMock.mockClear(); + + execMock.reject(new Error("some-other-error")); + }); + + it("does not log success", () => { + actualPromise.catch(() => {}); + + expect(logSuccessMock).not.toHaveBeenCalled(); + }); + + it("throws", () => { + return expect(actualPromise).rejects.toThrow("some-other-error"); + }); }); }); diff --git a/packages/infrastructure/webpack/src/scripts/do-webpack-build.ts b/packages/infrastructure/webpack/src/scripts/do-webpack-build.ts index 8a9b566480..ba81352ed5 100644 --- a/packages/infrastructure/webpack/src/scripts/do-webpack-build.ts +++ b/packages/infrastructure/webpack/src/scripts/do-webpack-build.ts @@ -11,8 +11,8 @@ export const doWebpackBuildInjectable = getInjectable({ const exec = di.inject(execInjectable); const logSuccess = di.inject(logSuccessInjectable); - return async () => { - const { stdout, stderr } = await exec("webpack"); + const execWithResultHandling = async (command: string) => { + const { stdout, stderr } = await exec(command); if (stderr) { throw new Error(stderr); @@ -20,5 +20,11 @@ export const doWebpackBuildInjectable = getInjectable({ logSuccess(stdout); }; + + return async () => { + await execWithResultHandling("webpack"); + + await execWithResultHandling("linkable-push"); + }; }, });