diff --git a/.changeset/tiny-points-fry.md b/.changeset/tiny-points-fry.md new file mode 100644 index 000000000..cfbf4b533 --- /dev/null +++ b/.changeset/tiny-points-fry.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +fix(build): Improve regex in copy traced files to skip symbolic links diff --git a/packages/open-next/src/build/copyTracedFiles.ts b/packages/open-next/src/build/copyTracedFiles.ts index 1eb3e3179..27b3b55e1 100644 --- a/packages/open-next/src/build/copyTracedFiles.ts +++ b/packages/open-next/src/build/copyTracedFiles.ts @@ -45,9 +45,15 @@ const EXCLUDED_PACKAGES = [ "next/dist/compiled/amphtml-validator", ]; -function isExcluded(srcPath: string): boolean { +export function isExcluded(srcPath: string): boolean { return EXCLUDED_PACKAGES.some((excluded) => - srcPath.match(getCrossPlatformPathRegex(`/node_modules/${excluded}/`)), + // `pnpm` can create a symbolic link that points to the pnpm store folder + // This will live under `/node_modules/sharp`. We need to handle this in our regex + srcPath.match( + getCrossPlatformPathRegex(`/node_modules/${excluded}(?:/|$)`, { + escape: false, + }), + ), ); } diff --git a/packages/open-next/src/build/installDeps.ts b/packages/open-next/src/build/installDeps.ts index 06620d0fa..6b4091925 100644 --- a/packages/open-next/src/build/installDeps.ts +++ b/packages/open-next/src/build/installDeps.ts @@ -85,7 +85,7 @@ export function installDependencies( fs.rmSync(tempInstallDir, { recursive: true, force: true }); logger.info(`Dependencies installed for ${name}`); } catch (e: any) { - logger.error(e.stdout.toString()); + logger.error(e.toString()); logger.error("Could not install dependencies"); } } diff --git a/packages/tests-unit/tests/build/copyTracedFiles.test.ts b/packages/tests-unit/tests/build/copyTracedFiles.test.ts new file mode 100644 index 000000000..45b07e431 --- /dev/null +++ b/packages/tests-unit/tests/build/copyTracedFiles.test.ts @@ -0,0 +1,42 @@ +import { isExcluded } from "@opennextjs/aws/build/copyTracedFiles.js"; + +describe("isExcluded", () => { + test("should exclude sharp", () => { + expect( + isExcluded( + "/home/user/git/my-opennext-project/node_modules/sharp/lib/index.js", + ), + ).toBe(true); + expect( + isExcluded( + "/home/user/git/my-opennext-project/node_modules/.pnpm/sharp/4.1.3/node_modules/sharp/lib/index.js", + ), + ).toBe(true); + expect( + isExcluded("/home/user/git/my-opennext-project/node_modules/sharp"), + ).toBe(true); + }); + + test("should not exclude other packages", () => { + expect( + isExcluded( + "/home/user/git/my-opennext-project/node_modules/other-package/lib/index.js", + ), + ).toBe(false); + expect( + isExcluded( + "/home/user/git/my-opennext-project/node_modules/.pnpm/other-package/4.1.3/node_modules/other-package/lib/index.js", + ), + ).toBe(false); + expect( + isExcluded( + "/home/user/git/my-opennext-project/node_modules/.pnpm/other-package/4.1.3/node_modules/sharp-other-package/lib/index.js", + ), + ).toBe(false); + expect( + isExcluded( + "/home/user/git/my-opennext-project/node_modules/.pnpm/other-package/4.1.3/node_modules/sharp-other", + ), + ).toBe(false); + }); +});