@vercel/build-utils 8.0.0 → 8.1.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 CHANGED
@@ -1,5 +1,18 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 8.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [build-utils] pnpm lockfile testing and fixing ([#11591](https://github.com/vercel/vercel/pull/11591))
8
+
9
+ ## 8.1.0
10
+
11
+ ### Minor Changes
12
+
13
+ - Update pnpm version detection logic ([#11445](https://github.com/vercel/vercel/pull/11445))
14
+ Add support for pnpm 9
15
+
3
16
  ## 8.0.0
4
17
 
5
18
  ### Major 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,152 @@ 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:
434
+ return "pnpm 6";
435
+ case lockfileVersion === 5.4:
436
+ return "pnpm 7";
437
+ case (lockfileVersion === 6 || lockfileVersion === 6.1):
438
+ return "pnpm 8";
439
+ case (lockfileVersion === 7 || lockfileVersion === 9):
440
+ return "pnpm 9";
441
+ default:
442
+ return "not found";
443
+ }
444
+ }
445
+ function shouldUseNpm7(lockfileVersion, nodeVersion) {
446
+ if (lockfileVersion === void 0)
447
+ return false;
448
+ return lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16;
449
+ }
450
+ function getPathOverrideForPackageManager({
424
451
  cliType,
425
452
  lockfileVersion,
426
453
  nodeVersion,
427
454
  env
428
455
  }) {
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";
456
+ const no_override = {
457
+ detectedLockfile: void 0,
458
+ detectedPackageManager: void 0,
459
+ path: void 0
460
+ };
438
461
  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
- }
462
+ switch (cliType) {
463
+ case "npm":
464
+ switch (true) {
465
+ case corepackEnabled:
466
+ return no_override;
467
+ case shouldUseNpm7(lockfileVersion, nodeVersion):
468
+ return {
469
+ path: "/node16/bin-npm7",
470
+ detectedLockfile: "package-lock.json",
471
+ detectedPackageManager: "npm 7+"
472
+ };
473
+ default:
474
+ return no_override;
475
+ }
476
+ case "pnpm":
477
+ switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
478
+ case "corepack_enabled":
479
+ return no_override;
480
+ case "pnpm 7":
481
+ return {
482
+ path: "/pnpm7/node_modules/.bin",
483
+ detectedLockfile: "pnpm-lock.yaml",
484
+ detectedPackageManager: "pnpm 7"
485
+ };
486
+ case "pnpm 8":
487
+ return {
488
+ path: "/pnpm8/node_modules/.bin",
489
+ detectedLockfile: "pnpm-lock.yaml",
490
+ detectedPackageManager: "pnpm 8"
491
+ };
492
+ case "pnpm 9":
493
+ return {
494
+ path: "/pnpm9/node_modules/.bin",
495
+ detectedLockfile: "pnpm-lock.yaml",
496
+ detectedPackageManager: "pnpm 9"
497
+ };
498
+ case "pnpm 6":
499
+ default:
500
+ return no_override;
501
+ }
502
+ case "bun":
503
+ switch (true) {
504
+ case corepackEnabled:
505
+ return no_override;
506
+ default:
507
+ return {
508
+ path: "/bun1",
509
+ detectedLockfile: "bun.lockb",
510
+ detectedPackageManager: "Bun"
511
+ };
512
+ }
513
+ case "yarn":
514
+ return no_override;
465
515
  }
466
- return {
467
- detectedLockfile,
468
- detectedPackageManager,
469
- path: pathValue,
470
- yarnNodeLinker
516
+ }
517
+ function getPathForPackageManager({
518
+ cliType,
519
+ lockfileVersion,
520
+ nodeVersion,
521
+ env
522
+ }) {
523
+ const overrides = getPathOverrideForPackageManager({
524
+ cliType,
525
+ lockfileVersion,
526
+ nodeVersion,
527
+ env
528
+ });
529
+ (0, import_debug.default)(
530
+ `Detected ${overrides.detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${overrides.path}`
531
+ );
532
+ const alreadyInPath = (newPath) => {
533
+ const oldPath = env.PATH ?? "";
534
+ return oldPath.split(import_path.default.delimiter).includes(newPath);
471
535
  };
536
+ switch (true) {
537
+ case (cliType === "yarn" && !env.YARN_NODE_LINKER):
538
+ return { ...overrides, yarnNodeLinker: "node-modules" };
539
+ case alreadyInPath(overrides.path ?? ""):
540
+ return {
541
+ detectedLockfile: void 0,
542
+ detectedPackageManager: void 0,
543
+ path: void 0,
544
+ yarnNodeLinker: void 0
545
+ };
546
+ default:
547
+ return { ...overrides, yarnNodeLinker: void 0 };
548
+ }
472
549
  }
473
550
  async function runCustomInstallCommand({
474
551
  destPath,
@@ -573,6 +650,7 @@ const installDependencies = (0, import_util.deprecate)(
573
650
  getNodeBinPaths,
574
651
  getNodeVersion,
575
652
  getPathForPackageManager,
653
+ getPathOverrideForPackageManager,
576
654
  getScriptName,
577
655
  getSpawnOptions,
578
656
  installDependencies,
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,152 @@ 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:
22156
+ return "pnpm 6";
22157
+ case lockfileVersion === 5.4:
22158
+ return "pnpm 7";
22159
+ case (lockfileVersion === 6 || lockfileVersion === 6.1):
22160
+ return "pnpm 8";
22161
+ case (lockfileVersion === 7 || lockfileVersion === 9):
22162
+ return "pnpm 9";
22163
+ default:
22164
+ return "not found";
22165
+ }
22166
+ }
22167
+ function shouldUseNpm7(lockfileVersion, nodeVersion) {
22168
+ if (lockfileVersion === void 0)
22169
+ return false;
22170
+ return lockfileVersion >= 2 && (nodeVersion?.major || 0) < 16;
22171
+ }
22172
+ function getPathOverrideForPackageManager({
22147
22173
  cliType,
22148
22174
  lockfileVersion,
22149
22175
  nodeVersion,
22150
22176
  env
22151
22177
  }) {
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";
22178
+ const no_override = {
22179
+ detectedLockfile: void 0,
22180
+ detectedPackageManager: void 0,
22181
+ path: void 0
22182
+ };
22161
22183
  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
- }
22184
+ switch (cliType) {
22185
+ case "npm":
22186
+ switch (true) {
22187
+ case corepackEnabled:
22188
+ return no_override;
22189
+ case shouldUseNpm7(lockfileVersion, nodeVersion):
22190
+ return {
22191
+ path: "/node16/bin-npm7",
22192
+ detectedLockfile: "package-lock.json",
22193
+ detectedPackageManager: "npm 7+"
22194
+ };
22195
+ default:
22196
+ return no_override;
22197
+ }
22198
+ case "pnpm":
22199
+ switch (detectPnpmVersion(lockfileVersion, corepackEnabled)) {
22200
+ case "corepack_enabled":
22201
+ return no_override;
22202
+ case "pnpm 7":
22203
+ return {
22204
+ path: "/pnpm7/node_modules/.bin",
22205
+ detectedLockfile: "pnpm-lock.yaml",
22206
+ detectedPackageManager: "pnpm 7"
22207
+ };
22208
+ case "pnpm 8":
22209
+ return {
22210
+ path: "/pnpm8/node_modules/.bin",
22211
+ detectedLockfile: "pnpm-lock.yaml",
22212
+ detectedPackageManager: "pnpm 8"
22213
+ };
22214
+ case "pnpm 9":
22215
+ return {
22216
+ path: "/pnpm9/node_modules/.bin",
22217
+ detectedLockfile: "pnpm-lock.yaml",
22218
+ detectedPackageManager: "pnpm 9"
22219
+ };
22220
+ case "pnpm 6":
22221
+ default:
22222
+ return no_override;
22223
+ }
22224
+ case "bun":
22225
+ switch (true) {
22226
+ case corepackEnabled:
22227
+ return no_override;
22228
+ default:
22229
+ return {
22230
+ path: "/bun1",
22231
+ detectedLockfile: "bun.lockb",
22232
+ detectedPackageManager: "Bun"
22233
+ };
22234
+ }
22235
+ case "yarn":
22236
+ return no_override;
22188
22237
  }
22189
- return {
22190
- detectedLockfile,
22191
- detectedPackageManager,
22192
- path: pathValue,
22193
- yarnNodeLinker
22238
+ }
22239
+ function getPathForPackageManager({
22240
+ cliType,
22241
+ lockfileVersion,
22242
+ nodeVersion,
22243
+ env
22244
+ }) {
22245
+ const overrides = getPathOverrideForPackageManager({
22246
+ cliType,
22247
+ lockfileVersion,
22248
+ nodeVersion,
22249
+ env
22250
+ });
22251
+ debug(
22252
+ `Detected ${overrides.detectedPackageManager} with lockfileVersion ${lockfileVersion} (${typeof lockfileVersion}): ${overrides.path}`
22253
+ );
22254
+ const alreadyInPath = (newPath) => {
22255
+ const oldPath = env.PATH ?? "";
22256
+ return oldPath.split(import_path5.default.delimiter).includes(newPath);
22194
22257
  };
22258
+ switch (true) {
22259
+ case (cliType === "yarn" && !env.YARN_NODE_LINKER):
22260
+ return { ...overrides, yarnNodeLinker: "node-modules" };
22261
+ case alreadyInPath(overrides.path ?? ""):
22262
+ return {
22263
+ detectedLockfile: void 0,
22264
+ detectedPackageManager: void 0,
22265
+ path: void 0,
22266
+ yarnNodeLinker: void 0
22267
+ };
22268
+ default:
22269
+ return { ...overrides, yarnNodeLinker: void 0 };
22270
+ }
22195
22271
  }
22196
22272
  async function runCustomInstallCommand({
22197
22273
  destPath,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "8.0.0",
3
+ "version": "8.1.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",