@vercel/build-utils 12.1.3 → 12.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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @vercel/build-utils
2
2
 
3
+ ## 12.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Add backend util helpers ([#14152](https://github.com/vercel/vercel/pull/14152))
8
+
9
+ ## 12.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - Add support for Bun through a vercel.json property ([#14130](https://github.com/vercel/vercel/pull/14130))
14
+
3
15
  ## 12.1.3
4
16
 
5
17
  ### Patch Changes
@@ -0,0 +1,17 @@
1
+ /**
2
+ * List of backend frameworks supported by the experimental backends feature
3
+ */
4
+ export declare const BACKEND_FRAMEWORKS: readonly ["express", "hono", "h3", "nestjs", "fastify"];
5
+ export type BackendFramework = (typeof BACKEND_FRAMEWORKS)[number];
6
+ /**
7
+ * Checks if the given framework is a backend framework
8
+ */
9
+ export declare function isBackendFramework(framework: string | null | undefined): framework is BackendFramework;
10
+ /**
11
+ * Checks if experimental backends are enabled via environment variable
12
+ */
13
+ export declare function isExperimentalBackendsEnabled(): boolean;
14
+ /**
15
+ * Checks if experimental backends are enabled AND the framework is a backend framework
16
+ */
17
+ export declare function shouldUseExperimentalBackends(framework: string | null | undefined): boolean;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var framework_helpers_exports = {};
20
+ __export(framework_helpers_exports, {
21
+ BACKEND_FRAMEWORKS: () => BACKEND_FRAMEWORKS,
22
+ isBackendFramework: () => isBackendFramework,
23
+ isExperimentalBackendsEnabled: () => isExperimentalBackendsEnabled,
24
+ shouldUseExperimentalBackends: () => shouldUseExperimentalBackends
25
+ });
26
+ module.exports = __toCommonJS(framework_helpers_exports);
27
+ const BACKEND_FRAMEWORKS = [
28
+ "express",
29
+ "hono",
30
+ "h3",
31
+ "nestjs",
32
+ "fastify"
33
+ ];
34
+ function isBackendFramework(framework) {
35
+ if (!framework)
36
+ return false;
37
+ return BACKEND_FRAMEWORKS.includes(framework);
38
+ }
39
+ function isExperimentalBackendsEnabled() {
40
+ return process.env.VERCEL_EXPERIMENTAL_BACKENDS === "1" || // Previously used for experimental express and hono builds
41
+ process.env.VERCEL_EXPERIMENTAL_EXPRESS_BUILD === "1" || process.env.VERCEL_EXPERIMENTAL_HONO_BUILD === "1";
42
+ }
43
+ function shouldUseExperimentalBackends(framework) {
44
+ return isExperimentalBackendsEnabled() && isBackendFramework(framework);
45
+ }
46
+ // Annotate the CommonJS export names for ESM import in node:
47
+ 0 && (module.exports = {
48
+ BACKEND_FRAMEWORKS,
49
+ isBackendFramework,
50
+ isExperimentalBackendsEnabled,
51
+ shouldUseExperimentalBackends
52
+ });
@@ -1,10 +1,13 @@
1
- import { NodeVersion } from '../types';
1
+ import { BunVersion, NodeVersion, Version } from '../types';
2
2
  export type NodeVersionMajor = ReturnType<typeof getOptions>[number]['major'];
3
3
  export declare const NODE_VERSIONS: NodeVersion[];
4
+ export declare const BUN_VERSIONS: BunVersion[];
4
5
  export declare function getNodeVersionByMajor(major: number): NodeVersion | undefined;
5
6
  declare function getOptions(): NodeVersion[];
6
7
  export declare function getAvailableNodeVersions(): NodeVersionMajor[];
7
8
  export declare function getLatestNodeVersion(availableVersions?: NodeVersionMajor[]): NodeVersion;
8
9
  export declare function getDiscontinuedNodeVersions(): NodeVersion[];
9
10
  export declare function getSupportedNodeVersion(engineRange: string | undefined, isAuto?: boolean, availableVersions?: NodeVersionMajor[]): Promise<NodeVersion>;
11
+ export declare function getSupportedBunVersion(engineRange: string): BunVersion;
12
+ export declare function isBunVersion(version: Version): boolean;
10
13
  export {};
@@ -28,12 +28,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var node_version_exports = {};
30
30
  __export(node_version_exports, {
31
+ BUN_VERSIONS: () => BUN_VERSIONS,
31
32
  NODE_VERSIONS: () => NODE_VERSIONS,
32
33
  getAvailableNodeVersions: () => getAvailableNodeVersions,
33
34
  getDiscontinuedNodeVersions: () => getDiscontinuedNodeVersions,
34
35
  getLatestNodeVersion: () => getLatestNodeVersion,
35
36
  getNodeVersionByMajor: () => getNodeVersionByMajor,
36
- getSupportedNodeVersion: () => getSupportedNodeVersion
37
+ getSupportedBunVersion: () => getSupportedBunVersion,
38
+ getSupportedNodeVersion: () => getSupportedNodeVersion,
39
+ isBunVersion: () => isBunVersion
37
40
  });
38
41
  module.exports = __toCommonJS(node_version_exports);
39
42
  var import_fs = require("fs");
@@ -89,6 +92,13 @@ const NODE_VERSIONS = [
89
92
  discontinueDate: /* @__PURE__ */ new Date("2020-01-06")
90
93
  })
91
94
  ];
95
+ const BUN_VERSIONS = [
96
+ new import_types.BunVersion({
97
+ major: 1,
98
+ range: "1.x",
99
+ runtime: "bun1.x"
100
+ })
101
+ ];
92
102
  function getNodeVersionByMajor(major) {
93
103
  return NODE_VERSIONS.find((v) => v.major === major);
94
104
  }
@@ -175,12 +185,36 @@ async function getSupportedNodeVersion(engineRange, isAuto = false, availableVer
175
185
  }
176
186
  return selection;
177
187
  }
188
+ function getSupportedBunVersion(engineRange) {
189
+ if ((0, import_semver.validRange)(engineRange)) {
190
+ const selected = BUN_VERSIONS.find((version) => {
191
+ return (0, import_semver.intersects)(version.range, engineRange);
192
+ });
193
+ if (selected) {
194
+ return new import_types.BunVersion({
195
+ major: selected.major,
196
+ range: selected.range,
197
+ runtime: selected.runtime
198
+ });
199
+ }
200
+ }
201
+ throw new import_errors.NowBuildError({
202
+ message: `Found invalid Bun Version: "${engineRange}".`,
203
+ code: "BUILD_UTILS_BUN_VERSION_INVALID"
204
+ });
205
+ }
206
+ function isBunVersion(version) {
207
+ return version.runtime.startsWith("bun");
208
+ }
178
209
  // Annotate the CommonJS export names for ESM import in node:
179
210
  0 && (module.exports = {
211
+ BUN_VERSIONS,
180
212
  NODE_VERSIONS,
181
213
  getAvailableNodeVersions,
182
214
  getDiscontinuedNodeVersions,
183
215
  getLatestNodeVersion,
184
216
  getNodeVersionByMajor,
185
- getSupportedNodeVersion
217
+ getSupportedBunVersion,
218
+ getSupportedNodeVersion,
219
+ isBunVersion
186
220
  });
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { SpawnOptions } from 'child_process';
3
- import { Meta, PackageJson, NodeVersion, Config } from '../types';
3
+ import { Meta, PackageJson, NodeVersion, Config, BunVersion } from '../types';
4
4
  export type CliType = 'yarn' | 'npm' | 'pnpm' | 'bun' | 'vlt';
5
5
  export interface ScanParentDirsResult {
6
6
  /**
@@ -85,23 +85,22 @@ export declare function getNodeBinPath({ cwd, }: {
85
85
  export declare function getNodeBinPaths({ start, base, }: TraverseUpDirectoriesProps): string[];
86
86
  export declare function runShellScript(fsPath: string, args?: string[], spawnOpts?: SpawnOptions): Promise<boolean>;
87
87
  export declare function getSpawnOptions(meta: Meta, nodeVersion: NodeVersion): SpawnOptions;
88
- export declare function getNodeVersion(destPath: string, fallbackVersion?: string | undefined, config?: Config, meta?: Meta, availableVersions?: number[]): Promise<NodeVersion>;
88
+ export declare function getNodeVersion(destPath: string, fallbackVersion?: string | undefined, config?: Config, meta?: Meta, availableVersions?: number[]): Promise<NodeVersion | BunVersion>;
89
89
  export declare function scanParentDirs(destPath: string, readPackageJson?: boolean, base?: string): Promise<ScanParentDirsResult>;
90
90
  export declare function turboVersionSpecifierSupportsCorepack(turboVersionSpecifier: string): boolean;
91
91
  export declare function usingCorepack(env: {
92
92
  [x: string]: string | undefined;
93
93
  }, packageJsonPackageManager: string | undefined, turboSupportsCorepackHome: boolean | undefined): boolean;
94
94
  export declare function walkParentDirs({ base, start, filename, }: WalkParentDirsProps): Promise<string | null>;
95
- export declare function runNpmInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta, nodeVersion?: NodeVersion, projectCreatedAt?: number): Promise<boolean>;
95
+ export declare function runNpmInstall(destPath: string, args?: string[], spawnOpts?: SpawnOptions, meta?: Meta, projectCreatedAt?: number): Promise<boolean>;
96
96
  /**
97
97
  * Prepares the input environment based on the used package manager and lockfile
98
98
  * versions.
99
99
  */
100
- export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, nodeVersion, env, packageJsonEngines, turboSupportsCorepackHome, projectCreatedAt, }: {
100
+ export declare function getEnvForPackageManager({ cliType, lockfileVersion, packageJsonPackageManager, env, packageJsonEngines, turboSupportsCorepackHome, projectCreatedAt, }: {
101
101
  cliType: CliType;
102
102
  lockfileVersion: number | undefined;
103
103
  packageJsonPackageManager?: string | undefined;
104
- nodeVersion: NodeVersion | undefined;
105
104
  env: {
106
105
  [x: string]: string | undefined;
107
106
  };
@@ -120,7 +119,6 @@ export declare function getPathOverrideForPackageManager({ cliType, lockfileVers
120
119
  cliType: CliType;
121
120
  lockfileVersion: number | undefined;
122
121
  corepackPackageManager: string | undefined;
123
- nodeVersion: NodeVersion | undefined;
124
122
  corepackEnabled?: boolean;
125
123
  packageJsonEngines?: PackageJson.Engines;
126
124
  projectCreatedAt?: number;
@@ -160,10 +158,9 @@ export declare function detectPackageManager(cliType: CliType, lockfileVersion:
160
158
  * Note: Make sure it doesn't contain any `console.log` calls.
161
159
  * @deprecated use `getEnvForPackageManager` instead
162
160
  */
163
- export declare function getPathForPackageManager({ cliType, lockfileVersion, nodeVersion, env, }: {
161
+ export declare function getPathForPackageManager({ cliType, lockfileVersion, env, }: {
164
162
  cliType: CliType;
165
163
  lockfileVersion: number | undefined;
166
- nodeVersion: NodeVersion | undefined;
167
164
  env: {
168
165
  [x: string]: string | undefined;
169
166
  };
@@ -187,10 +184,9 @@ export declare function getPathForPackageManager({ cliType, lockfileVersion, nod
187
184
  */
188
185
  yarnNodeLinker: string | undefined;
189
186
  };
190
- export declare function runCustomInstallCommand({ destPath, installCommand, nodeVersion, spawnOpts, projectCreatedAt, }: {
187
+ export declare function runCustomInstallCommand({ destPath, installCommand, spawnOpts, projectCreatedAt, }: {
191
188
  destPath: string;
192
189
  installCommand: string;
193
- nodeVersion: NodeVersion;
194
190
  spawnOpts?: SpawnOptions;
195
191
  projectCreatedAt?: number;
196
192
  }): Promise<void>;
@@ -182,6 +182,9 @@ function getSpawnOptions(meta, nodeVersion) {
182
182
  const opts = {
183
183
  env: (0, import_clone_env.cloneEnv)(process.env)
184
184
  };
185
+ if ((0, import_node_version.isBunVersion)(nodeVersion)) {
186
+ return opts;
187
+ }
185
188
  if (!meta.isDev) {
186
189
  let found = false;
187
190
  const oldPath = opts.env.PATH || process.env.PATH || "";
@@ -200,6 +203,9 @@ function getSpawnOptions(meta, nodeVersion) {
200
203
  return opts;
201
204
  }
202
205
  async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = (0, import_node_version.getAvailableNodeVersions)()) {
206
+ if (config.bunVersion) {
207
+ return (0, import_node_version.getSupportedBunVersion)(config.bunVersion);
208
+ }
203
209
  const latestVersion = (0, import_node_version.getLatestNodeVersion)(availableVersions);
204
210
  if (meta.isDev) {
205
211
  latestVersion.runtime = "nodejs";
@@ -520,7 +526,7 @@ function checkIfAlreadyInstalled(runNpmInstallSet, packageJsonPath) {
520
526
  return { alreadyInstalled, runNpmInstallSet: initializedRunNpmInstallSet };
521
527
  }
522
528
  const runNpmInstallSema = new import_async_sema.default(1);
523
- async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion, projectCreatedAt) {
529
+ async function runNpmInstall(destPath, args = [], spawnOpts, meta, projectCreatedAt) {
524
530
  if (meta?.isDev) {
525
531
  (0, import_debug.default)("Skipping dependency installation because dev mode is enabled");
526
532
  return false;
@@ -573,7 +579,6 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion,
573
579
  cliType,
574
580
  lockfileVersion,
575
581
  packageJsonPackageManager,
576
- nodeVersion,
577
582
  env,
578
583
  packageJsonEngines: packageJson?.engines,
579
584
  turboSupportsCorepackHome,
@@ -600,7 +605,6 @@ function getEnvForPackageManager({
600
605
  cliType,
601
606
  lockfileVersion,
602
607
  packageJsonPackageManager,
603
- nodeVersion,
604
608
  env,
605
609
  packageJsonEngines,
606
610
  turboSupportsCorepackHome,
@@ -619,7 +623,6 @@ function getEnvForPackageManager({
619
623
  cliType,
620
624
  lockfileVersion,
621
625
  corepackPackageManager: packageJsonPackageManager,
622
- nodeVersion,
623
626
  corepackEnabled,
624
627
  packageJsonEngines,
625
628
  projectCreatedAt
@@ -913,15 +916,13 @@ function detectPackageManager(cliType, lockfileVersion, projectCreatedAt) {
913
916
  function getPathForPackageManager({
914
917
  cliType,
915
918
  lockfileVersion,
916
- nodeVersion,
917
919
  env
918
920
  }) {
919
921
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
920
922
  let overrides = getPathOverrideForPackageManager({
921
923
  cliType,
922
924
  lockfileVersion,
923
- corepackPackageManager: void 0,
924
- nodeVersion
925
+ corepackPackageManager: void 0
925
926
  });
926
927
  if (corepackEnabled) {
927
928
  overrides = NO_OVERRIDE;
@@ -947,7 +948,6 @@ function getPathForPackageManager({
947
948
  async function runCustomInstallCommand({
948
949
  destPath,
949
950
  installCommand,
950
- nodeVersion,
951
951
  spawnOpts,
952
952
  projectCreatedAt
953
953
  }) {
@@ -963,7 +963,6 @@ async function runCustomInstallCommand({
963
963
  cliType,
964
964
  lockfileVersion,
965
965
  packageJsonPackageManager,
966
- nodeVersion,
967
966
  env: spawnOpts?.env || {},
968
967
  packageJsonEngines: packageJson?.engines,
969
968
  turboSupportsCorepackHome,
@@ -1000,7 +999,6 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts, projectCre
1000
999
  cliType,
1001
1000
  lockfileVersion,
1002
1001
  packageJsonPackageManager,
1003
- nodeVersion: void 0,
1004
1002
  env: (0, import_clone_env.cloneEnv)(process.env, spawnOpts?.env),
1005
1003
  packageJsonEngines: packageJson?.engines,
1006
1004
  turboSupportsCorepackHome,
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@ import getWriteableDirectory from './fs/get-writable-directory';
9
9
  import glob, { GlobOptions } from './fs/glob';
10
10
  import rename from './fs/rename';
11
11
  import { spawnAsync, execCommand, spawnCommand, walkParentDirs, getScriptName, installDependencies, runPackageJsonScript, runNpmInstall, runBundleInstall, runPipInstall, runShellScript, runCustomInstallCommand, getEnvForPackageManager, getNodeVersion, getPathForPackageManager, detectPackageManager, getSpawnOptions, getNodeBinPath, getNodeBinPaths, scanParentDirs, traverseUpDirectories } from './fs/run-user-scripts';
12
- import { getLatestNodeVersion, getDiscontinuedNodeVersions, getSupportedNodeVersion } from './fs/node-version';
12
+ import { getLatestNodeVersion, getDiscontinuedNodeVersions, getSupportedNodeVersion, isBunVersion, getSupportedBunVersion } from './fs/node-version';
13
13
  import streamToBuffer, { streamToBufferChunks } from './fs/stream-to-buffer';
14
14
  import debug from './debug';
15
15
  import getIgnoreFilter from './get-ignore-filter';
@@ -18,7 +18,7 @@ import { getPrefixedEnvVars } from './get-prefixed-env-vars';
18
18
  import { cloneEnv } from './clone-env';
19
19
  import { hardLinkDir } from './hard-link-dir';
20
20
  import { validateNpmrc } from './validate-npmrc';
21
- export { FileBlob, FileFsRef, FileRef, Lambda, NodejsLambda, createLambda, Prerender, download, downloadFile, DownloadedFiles, getWriteableDirectory, glob, GlobOptions, rename, spawnAsync, getScriptName, installDependencies, runPackageJsonScript, execCommand, spawnCommand, walkParentDirs, getNodeBinPath, getNodeBinPaths, getSupportedNodeVersion, detectPackageManager, runNpmInstall, runBundleInstall, runPipInstall, runShellScript, runCustomInstallCommand, getEnvForPackageManager, getNodeVersion, getPathForPackageManager, getLatestNodeVersion, getDiscontinuedNodeVersions, getSpawnOptions, getPlatformEnv, getPrefixedEnvVars, streamToBuffer, streamToBufferChunks, debug, isSymbolicLink, isDirectory, getLambdaOptionsFromFunction, scanParentDirs, getIgnoreFilter, cloneEnv, hardLinkDir, traverseUpDirectories, validateNpmrc, };
21
+ export { FileBlob, FileFsRef, FileRef, Lambda, NodejsLambda, createLambda, Prerender, download, downloadFile, DownloadedFiles, getWriteableDirectory, glob, GlobOptions, rename, spawnAsync, getScriptName, installDependencies, runPackageJsonScript, execCommand, spawnCommand, walkParentDirs, getNodeBinPath, getNodeBinPaths, getSupportedNodeVersion, isBunVersion, getSupportedBunVersion, detectPackageManager, runNpmInstall, runBundleInstall, runPipInstall, runShellScript, runCustomInstallCommand, getEnvForPackageManager, getNodeVersion, getPathForPackageManager, getLatestNodeVersion, getDiscontinuedNodeVersions, getSpawnOptions, getPlatformEnv, getPrefixedEnvVars, streamToBuffer, streamToBufferChunks, debug, isSymbolicLink, isDirectory, getLambdaOptionsFromFunction, scanParentDirs, getIgnoreFilter, cloneEnv, hardLinkDir, traverseUpDirectories, validateNpmrc, };
22
22
  export { EdgeFunction } from './edge-function';
23
23
  export { readConfigFile } from './fs/read-config-file';
24
24
  export { normalizePath } from './fs/normalize-path';
@@ -32,3 +32,4 @@ export { NODE_VERSIONS } from './fs/node-version';
32
32
  export { getInstalledPackageVersion } from './get-installed-package-version';
33
33
  export { defaultCachePathGlob } from './default-cache-path-glob';
34
34
  export { generateNodeBuilderFunctions } from './generate-node-builder-functions';
35
+ export { BACKEND_FRAMEWORKS, BackendFramework, isBackendFramework, isExperimentalBackendsEnabled, shouldUseExperimentalBackends, } from './framework-helpers';
package/dist/index.js CHANGED
@@ -21817,8 +21817,10 @@ var require_ignore = __commonJS({
21817
21817
  // src/index.ts
21818
21818
  var src_exports = {};
21819
21819
  __export(src_exports, {
21820
+ BACKEND_FRAMEWORKS: () => BACKEND_FRAMEWORKS,
21820
21821
  BUILDER_COMPILE_STEP: () => BUILDER_COMPILE_STEP,
21821
21822
  BUILDER_INSTALLER_STEP: () => BUILDER_INSTALLER_STEP,
21823
+ BunVersion: () => BunVersion,
21822
21824
  EdgeFunction: () => EdgeFunction,
21823
21825
  FileBlob: () => FileBlob,
21824
21826
  FileFsRef: () => file_fs_ref_default,
@@ -21859,12 +21861,16 @@ __export(src_exports, {
21859
21861
  getProvidedRuntime: () => getProvidedRuntime,
21860
21862
  getScriptName: () => getScriptName,
21861
21863
  getSpawnOptions: () => getSpawnOptions,
21864
+ getSupportedBunVersion: () => getSupportedBunVersion,
21862
21865
  getSupportedNodeVersion: () => getSupportedNodeVersion,
21863
21866
  getWriteableDirectory: () => getWritableDirectory,
21864
21867
  glob: () => glob,
21865
21868
  hardLinkDir: () => hardLinkDir,
21866
21869
  installDependencies: () => installDependencies,
21870
+ isBackendFramework: () => isBackendFramework,
21871
+ isBunVersion: () => isBunVersion,
21867
21872
  isDirectory: () => isDirectory,
21873
+ isExperimentalBackendsEnabled: () => isExperimentalBackendsEnabled,
21868
21874
  isSymbolicLink: () => isSymbolicLink,
21869
21875
  normalizePath: () => normalizePath,
21870
21876
  readConfigFile: () => readConfigFile,
@@ -21877,6 +21883,7 @@ __export(src_exports, {
21877
21883
  runShellScript: () => runShellScript,
21878
21884
  scanParentDirs: () => scanParentDirs,
21879
21885
  shouldServe: () => shouldServe,
21886
+ shouldUseExperimentalBackends: () => shouldUseExperimentalBackends,
21880
21887
  spawnAsync: () => spawnAsync,
21881
21888
  spawnCommand: () => spawnCommand,
21882
21889
  streamToBuffer: () => streamToBuffer,
@@ -22948,6 +22955,8 @@ var Version = class {
22948
22955
  };
22949
22956
  var NodeVersion = class extends Version {
22950
22957
  };
22958
+ var BunVersion = class extends Version {
22959
+ };
22951
22960
 
22952
22961
  // src/fs/node-version.ts
22953
22962
  var NODE_VERSIONS = [
@@ -22998,6 +23007,13 @@ var NODE_VERSIONS = [
22998
23007
  discontinueDate: /* @__PURE__ */ new Date("2020-01-06")
22999
23008
  })
23000
23009
  ];
23010
+ var BUN_VERSIONS = [
23011
+ new BunVersion({
23012
+ major: 1,
23013
+ range: "1.x",
23014
+ runtime: "bun1.x"
23015
+ })
23016
+ ];
23001
23017
  function getOptions() {
23002
23018
  return NODE_VERSIONS;
23003
23019
  }
@@ -23081,6 +23097,27 @@ async function getSupportedNodeVersion(engineRange, isAuto = false, availableVer
23081
23097
  }
23082
23098
  return selection;
23083
23099
  }
23100
+ function getSupportedBunVersion(engineRange) {
23101
+ if ((0, import_semver.validRange)(engineRange)) {
23102
+ const selected = BUN_VERSIONS.find((version) => {
23103
+ return (0, import_semver.intersects)(version.range, engineRange);
23104
+ });
23105
+ if (selected) {
23106
+ return new BunVersion({
23107
+ major: selected.major,
23108
+ range: selected.range,
23109
+ runtime: selected.runtime
23110
+ });
23111
+ }
23112
+ }
23113
+ throw new NowBuildError({
23114
+ message: `Found invalid Bun Version: "${engineRange}".`,
23115
+ code: "BUILD_UTILS_BUN_VERSION_INVALID"
23116
+ });
23117
+ }
23118
+ function isBunVersion(version) {
23119
+ return version.runtime.startsWith("bun");
23120
+ }
23084
23121
 
23085
23122
  // src/fs/read-config-file.ts
23086
23123
  var import_js_yaml = __toESM(require_js_yaml2());
@@ -23257,6 +23294,9 @@ function getSpawnOptions(meta, nodeVersion) {
23257
23294
  const opts = {
23258
23295
  env: cloneEnv(process.env)
23259
23296
  };
23297
+ if (isBunVersion(nodeVersion)) {
23298
+ return opts;
23299
+ }
23260
23300
  if (!meta.isDev) {
23261
23301
  let found = false;
23262
23302
  const oldPath = opts.env.PATH || process.env.PATH || "";
@@ -23275,6 +23315,9 @@ function getSpawnOptions(meta, nodeVersion) {
23275
23315
  return opts;
23276
23316
  }
23277
23317
  async function getNodeVersion(destPath, fallbackVersion = process.env.VERCEL_PROJECT_SETTINGS_NODE_VERSION, config = {}, meta = {}, availableVersions = getAvailableNodeVersions()) {
23318
+ if (config.bunVersion) {
23319
+ return getSupportedBunVersion(config.bunVersion);
23320
+ }
23278
23321
  const latestVersion = getLatestNodeVersion(availableVersions);
23279
23322
  if (meta.isDev) {
23280
23323
  latestVersion.runtime = "nodejs";
@@ -23595,7 +23638,7 @@ function checkIfAlreadyInstalled(runNpmInstallSet, packageJsonPath) {
23595
23638
  return { alreadyInstalled, runNpmInstallSet: initializedRunNpmInstallSet };
23596
23639
  }
23597
23640
  var runNpmInstallSema = new import_async_sema4.default(1);
23598
- async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion, projectCreatedAt) {
23641
+ async function runNpmInstall(destPath, args = [], spawnOpts, meta, projectCreatedAt) {
23599
23642
  if (meta?.isDev) {
23600
23643
  debug("Skipping dependency installation because dev mode is enabled");
23601
23644
  return false;
@@ -23648,7 +23691,6 @@ async function runNpmInstall(destPath, args = [], spawnOpts, meta, nodeVersion,
23648
23691
  cliType,
23649
23692
  lockfileVersion,
23650
23693
  packageJsonPackageManager,
23651
- nodeVersion,
23652
23694
  env,
23653
23695
  packageJsonEngines: packageJson?.engines,
23654
23696
  turboSupportsCorepackHome,
@@ -23675,7 +23717,6 @@ function getEnvForPackageManager({
23675
23717
  cliType,
23676
23718
  lockfileVersion,
23677
23719
  packageJsonPackageManager,
23678
- nodeVersion,
23679
23720
  env,
23680
23721
  packageJsonEngines,
23681
23722
  turboSupportsCorepackHome,
@@ -23694,7 +23735,6 @@ function getEnvForPackageManager({
23694
23735
  cliType,
23695
23736
  lockfileVersion,
23696
23737
  corepackPackageManager: packageJsonPackageManager,
23697
- nodeVersion,
23698
23738
  corepackEnabled,
23699
23739
  packageJsonEngines,
23700
23740
  projectCreatedAt
@@ -23988,15 +24028,13 @@ function detectPackageManager(cliType, lockfileVersion, projectCreatedAt) {
23988
24028
  function getPathForPackageManager({
23989
24029
  cliType,
23990
24030
  lockfileVersion,
23991
- nodeVersion,
23992
24031
  env
23993
24032
  }) {
23994
24033
  const corepackEnabled = env.ENABLE_EXPERIMENTAL_COREPACK === "1";
23995
24034
  let overrides = getPathOverrideForPackageManager({
23996
24035
  cliType,
23997
24036
  lockfileVersion,
23998
- corepackPackageManager: void 0,
23999
- nodeVersion
24037
+ corepackPackageManager: void 0
24000
24038
  });
24001
24039
  if (corepackEnabled) {
24002
24040
  overrides = NO_OVERRIDE;
@@ -24022,7 +24060,6 @@ function getPathForPackageManager({
24022
24060
  async function runCustomInstallCommand({
24023
24061
  destPath,
24024
24062
  installCommand,
24025
- nodeVersion,
24026
24063
  spawnOpts,
24027
24064
  projectCreatedAt
24028
24065
  }) {
@@ -24038,7 +24075,6 @@ async function runCustomInstallCommand({
24038
24075
  cliType,
24039
24076
  lockfileVersion,
24040
24077
  packageJsonPackageManager,
24041
- nodeVersion,
24042
24078
  env: spawnOpts?.env || {},
24043
24079
  packageJsonEngines: packageJson?.engines,
24044
24080
  turboSupportsCorepackHome,
@@ -24075,7 +24111,6 @@ async function runPackageJsonScript(destPath, scriptNames, spawnOpts, projectCre
24075
24111
  cliType,
24076
24112
  lockfileVersion,
24077
24113
  packageJsonPackageManager,
24078
- nodeVersion: void 0,
24079
24114
  env: cloneEnv(process.env, spawnOpts?.env),
24080
24115
  packageJsonEngines: packageJson?.engines,
24081
24116
  turboSupportsCorepackHome,
@@ -24730,10 +24765,33 @@ ${entrypointsForMessage}`
24730
24765
  entrypointCallback
24731
24766
  };
24732
24767
  }
24768
+
24769
+ // src/framework-helpers.ts
24770
+ var BACKEND_FRAMEWORKS = [
24771
+ "express",
24772
+ "hono",
24773
+ "h3",
24774
+ "nestjs",
24775
+ "fastify"
24776
+ ];
24777
+ function isBackendFramework(framework) {
24778
+ if (!framework)
24779
+ return false;
24780
+ return BACKEND_FRAMEWORKS.includes(framework);
24781
+ }
24782
+ function isExperimentalBackendsEnabled() {
24783
+ return process.env.VERCEL_EXPERIMENTAL_BACKENDS === "1" || // Previously used for experimental express and hono builds
24784
+ process.env.VERCEL_EXPERIMENTAL_EXPRESS_BUILD === "1" || process.env.VERCEL_EXPERIMENTAL_HONO_BUILD === "1";
24785
+ }
24786
+ function shouldUseExperimentalBackends(framework) {
24787
+ return isExperimentalBackendsEnabled() && isBackendFramework(framework);
24788
+ }
24733
24789
  // Annotate the CommonJS export names for ESM import in node:
24734
24790
  0 && (module.exports = {
24791
+ BACKEND_FRAMEWORKS,
24735
24792
  BUILDER_COMPILE_STEP,
24736
24793
  BUILDER_INSTALLER_STEP,
24794
+ BunVersion,
24737
24795
  EdgeFunction,
24738
24796
  FileBlob,
24739
24797
  FileFsRef,
@@ -24774,12 +24832,16 @@ ${entrypointsForMessage}`
24774
24832
  getProvidedRuntime,
24775
24833
  getScriptName,
24776
24834
  getSpawnOptions,
24835
+ getSupportedBunVersion,
24777
24836
  getSupportedNodeVersion,
24778
24837
  getWriteableDirectory,
24779
24838
  glob,
24780
24839
  hardLinkDir,
24781
24840
  installDependencies,
24841
+ isBackendFramework,
24842
+ isBunVersion,
24782
24843
  isDirectory,
24844
+ isExperimentalBackendsEnabled,
24783
24845
  isSymbolicLink,
24784
24846
  normalizePath,
24785
24847
  readConfigFile,
@@ -24792,6 +24854,7 @@ ${entrypointsForMessage}`
24792
24854
  runShellScript,
24793
24855
  scanParentDirs,
24794
24856
  shouldServe,
24857
+ shouldUseExperimentalBackends,
24795
24858
  spawnAsync,
24796
24859
  spawnCommand,
24797
24860
  streamToBuffer,
package/dist/types.d.ts CHANGED
@@ -22,6 +22,7 @@ export interface Files {
22
22
  [filePath: string]: File;
23
23
  }
24
24
  export interface Config {
25
+ bunVersion?: string;
25
26
  maxLambdaSize?: string;
26
27
  includeFiles?: string | string[];
27
28
  excludeFiles?: string | string[];
@@ -318,6 +319,8 @@ export declare class Version implements BaseVersion {
318
319
  }
319
320
  export declare class NodeVersion extends Version {
320
321
  }
322
+ export declare class BunVersion extends Version {
323
+ }
321
324
  export interface Builder {
322
325
  use: string;
323
326
  src?: string;
package/dist/types.js CHANGED
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var types_exports = {};
20
20
  __export(types_exports, {
21
+ BunVersion: () => BunVersion,
21
22
  NodeVersion: () => NodeVersion,
22
23
  Version: () => Version
23
24
  });
@@ -44,8 +45,11 @@ class Version {
44
45
  }
45
46
  class NodeVersion extends Version {
46
47
  }
48
+ class BunVersion extends Version {
49
+ }
47
50
  // Annotate the CommonJS export names for ESM import in node:
48
51
  0 && (module.exports = {
52
+ BunVersion,
49
53
  NodeVersion,
50
54
  Version
51
55
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/build-utils",
3
- "version": "12.1.3",
3
+ "version": "12.2.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.js",
@@ -27,7 +27,7 @@
27
27
  "@types/semver": "6.0.0",
28
28
  "@types/yazl": "2.4.2",
29
29
  "@vercel/error-utils": "2.0.3",
30
- "@vercel/routing-utils": "5.2.0",
30
+ "@vercel/routing-utils": "5.2.1",
31
31
  "aggregate-error": "3.0.1",
32
32
  "async-retry": "1.2.3",
33
33
  "async-sema": "2.1.4",