@vercel/build-utils 7.12.0 → 8.1.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 CHANGED
@@ -1,5 +1,22 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 8.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Update pnpm version detection logic ([#11445](https://github.com/vercel/vercel/pull/11445))
8
+ Add support for pnpm 9
9
+
10
+ ## 8.0.0
11
+
12
+ ### Major Changes
13
+
14
+ - Remove legacy `avoidTopLevelInstall` logic ([#11513](https://github.com/vercel/vercel/pull/11513))
15
+
16
+ ### Patch Changes
17
+
18
+ - [build-utils] Add `VERCEL_PROJECT_PRODUCTION_URL` framework env var prefix ([#11506](https://github.com/vercel/vercel/pull/11506))
19
+
3
20
  ## 7.12.0
4
21
 
5
22
  ### Minor Changes
@@ -92,6 +92,32 @@ export declare function getEnvForPackageManager({ cliType, lockfileVersion, node
92
92
  }): {
93
93
  [x: string]: string | undefined;
94
94
  };
95
+ /**
96
+ * Helper to get the binary paths that link to the used package manager.
97
+ * Note: Make sure it doesn't contain any `console.log` calls.
98
+ */
99
+ export declare function getPathOverrideForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
100
+ cliType: CliType;
101
+ lockfileVersion: number | undefined;
102
+ nodeVersion: NodeVersion | undefined;
103
+ env: {
104
+ [x: string]: string | undefined;
105
+ };
106
+ }): {
107
+ /**
108
+ * Which lockfile was detected.
109
+ */
110
+ detectedLockfile: string | undefined;
111
+ /**
112
+ * Detected package manager that generated the found lockfile.
113
+ */
114
+ detectedPackageManager: string | undefined;
115
+ /**
116
+ * Value of $PATH that includes the binaries for the detected package manager.
117
+ * Undefined if no $PATH are necessary.
118
+ */
119
+ path: string | undefined;
120
+ };
95
121
  /**
96
122
  * Helper to get the binary paths that link to the used package manager.
97
123
  * Note: Make sure it doesn't contain any `console.log` calls.
@@ -34,6 +34,7 @@ __export(run_user_scripts_exports, {
34
34
  getNodeBinPaths: () => getNodeBinPaths,
35
35
  getNodeVersion: () => getNodeVersion,
36
36
  getPathForPackageManager: () => getPathForPackageManager,
37
+ getPathOverrideForPackageManager: () => getPathOverrideForPackageManager,
37
38
  getScriptName: () => getScriptName,
38
39
  getSpawnOptions: () => getSpawnOptions,
39
40
  installDependencies: () => installDependencies,
@@ -389,9 +390,8 @@ function getEnvForPackageManager({
389
390
  const {
390
391
  detectedLockfile,
391
392
  detectedPackageManager,
392
- path: newPath,
393
- yarnNodeLinker
394
- } = getPathForPackageManager({
393
+ path: newPath
394
+ } = getPathOverrideForPackageManager({
395
395
  cliType,
396
396
  lockfileVersion,
397
397
  nodeVersion,
@@ -400,75 +400,146 @@ function getEnvForPackageManager({
400
400
  const newEnv = {
401
401
  ...env
402
402
  };
403
- if (newPath) {
403
+ const alreadyInPath = (newPath2) => {
404
+ const oldPath = env.PATH ?? "";
405
+ return oldPath.split(import_path.default.delimiter).includes(newPath2);
406
+ };
407
+ if (newPath && !alreadyInPath(newPath)) {
404
408
  const oldPath = env.PATH + "";
405
409
  newEnv.PATH = `${newPath}${import_path.default.delimiter}${oldPath}`;
406
- }
407
- if (yarnNodeLinker) {
408
- newEnv.YARN_NODE_LINKER = yarnNodeLinker;
409
- }
410
- if (detectedLockfile && detectedPackageManager) {
411
- const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
412
- console.log(
413
- `Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
414
- );
415
- if (cliType === "bun") {
416
- console.warn(
417
- "Warning: Bun is used as a package manager at build time only, not at runtime with Functions"
410
+ if (detectedLockfile && detectedPackageManager) {
411
+ const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
412
+ console.log(
413
+ `Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
418
414
  );
415
+ if (cliType === "bun") {
416
+ console.warn(
417
+ "Warning: Bun is used as a package manager at build time only, not at runtime with Functions"
418
+ );
419
+ }
419
420
  }
420
421
  }
422
+ if (cliType === "yarn" && !env.YARN_NODE_LINKER) {
423
+ newEnv.YARN_NODE_LINKER = "node-modules";
424
+ }
421
425
  return newEnv;
422
426
  }
423
- function getPathForPackageManager({
427
+ function detectPnpmVersion(lockfileVersion, corepackEnabled) {
428
+ switch (true) {
429
+ case corepackEnabled:
430
+ return "corepack_enabled";
431
+ case lockfileVersion === void 0:
432
+ return "not found";
433
+ case (lockfileVersion === 5.3 || lockfileVersion === 5.4):
434
+ return "pnpm 7";
435
+ case (lockfileVersion === 6 || lockfileVersion === 6.1):
436
+ return "pnpm 8";
437
+ case (lockfileVersion === 7 || lockfileVersion === 9):
438
+ return "pnpm 9";
439
+ default:
440
+ return "not found";
441
+ }
442
+ }
443
+ function shouldUseNpm7(lockfileVersion, nodeVersion) {
444
+ if (lockfileVersion === void 0)
445
+ return false;
446
+ return lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16;
447
+ }
448
+ function getPathOverrideForPackageManager({
424
449
  cliType,
425
450
  lockfileVersion,
426
451
  nodeVersion,
427
452
  env
428
453
  }) {
429
- let detectedLockfile;
430
- let detectedPackageManager;
431
- let pathValue;
432
- let yarnNodeLinker;
433
- const oldPath = env.PATH + "";
434
- const npm7 = "/node16/bin-npm7";
435
- const pnpm7 = "/pnpm7/node_modules/.bin";
436
- const pnpm8 = "/pnpm8/node_modules/.bin";
437
- const bun1 = "/bun1";
454
+ const no_override = {
455
+ detectedLockfile: void 0,
456
+ detectedPackageManager: void 0,
457
+ path: void 0
458
+ };
438
459
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
439
- if (cliType === "npm") {
440
- if (typeof lockfileVersion === "number" && lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16 && !oldPath.includes(npm7) && !corepackEnabled) {
441
- pathValue = npm7;
442
- detectedLockfile = "package-lock.json";
443
- detectedPackageManager = "npm 7+";
444
- }
445
- } else if (cliType === "pnpm") {
446
- if (typeof lockfileVersion === "number" && lockfileVersion === 5.4 && !oldPath.includes(pnpm7) && !corepackEnabled) {
447
- pathValue = pnpm7;
448
- detectedLockfile = "pnpm-lock.yaml";
449
- detectedPackageManager = "pnpm 7";
450
- } else if (typeof lockfileVersion === "number" && lockfileVersion >= 6 && !oldPath.includes(pnpm8) && !corepackEnabled) {
451
- pathValue = pnpm8;
452
- detectedLockfile = "pnpm-lock.yaml";
453
- detectedPackageManager = "pnpm 8";
454
- }
455
- } else if (cliType === "bun") {
456
- if (!oldPath.includes(bun1) && !corepackEnabled) {
457
- pathValue = bun1;
458
- detectedLockfile = "bun.lockb";
459
- detectedPackageManager = "Bun";
460
- }
461
- } else {
462
- if (!env.YARN_NODE_LINKER) {
463
- yarnNodeLinker = "node-modules";
464
- }
460
+ switch (cliType) {
461
+ case "npm":
462
+ switch (true) {
463
+ case corepackEnabled:
464
+ return no_override;
465
+ case shouldUseNpm7(lockfileVersion, nodeVersion):
466
+ return {
467
+ path: "/node16/bin-npm7",
468
+ detectedLockfile: "package-lock.json",
469
+ detectedPackageManager: "npm 7+"
470
+ };
471
+ default:
472
+ return no_override;
473
+ }
474
+ case "pnpm":
475
+ switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
476
+ case "corepack_enabled":
477
+ return no_override;
478
+ case "pnpm 7":
479
+ return {
480
+ path: "/pnpm7/node_modules/.bin",
481
+ detectedLockfile: "pnpm-lock.yaml",
482
+ detectedPackageManager: "pnpm 7"
483
+ };
484
+ case "pnpm 8":
485
+ return {
486
+ path: "/pnpm8/node_modules/.bin",
487
+ detectedLockfile: "pnpm-lock.yaml",
488
+ detectedPackageManager: "pnpm 8"
489
+ };
490
+ case "pnpm 9":
491
+ return {
492
+ path: "/pnpm9/node_modules/.bin",
493
+ detectedLockfile: "pnpm-lock.yaml",
494
+ detectedPackageManager: "pnpm 9"
495
+ };
496
+ default:
497
+ return no_override;
498
+ }
499
+ case "bun":
500
+ switch (true) {
501
+ case corepackEnabled:
502
+ return no_override;
503
+ default:
504
+ return {
505
+ path: "/bun1",
506
+ detectedLockfile: "bun.lockb",
507
+ detectedPackageManager: "Bun"
508
+ };
509
+ }
510
+ case "yarn":
511
+ return no_override;
465
512
  }
466
- return {
467
- detectedLockfile,
468
- detectedPackageManager,
469
- path: pathValue,
470
- yarnNodeLinker
513
+ }
514
+ function getPathForPackageManager({
515
+ cliType,
516
+ lockfileVersion,
517
+ nodeVersion,
518
+ env
519
+ }) {
520
+ const overrides = getPathOverrideForPackageManager({
521
+ cliType,
522
+ lockfileVersion,
523
+ nodeVersion,
524
+ env
525
+ });
526
+ const alreadyInPath = (newPath) => {
527
+ const oldPath = env.PATH ?? "";
528
+ return oldPath.split(import_path.default.delimiter).includes(newPath);
471
529
  };
530
+ switch (true) {
531
+ case (cliType === "yarn" && !env.YARN_NODE_LINKER):
532
+ return { ...overrides, yarnNodeLinker: "node-modules" };
533
+ case alreadyInPath(overrides.path ?? ""):
534
+ return {
535
+ detectedLockfile: void 0,
536
+ detectedPackageManager: void 0,
537
+ path: void 0,
538
+ yarnNodeLinker: void 0
539
+ };
540
+ default:
541
+ return { ...overrides, yarnNodeLinker: void 0 };
542
+ }
472
543
  }
473
544
  async function runCustomInstallCommand({
474
545
  destPath,
@@ -573,6 +644,7 @@ const installDependencies = (0, import_util.deprecate)(
573
644
  getNodeBinPaths,
574
645
  getNodeVersion,
575
646
  getPathForPackageManager,
647
+ getPathOverrideForPackageManager,
576
648
  getScriptName,
577
649
  getSpawnOptions,
578
650
  installDependencies,
@@ -30,7 +30,8 @@ function getPrefixedEnvVars({
30
30
  "VERCEL_URL",
31
31
  "VERCEL_ENV",
32
32
  "VERCEL_REGION",
33
- "VERCEL_BRANCH_URL"
33
+ "VERCEL_BRANCH_URL",
34
+ "VERCEL_PROJECT_PRODUCTION_URL"
34
35
  ];
35
36
  const newEnvs = {};
36
37
  if (envPrefix && envs.VERCEL_URL) {
package/dist/index.js CHANGED
@@ -22112,9 +22112,8 @@ function getEnvForPackageManager({
22112
22112
  const {
22113
22113
  detectedLockfile,
22114
22114
  detectedPackageManager,
22115
- path: newPath,
22116
- yarnNodeLinker
22117
- } = getPathForPackageManager({
22115
+ path: newPath
22116
+ } = getPathOverrideForPackageManager({
22118
22117
  cliType,
22119
22118
  lockfileVersion,
22120
22119
  nodeVersion,
@@ -22123,75 +22122,146 @@ function getEnvForPackageManager({
22123
22122
  const newEnv = {
22124
22123
  ...env
22125
22124
  };
22126
- if (newPath) {
22125
+ const alreadyInPath = (newPath2) => {
22126
+ const oldPath = env.PATH ?? "";
22127
+ return oldPath.split(import_path5.default.delimiter).includes(newPath2);
22128
+ };
22129
+ if (newPath && !alreadyInPath(newPath)) {
22127
22130
  const oldPath = env.PATH + "";
22128
22131
  newEnv.PATH = `${newPath}${import_path5.default.delimiter}${oldPath}`;
22129
- }
22130
- if (yarnNodeLinker) {
22131
- newEnv.YARN_NODE_LINKER = yarnNodeLinker;
22132
- }
22133
- if (detectedLockfile && detectedPackageManager) {
22134
- const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
22135
- console.log(
22136
- `Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
22137
- );
22138
- if (cliType === "bun") {
22139
- console.warn(
22140
- "Warning: Bun is used as a package manager at build time only, not at runtime with Functions"
22132
+ if (detectedLockfile && detectedPackageManager) {
22133
+ const versionString = cliType === "pnpm" ? `version ${lockfileVersion} ` : "";
22134
+ console.log(
22135
+ `Detected \`${detectedLockfile}\` ${versionString}generated by ${detectedPackageManager}`
22141
22136
  );
22137
+ if (cliType === "bun") {
22138
+ console.warn(
22139
+ "Warning: Bun is used as a package manager at build time only, not at runtime with Functions"
22140
+ );
22141
+ }
22142
22142
  }
22143
22143
  }
22144
+ if (cliType === "yarn" && !env.YARN_NODE_LINKER) {
22145
+ newEnv.YARN_NODE_LINKER = "node-modules";
22146
+ }
22144
22147
  return newEnv;
22145
22148
  }
22146
- function getPathForPackageManager({
22149
+ function detectPnpmVersion(lockfileVersion, corepackEnabled) {
22150
+ switch (true) {
22151
+ case corepackEnabled:
22152
+ return "corepack_enabled";
22153
+ case lockfileVersion === void 0:
22154
+ return "not found";
22155
+ case (lockfileVersion === 5.3 || lockfileVersion === 5.4):
22156
+ return "pnpm 7";
22157
+ case (lockfileVersion === 6 || lockfileVersion === 6.1):
22158
+ return "pnpm 8";
22159
+ case (lockfileVersion === 7 || lockfileVersion === 9):
22160
+ return "pnpm 9";
22161
+ default:
22162
+ return "not found";
22163
+ }
22164
+ }
22165
+ function shouldUseNpm7(lockfileVersion, nodeVersion) {
22166
+ if (lockfileVersion === void 0)
22167
+ return false;
22168
+ return lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16;
22169
+ }
22170
+ function getPathOverrideForPackageManager({
22147
22171
  cliType,
22148
22172
  lockfileVersion,
22149
22173
  nodeVersion,
22150
22174
  env
22151
22175
  }) {
22152
- let detectedLockfile;
22153
- let detectedPackageManager;
22154
- let pathValue;
22155
- let yarnNodeLinker;
22156
- const oldPath = env.PATH + "";
22157
- const npm7 = "/node16/bin-npm7";
22158
- const pnpm7 = "/pnpm7/node_modules/.bin";
22159
- const pnpm8 = "/pnpm8/node_modules/.bin";
22160
- const bun1 = "/bun1";
22176
+ const no_override = {
22177
+ detectedLockfile: void 0,
22178
+ detectedPackageManager: void 0,
22179
+ path: void 0
22180
+ };
22161
22181
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
22162
- if (cliType === "npm") {
22163
- if (typeof lockfileVersion === "number" && lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16 && !oldPath.includes(npm7) && !corepackEnabled) {
22164
- pathValue = npm7;
22165
- detectedLockfile = "package-lock.json";
22166
- detectedPackageManager = "npm 7+";
22167
- }
22168
- } else if (cliType === "pnpm") {
22169
- if (typeof lockfileVersion === "number" && lockfileVersion === 5.4 && !oldPath.includes(pnpm7) && !corepackEnabled) {
22170
- pathValue = pnpm7;
22171
- detectedLockfile = "pnpm-lock.yaml";
22172
- detectedPackageManager = "pnpm 7";
22173
- } else if (typeof lockfileVersion === "number" && lockfileVersion >= 6 && !oldPath.includes(pnpm8) && !corepackEnabled) {
22174
- pathValue = pnpm8;
22175
- detectedLockfile = "pnpm-lock.yaml";
22176
- detectedPackageManager = "pnpm 8";
22177
- }
22178
- } else if (cliType === "bun") {
22179
- if (!oldPath.includes(bun1) && !corepackEnabled) {
22180
- pathValue = bun1;
22181
- detectedLockfile = "bun.lockb";
22182
- detectedPackageManager = "Bun";
22183
- }
22184
- } else {
22185
- if (!env.YARN_NODE_LINKER) {
22186
- yarnNodeLinker = "node-modules";
22187
- }
22182
+ switch (cliType) {
22183
+ case "npm":
22184
+ switch (true) {
22185
+ case corepackEnabled:
22186
+ return no_override;
22187
+ case shouldUseNpm7(lockfileVersion, nodeVersion):
22188
+ return {
22189
+ path: "/node16/bin-npm7",
22190
+ detectedLockfile: "package-lock.json",
22191
+ detectedPackageManager: "npm 7+"
22192
+ };
22193
+ default:
22194
+ return no_override;
22195
+ }
22196
+ case "pnpm":
22197
+ switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
22198
+ case "corepack_enabled":
22199
+ return no_override;
22200
+ case "pnpm 7":
22201
+ return {
22202
+ path: "/pnpm7/node_modules/.bin",
22203
+ detectedLockfile: "pnpm-lock.yaml",
22204
+ detectedPackageManager: "pnpm 7"
22205
+ };
22206
+ case "pnpm 8":
22207
+ return {
22208
+ path: "/pnpm8/node_modules/.bin",
22209
+ detectedLockfile: "pnpm-lock.yaml",
22210
+ detectedPackageManager: "pnpm 8"
22211
+ };
22212
+ case "pnpm 9":
22213
+ return {
22214
+ path: "/pnpm9/node_modules/.bin",
22215
+ detectedLockfile: "pnpm-lock.yaml",
22216
+ detectedPackageManager: "pnpm 9"
22217
+ };
22218
+ default:
22219
+ return no_override;
22220
+ }
22221
+ case "bun":
22222
+ switch (true) {
22223
+ case corepackEnabled:
22224
+ return no_override;
22225
+ default:
22226
+ return {
22227
+ path: "/bun1",
22228
+ detectedLockfile: "bun.lockb",
22229
+ detectedPackageManager: "Bun"
22230
+ };
22231
+ }
22232
+ case "yarn":
22233
+ return no_override;
22188
22234
  }
22189
- return {
22190
- detectedLockfile,
22191
- detectedPackageManager,
22192
- path: pathValue,
22193
- yarnNodeLinker
22235
+ }
22236
+ function getPathForPackageManager({
22237
+ cliType,
22238
+ lockfileVersion,
22239
+ nodeVersion,
22240
+ env
22241
+ }) {
22242
+ const overrides = getPathOverrideForPackageManager({
22243
+ cliType,
22244
+ lockfileVersion,
22245
+ nodeVersion,
22246
+ env
22247
+ });
22248
+ const alreadyInPath = (newPath) => {
22249
+ const oldPath = env.PATH ?? "";
22250
+ return oldPath.split(import_path5.default.delimiter).includes(newPath);
22194
22251
  };
22252
+ switch (true) {
22253
+ case (cliType === "yarn" && !env.YARN_NODE_LINKER):
22254
+ return { ...overrides, yarnNodeLinker: "node-modules" };
22255
+ case alreadyInPath(overrides.path ?? ""):
22256
+ return {
22257
+ detectedLockfile: void 0,
22258
+ detectedPackageManager: void 0,
22259
+ path: void 0,
22260
+ yarnNodeLinker: void 0
22261
+ };
22262
+ default:
22263
+ return { ...overrides, yarnNodeLinker: void 0 };
22264
+ }
22195
22265
  }
22196
22266
  async function runCustomInstallCommand({
22197
22267
  destPath,
@@ -22358,7 +22428,8 @@ function getPrefixedEnvVars({
22358
22428
  "VERCEL_URL",
22359
22429
  "VERCEL_ENV",
22360
22430
  "VERCEL_REGION",
22361
- "VERCEL_BRANCH_URL"
22431
+ "VERCEL_BRANCH_URL",
22432
+ "VERCEL_PROJECT_PRODUCTION_URL"
22362
22433
  ];
22363
22434
  const newEnvs = {};
22364
22435
  if (envPrefix && envs.VERCEL_URL) {
package/dist/types.d.ts CHANGED
@@ -60,7 +60,6 @@ export interface Meta {
60
60
  filesRemoved?: string[];
61
61
  env?: Env;
62
62
  buildEnv?: Env;
63
- avoidTopLevelInstall?: boolean;
64
63
  [key: string]: unknown;
65
64
  }
66
65
  export interface BuildOptions {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "7.12.0",
3
+ "version": "8.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",