From 01cac7b05bdad7f301913f3a681524524c9b1e91 Mon Sep 17 00:00:00 2001 From: Mark Dalgleish Date: Tue, 27 Feb 2024 08:01:38 +1100 Subject: [PATCH] Pass resolved `viteConfig` to `buildEnd` hook (#8885) --- .changeset/shy-fireants-listen.md | 5 ++++ integration/vite-presets-test.ts | 38 +++++++++++++++++++++++-------- packages/remix-dev/vite/build.ts | 1 + packages/remix-dev/vite/plugin.ts | 3 ++- 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 .changeset/shy-fireants-listen.md diff --git a/.changeset/shy-fireants-listen.md b/.changeset/shy-fireants-listen.md new file mode 100644 index 00000000000..b582244c631 --- /dev/null +++ b/.changeset/shy-fireants-listen.md @@ -0,0 +1,5 @@ +--- +"@remix-run/dev": minor +--- + +Pass resolved `viteConfig` to Remix Vite plugin's `buildEnd` hook diff --git a/integration/vite-presets-test.ts b/integration/vite-presets-test.ts index ba308e7bdb5..e190f2289d5 100644 --- a/integration/vite-presets-test.ts +++ b/integration/vite-presets-test.ts @@ -22,6 +22,9 @@ const files = { ); export default { + build: { + assetsDir: "custom-assets-dir", + }, plugins: [remix({ presets: [ // Ensure user config is passed to remixConfig hook @@ -112,9 +115,16 @@ const files = { name: "test-preset", remixConfig: async () => ({ async buildEnd(buildEndArgs) { + let { viteConfig, buildManifest, remixConfig } = buildEndArgs; + await fs.writeFile( - "BUILD_END_ARGS.js", - "export default " + serializeJs(buildEndArgs, { space: 2, unsafe: true }), + "BUILD_END_META.js", + [ + "export const keys = " + JSON.stringify(Object.keys(buildEndArgs)) + ";", + "export const buildManifest = " + serializeJs(buildManifest, { space: 2, unsafe: true }) + ";", + "export const remixConfig = " + serializeJs(remixConfig, { space: 2, unsafe: true }) + ";", + "export const assetsDir = " + JSON.stringify(viteConfig.build.assetsDir) + ";", + ].join("\\n"), "utf-8" ); }, @@ -142,10 +152,14 @@ test("Vite / presets", async () => { return normalizePath(path.relative(cwd, pathname)); } - let buildEndArgs: any = ( - await import(URL.pathToFileURL(path.join(cwd, "BUILD_END_ARGS.js")).href) - ).default; - let { remixConfig } = buildEndArgs; + let buildEndArgsMeta: any = await import( + URL.pathToFileURL(path.join(cwd, "BUILD_END_META.js")).href + ); + + let { remixConfig } = buildEndArgsMeta; + + // Smoke test Vite config + expect(buildEndArgsMeta.assetsDir).toBe("custom-assets-dir"); // Before rewriting to relative paths, assert that paths are absolute within cwd expect(pathStartsWithCwd(remixConfig.buildDirectory)).toBe(true); @@ -182,10 +196,16 @@ test("Vite / presets", async () => { ).toEqual({ remixConfigFrozen: true, }); - expect(Object.keys(buildEndArgs)).toEqual(["buildManifest", "remixConfig"]); + + // Snapshot the buildEnd args keys + expect(buildEndArgsMeta.keys).toEqual([ + "buildManifest", + "remixConfig", + "viteConfig", + ]); // Smoke test the resolved config - expect(Object.keys(buildEndArgs.remixConfig)).toEqual([ + expect(Object.keys(remixConfig)).toEqual([ "appDirectory", "basename", "buildDirectory", @@ -201,7 +221,7 @@ test("Vite / presets", async () => { ]); // Ensure we get a valid build manifest - expect(buildEndArgs.buildManifest).toEqual({ + expect(buildEndArgsMeta.buildManifest).toEqual({ routeIdToServerBundleId: { "routes/_index": "preset-server-bundle-id", }, diff --git a/packages/remix-dev/vite/build.ts b/packages/remix-dev/vite/build.ts index e70c9956a26..e136f26d5dc 100644 --- a/packages/remix-dev/vite/build.ts +++ b/packages/remix-dev/vite/build.ts @@ -357,5 +357,6 @@ export async function build( await remixConfig.buildEnd?.({ buildManifest, remixConfig, + viteConfig, }); } diff --git a/packages/remix-dev/vite/plugin.ts b/packages/remix-dev/vite/plugin.ts index 5af6fddec81..40eba9cb12b 100644 --- a/packages/remix-dev/vite/plugin.ts +++ b/packages/remix-dev/vite/plugin.ts @@ -172,8 +172,9 @@ export type VitePluginConfig = SupportedRemixEsbuildUserConfig & { }; type BuildEndHook = (args: { - remixConfig: ResolvedVitePluginConfig; buildManifest: BuildManifest | undefined; + remixConfig: ResolvedVitePluginConfig; + viteConfig: Vite.ResolvedConfig; }) => void | Promise; export type ResolvedVitePluginConfig = Readonly<