@netlify/build 26.5.0-rc → 26.5.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netlify/build",
3
- "version": "26.5.0-rc",
3
+ "version": "26.5.2",
4
4
  "description": "Netlify build module",
5
5
  "type": "module",
6
6
  "exports": "./src/core/main.js",
@@ -60,50 +60,50 @@
60
60
  "@netlify/config": "^17.0.0",
61
61
  "@netlify/functions-utils": "^4.0.0",
62
62
  "@netlify/git-utils": "^4.0.0",
63
- "@netlify/plugin-edge-handlers": "^3.0.4",
64
- "@netlify/plugins-list": "^6.3.0",
63
+ "@netlify/plugin-edge-handlers": "^3.0.7",
64
+ "@netlify/plugins-list": "^6.18.1",
65
65
  "@netlify/run-utils": "^4.0.0",
66
- "@netlify/zip-it-and-ship-it": "5.5.0",
67
- "@sindresorhus/slugify": "^1.1.0",
66
+ "@netlify/zip-it-and-ship-it": "5.9.0",
67
+ "@sindresorhus/slugify": "^2.0.0",
68
68
  "@types/node": "^16.0.0",
69
- "ansi-escapes": "^4.3.2",
70
- "chalk": "^4.1.2",
71
- "clean-stack": "^3.0.1",
72
- "execa": "^5.1.1",
73
- "figures": "^3.2.0",
74
- "filter-obj": "^2.0.1",
69
+ "ansi-escapes": "^5.0.0",
70
+ "chalk": "^5.0.0",
71
+ "clean-stack": "^4.0.0",
72
+ "execa": "^6.0.0",
73
+ "figures": "^4.0.0",
74
+ "filter-obj": "^3.0.0",
75
75
  "got": "^10.0.0",
76
- "indent-string": "^4.0.0",
77
- "is-plain-obj": "^3.0.0",
76
+ "indent-string": "^5.0.0",
77
+ "is-plain-obj": "^4.0.0",
78
78
  "js-yaml": "^4.0.0",
79
- "keep-func-props": "^3.0.0",
80
- "locate-path": "^6.0.0",
81
- "log-process-errors": "^6.0.0",
82
- "map-obj": "^4.0.0",
79
+ "keep-func-props": "^4.0.0",
80
+ "locate-path": "^7.0.0",
81
+ "log-process-errors": "^8.0.0",
82
+ "map-obj": "^5.0.0",
83
83
  "memoize-one": "^6.0.0",
84
- "os-name": "^4.0.1",
85
- "p-event": "^4.1.0",
84
+ "os-name": "^5.0.0",
85
+ "p-event": "^5.0.0",
86
86
  "p-every": "^2.0.0",
87
- "p-filter": "^2.1.0",
88
- "p-locate": "^5.0.0",
89
- "p-reduce": "^2.1.0",
90
- "path-exists": "^4.0.0",
91
- "path-type": "^4.0.0",
92
- "pkg-dir": "^5.0.0",
87
+ "p-filter": "^3.0.0",
88
+ "p-locate": "^6.0.0",
89
+ "p-reduce": "^3.0.0",
90
+ "path-exists": "^5.0.0",
91
+ "path-type": "^5.0.0",
92
+ "pkg-dir": "^6.0.0",
93
93
  "pretty-ms": "^7.0.0",
94
- "ps-list": "^7.0.0",
95
- "read-pkg-up": "^7.0.1",
94
+ "ps-list": "^8.0.0",
95
+ "read-pkg-up": "^9.0.0",
96
96
  "readdirp": "^3.4.0",
97
97
  "resolve": "^2.0.0-next.1",
98
98
  "rfdc": "^1.3.0",
99
99
  "safe-json-stringify": "^1.2.0",
100
100
  "semver": "^7.0.0",
101
101
  "statsd-client": "0.4.7",
102
- "string-width": "^4.2.0",
103
- "strip-ansi": "^6.0.0",
104
- "supports-color": "^8.0.0",
102
+ "string-width": "^5.0.0",
103
+ "strip-ansi": "^7.0.0",
104
+ "supports-color": "^9.0.0",
105
105
  "tmp-promise": "^3.0.2",
106
- "ts-node": "^10.4.0",
106
+ "ts-node": "10.4.0",
107
107
  "typescript": "^4.5.4",
108
108
  "update-notifier": "^5.0.0",
109
109
  "uuid": "^8.0.0",
@@ -112,20 +112,20 @@
112
112
  "devDependencies": {
113
113
  "@netlify/nock-udp": "^1.0.0",
114
114
  "atob": "^2.1.2",
115
- "ava": "^3.15.0",
115
+ "ava": "^4.0.0",
116
116
  "cpy": "^8.1.0",
117
117
  "del": "^6.0.0",
118
118
  "fast-safe-stringify": "^2.0.7",
119
- "get-bin-path": "^5.1.0",
120
- "get-node": "^11.0.2",
121
- "get-port": "^5.1.1",
119
+ "get-bin-path": "^6.0.0",
120
+ "get-node": "^12.0.0",
121
+ "get-port": "^6.0.0",
122
122
  "get-stream": "^6.0.0",
123
- "has-ansi": "^4.0.0",
123
+ "has-ansi": "^5.0.0",
124
124
  "is-ci": "^3.0.0",
125
125
  "moize": "^6.0.0",
126
- "path-key": "^3.1.1",
127
- "process-exists": "^4.0.0",
128
- "sinon": "^12.0.0",
126
+ "path-key": "^4.0.0",
127
+ "process-exists": "^5.0.0",
128
+ "sinon": "^13.0.0",
129
129
  "yarn": "^1.22.4"
130
130
  },
131
131
  "engines": {
@@ -143,6 +143,7 @@ export const saveUpdatedConfig = async function ({
143
143
  headersPath,
144
144
  redirectsPath,
145
145
  logs,
146
+ featureFlags,
146
147
  context,
147
148
  branch,
148
149
  debug,
@@ -160,6 +161,7 @@ export const saveUpdatedConfig = async function ({
160
161
  context,
161
162
  branch,
162
163
  logs,
164
+ featureFlags,
163
165
  })
164
166
 
165
167
  await logConfigOnUpload({ logs, configPath, debug })
@@ -2,7 +2,7 @@ import { relative, normalize } from 'path'
2
2
 
3
3
  import { getCacheDir } from '@netlify/cache-utils'
4
4
  import mapObj from 'map-obj'
5
- import pathExists from 'path-exists'
5
+ import { pathExists } from 'path-exists'
6
6
 
7
7
  import { ROOT_PACKAGE_JSON } from '../utils/json.js'
8
8
 
@@ -11,6 +11,7 @@ export const getConstants = async function ({
11
11
  configPath,
12
12
  buildDir,
13
13
  functionsDistDir,
14
+ edgeHandlersDistDir,
14
15
  cacheDir,
15
16
  netlifyConfig,
16
17
  siteInfo: { id: siteId },
@@ -26,6 +27,8 @@ export const getConstants = async function ({
26
27
  CONFIG_PATH: configPath,
27
28
  // The directory where built serverless functions are placed before deployment
28
29
  FUNCTIONS_DIST: functionsDistDir,
30
+ // The directory where built Edge Handlers are placed before deployment
31
+ EDGE_HANDLERS_DIST: edgeHandlersDistDir,
29
32
  // Path to the Netlify build cache folder
30
33
  CACHE_DIR: normalizedCacheDir,
31
34
  // Boolean indicating whether the build was run locally (Netlify CLI) or in the production CI
@@ -41,11 +44,15 @@ export const getConstants = async function ({
41
44
  // The directory where internal functions (i.e. generated programmatically
42
45
  // via plugins or others) live
43
46
  INTERNAL_FUNCTIONS_SRC: `${buildDir}/${INTERNAL_FUNCTIONS_SRC}`,
47
+ // The directory where internal Edge Handlers (i.e. generated programmatically
48
+ // via plugins or others) live
49
+ INTERNAL_EDGE_HANDLERS_SRC: `${buildDir}/${INTERNAL_EDGE_HANDLERS_SRC}`,
44
50
  }
45
51
  const constantsA = await addMutableConstants({ constants, buildDir, netlifyConfig })
46
52
  return constantsA
47
53
  }
48
54
 
55
+ const INTERNAL_EDGE_HANDLERS_SRC = '.netlify/edge-handlers'
49
56
  const INTERNAL_FUNCTIONS_SRC = '.netlify/functions-internal'
50
57
 
51
58
  // Retrieve constants which might change during the build if a plugin modifies
@@ -141,7 +148,9 @@ const CONSTANT_PATHS = new Set([
141
148
  'PUBLISH_DIR',
142
149
  'FUNCTIONS_SRC',
143
150
  'FUNCTIONS_DIST',
151
+ 'INTERNAL_EDGE_HANDLERS_SRC',
144
152
  'INTERNAL_FUNCTIONS_SRC',
153
+ 'EDGE_HANDLERS_DIST',
145
154
  'EDGE_HANDLERS_SRC',
146
155
  'CACHE_DIR',
147
156
  ])
@@ -14,7 +14,6 @@ const getFeatureFlag = function (name) {
14
14
  // Default values for feature flags
15
15
  export const DEFAULT_FEATURE_FLAGS = {
16
16
  buildbot_build_go_functions: false,
17
- buildbot_create_functions_manifest: false,
18
17
  buildbot_es_modules_esbuild: false,
19
18
  buildbot_zisi_trace_nft: false,
20
19
  buildbot_zisi_esbuild_parser: false,
package/src/core/flags.js CHANGED
@@ -107,6 +107,12 @@ Default: Current Node.js binary`,
107
107
  functionsDistDir: {
108
108
  string: true,
109
109
  describe: `Path to the directory where packaged functions are kept.
110
+ Default: automatically guessed`,
111
+ hidden: true,
112
+ },
113
+ edgeHandlersDistDir: {
114
+ string: true,
115
+ describe: `Path to the directory where packaged Edge Handlers are kept.
110
116
  Default: automatically guessed`,
111
117
  hidden: true,
112
118
  },
package/src/core/main.js CHANGED
@@ -164,6 +164,7 @@ const tExecBuild = async function ({
164
164
  verbose,
165
165
  nodePath,
166
166
  functionsDistDir,
167
+ edgeHandlersDistDir,
167
168
  cacheDir,
168
169
  dry,
169
170
  mode,
@@ -229,6 +230,7 @@ const tExecBuild = async function ({
229
230
  configPath,
230
231
  buildDir,
231
232
  functionsDistDir,
233
+ edgeHandlersDistDir,
232
234
  cacheDir,
233
235
  netlifyConfig,
234
236
  siteInfo,
@@ -1,6 +1,6 @@
1
1
  import { relative } from 'path'
2
2
 
3
- import pathExists from 'path-exists'
3
+ import { pathExists } from 'path-exists'
4
4
 
5
5
  import { logMissingSideFile } from '../log/messages/core.js'
6
6
 
@@ -41,6 +41,7 @@ const getDefaultFlags = function ({ env: envOpt = {} }, combinedEnv) {
41
41
  telemetry: false,
42
42
  verbose: Boolean(combinedEnv.NETLIFY_BUILD_DEBUG),
43
43
  functionsDistDir: DEFAULT_FUNCTIONS_DIST,
44
+ edgeHandlersDistDir: DEFAULT_EDGE_HANDLERS_DIST,
44
45
  cacheDir: DEFAULT_CACHE_DIR,
45
46
  deployId: combinedEnv.DEPLOY_ID,
46
47
  buildId: combinedEnv.BUILD_ID,
@@ -62,6 +63,7 @@ const computeTelemetry = function (flags, envOpts) {
62
63
  }
63
64
 
64
65
  const REQUIRE_MODE = 'require'
66
+ const DEFAULT_EDGE_HANDLERS_DIST = '.netlify/edge-handlers-dist/'
65
67
  const DEFAULT_FUNCTIONS_DIST = '.netlify/functions/'
66
68
  const DEFAULT_CACHE_DIR = '.netlify/cache/'
67
69
  const DEFAULT_STATSD_PORT = 8125
@@ -1,6 +1,6 @@
1
1
  import { version as currentVersion, execPath } from 'process'
2
2
 
3
- import execa from 'execa'
3
+ import { execa } from 'execa'
4
4
  import semver from 'semver'
5
5
 
6
6
  import { addErrorInfo } from '../error/info.js'
@@ -1,6 +1,6 @@
1
1
  import { cwd as getCwd } from 'process'
2
2
 
3
- import pathExists from 'path-exists'
3
+ import { pathExists } from 'path-exists'
4
4
 
5
5
  import { logBuildError } from '../log/messages/core.js'
6
6
  import { logOldCliVersionError } from '../log/old_version.js'
@@ -89,7 +89,10 @@ const getApp = function () {
89
89
  // But we change it back after Bugsnag is done reporting.
90
90
  const updateErrorName = function (error, type) {
91
91
  const { name } = error
92
- error.name = type
92
+ // This might fail if `name` is a getter or is non-writable.
93
+ try {
94
+ error.name = type
95
+ } catch {}
93
96
  return name
94
97
  }
95
98
 
@@ -1,4 +1,4 @@
1
- import pkgDir from 'pkg-dir'
1
+ import { packageDirectory } from 'pkg-dir'
2
2
 
3
3
  import { logInstallLocalPluginsDeps } from '../log/messages/install.js'
4
4
 
@@ -57,6 +57,6 @@ const hasPackageDir = function ({ packageDir }) {
57
57
 
58
58
  // We only install dependencies of local plugins that have their own `package.json`
59
59
  const removeMainRoot = async function (localPluginsOptions, buildDir) {
60
- const mainPackageDir = await pkgDir(buildDir)
60
+ const mainPackageDir = await packageDirectory({ cwd: buildDir })
61
61
  return localPluginsOptions.filter(({ packageDir }) => packageDir !== mainPackageDir)
62
62
  }
@@ -1,7 +1,7 @@
1
1
  import { homedir } from 'os'
2
2
 
3
- import execa from 'execa'
4
- import pathExists from 'path-exists'
3
+ import { execa } from 'execa'
4
+ import { pathExists } from 'path-exists'
5
5
 
6
6
  import { addErrorInfo } from '../error/info.js'
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { promises as fs } from 'fs'
2
2
  import { normalize } from 'path'
3
3
 
4
- import pathExists from 'path-exists'
4
+ import { pathExists } from 'path-exists'
5
5
  import { isFile } from 'path-type'
6
6
 
7
7
  import { logInstallMissingPlugins } from '../log/messages/install.js'
@@ -34,6 +34,7 @@ const TEST_FLAGS = ['buffer', 'telemetry']
34
34
  const INTERNAL_FLAGS = [
35
35
  'nodePath',
36
36
  'functionsDistDir',
37
+ 'edgeHandlersDistDir',
37
38
  'defaultConfig',
38
39
  'cachedConfigPath',
39
40
  'sendStatus',
@@ -1,7 +1,7 @@
1
1
  import { promises as fs } from 'fs'
2
2
  import { inspect } from 'util'
3
3
 
4
- import pathExists from 'path-exists'
4
+ import { pathExists } from 'path-exists'
5
5
 
6
6
  import { log, logMessage, logSubHeader } from '../logger.js'
7
7
 
@@ -16,7 +16,7 @@ export const handleError = async function (error, verbose) {
16
16
  // On uncaught exceptions and unhandled rejections, print the stack trace.
17
17
  // Also, prevent child processes from crashing on uncaught exceptions.
18
18
  export const handleProcessErrors = function () {
19
- logProcessErrors({ log: handleProcessError, exitOn: [], level: { multipleResolves: 'silent' } })
19
+ logProcessErrors({ log: handleProcessError, exitOn: [] })
20
20
  }
21
21
 
22
22
  const handleProcessError = async function (error, level, originalError) {
@@ -36,7 +36,10 @@ const normalizeError = function (type, func, message, { error } = {}) {
36
36
 
37
37
  const getError = function (error, message, func) {
38
38
  if (error instanceof Error) {
39
- error.message = `${message}\n${error.message}`
39
+ // This might fail if `name` is a getter or is non-writable.
40
+ try {
41
+ error.message = `${message}\n${error.message}`
42
+ } catch {}
40
43
  return error
41
44
  }
42
45
 
@@ -1,7 +1,7 @@
1
1
  import process from 'process'
2
2
  import { promisify } from 'util'
3
3
 
4
- import pEvent from 'p-event'
4
+ import { pEvent } from 'p-event'
5
5
  import { v4 as uuidv4 } from 'uuid'
6
6
 
7
7
  import { jsonToError, errorToJson } from '../error/build.js'
@@ -1,4 +1,4 @@
1
- import locatePath from 'locate-path'
1
+ import { locatePath } from 'locate-path'
2
2
 
3
3
  import { addErrorInfo } from '../../error/info.js'
4
4
 
@@ -1,6 +1,6 @@
1
1
  import { fileURLToPath } from 'url'
2
2
 
3
- import execa from 'execa'
3
+ import { execaNode } from 'execa'
4
4
 
5
5
  import { addErrorInfo } from '../error/info.js'
6
6
  import { logLoadingPlugins, logOutdatedPlugins, logIncompatiblePlugins } from '../log/messages/compatibility.js'
@@ -31,7 +31,7 @@ const tStartPlugins = async function ({ pluginsOptions, buildDir, childEnv, logs
31
31
  export const startPlugins = measureDuration(tStartPlugins, 'start_plugins')
32
32
 
33
33
  const startPlugin = async function ({ pluginDir, nodePath, buildDir, childEnv }) {
34
- const childProcess = execa.node(CHILD_MAIN_FILE, {
34
+ const childProcess = execaNode(CHILD_MAIN_FILE, {
35
35
  cwd: buildDir,
36
36
  preferLocal: true,
37
37
  localDir: pluginDir,
@@ -1,6 +1,6 @@
1
1
  import { platform } from 'process'
2
2
 
3
- import execa from 'execa'
3
+ import { execa } from 'execa'
4
4
 
5
5
  import { addErrorInfo } from '../error/info.js'
6
6
  import { getBuildCommandDescription } from '../log/description.js'
@@ -2,7 +2,7 @@ import net from 'net'
2
2
  import { normalize, resolve, relative } from 'path'
3
3
  import { promisify } from 'util'
4
4
 
5
- import pEvent from 'p-event'
5
+ import { pEvent } from 'p-event'
6
6
 
7
7
  import { addErrorInfo } from '../../error/info.js'
8
8
  import { runsAfterDeploy } from '../../plugins/events.js'
@@ -16,6 +16,7 @@ const coreStep = async function ({
16
16
  buildbotServerSocket,
17
17
  events,
18
18
  logs,
19
+ featureFlags,
19
20
  context,
20
21
  branch,
21
22
  configMutations,
@@ -35,6 +36,7 @@ const coreStep = async function ({
35
36
  headersPath,
36
37
  redirectsPath,
37
38
  logs,
39
+ featureFlags,
38
40
  context,
39
41
  branch,
40
42
  debug,
@@ -1,65 +1,23 @@
1
- import { join, resolve } from 'path'
1
+ import { resolve } from 'path'
2
2
 
3
3
  import { zipFunctions } from '@netlify/zip-it-and-ship-it'
4
- import mapObject from 'map-obj'
5
- import pathExists from 'path-exists'
4
+ import { pathExists } from 'path-exists'
6
5
 
7
6
  import { log } from '../../log/logger.js'
8
7
  import { logBundleResults, logFunctionsNonExistingDir, logFunctionsToBundle } from '../../log/messages/core_steps.js'
9
8
 
10
9
  import { getZipError } from './error.js'
11
- import { getZisiFeatureFlags } from './feature_flags.js'
12
10
  import { getUserAndInternalFunctions, validateFunctionsSrc } from './utils.js'
11
+ import { getZisiParameters } from './zisi.js'
13
12
 
14
13
  // Returns `true` if at least one of the functions has been configured to use
15
14
  // esbuild.
16
15
  const isUsingEsbuild = (functionsConfig = {}) =>
17
16
  Object.values(functionsConfig).some((configObject) => configObject.node_bundler === 'esbuild')
18
17
 
19
- // The function configuration keys returned by @netlify/config are not an exact
20
- // match to the properties that @netlify/zip-it-and-ship-it expects. We do that
21
- // translation here.
22
- const normalizeFunctionConfig = ({ buildDir, functionConfig = {}, isRunningLocally }) => ({
23
- externalNodeModules: functionConfig.external_node_modules,
24
- includedFiles: functionConfig.included_files,
25
- includedFilesBasePath: buildDir,
26
- ignoredNodeModules: functionConfig.ignored_node_modules,
27
- schedule: functionConfig.schedule,
28
-
29
- // When the user selects esbuild as the Node bundler, we still want to use
30
- // the legacy ZISI bundler as a fallback. Rather than asking the user to
31
- // make this decision, we abstract that complexity away by injecting the
32
- // fallback behavior ourselves. We do this by transforming the value
33
- // `esbuild` into `esbuild_zisi`, which zip-it-and-ship-it understands.
34
- nodeBundler: functionConfig.node_bundler === 'esbuild' ? 'esbuild_zisi' : functionConfig.node_bundler,
35
-
36
- // If the build is running in buildbot, we set the Rust target directory to a
37
- // path that will get cached in between builds, allowing us to speed up the
38
- // build process.
39
- rustTargetDirectory: isRunningLocally ? undefined : resolve(buildDir, '.netlify', 'rust-functions-cache', '[name]'),
40
- })
41
-
42
- const getZisiParameters = ({
43
- buildDir,
44
- featureFlags,
45
- functionsConfig,
46
- functionsDist,
47
- isRunningLocally,
48
- repositoryRoot,
49
- }) => {
50
- const isManifestEnabled = isRunningLocally || featureFlags.buildbot_create_functions_manifest === true
51
- const manifest = isManifestEnabled ? join(functionsDist, 'manifest.json') : undefined
52
- const config = mapObject(functionsConfig, (expression, object) => [
53
- expression,
54
- normalizeFunctionConfig({ buildDir, featureFlags, functionConfig: object, isRunningLocally }),
55
- ])
56
- const zisiFeatureFlags = getZisiFeatureFlags(featureFlags)
57
-
58
- return { basePath: buildDir, config, manifest, featureFlags: zisiFeatureFlags, repositoryRoot }
59
- }
60
-
61
18
  const zipFunctionsAndLogResults = async ({
62
19
  buildDir,
20
+ childEnv,
63
21
  featureFlags,
64
22
  functionsConfig,
65
23
  functionsDist,
@@ -71,6 +29,7 @@ const zipFunctionsAndLogResults = async ({
71
29
  }) => {
72
30
  const zisiParameters = getZisiParameters({
73
31
  buildDir,
32
+ childEnv,
74
33
  featureFlags,
75
34
  functionsConfig,
76
35
  functionsDist,
@@ -97,6 +56,7 @@ const zipFunctionsAndLogResults = async ({
97
56
  // Plugin to package Netlify functions with @netlify/zip-it-and-ship-it
98
57
  // eslint-disable-next-line complexity
99
58
  const coreStep = async function ({
59
+ childEnv,
100
60
  constants: {
101
61
  INTERNAL_FUNCTIONS_SRC: relativeInternalFunctionsSrc,
102
62
  IS_LOCAL: isRunningLocally,
@@ -145,6 +105,7 @@ const coreStep = async function ({
145
105
 
146
106
  const { bundler } = await zipFunctionsAndLogResults({
147
107
  buildDir,
108
+ childEnv,
148
109
  featureFlags,
149
110
  functionsConfig: netlifyConfig.functions,
150
111
  functionsDist,
@@ -0,0 +1,53 @@
1
+ import { join, resolve } from 'path'
2
+
3
+ import mapObject from 'map-obj'
4
+
5
+ import { getZisiFeatureFlags } from './feature_flags.js'
6
+
7
+ export const getZisiParameters = ({
8
+ buildDir,
9
+ childEnv,
10
+ featureFlags,
11
+ functionsConfig,
12
+ functionsDist,
13
+ isRunningLocally,
14
+ repositoryRoot,
15
+ }) => {
16
+ const nodeVersion = childEnv.AWS_LAMBDA_JS_RUNTIME
17
+ const manifest = join(functionsDist, 'manifest.json')
18
+ const config = mapObject(functionsConfig, (expression, object) => [
19
+ expression,
20
+ normalizeFunctionConfig({ buildDir, featureFlags, functionConfig: object, isRunningLocally, nodeVersion }),
21
+ ])
22
+ const zisiFeatureFlags = getZisiFeatureFlags(featureFlags)
23
+
24
+ return { basePath: buildDir, config, manifest, featureFlags: zisiFeatureFlags, repositoryRoot }
25
+ }
26
+
27
+ // The function configuration keys returned by @netlify/config are not an exact
28
+ // match to the properties that @netlify/zip-it-and-ship-it expects. We do that
29
+ // translation here.
30
+ export const normalizeFunctionConfig = ({ buildDir, functionConfig = {}, isRunningLocally, nodeVersion }) => ({
31
+ externalNodeModules: functionConfig.external_node_modules,
32
+ includedFiles: functionConfig.included_files,
33
+ includedFilesBasePath: buildDir,
34
+ ignoredNodeModules: functionConfig.ignored_node_modules,
35
+ nodeVersion,
36
+ schedule: functionConfig.schedule,
37
+
38
+ // When the user selects esbuild as the Node bundler, we still want to use
39
+ // the legacy ZISI bundler as a fallback. Rather than asking the user to
40
+ // make this decision, we abstract that complexity away by injecting the
41
+ // fallback behavior ourselves. We do this by transforming the value
42
+ // `esbuild` into `esbuild_zisi`, which zip-it-and-ship-it understands.
43
+ nodeBundler: functionConfig.node_bundler === 'esbuild' ? 'esbuild_zisi' : functionConfig.node_bundler,
44
+
45
+ // If the build is running in buildbot, we set the Rust target directory to a
46
+ // path that will get cached in between builds, allowing us to speed up the
47
+ // build process.
48
+ rustTargetDirectory: isRunningLocally ? undefined : resolve(buildDir, '.netlify', 'rust-functions-cache', '[name]'),
49
+
50
+ // Go functions should be zipped only when building locally. When running in
51
+ // buildbot, the Go API client will handle the zipping.
52
+ zipGo: isRunningLocally ? true : undefined,
53
+ })
@@ -1,4 +1,4 @@
1
- import pathExists from 'path-exists'
1
+ import { pathExists } from 'path-exists'
2
2
 
3
3
  import { installFunctionDependencies } from '../../install/functions.js'
4
4
 
@@ -1,7 +1,7 @@
1
1
  import { isDeepStrictEqual } from 'util'
2
2
 
3
3
  import pFilter from 'p-filter'
4
- import pathExists from 'path-exists'
4
+ import { pathExists } from 'path-exists'
5
5
 
6
6
  import { resolveUpdatedConfig } from '../core/config.js'
7
7
  import { addErrorInfo } from '../error/info.js'
@@ -1,6 +1,6 @@
1
1
  import { dirname } from 'path'
2
2
 
3
- import readPkgUp from 'read-pkg-up'
3
+ import { readPackageUp } from 'read-pkg-up'
4
4
 
5
5
  // Retrieve `package.json` from a specific directory
6
6
  export const getPackageJson = async function (cwd, { normalize } = {}) {
@@ -16,7 +16,7 @@ export const getPackageJson = async function (cwd, { normalize } = {}) {
16
16
 
17
17
  const getPackageObj = async function ({ cwd, normalize = true }) {
18
18
  try {
19
- return await readPkgUp({ cwd, normalize })
19
+ return await readPackageUp({ cwd, normalize })
20
20
  // If the `package.json` is invalid and `normalize` is `true`, an error is
21
21
  // thrown. We return `undefined` then.
22
22
  } catch {}
@@ -13,6 +13,11 @@ export interface NetlifyPluginConstants {
13
13
  * `undefined` if no `netlify/functions` directory exists in the base directory and if not specified by the user.
14
14
  */
15
15
  FUNCTIONS_SRC?: string
16
+ /**
17
+ * the directory where internal Edge Handlers source code lives. This is where build plugins should place auto-generated handlers.
18
+ * `undefined` if the version of @netlify/build does not support internal Edge Handlers
19
+ */
20
+ INTERNAL_EDGE_HANDLERS_SRC?: string
16
21
  /**
17
22
  * the directory where internal function source code lives. This is where build plugins should place auto-generated functions.
18
23
  * `undefined` if the version of @netlify/build does not support internal functions
@@ -22,6 +27,10 @@ export interface NetlifyPluginConstants {
22
27
  * the directory where built serverless functions are placed before deployment. Its value is always defined, but the target might not have been created yet.
23
28
  */
24
29
  FUNCTIONS_DIST: string
30
+ /**
31
+ * the directory where built Edge Handlers are placed before deployment. Its value is always defined, but the target might not have been created yet.
32
+ */
33
+ EDGE_HANDLERS_DIST: string
25
34
  /**
26
35
  * the directory where Edge Handlers source code lives.
27
36
  * `undefined` if no `netlify/edge-handlers` directory exists in the base directory and if not specified in `netlify.toml`.