@vercel/build-utils 8.1.3 → 8.2.1
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/node-version.js +1 -1
- package/dist/fs/run-user-scripts.d.ts +6 -6
- package/dist/fs/run-user-scripts.js +43 -27
- package/dist/index.js +44 -28
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# @vercel/build-utils
|
2
2
|
|
3
|
+
## 8.2.1
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- [node] update node@16 deprecation day ([#11671](https://github.com/vercel/vercel/pull/11671))
|
8
|
+
|
9
|
+
## 8.2.0
|
10
|
+
|
11
|
+
### Minor Changes
|
12
|
+
|
13
|
+
- fix corepack detection for package manager version determination ([#11596](https://github.com/vercel/vercel/pull/11596))
|
14
|
+
|
15
|
+
### Patch Changes
|
16
|
+
|
17
|
+
- Fix triggering of ignored project settings node version warning ([#11550](https://github.com/vercel/vercel/pull/11550))
|
18
|
+
|
3
19
|
## 8.1.3
|
4
20
|
|
5
21
|
### Patch Changes
|
package/dist/fs/node-version.js
CHANGED
@@ -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,13 +400,18 @@ function getEnvForPackageManager({
|
|
394
400
|
} = getPathOverrideForPackageManager({
|
395
401
|
cliType,
|
396
402
|
lockfileVersion,
|
397
|
-
|
398
|
-
|
403
|
+
corepackEnabled,
|
404
|
+
nodeVersion
|
399
405
|
});
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
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
|
+
}
|
404
415
|
const newEnv = {
|
405
416
|
...env
|
406
417
|
};
|
@@ -454,15 +465,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
|
|
454
465
|
function getPathOverrideForPackageManager({
|
455
466
|
cliType,
|
456
467
|
lockfileVersion,
|
457
|
-
|
458
|
-
|
468
|
+
corepackEnabled,
|
469
|
+
nodeVersion
|
459
470
|
}) {
|
460
471
|
const no_override = {
|
461
472
|
detectedLockfile: void 0,
|
462
473
|
detectedPackageManager: void 0,
|
463
474
|
path: void 0
|
464
475
|
};
|
465
|
-
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
466
476
|
switch (cliType) {
|
467
477
|
case "npm":
|
468
478
|
switch (true) {
|
@@ -524,11 +534,12 @@ function getPathForPackageManager({
|
|
524
534
|
nodeVersion,
|
525
535
|
env
|
526
536
|
}) {
|
537
|
+
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
527
538
|
const overrides = getPathOverrideForPackageManager({
|
528
539
|
cliType,
|
529
540
|
lockfileVersion,
|
530
|
-
|
531
|
-
|
541
|
+
corepackEnabled,
|
542
|
+
nodeVersion
|
532
543
|
});
|
533
544
|
const alreadyInPath = (newPath) => {
|
534
545
|
const oldPath = env.PATH ?? "";
|
@@ -555,10 +566,14 @@ async function runCustomInstallCommand({
|
|
555
566
|
spawnOpts
|
556
567
|
}) {
|
557
568
|
console.log(`Running "install" command: \`${installCommand}\`...`);
|
558
|
-
const { cliType, lockfileVersion } = await scanParentDirs(
|
569
|
+
const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
|
570
|
+
destPath,
|
571
|
+
true
|
572
|
+
);
|
559
573
|
const env = getEnvForPackageManager({
|
560
574
|
cliType,
|
561
575
|
lockfileVersion,
|
576
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
562
577
|
nodeVersion,
|
563
578
|
env: spawnOpts?.env || {}
|
564
579
|
});
|
@@ -589,6 +604,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
|
|
589
604
|
env: getEnvForPackageManager({
|
590
605
|
cliType,
|
591
606
|
lockfileVersion,
|
607
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
592
608
|
nodeVersion: void 0,
|
593
609
|
env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env)
|
594
610
|
})
|
package/dist/index.js
CHANGED
@@ -21620,7 +21620,7 @@ var NODE_VERSIONS = [
|
|
21620
21620
|
major: 16,
|
21621
21621
|
range: "16.x",
|
21622
21622
|
runtime: "nodejs16.x",
|
21623
|
-
discontinueDate: /* @__PURE__ */ new Date("
|
21623
|
+
discontinueDate: /* @__PURE__ */ new Date("2025-02-28")
|
21624
21624
|
},
|
21625
21625
|
{
|
21626
21626
|
major: 14,
|
@@ -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,13 +22122,18 @@ function getEnvForPackageManager({
|
|
22116
22122
|
} = getPathOverrideForPackageManager({
|
22117
22123
|
cliType,
|
22118
22124
|
lockfileVersion,
|
22119
|
-
|
22120
|
-
|
22125
|
+
corepackEnabled,
|
22126
|
+
nodeVersion
|
22121
22127
|
});
|
22122
|
-
|
22123
|
-
|
22124
|
-
|
22125
|
-
|
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
|
+
}
|
22126
22137
|
const newEnv = {
|
22127
22138
|
...env
|
22128
22139
|
};
|
@@ -22176,15 +22187,14 @@ function shouldUseNpm7(lockfileVersion, nodeVersion) {
|
|
22176
22187
|
function getPathOverrideForPackageManager({
|
22177
22188
|
cliType,
|
22178
22189
|
lockfileVersion,
|
22179
|
-
|
22180
|
-
|
22190
|
+
corepackEnabled,
|
22191
|
+
nodeVersion
|
22181
22192
|
}) {
|
22182
22193
|
const no_override = {
|
22183
22194
|
detectedLockfile: void 0,
|
22184
22195
|
detectedPackageManager: void 0,
|
22185
22196
|
path: void 0
|
22186
22197
|
};
|
22187
|
-
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
22188
22198
|
switch (cliType) {
|
22189
22199
|
case "npm":
|
22190
22200
|
switch (true) {
|
@@ -22246,11 +22256,12 @@ function getPathForPackageManager({
|
|
22246
22256
|
nodeVersion,
|
22247
22257
|
env
|
22248
22258
|
}) {
|
22259
|
+
const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
|
22249
22260
|
const overrides = getPathOverrideForPackageManager({
|
22250
22261
|
cliType,
|
22251
22262
|
lockfileVersion,
|
22252
|
-
|
22253
|
-
|
22263
|
+
corepackEnabled,
|
22264
|
+
nodeVersion
|
22254
22265
|
});
|
22255
22266
|
const alreadyInPath = (newPath) => {
|
22256
22267
|
const oldPath = env.PATH ?? "";
|
@@ -22277,10 +22288,14 @@ async function runCustomInstallCommand({
|
|
22277
22288
|
spawnOpts
|
22278
22289
|
}) {
|
22279
22290
|
console.log(`Running "install" command: \`${installCommand}\`...`);
|
22280
|
-
const { cliType, lockfileVersion } = await scanParentDirs(
|
22291
|
+
const { cliType, lockfileVersion, packageJson } = await scanParentDirs(
|
22292
|
+
destPath,
|
22293
|
+
true
|
22294
|
+
);
|
22281
22295
|
const env = getEnvForPackageManager({
|
22282
22296
|
cliType,
|
22283
22297
|
lockfileVersion,
|
22298
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
22284
22299
|
nodeVersion,
|
22285
22300
|
env: spawnOpts?.env || {}
|
22286
22301
|
});
|
@@ -22311,6 +22326,7 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts) {
|
|
22311
22326
|
env: getEnvForPackageManager({
|
22312
22327
|
cliType,
|
22313
22328
|
lockfileVersion,
|
22329
|
+
packageJsonPackageManager: packageJson?.packageManager,
|
22314
22330
|
nodeVersion: void 0,
|
22315
22331
|
env: cloneEnv(process.env, spawnOpts?.env)
|
22316
22332
|
})
|