mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-08 21:07:46 +00:00
The `getNodeBinPath()` function is problematic because it assumes that commands are installed in the `node_modules` directory alongside the detected lockfile. This works fine the majority of the time, but ends up not being the case when using a monorepo that uses a package manager in "linked" mode (i.e. pnpm by default). Consider the following: ``` . ├── pnpm-lock.yaml ├── node_modules ├── blog │ ├── node_modules │ │ ├── hexo -> .pnpm/hexo@3.9.0/node_modules/hexo ``` In this setup, adding the root-level `node_modules/.bin` would not make the `hexo` command be visible in the `$PATH`. To solve this issue, the new `getNodeBinPaths()` function returns an array of all directories up to the specified `root`, which can then be placed into the `$PATH`. It's also more efficient (synchronous) since it does not need to scan for a lockfile anymore (the `root` needs to be specified explicitly). The new function is being used in `@vercel/next` and `@vercel/static-build`. The `traverseUpDirectories()` function from CLI was moved to `build-utils` to implement this function. Consequently, that makes the implementations of `walkParentDirs()` and `walkParentDirsMulti()` simpler, since it's using this generator now.
51 lines
1.4 KiB
TypeScript
Vendored
51 lines
1.4 KiB
TypeScript
Vendored
import { traverseUpDirectories } from '../src/fs/run-user-scripts';
|
|
|
|
const isWindows = process.platform === 'win32';
|
|
|
|
describe('traverseUpDirectories()', () => {
|
|
test.each(
|
|
isWindows
|
|
? [
|
|
{
|
|
start: 'C:\\foo\\bar\\baz',
|
|
expected: ['C:\\foo\\bar\\baz', 'C:\\foo\\bar', 'C:\\foo', 'C:\\'],
|
|
},
|
|
{
|
|
start: 'C:\\foo\\..\\bar\\.\\baz',
|
|
expected: ['C:\\bar\\baz', 'C:\\bar', 'C:\\'],
|
|
},
|
|
{
|
|
start: 'C:\\foo\\bar\\baz\\another',
|
|
base: 'C:\\foo\\bar',
|
|
expected: [
|
|
'C:\\foo\\bar\\baz\\another',
|
|
'C:\\foo\\bar\\baz',
|
|
'C:\\foo\\bar',
|
|
],
|
|
},
|
|
]
|
|
: [
|
|
{
|
|
start: '/foo/bar/baz',
|
|
expected: ['/foo/bar/baz', '/foo/bar', '/foo', '/'],
|
|
},
|
|
{
|
|
start: '/foo/../bar/./baz',
|
|
expected: ['/bar/baz', '/bar', '/'],
|
|
},
|
|
{
|
|
start: '/foo/bar/baz/another',
|
|
base: '/foo/bar',
|
|
expected: ['/foo/bar/baz/another', '/foo/bar/baz', '/foo/bar'],
|
|
},
|
|
]
|
|
)(
|
|
'should traverse start="$start", base="$base"',
|
|
({ start, base, expected }) => {
|
|
expect(Array.from(traverseUpDirectories({ start, base }))).toEqual(
|
|
expected
|
|
);
|
|
}
|
|
);
|
|
});
|