@vercel/build-utils 8.1.2 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/fs/run-user-scripts.d.ts +6 -6
- package/dist/fs/run-user-scripts.js +43 -29
- package/dist/index.js +43 -29
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# @vercel/build-utils
|
2
2
|
|
3
|
+
## 8.2.0
|
4
|
+
|
5
|
+
### Minor Changes
|
6
|
+
|
7
|
+
- fix corepack detection for package manager version determination ([#11596](https://github.com/vercel/vercel/pull/11596))
|
8
|
+
|
9
|
+
### Patch Changes
|
10
|
+
|
11
|
+
- Fix triggering of ignored project settings node version warning ([#11550](https://github.com/vercel/vercel/pull/11550))
|
12
|
+
|
13
|
+
## 8.1.3
|
14
|
+
|
15
|
+
### Patch Changes
|
16
|
+
|
17
|
+
- [build-utils] log more around package manager detection ([#11594](https://github.com/vercel/vercel/pull/11594))
|
18
|
+
|
3
19
|
## 8.1.2
|
4
20
|
|
5
21
|
### Patch Changes
|
@@ -74,7 +74,7 @@ export declare function getNodeBinPath({ cwd, }: {
|
|
74
74
|
export declare function getNodeBinPaths({ start, base, }: TraverseUpDirectoriesProps): string[];
|
75
75
|
export declare function runShellScript(fsPath: string, args?: string[], spawnOpts?: SpawnOptions): Promise<boolean>;
|
76
76
|
export declare function getSpawnOptions(meta: Meta, nodeVersion: NodeVersion): SpawnOptions;
|
77
|
-
export declare function getNodeVersion(destPath: string,
|
77
|
+
export declare function getNodeVersion(destPath: string, fallbackVersion?: string | undefined, config?: Config, meta?: Meta, availableVersions?: number[]): Promise<NodeVersion>;
|
78
78
|
export declare function scanParentDirs(destPath: string, readPackageJson?: boolean, base?: string): Promise<ScanParentDirsResult>;
|
79
79
|
export declare function walkParentDirs({ base, start, filename, }: WalkParentDirsProps): Promise<string | null>;
|
80
80
|
export declare function runNpmInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta, nodeVersion?: NodeVersion): Promise<boolean>;
|
@@ -82,9 +82,10 @@ export declare function runNpmInstall(destPath: string, args?: string[], spawnOp
|
|
82
82
|
* Prepares the input environment based on the used package manager and lockfile
|
83
83
|
* versions.
|
84
84
|
*/
|
85
|
-
export declare function getEnvForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
|
85
|
+
export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, }: {
|
86
86
|
cliType: CliType;
|
87
87
|
lockfileVersion: number | undefined;
|
88
|
+
packageJsonPackageManager?: string | undefined;
|
88
89
|
nodeVersion: NodeVersion | undefined;
|
89
90
|
env: {
|
90
91
|
[x: string]: string | undefined;
|
@@ -96,13 +97,11 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, node
|
|
96
97
|
* Helper to get the binary paths that link to the used package manager.
|
97
98
|
* Note: Make sure it doesn't contain any `console.log` calls.
|
98
99
|
*/
|
99
|
-
export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion,
|
100
|
+
export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, corepackEnabled, nodeVersion, }: {
|
100
101
|
cliType: CliType;
|
101
102
|
lockfileVersion: number | undefined;
|
103
|
+
corepackEnabled: boolean;
|
102
104
|
nodeVersion: NodeVersion | undefined;
|
103
|
-
env: {
|
104
|
-
[x: string]: string | undefined;
|
105
|
-
};
|
106
105
|
}): {
|
107
106
|
/**
|
108
107
|
* Which lockfile was detected.
|
@@ -121,6 +120,7 @@ export declare function getPathOverrideForPackageManager({ cliType, lockfileVers
|
|
121
120
|
/**
|
122
121
|
* Helper to get the binary paths that link to the used package manager.
|
123
122
|
* Note: Make sure it doesn't contain any `console.log` calls.
|
123
|
+
* @deprecated use `getEnvForPackageManager` instead
|
124
124
|
*/
|
125
125
|
export declare function getPathForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
|
126
126
|
cliType: CliType;
|
@@ -173,33 +173,37 @@ function getSpawnOptions(meta, nodeVersion) {
|
|
173
173
|
}
|
174
174
|
return opts;
|
175
175
|
}
|
176
|
-
async function getNodeVersion(destPath,
|
177
|
-
const
|
176
|
+
async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = (0, import_node_version.getAvailableNodeVersions)()) {
|
177
|
+
const latestVersion = (0, import_node_version.getLatestNodeVersion)(availableVersions);
|
178
178
|
if (meta.isDev) {
|
179
|
-
return { ...
|
179
|
+
return { ...latestVersion, runtime: "nodejs" };
|
180
180
|
}
|
181
181
|
const { packageJson } = await scanParentDirs(destPath, true);
|
182
|
-
|
183
|
-
|
182
|
+
const configuredVersion = config.nodeVersion || fallbackVersion;
|
183
|
+
const packageJsonVersion = packageJson?.engines?.node;
|
184
|
+
const supportedNodeVersion = await (0, import_node_version.getSupportedNodeVersion)(
|
185
|
+
packageJsonVersion || configuredVersion,
|
186
|
+
!packageJsonVersion,
|
187
|
+
availableVersions
|
188
|
+
);
|
184
189
|
if (packageJson?.engines?.node) {
|
185
190
|
const { node } = packageJson.engines;
|
186
|
-
if (
|
191
|
+
if (configuredVersion && !(0, import_semver.intersects)(configuredVersion, supportedNodeVersion.range)) {
|
187
192
|
console.warn(
|
188
|
-
`Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${
|
193
|
+
`Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${configuredVersion}") will not apply. Learn More: http://vercel.link/node-version`
|
189
194
|
);
|
190
|
-
}
|
195
|
+
}
|
196
|
+
if ((0, import_semver.coerce)(node)?.raw === node) {
|
191
197
|
console.warn(
|
192
198
|
`Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` with major.minor.patch, but only major Node.js Version can be selected. Learn More: http://vercel.link/node-version`
|
193
199
|
);
|
194
|
-
} else if ((0, import_semver.validRange)(node) && (0, import_semver.intersects)(`${
|
200
|
+
} else if ((0, import_semver.validRange)(node) && (0, import_semver.intersects)(`${latestVersion.major + 1}.x`, node)) {
|
195
201
|
console.warn(
|
196
202
|
`Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` that will automatically upgrade when a new major Node.js Version is released. Learn More: http://vercel.link/node-version`
|
197
203
|
);
|
198
204
|
}
|
199
|
-
nodeVersion = node;
|
200
|
-
isAuto = false;
|
201
205
|
}
|
202
|
-
return
|
206
|
+
return supportedNodeVersion;
|
203
207
|
}
|
204
208
|
async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
|
205
209
|
(0, import_assert.default)(import_path.default.isAbsolute(destPath));
|
@@ -302,9 +306,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
|
|
302
306
|
(0, import_assert.default)(import_path.default.isAbsolute(destPath));
|
303
307
|
try {
|
304
308
|
await runNpmInstallSema.acquire();
|
305
|
-
const { cliType, packageJsonPath, lockfileVersion } = await scanParentDirs(
|
306
|
-
destPath
|
307
|
-
);
|
309
|
+
const { cliType, packageJsonPath, packageJson, lockfileVersion } = await scanParentDirs(destPath, true);
|
308
310
|
if (!packageJsonPath) {
|
309
311
|
(0, import_debug.default)(
|
310
312
|
`Skipping dependency installation because no package.json was found for ${destPath}`
|
@@ -333,6 +335,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
|
|
333
335
|
opts.env = getEnvForPackageManager({
|
334
336
|
cliType,
|
335
337
|
lockfileVersion,
|
338
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
336
339
|
nodeVersion,
|
337
340
|
env
|
338
341
|
});
|
@@ -384,9 +387,12 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
|
|
384
387
|
function getEnvForPackageManager({
|
385
388
|
cliType,
|
386
389
|
lockfileVersion,
|
390
|
+
packageJsonPackageManager,
|
387
391
|
nodeVersion,
|
388
392
|
env
|
389
393
|
}) {
|
394
|
+
const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
395
|
+
const corepackEnabled = corepackFlagged && Boolean(packageJsonPackageManager);
|
390
396
|
const {
|
391
397
|
detectedLockfile,
|
392
398
|
detectedPackageManager,
|
@@ -394,12 +400,18 @@ function getEnvForPackageManager({
|
|
394
400
|
} = getPathOverrideForPackageManager({
|
395
401
|
cliType,
|
396
402
|
lockfileVersion,
|
397
|
-
|
398
|
-
|
403
|
+
corepackEnabled,
|
404
|
+
nodeVersion
|
399
405
|
});
|
400
|
-
(
|
401
|
-
|
402
|
-
|
406
|
+
if (corepackEnabled) {
|
407
|
+
(0, import_debug.default)(
|
408
|
+
`Detected corepack use for "${packageJsonPackageManager}". Not overriding package manager version.`
|
409
|
+
);
|
410
|
+
} else {
|
411
|
+
(0, import_debug.default)(
|
412
|
+
`Detected ${detectedPackageManager}. Added "${newPath}" to path. Based on assumed package manager "${cliType}", lockfile "${detectedLockfile}", and lockfileVersion "${lockfileVersion}"`
|
413
|
+
);
|
414
|
+
}
|
403
415
|
const newEnv = {
|
404
416
|
...env
|
405
417
|
};
|
@@ -453,15 +465,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
|
|
453
465
|
function getPathOverrideForPackageManager({
|
454
466
|
cliType,
|
455
467
|
lockfileVersion,
|
456
|
-
|
457
|
-
|
468
|
+
corepackEnabled,
|
469
|
+
nodeVersion
|
458
470
|
}) {
|
459
471
|
const no_override = {
|
460
472
|
detectedLockfile: void 0,
|
461
473
|
detectedPackageManager: void 0,
|
462
474
|
path: void 0
|
463
475
|
};
|
464
|
-
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
465
476
|
switch (cliType) {
|
466
477
|
case "npm":
|
467
478
|
switch (true) {
|
@@ -523,15 +534,13 @@ function getPathForPackageManager({
|
|
523
534
|
nodeVersion,
|
524
535
|
env
|
525
536
|
}) {
|
537
|
+
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
526
538
|
const overrides = getPathOverrideForPackageManager({
|
527
539
|
cliType,
|
528
540
|
lockfileVersion,
|
529
|
-
|
530
|
-
|
541
|
+
corepackEnabled,
|
542
|
+
nodeVersion
|
531
543
|
});
|
532
|
-
(0, import_debug.default)(
|
533
|
-
`Detected ${overrides.detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${overrides.path}`
|
534
|
-
);
|
535
544
|
const alreadyInPath = (newPath) => {
|
536
545
|
const oldPath = env.PATH ?? "";
|
537
546
|
return oldPath.split(import_path.default.delimiter).includes(newPath);
|
@@ -557,10 +566,14 @@ async function runCustomInstallCommand({
|
|
557
566
|
spawnOpts
|
558
567
|
}) {
|
559
568
|
console.log(`Running "install" command: \`${installCommand}\`...`);
|
560
|
-
const { cliType, lockfileVersion } = await scanParentDirs(
|
569
|
+
const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
|
570
|
+
destPath,
|
571
|
+
true
|
572
|
+
);
|
561
573
|
const env = getEnvForPackageManager({
|
562
574
|
cliType,
|
563
575
|
lockfileVersion,
|
576
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
564
577
|
nodeVersion,
|
565
578
|
env: spawnOpts?.env || {}
|
566
579
|
});
|
@@ -591,6 +604,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
|
|
591
604
|
env: getEnvForPackageManager({
|
592
605
|
cliType,
|
593
606
|
lockfileVersion,
|
607
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
594
608
|
nodeVersion: void 0,
|
595
609
|
env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env)
|
596
610
|
})
|
package/dist/index.js
CHANGED
@@ -21895,33 +21895,37 @@ function getSpawnOptions(meta, nodeVersion) {
|
|
21895
21895
|
}
|
21896
21896
|
return opts;
|
21897
21897
|
}
|
21898
|
-
async function getNodeVersion(destPath,
|
21899
|
-
const
|
21898
|
+
async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = getAvailableNodeVersions()) {
|
21899
|
+
const latestVersion = getLatestNodeVersion(availableVersions);
|
21900
21900
|
if (meta.isDev) {
|
21901
|
-
return { ...
|
21901
|
+
return { ...latestVersion, runtime: "nodejs" };
|
21902
21902
|
}
|
21903
21903
|
const { packageJson } = await scanParentDirs(destPath, true);
|
21904
|
-
|
21905
|
-
|
21904
|
+
const configuredVersion = config.nodeVersion || fallbackVersion;
|
21905
|
+
const packageJsonVersion = packageJson?.engines?.node;
|
21906
|
+
const supportedNodeVersion = await getSupportedNodeVersion(
|
21907
|
+
packageJsonVersion || configuredVersion,
|
21908
|
+
!packageJsonVersion,
|
21909
|
+
availableVersions
|
21910
|
+
);
|
21906
21911
|
if (packageJson?.engines?.node) {
|
21907
21912
|
const { node } = packageJson.engines;
|
21908
|
-
if (
|
21913
|
+
if (configuredVersion && !(0, import_semver2.intersects)(configuredVersion, supportedNodeVersion.range)) {
|
21909
21914
|
console.warn(
|
21910
|
-
`Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${
|
21915
|
+
`Warning: Due to "engines": { "node": "${node}" } in your \`package.json\` file, the Node.js Version defined in your Project Settings ("${configuredVersion}") will not apply. Learn More: http://vercel.link/node-version`
|
21911
21916
|
);
|
21912
|
-
}
|
21917
|
+
}
|
21918
|
+
if ((0, import_semver2.coerce)(node)?.raw === node) {
|
21913
21919
|
console.warn(
|
21914
21920
|
`Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` with major.minor.patch, but only major Node.js Version can be selected. Learn More: http://vercel.link/node-version`
|
21915
21921
|
);
|
21916
|
-
} else if ((0, import_semver2.validRange)(node) && (0, import_semver2.intersects)(`${
|
21922
|
+
} else if ((0, import_semver2.validRange)(node) && (0, import_semver2.intersects)(`${latestVersion.major + 1}.x`, node)) {
|
21917
21923
|
console.warn(
|
21918
21924
|
`Warning: Detected "engines": { "node": "${node}" } in your \`package.json\` that will automatically upgrade when a new major Node.js Version is released. Learn More: http://vercel.link/node-version`
|
21919
21925
|
);
|
21920
21926
|
}
|
21921
|
-
nodeVersion = node;
|
21922
|
-
isAuto = false;
|
21923
21927
|
}
|
21924
|
-
return
|
21928
|
+
return supportedNodeVersion;
|
21925
21929
|
}
|
21926
21930
|
async function scanParentDirs(destPath, readPackageJson = false, base = "/") {
|
21927
21931
|
(0, import_assert6.default)(import_path5.default.isAbsolute(destPath));
|
@@ -22024,9 +22028,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
|
|
22024
22028
|
(0, import_assert6.default)(import_path5.default.isAbsolute(destPath));
|
22025
22029
|
try {
|
22026
22030
|
await runNpmInstallSema.acquire();
|
22027
|
-
const { cliType, packageJsonPath, lockfileVersion } = await scanParentDirs(
|
22028
|
-
destPath
|
22029
|
-
);
|
22031
|
+
const { cliType, packageJsonPath, packageJson, lockfileVersion } = await scanParentDirs(destPath, true);
|
22030
22032
|
if (!packageJsonPath) {
|
22031
22033
|
debug(
|
22032
22034
|
`Skipping dependency installation because no package.json was found for ${destPath}`
|
@@ -22055,6 +22057,7 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
|
|
22055
22057
|
opts.env = getEnvForPackageManager({
|
22056
22058
|
cliType,
|
22057
22059
|
lockfileVersion,
|
22060
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
22058
22061
|
nodeVersion,
|
22059
22062
|
env
|
22060
22063
|
});
|
@@ -22106,9 +22109,12 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion)
|
|
22106
22109
|
function getEnvForPackageManager({
|
22107
22110
|
cliType,
|
22108
22111
|
lockfileVersion,
|
22112
|
+
packageJsonPackageManager,
|
22109
22113
|
nodeVersion,
|
22110
22114
|
env
|
22111
22115
|
}) {
|
22116
|
+
const corepackFlagged = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
22117
|
+
const corepackEnabled = corepackFlagged && Boolean(packageJsonPackageManager);
|
22112
22118
|
const {
|
22113
22119
|
detectedLockfile,
|
22114
22120
|
detectedPackageManager,
|
@@ -22116,12 +22122,18 @@ function getEnvForPackageManager({
|
|
22116
22122
|
} = getPathOverrideForPackageManager({
|
22117
22123
|
cliType,
|
22118
22124
|
lockfileVersion,
|
22119
|
-
|
22120
|
-
|
22125
|
+
corepackEnabled,
|
22126
|
+
nodeVersion
|
22121
22127
|
});
|
22122
|
-
|
22123
|
-
|
22124
|
-
|
22128
|
+
if (corepackEnabled) {
|
22129
|
+
debug(
|
22130
|
+
`Detected corepack use for "${packageJsonPackageManager}". Not overriding package manager version.`
|
22131
|
+
);
|
22132
|
+
} else {
|
22133
|
+
debug(
|
22134
|
+
`Detected ${detectedPackageManager}. Added "${newPath}" to path. Based on assumed package manager "${cliType}", lockfile "${detectedLockfile}", and lockfileVersion "${lockfileVersion}"`
|
22135
|
+
);
|
22136
|
+
}
|
22125
22137
|
const newEnv = {
|
22126
22138
|
...env
|
22127
22139
|
};
|
@@ -22175,15 +22187,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
|
|
22175
22187
|
function getPathOverrideForPackageManager({
|
22176
22188
|
cliType,
|
22177
22189
|
lockfileVersion,
|
22178
|
-
|
22179
|
-
|
22190
|
+
corepackEnabled,
|
22191
|
+
nodeVersion
|
22180
22192
|
}) {
|
22181
22193
|
const no_override = {
|
22182
22194
|
detectedLockfile: void 0,
|
22183
22195
|
detectedPackageManager: void 0,
|
22184
22196
|
path: void 0
|
22185
22197
|
};
|
22186
|
-
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
22187
22198
|
switch (cliType) {
|
22188
22199
|
case "npm":
|
22189
22200
|
switch (true) {
|
@@ -22245,15 +22256,13 @@ function getPathForPackageManager({
|
|
22245
22256
|
nodeVersion,
|
22246
22257
|
env
|
22247
22258
|
}) {
|
22259
|
+
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
22248
22260
|
const overrides = getPathOverrideForPackageManager({
|
22249
22261
|
cliType,
|
22250
22262
|
lockfileVersion,
|
22251
|
-
|
22252
|
-
|
22263
|
+
corepackEnabled,
|
22264
|
+
nodeVersion
|
22253
22265
|
});
|
22254
|
-
debug(
|
22255
|
-
`Detected ${overrides.detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${overrides.path}`
|
22256
|
-
);
|
22257
22266
|
const alreadyInPath = (newPath) => {
|
22258
22267
|
const oldPath = env.PATH ?? "";
|
22259
22268
|
return oldPath.split(import_path5.default.delimiter).includes(newPath);
|
@@ -22279,10 +22288,14 @@ async function runCustomInstallCommand({
|
|
22279
22288
|
spawnOpts
|
22280
22289
|
}) {
|
22281
22290
|
console.log(`Running "install" command: \`${installCommand}\`...`);
|
22282
|
-
const { cliType, lockfileVersion } = await scanParentDirs(
|
22291
|
+
const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
|
22292
|
+
destPath,
|
22293
|
+
true
|
22294
|
+
);
|
22283
22295
|
const env = getEnvForPackageManager({
|
22284
22296
|
cliType,
|
22285
22297
|
lockfileVersion,
|
22298
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
22286
22299
|
nodeVersion,
|
22287
22300
|
env: spawnOpts?.env || {}
|
22288
22301
|
});
|
@@ -22313,6 +22326,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
|
|
22313
22326
|
env: getEnvForPackageManager({
|
22314
22327
|
cliType,
|
22315
22328
|
lockfileVersion,
|
22329
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
22316
22330
|
nodeVersion: void 0,
|
22317
22331
|
env: cloneEnv(process.env, spawnOpts?.env)
|
22318
22332
|
})
|