diff --git a/examples/node-yarn-workspaces-nested/.gitignore b/examples/node-yarn-workspaces-nested/.gitignore new file mode 100644 index 000000000..6fb8e236f --- /dev/null +++ b/examples/node-yarn-workspaces-nested/.gitignore @@ -0,0 +1,4 @@ +node_modules +.pnp.cjs +.pnp.loader.mjs +.yarn/install-state.gz diff --git a/examples/node-yarn-workspaces-nested/.yarnrc.yml b/examples/node-yarn-workspaces-nested/.yarnrc.yml new file mode 100644 index 000000000..09b10123b --- /dev/null +++ b/examples/node-yarn-workspaces-nested/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: pnp diff --git a/examples/node-yarn-workspaces-nested/README.md b/examples/node-yarn-workspaces-nested/README.md new file mode 100644 index 000000000..7c93e85be --- /dev/null +++ b/examples/node-yarn-workspaces-nested/README.md @@ -0,0 +1,36 @@ +# node-yarn-workspaces-nested + +Reproduces [#463](https://github.com/railwayapp/railpack/issues/463): a Yarn +Berry monorepo with a deeply-nested workspace package causes a phantom duplicate +directory inside the container, making `yarn install` fail. + +## Structure + +The workspace glob is `packages/**/*` (recursive), with a package at +`packages/prisma/timescaledb/`. The intermediate directory `packages/prisma/` +happens to be named `prisma`, which matches the `prisma` entry in +`SupportingInstallFiles`. + +## The bug + +`SupportingInstallFiles` returns both: + +- `packages/prisma/timescaledb/package.json` (matched as a file) +- `packages/prisma` (matched as a directory named `prisma`) + +This produces two copy commands in the build plan: + +1. `copy packages/prisma/timescaledb/package.json` → creates + `/app/packages/prisma/timescaledb/` +2. `copy packages/prisma → packages/prisma` → because BuildKit uses + `CopyDirContentsOnly: false`, the directory `prisma/` is placed *inside* + `/app/packages/prisma/`, creating the phantom + `/app/packages/prisma/prisma/timescaledb/` + +Yarn then sees two workspaces with the same name and fails: + +``` +Internal Error: Duplicate workspace name @wildmetrics/prisma-timescale: + /app/packages/prisma/timescaledb conflicts with + /app/packages/prisma/prisma/timescaledb +``` diff --git a/examples/node-yarn-workspaces-nested/index.js b/examples/node-yarn-workspaces-nested/index.js new file mode 100644 index 000000000..9cb2f05b3 --- /dev/null +++ b/examples/node-yarn-workspaces-nested/index.js @@ -0,0 +1,2 @@ +import { message } from "@wildmetrics/prisma-timescale"; +console.log(message); diff --git a/examples/node-yarn-workspaces-nested/package.json b/examples/node-yarn-workspaces-nested/package.json new file mode 100644 index 000000000..af3d727b9 --- /dev/null +++ b/examples/node-yarn-workspaces-nested/package.json @@ -0,0 +1,16 @@ +{ + "name": "node-yarn-workspaces-nested", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "start": "node index.js" + }, + "workspaces": [ + "packages/**/*" + ], + "dependencies": { + "@wildmetrics/prisma-timescale": "workspace:*" + }, + "packageManager": "yarn@4.5.3" +} diff --git a/examples/node-yarn-workspaces-nested/packages/prisma/timescaledb/index.js b/examples/node-yarn-workspaces-nested/packages/prisma/timescaledb/index.js new file mode 100644 index 000000000..20ced2518 --- /dev/null +++ b/examples/node-yarn-workspaces-nested/packages/prisma/timescaledb/index.js @@ -0,0 +1 @@ +export const message = "hello from timescaledb package"; diff --git a/examples/node-yarn-workspaces-nested/packages/prisma/timescaledb/package.json b/examples/node-yarn-workspaces-nested/packages/prisma/timescaledb/package.json new file mode 100644 index 000000000..8655a8c63 --- /dev/null +++ b/examples/node-yarn-workspaces-nested/packages/prisma/timescaledb/package.json @@ -0,0 +1,6 @@ +{ + "name": "@wildmetrics/prisma-timescale", + "version": "1.0.0", + "type": "module", + "main": "index.js" +} diff --git a/examples/node-yarn-workspaces-nested/test.json b/examples/node-yarn-workspaces-nested/test.json new file mode 100644 index 000000000..3b1e5be2b --- /dev/null +++ b/examples/node-yarn-workspaces-nested/test.json @@ -0,0 +1,5 @@ +[ + { + "expectedOutput": "hello from timescaledb package" + } +] diff --git a/examples/node-yarn-workspaces-nested/yarn.lock b/examples/node-yarn-workspaces-nested/yarn.lock new file mode 100644 index 000000000..995128ef2 --- /dev/null +++ b/examples/node-yarn-workspaces-nested/yarn.lock @@ -0,0 +1,20 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@wildmetrics/prisma-timescale@workspace:*, @wildmetrics/prisma-timescale@workspace:packages/prisma/timescaledb": + version: 0.0.0-use.local + resolution: "@wildmetrics/prisma-timescale@workspace:packages/prisma/timescaledb" + languageName: unknown + linkType: soft + +"node-yarn-workspaces-nested@workspace:.": + version: 0.0.0-use.local + resolution: "node-yarn-workspaces-nested@workspace:." + dependencies: + "@wildmetrics/prisma-timescale": "workspace:*" + languageName: unknown + linkType: soft