@netlify/build 28.0.1-beta → 28.1.0-framework-version-detection

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.
Files changed (259) hide show
  1. package/bin.js +5 -0
  2. package/lib/core/bin.js +66 -0
  3. package/lib/core/build.js +355 -0
  4. package/lib/core/config.js +125 -0
  5. package/lib/core/constants.js +116 -0
  6. package/lib/core/dev.js +27 -0
  7. package/lib/core/dry.js +21 -0
  8. package/lib/core/feature_flags.js +19 -0
  9. package/lib/core/flags.js +201 -0
  10. package/lib/core/lingering.js +68 -0
  11. package/lib/core/main.js +105 -0
  12. package/lib/core/missing_side_file.js +17 -0
  13. package/lib/core/normalize_flags.js +59 -0
  14. package/lib/core/severity.js +21 -0
  15. package/lib/core/types.js +8 -0
  16. package/lib/core/user_node_version.js +32 -0
  17. package/lib/env/changes.js +43 -0
  18. package/lib/env/main.js +14 -0
  19. package/lib/env/metadata.js +68 -0
  20. package/lib/error/api.js +37 -0
  21. package/lib/error/build.js +36 -0
  22. package/{src → lib}/error/cancel.js +5 -6
  23. package/lib/error/colors.js +9 -0
  24. package/lib/error/handle.js +46 -0
  25. package/lib/error/info.js +37 -0
  26. package/lib/error/monitor/location.js +16 -0
  27. package/lib/error/monitor/normalize.js +86 -0
  28. package/lib/error/monitor/print.js +20 -0
  29. package/lib/error/monitor/report.js +120 -0
  30. package/lib/error/monitor/start.js +61 -0
  31. package/lib/error/parse/clean_stack.js +70 -0
  32. package/lib/error/parse/location.js +50 -0
  33. package/lib/error/parse/normalize.js +24 -0
  34. package/lib/error/parse/parse.js +67 -0
  35. package/lib/error/parse/plugin.js +55 -0
  36. package/lib/error/parse/properties.js +16 -0
  37. package/lib/error/parse/serialize_log.js +34 -0
  38. package/lib/error/parse/serialize_status.js +18 -0
  39. package/lib/error/parse/stack.js +34 -0
  40. package/lib/error/type.js +171 -0
  41. package/lib/install/functions.js +20 -0
  42. package/lib/install/local.js +45 -0
  43. package/lib/install/main.js +67 -0
  44. package/lib/install/missing.js +54 -0
  45. package/{src → lib}/log/colors.js +15 -22
  46. package/lib/log/description.js +21 -0
  47. package/lib/log/header.js +14 -0
  48. package/lib/log/header_func.js +13 -0
  49. package/lib/log/logger.js +140 -0
  50. package/lib/log/messages/compatibility.js +120 -0
  51. package/lib/log/messages/config.js +98 -0
  52. package/lib/log/messages/core.js +50 -0
  53. package/lib/log/messages/core_steps.js +75 -0
  54. package/lib/log/messages/dry.js +41 -0
  55. package/lib/log/messages/install.js +25 -0
  56. package/lib/log/messages/ipc.js +29 -0
  57. package/lib/log/messages/mutations.js +62 -0
  58. package/{src → lib}/log/messages/plugins.js +18 -32
  59. package/lib/log/messages/status.js +14 -0
  60. package/lib/log/messages/steps.js +18 -0
  61. package/lib/log/old_version.js +32 -0
  62. package/lib/log/serialize.js +10 -0
  63. package/lib/log/stream.js +68 -0
  64. package/lib/log/theme.js +25 -0
  65. package/lib/plugins/child/diff.js +46 -0
  66. package/lib/plugins/child/error.js +26 -0
  67. package/lib/plugins/child/lazy.js +15 -0
  68. package/lib/plugins/child/load.js +22 -0
  69. package/lib/plugins/child/logic.js +57 -0
  70. package/lib/plugins/child/main.js +37 -0
  71. package/lib/plugins/child/run.js +19 -0
  72. package/lib/plugins/child/status.js +63 -0
  73. package/lib/plugins/child/typescript.js +28 -0
  74. package/lib/plugins/child/utils.js +42 -0
  75. package/lib/plugins/child/validate.js +31 -0
  76. package/lib/plugins/compatibility.js +104 -0
  77. package/{src → lib}/plugins/error.js +31 -35
  78. package/{src → lib}/plugins/events.js +7 -12
  79. package/lib/plugins/expected_version.js +81 -0
  80. package/lib/plugins/ipc.js +120 -0
  81. package/lib/plugins/list.js +73 -0
  82. package/lib/plugins/load.js +50 -0
  83. package/lib/plugins/manifest/check.js +85 -0
  84. package/lib/plugins/manifest/load.js +38 -0
  85. package/lib/plugins/manifest/main.js +17 -0
  86. package/lib/plugins/manifest/path.js +24 -0
  87. package/lib/plugins/manifest/validate.js +91 -0
  88. package/lib/plugins/node_version.js +30 -0
  89. package/lib/plugins/options.js +55 -0
  90. package/lib/plugins/pinned_version.js +83 -0
  91. package/lib/plugins/resolve.js +110 -0
  92. package/lib/plugins/spawn.js +54 -0
  93. package/lib/plugins_core/add.js +35 -0
  94. package/lib/plugins_core/build_command.js +50 -0
  95. package/lib/plugins_core/deploy/buildbot_client.js +87 -0
  96. package/lib/plugins_core/deploy/index.js +49 -0
  97. package/{src → lib}/plugins_core/deploy/manifest.yml +0 -0
  98. package/lib/plugins_core/edge_functions/index.js +79 -0
  99. package/lib/plugins_core/edge_functions/lib/error.js +17 -0
  100. package/lib/plugins_core/edge_functions/lib/internal_manifest.js +50 -0
  101. package/lib/plugins_core/edge_functions/validate_manifest/validate_edge_functions_manifest.js +75 -0
  102. package/lib/plugins_core/functions/error.js +123 -0
  103. package/lib/plugins_core/functions/feature_flags.js +6 -0
  104. package/lib/plugins_core/functions/index.js +114 -0
  105. package/lib/plugins_core/functions/utils.js +45 -0
  106. package/lib/plugins_core/functions/zisi.js +39 -0
  107. package/{src → lib}/plugins_core/functions_install/index.js +8 -11
  108. package/{src → lib}/plugins_core/functions_install/manifest.yml +0 -0
  109. package/lib/plugins_core/list.js +20 -0
  110. package/lib/status/add.js +30 -0
  111. package/lib/status/colors.js +18 -0
  112. package/lib/status/load_error.js +10 -0
  113. package/lib/status/report.js +83 -0
  114. package/lib/status/success.js +14 -0
  115. package/lib/steps/core_step.js +57 -0
  116. package/lib/steps/error.js +65 -0
  117. package/lib/steps/get.js +43 -0
  118. package/lib/steps/plugin.js +55 -0
  119. package/lib/steps/return.js +25 -0
  120. package/lib/steps/run_core_steps.js +126 -0
  121. package/lib/steps/run_step.js +188 -0
  122. package/lib/steps/run_steps.js +96 -0
  123. package/lib/steps/update_config.js +66 -0
  124. package/lib/telemetry/main.js +97 -0
  125. package/lib/time/aggregate.js +120 -0
  126. package/lib/time/main.js +37 -0
  127. package/lib/time/measure.js +18 -0
  128. package/lib/time/report.js +47 -0
  129. package/lib/utils/errors.js +13 -0
  130. package/lib/utils/json.js +15 -0
  131. package/{src → lib}/utils/omit.js +3 -4
  132. package/lib/utils/package.js +22 -0
  133. package/lib/utils/remove_falsy.js +8 -0
  134. package/lib/utils/resolve.js +41 -0
  135. package/lib/utils/runtime.js +5 -0
  136. package/lib/utils/semver.js +28 -0
  137. package/package.json +39 -19
  138. package/types/config/netlify_config.d.ts +4 -4
  139. package/types/netlify_plugin_constants.d.ts +8 -8
  140. package/src/core/bin.js +0 -83
  141. package/src/core/config.js +0 -186
  142. package/src/core/constants.js +0 -156
  143. package/src/core/dry.js +0 -39
  144. package/src/core/feature_flags.js +0 -21
  145. package/src/core/flags.js +0 -194
  146. package/src/core/lingering.js +0 -85
  147. package/src/core/main.js +0 -692
  148. package/src/core/missing_side_file.js +0 -29
  149. package/src/core/normalize_flags.js +0 -69
  150. package/src/core/severity.js +0 -22
  151. package/src/core/user_node_version.js +0 -41
  152. package/src/env/changes.js +0 -52
  153. package/src/env/main.js +0 -19
  154. package/src/env/metadata.js +0 -81
  155. package/src/error/api.js +0 -46
  156. package/src/error/build.js +0 -50
  157. package/src/error/colors.js +0 -11
  158. package/src/error/handle.js +0 -57
  159. package/src/error/info.js +0 -46
  160. package/src/error/monitor/location.js +0 -21
  161. package/src/error/monitor/normalize.js +0 -77
  162. package/src/error/monitor/print.js +0 -42
  163. package/src/error/monitor/report.js +0 -133
  164. package/src/error/monitor/start.js +0 -69
  165. package/src/error/parse/clean_stack.js +0 -87
  166. package/src/error/parse/location.js +0 -58
  167. package/src/error/parse/normalize.js +0 -29
  168. package/src/error/parse/parse.js +0 -97
  169. package/src/error/parse/plugin.js +0 -70
  170. package/src/error/parse/properties.js +0 -23
  171. package/src/error/parse/serialize_log.js +0 -42
  172. package/src/error/parse/serialize_status.js +0 -23
  173. package/src/error/parse/stack.js +0 -43
  174. package/src/error/type.js +0 -182
  175. package/src/install/functions.js +0 -28
  176. package/src/install/local.js +0 -62
  177. package/src/install/main.js +0 -81
  178. package/src/install/missing.js +0 -67
  179. package/src/log/description.js +0 -26
  180. package/src/log/header.js +0 -16
  181. package/src/log/header_func.js +0 -17
  182. package/src/log/logger.js +0 -107
  183. package/src/log/messages/compatibility.js +0 -164
  184. package/src/log/messages/config.js +0 -105
  185. package/src/log/messages/core.js +0 -70
  186. package/src/log/messages/core_steps.js +0 -104
  187. package/src/log/messages/dry.js +0 -63
  188. package/src/log/messages/install.js +0 -20
  189. package/src/log/messages/ipc.js +0 -38
  190. package/src/log/messages/mutations.js +0 -82
  191. package/src/log/messages/status.js +0 -16
  192. package/src/log/messages/steps.js +0 -22
  193. package/src/log/old_version.js +0 -41
  194. package/src/log/serialize.js +0 -13
  195. package/src/log/stream.js +0 -85
  196. package/src/log/theme.js +0 -26
  197. package/src/plugins/child/diff.js +0 -55
  198. package/src/plugins/child/error.js +0 -32
  199. package/src/plugins/child/lazy.js +0 -18
  200. package/src/plugins/child/load.js +0 -29
  201. package/src/plugins/child/logic.js +0 -57
  202. package/src/plugins/child/main.js +0 -51
  203. package/src/plugins/child/run.js +0 -28
  204. package/src/plugins/child/status.js +0 -67
  205. package/src/plugins/child/typescript.js +0 -45
  206. package/src/plugins/child/utils.js +0 -56
  207. package/src/plugins/child/validate.js +0 -34
  208. package/src/plugins/compatibility.js +0 -128
  209. package/src/plugins/expected_version.js +0 -119
  210. package/src/plugins/ipc.js +0 -145
  211. package/src/plugins/list.js +0 -86
  212. package/src/plugins/load.js +0 -70
  213. package/src/plugins/manifest/check.js +0 -106
  214. package/src/plugins/manifest/load.js +0 -41
  215. package/src/plugins/manifest/main.js +0 -22
  216. package/src/plugins/manifest/path.js +0 -31
  217. package/src/plugins/manifest/validate.js +0 -108
  218. package/src/plugins/node_version.js +0 -50
  219. package/src/plugins/options.js +0 -88
  220. package/src/plugins/pinned_version.js +0 -131
  221. package/src/plugins/resolve.js +0 -152
  222. package/src/plugins/spawn.js +0 -66
  223. package/src/plugins_core/add.js +0 -49
  224. package/src/plugins_core/build_command.js +0 -75
  225. package/src/plugins_core/deploy/buildbot_client.js +0 -102
  226. package/src/plugins_core/deploy/index.js +0 -73
  227. package/src/plugins_core/edge_functions/index.js +0 -107
  228. package/src/plugins_core/edge_functions/lib/internal_manifest.js +0 -54
  229. package/src/plugins_core/functions/error.js +0 -163
  230. package/src/plugins_core/functions/feature_flags.js +0 -6
  231. package/src/plugins_core/functions/index.js +0 -160
  232. package/src/plugins_core/functions/utils.js +0 -66
  233. package/src/plugins_core/functions/zisi.js +0 -53
  234. package/src/plugins_core/list.js +0 -27
  235. package/src/status/add.js +0 -36
  236. package/src/status/colors.js +0 -23
  237. package/src/status/load_error.js +0 -11
  238. package/src/status/report.js +0 -128
  239. package/src/status/success.js +0 -18
  240. package/src/steps/core_step.js +0 -90
  241. package/src/steps/error.js +0 -102
  242. package/src/steps/get.js +0 -32
  243. package/src/steps/plugin.js +0 -85
  244. package/src/steps/return.js +0 -52
  245. package/src/steps/run_core_steps.js +0 -194
  246. package/src/steps/run_step.js +0 -300
  247. package/src/steps/run_steps.js +0 -179
  248. package/src/steps/update_config.js +0 -93
  249. package/src/telemetry/main.js +0 -136
  250. package/src/time/aggregate.js +0 -146
  251. package/src/time/main.js +0 -48
  252. package/src/time/measure.js +0 -22
  253. package/src/time/report.js +0 -59
  254. package/src/utils/errors.js +0 -12
  255. package/src/utils/json.js +0 -19
  256. package/src/utils/package.js +0 -23
  257. package/src/utils/remove_falsy.js +0 -10
  258. package/src/utils/resolve.js +0 -46
  259. package/src/utils/semver.js +0 -34
@@ -1,49 +0,0 @@
1
- import { listCorePlugins, isCorePlugin } from './list.js'
2
-
3
- // Add core plugins and user plugins together.
4
- // Do not allow user override of core plugins.
5
- export const addCorePlugins = function ({ netlifyConfig: { plugins }, constants }) {
6
- const corePlugins = listCorePlugins(constants)
7
- const allCorePlugins = corePlugins
8
- .map((corePlugin) => addCoreProperties(corePlugin, plugins))
9
- .filter((corePlugin) => !isOptionalCore(corePlugin, plugins))
10
- const userPlugins = plugins.filter(isUserPlugin)
11
- const allPlugins = [...userPlugins, ...allCorePlugins]
12
- const pluginsOptions = allPlugins.map(normalizePluginOptions)
13
- return pluginsOptions
14
- }
15
-
16
- const addCoreProperties = function (corePlugin, plugins) {
17
- const inputs = getCorePluginInputs(corePlugin, plugins)
18
- return { ...corePlugin, inputs, loadedFrom: 'core', origin: 'core' }
19
- }
20
-
21
- // Core plugins can get inputs too
22
- const getCorePluginInputs = function (corePlugin, plugins) {
23
- const configuredCorePlugin = plugins.find((plugin) => plugin.package === corePlugin.package)
24
- if (configuredCorePlugin === undefined) {
25
- return {}
26
- }
27
-
28
- return configuredCorePlugin.inputs
29
- }
30
-
31
- // Optional core plugins requires user opt-in
32
- const isOptionalCore = function (pluginA, plugins) {
33
- return pluginA.optional && plugins.every((pluginB) => pluginB.package !== pluginA.package)
34
- }
35
-
36
- const isUserPlugin = function (plugin) {
37
- return !isCorePlugin(plugin.package)
38
- }
39
-
40
- const normalizePluginOptions = function ({
41
- package: packageName,
42
- pluginPath,
43
- pinned_version: pinnedVersion,
44
- loadedFrom,
45
- origin,
46
- inputs,
47
- }) {
48
- return { packageName, pluginPath, pinnedVersion, loadedFrom, origin, inputs }
49
- }
@@ -1,75 +0,0 @@
1
- import { platform } from 'process'
2
-
3
- import { execa } from 'execa'
4
-
5
- import { addErrorInfo } from '../error/info.js'
6
- import { getBuildCommandDescription } from '../log/description.js'
7
- import { logBuildCommandStart } from '../log/messages/steps.js'
8
- import { getBuildCommandStdio, handleBuildCommandOutput } from '../log/stream.js'
9
-
10
- // Fire `build.command`
11
- const coreStep = async function ({
12
- configPath,
13
- buildDir,
14
- nodePath,
15
- childEnv,
16
- logs,
17
- netlifyConfig: {
18
- build: { command: buildCommand, commandOrigin: buildCommandOrigin },
19
- },
20
- }) {
21
- logBuildCommandStart(logs, buildCommand)
22
-
23
- const stdio = getBuildCommandStdio(logs)
24
- const childProcess = execa(buildCommand, {
25
- shell: SHELL,
26
- cwd: buildDir,
27
- preferLocal: true,
28
- execPath: nodePath,
29
- env: childEnv,
30
- extendEnv: false,
31
- stdio,
32
- })
33
-
34
- try {
35
- const buildCommandOutput = await childProcess
36
- handleBuildCommandOutput(buildCommandOutput, logs)
37
- return {}
38
- } catch (error) {
39
- // In our test environment we use `stdio: 'pipe'` on the build command, meaning our `stdout/stderr` output are
40
- // buffered and consequently added to `error.message`. To avoid this and end up with duplicated output in our
41
- // logs/snapshots we need to rely on `error.shortMessage`.
42
- error.message = error.shortMessage
43
- handleBuildCommandOutput(error, logs)
44
- addErrorInfo(error, { type: 'buildCommand', location: { buildCommand, buildCommandOrigin, configPath } })
45
- throw error
46
- }
47
- }
48
-
49
- // We use Bash on Unix and `cmd.exe` on Windows
50
- const SHELL = platform === 'win32' ? true : 'bash'
51
-
52
- const coreStepDescription = function ({
53
- netlifyConfig: {
54
- build: { commandOrigin: buildCommandOrigin },
55
- },
56
- }) {
57
- return getBuildCommandDescription(buildCommandOrigin)
58
- }
59
-
60
- const hasBuildCommand = function ({
61
- netlifyConfig: {
62
- build: { command: buildCommand },
63
- },
64
- }) {
65
- return buildCommand !== undefined && buildCommand !== ''
66
- }
67
-
68
- export const buildCommandCore = {
69
- event: 'onBuild',
70
- coreStep,
71
- coreStepId: 'build_command',
72
- coreStepName: 'build.command',
73
- coreStepDescription,
74
- condition: hasBuildCommand,
75
- }
@@ -1,102 +0,0 @@
1
- import net from 'net'
2
- import { normalize, resolve, relative } from 'path'
3
- import { promisify } from 'util'
4
-
5
- import { pEvent } from 'p-event'
6
-
7
- import { addErrorInfo } from '../../error/info.js'
8
- import { runsAfterDeploy } from '../../plugins/events.js'
9
- import { addAsyncErrorMessage } from '../../utils/errors.js'
10
-
11
- export const createBuildbotClient = function (buildbotServerSocket) {
12
- const connectionOpts = getConnectionOpts(buildbotServerSocket)
13
- const client = net.createConnection(connectionOpts)
14
- return client
15
- }
16
-
17
- // Windows does not support Unix sockets well, so we also support `host:port`
18
- const getConnectionOpts = function (buildbotServerSocket) {
19
- if (!buildbotServerSocket.includes(':')) {
20
- return { path: buildbotServerSocket }
21
- }
22
-
23
- const [host, port] = buildbotServerSocket.split(':')
24
- return { host, port }
25
- }
26
-
27
- const eConnectBuildbotClient = async function (client) {
28
- await pEvent(client, 'connect')
29
- }
30
-
31
- export const connectBuildbotClient = addAsyncErrorMessage(eConnectBuildbotClient, 'Could not connect to buildbot')
32
-
33
- export const closeBuildbotClient = async function (client) {
34
- if (client.destroyed) {
35
- return
36
- }
37
-
38
- await promisify(client.end.bind(client))()
39
- }
40
-
41
- const cWritePayload = async function (buildbotClient, payload) {
42
- await promisify(buildbotClient.write.bind(buildbotClient))(JSON.stringify(payload))
43
- }
44
-
45
- const writePayload = addAsyncErrorMessage(cWritePayload, 'Could not send payload to buildbot')
46
-
47
- const cGetNextParsedResponsePromise = async function (buildbotClient) {
48
- const data = await pEvent(buildbotClient, 'data')
49
- return JSON.parse(data)
50
- }
51
-
52
- const getNextParsedResponsePromise = addAsyncErrorMessage(
53
- cGetNextParsedResponsePromise,
54
- 'Invalid response from buildbot',
55
- )
56
-
57
- export const deploySiteWithBuildbotClient = async function ({ client, events, buildDir, repositoryRoot, constants }) {
58
- const action = shouldWaitForPostProcessing(events) ? 'deploySiteAndAwaitLive' : 'deploySite'
59
- const deployDir = getDeployDir({ buildDir, repositoryRoot, constants })
60
- const payload = { action, deployDir }
61
-
62
- const [{ succeeded, values: { error, error_type: errorType } = {} }] = await Promise.all([
63
- getNextParsedResponsePromise(client),
64
- writePayload(client, payload),
65
- ])
66
-
67
- if (!succeeded) {
68
- return handleDeployError(error, errorType)
69
- }
70
- }
71
-
72
- // The file paths in the buildbot are relative to the repository root.
73
- // However, the file paths in Build plugins, including `constants.PUBLISH_DIR`
74
- // are relative to the build directory, which is different when there is a
75
- // base directory. This converts it.
76
- // We need to call `normalize()` in case the publish directory is the
77
- // repository root, so `deployDir` is "." not ""
78
- const getDeployDir = function ({ buildDir, repositoryRoot, constants: { PUBLISH_DIR } }) {
79
- const absolutePublishDir = resolve(buildDir, PUBLISH_DIR)
80
- const relativePublishDir = relative(repositoryRoot, absolutePublishDir)
81
- const deployDir = normalize(relativePublishDir)
82
- return deployDir
83
- }
84
-
85
- // We distinguish between user errors and system errors during deploys
86
- const handleDeployError = function (error, errorType) {
87
- const errorA = new Error(`Deploy did not succeed: ${error}`)
88
- const errorInfo =
89
- errorType === 'user' ? { type: 'resolveConfig' } : { type: 'coreStep', location: { coreStepName: 'Deploy site' } }
90
- addErrorInfo(errorA, errorInfo)
91
- throw errorA
92
- }
93
-
94
- // We only wait for post-processing (last stage before site deploy) if the build
95
- // has some plugins that do post-deploy logic
96
- const shouldWaitForPostProcessing = function (events) {
97
- return events.some(hasPostDeployLogic)
98
- }
99
-
100
- const hasPostDeployLogic = function (event) {
101
- return runsAfterDeploy(event)
102
- }
@@ -1,73 +0,0 @@
1
- import { saveUpdatedConfig, restoreUpdatedConfig } from '../../core/config.js'
2
- import { logDeploySuccess } from '../../log/messages/plugins.js'
3
-
4
- import {
5
- createBuildbotClient,
6
- connectBuildbotClient,
7
- closeBuildbotClient,
8
- deploySiteWithBuildbotClient,
9
- } from './buildbot_client.js'
10
-
11
- const coreStep = async function ({
12
- buildDir,
13
- configPath,
14
- repositoryRoot,
15
- constants,
16
- buildbotServerSocket,
17
- events,
18
- logs,
19
- featureFlags,
20
- context,
21
- branch,
22
- configMutations,
23
- headersPath,
24
- redirectsPath,
25
- debug,
26
- saveConfig,
27
- }) {
28
- const client = createBuildbotClient(buildbotServerSocket)
29
- try {
30
- await connectBuildbotClient(client)
31
- await saveUpdatedConfig({
32
- configMutations,
33
- buildDir,
34
- repositoryRoot,
35
- configPath,
36
- headersPath,
37
- redirectsPath,
38
- logs,
39
- featureFlags,
40
- context,
41
- branch,
42
- debug,
43
- saveConfig,
44
- })
45
- await deploySiteWithBuildbotClient({ client, events, buildDir, repositoryRoot, constants })
46
- await restoreUpdatedConfig({
47
- configMutations,
48
- buildDir,
49
- repositoryRoot,
50
- configPath,
51
- headersPath,
52
- redirectsPath,
53
- saveConfig,
54
- })
55
- logDeploySuccess(logs)
56
- return {}
57
- } finally {
58
- await closeBuildbotClient(client)
59
- }
60
- }
61
-
62
- const shouldDeploy = function ({ buildbotServerSocket }) {
63
- return buildbotServerSocket !== undefined
64
- }
65
-
66
- export const deploySite = {
67
- event: 'onPostBuild',
68
- coreStep,
69
- coreStepId: 'deploy_site',
70
- coreStepName: 'Deploy site',
71
- coreStepDescription: () => 'Deploy site',
72
- condition: shouldDeploy,
73
- }
@@ -1,107 +0,0 @@
1
- import { promises as fs } from 'fs'
2
- import { dirname, join, resolve } from 'path'
3
-
4
- import { bundle, find } from '@netlify/edge-bundler'
5
- import { pathExists } from 'path-exists'
6
-
7
- import { logFunctionsToBundle } from '../../log/messages/core_steps.js'
8
-
9
- import { parseManifest } from './lib/internal_manifest.js'
10
-
11
- // TODO: Replace this with a custom cache directory.
12
- const DENO_CLI_CACHE_DIRECTORY = '.netlify/plugins/deno-cli'
13
- const IMPORT_MAP_FILENAME = 'edge-functions-import-map.json'
14
-
15
- const coreStep = async function ({
16
- buildDir,
17
- constants: {
18
- EDGE_FUNCTIONS_DIST: distDirectory,
19
- EDGE_FUNCTIONS_SRC: srcDirectory,
20
- INTERNAL_EDGE_FUNCTIONS_SRC: internalSrcDirectory,
21
- IS_LOCAL: isRunningLocally,
22
- },
23
- debug,
24
- featureFlags,
25
- logs,
26
- netlifyConfig,
27
- }) {
28
- const { edge_functions: configDeclarations = [] } = netlifyConfig
29
- const distPath = resolve(buildDir, distDirectory)
30
- const internalSrcPath = resolve(buildDir, internalSrcDirectory)
31
- const distImportMapPath = join(dirname(internalSrcPath), IMPORT_MAP_FILENAME)
32
- const srcPath = srcDirectory ? resolve(buildDir, srcDirectory) : undefined
33
- const sourcePaths = [internalSrcPath, srcPath].filter(Boolean)
34
-
35
- logFunctions({ internalSrcDirectory, internalSrcPath, logs, srcDirectory, srcPath })
36
-
37
- const { declarations: internalDeclarations, importMap } = await parseManifest(internalSrcPath)
38
- const declarations = [...configDeclarations, ...internalDeclarations]
39
-
40
- // If we're running in buildbot and the feature flag is enabled, we set the
41
- // Deno cache dir to a directory that is persisted between builds.
42
- const cacheDirectory =
43
- !isRunningLocally && featureFlags.edge_functions_cache_cli ? resolve(buildDir, DENO_CLI_CACHE_DIRECTORY) : undefined
44
-
45
- // Edge Bundler expects the dist directory to exist.
46
- await fs.mkdir(distPath, { recursive: true })
47
-
48
- await bundle(sourcePaths, distPath, declarations, {
49
- cacheDirectory,
50
- debug,
51
- distImportMapPath,
52
- featureFlags,
53
- importMaps: [importMap].filter(Boolean),
54
- })
55
-
56
- return {}
57
- }
58
-
59
- // We run this core step if at least one of the functions directories (the
60
- // one configured by the user or the internal one) exists. We use a dynamic
61
- // `condition` because the directories might be created by the build command
62
- // or plugins.
63
- const hasEdgeFunctionsDirectories = async function ({
64
- buildDir,
65
- constants: { INTERNAL_EDGE_FUNCTIONS_SRC, EDGE_FUNCTIONS_SRC },
66
- }) {
67
- const hasFunctionsSrc = EDGE_FUNCTIONS_SRC !== undefined && EDGE_FUNCTIONS_SRC !== ''
68
-
69
- if (hasFunctionsSrc) {
70
- return true
71
- }
72
-
73
- const internalFunctionsSrc = resolve(buildDir, INTERNAL_EDGE_FUNCTIONS_SRC)
74
-
75
- return await pathExists(internalFunctionsSrc)
76
- }
77
-
78
- const logFunctions = async ({
79
- internalSrcDirectory,
80
- internalSrcPath,
81
- logs,
82
- srcDirectory: userFunctionsSrc,
83
- srcPath,
84
- }) => {
85
- const [userFunctions, internalFunctions] = await Promise.all([find([srcPath]), find([internalSrcPath])])
86
- const userFunctionsSrcExists = await pathExists(srcPath)
87
- const internalFunctionsSrc = internalSrcDirectory
88
-
89
- logFunctionsToBundle({
90
- logs,
91
- userFunctions: userFunctions.map(({ name }) => name),
92
- userFunctionsSrc,
93
- userFunctionsSrcExists,
94
- internalFunctions: internalFunctions.map(({ name }) => name),
95
- internalFunctionsSrc,
96
- type: 'Edge Functions',
97
- })
98
- }
99
-
100
- export const bundleEdgeFunctions = {
101
- event: 'onBuild',
102
- coreStep,
103
- coreStepId: 'edge_functions_bundling',
104
- coreStepName: 'Edge Functions bundling',
105
- coreStepDescription: () => 'Edge Functions bundling',
106
- condition: hasEdgeFunctionsDirectories,
107
- }
@@ -1,54 +0,0 @@
1
- import { promises as fs } from 'fs'
2
- import { dirname, join, resolve } from 'path'
3
-
4
- const parseManifest = async (internalSourceDirectory) => {
5
- const manifestPath = join(internalSourceDirectory, 'manifest.json')
6
-
7
- try {
8
- const data = await fs.readFile(manifestPath)
9
- const manifest = JSON.parse(data)
10
-
11
- if (manifest.version !== 1) {
12
- throw new Error('Unsupported manifest version')
13
- }
14
-
15
- const result = {
16
- declarations: manifest.functions,
17
- }
18
-
19
- if (manifest.import_map) {
20
- const importMapPath = resolve(dirname(manifestPath), manifest.import_map)
21
- const importMap = await readImportMap(importMapPath)
22
-
23
- return {
24
- ...result,
25
- importMap,
26
- }
27
- }
28
-
29
- return result
30
- } catch {
31
- // no-op
32
- }
33
-
34
- return {
35
- declarations: [],
36
- }
37
- }
38
-
39
- const readImportMap = async (path) => {
40
- try {
41
- const data = await fs.readFile(path)
42
- const importMap = JSON.parse(data)
43
-
44
- return importMap
45
- } catch {
46
- // no-op
47
- }
48
-
49
- return {
50
- imports: {},
51
- }
52
- }
53
-
54
- export { parseManifest }
@@ -1,163 +0,0 @@
1
- import readdirp from 'readdirp'
2
-
3
- import { addErrorInfo } from '../../error/info.js'
4
-
5
- const MODULE_NOT_FOUND_CODE = 'MODULE_NOT_FOUND'
6
- const MODULE_NOT_FOUND_ESBUILD_REGEXP = /^Could not resolve ['"]([^'"]+)/
7
- const MODULE_NOT_FOUND_REGEXP = /Cannot find module ['"]([^'"]+)/
8
-
9
- // Handle errors coming from zip-it-and-ship-it
10
- export const getZipError = async function (error, functionsSrc) {
11
- const moduleNotFoundError = await getModuleNotFoundError(error, functionsSrc)
12
-
13
- if (moduleNotFoundError) {
14
- return moduleNotFoundError
15
- }
16
-
17
- if (isPackageJsonError(error)) {
18
- return getPackageJsonError(error)
19
- }
20
-
21
- return error
22
- }
23
-
24
- const getModuleNotFoundError = async function (error, functionsSrc) {
25
- const errorFromZisi = await getModuleNotFoundErrorFromZISI(error, functionsSrc)
26
-
27
- if (errorFromZisi) {
28
- return errorFromZisi
29
- }
30
-
31
- const errorFromEsbuild = await getModuleNotFoundErrorFromEsbuild(error, functionsSrc)
32
-
33
- if (errorFromEsbuild) {
34
- return errorFromEsbuild
35
- }
36
- }
37
-
38
- const getModuleNotFoundErrorObject = async ({ error, functionsSrc, moduleNames }) => {
39
- const message = await getModuleNotFoundMessage(functionsSrc, moduleNames)
40
-
41
- error.message = `${message}\n\n${error.message}`
42
- addErrorInfo(error, { type: 'dependencies' })
43
-
44
- return error
45
- }
46
-
47
- const getModuleNotFoundMessage = async function (functionsSrc, moduleNames) {
48
- if (moduleNames.length === 0 || !(await lacksNodeModules(functionsSrc))) {
49
- return MODULE_NOT_FOUND_MESSAGE
50
- }
51
-
52
- if (moduleNames.filter(Boolean).some(isLocalPath)) {
53
- return PATH_NOT_FOUND_MESSAGE
54
- }
55
-
56
- return getLocalInstallMessage(moduleNames)
57
- }
58
-
59
- const isLocalPath = function (moduleName) {
60
- return moduleName.startsWith('.') || moduleName.startsWith('/')
61
- }
62
-
63
- const getModuleNotFoundErrorFromEsbuild = function (error, functionsSrc) {
64
- const { errors = [] } = error
65
- const modulesNotFound = errors.reduce((modules, errorObject) => {
66
- const match = errorObject.text.match(MODULE_NOT_FOUND_ESBUILD_REGEXP)
67
-
68
- if (!match) {
69
- return modules
70
- }
71
-
72
- return [...modules, match[1]]
73
- }, [])
74
-
75
- if (modulesNotFound.length === 0) {
76
- return
77
- }
78
-
79
- return getModuleNotFoundErrorObject({ error, functionsSrc, moduleNames: modulesNotFound })
80
- }
81
-
82
- const getModuleNotFoundErrorFromZISI = function (error, functionsSrc) {
83
- if (!(error instanceof Error && error.code === MODULE_NOT_FOUND_CODE)) {
84
- return
85
- }
86
-
87
- const moduleName = getModuleNameFromZISIError(error)
88
-
89
- return getModuleNotFoundErrorObject({ error, functionsSrc, moduleNames: moduleName ? [moduleName] : [] })
90
- }
91
-
92
- // This error message always include the same words
93
- const getModuleNameFromZISIError = function (error) {
94
- if (typeof error.message !== 'string') {
95
- return
96
- }
97
-
98
- const result = MODULE_NOT_FOUND_REGEXP.exec(error.message)
99
- if (result === null) {
100
- return
101
- }
102
-
103
- return result[1]
104
- }
105
-
106
- // Netlify Functions has a `package.json` but no `node_modules`
107
- const lacksNodeModules = async function (functionsSrc) {
108
- return (
109
- functionsSrc !== undefined &&
110
- (await hasFunctionRootFile('package.json', functionsSrc)) &&
111
- !(await hasFunctionRootFile('node_modules', functionsSrc))
112
- )
113
- }
114
-
115
- // Functions can be either files or directories, so we need to check on two
116
- // depth levels
117
- const hasFunctionRootFile = async function (filename, functionsSrc) {
118
- const files = await readdirp.promise(functionsSrc, { depth: 1, fileFilter: filename })
119
- return files.length !== 0
120
- }
121
-
122
- const MODULE_NOT_FOUND_MESSAGE = `A Netlify Function failed to require one of its dependencies.
123
- Please make sure it is present in the site's top-level "package.json".`
124
- const PATH_NOT_FOUND_MESSAGE = `A Netlify Function failed to require a local file.
125
- Please make sure the file exists and its path is correctly spelled.`
126
-
127
- // A common mistake is to assume Netlify Functions dependencies are
128
- // automatically installed. This checks for this pattern.
129
- const getLocalInstallMessage = function (modules) {
130
- const genericMessage = `
131
-
132
- By default, dependencies inside a Netlify Function's "package.json" are not automatically installed.
133
- There are several ways to fix this problem:
134
- - Removing your Function's "package.json" and adding the dependencies to the project's top-level "package.json" instead. This is the fastest and safest solution.
135
- - Running "npm install" or "yarn" inside your Netlify Function in your build command.
136
- - Adding the following plugin to your "netlify.toml":
137
-
138
- [[plugins]]
139
- package = "@netlify/plugin-functions-install-core"
140
- `
141
-
142
- if (modules.length === 1) {
143
- return `A Netlify Function is using "${modules[0]}" but that dependency has not been installed yet.${genericMessage}`
144
- }
145
-
146
- const moduleNames = modules.map((name) => `"${name}"`).join(', ')
147
-
148
- return `A Netlify Function is using dependencies that have not been installed yet: ${moduleNames}${genericMessage}`
149
- }
150
-
151
- // We need to load the site's `package.json` when bundling Functions. This is
152
- // because `optionalDependencies` can make `import()` fail, but we don't want
153
- // to error then. However, if the `package.json` is invalid, we fail the build.
154
- const isPackageJsonError = function (error) {
155
- return PACKAGE_JSON_ORIGINAL_MESSAGES.some((msg) => error.message.includes(msg))
156
- }
157
-
158
- const PACKAGE_JSON_ORIGINAL_MESSAGES = ['is invalid JSON', 'in JSON at position']
159
-
160
- const getPackageJsonError = function (error) {
161
- addErrorInfo(error, { type: 'resolveConfig' })
162
- return error
163
- }
@@ -1,6 +0,0 @@
1
- export const getZisiFeatureFlags = (featureFlags) => ({
2
- ...featureFlags,
3
- defaultEsModulesToEsbuild: featureFlags.buildbot_es_modules_esbuild,
4
- parseWithEsbuild: featureFlags.buildbot_zisi_esbuild_parser,
5
- traceWithNft: featureFlags.buildbot_zisi_trace_nft,
6
- })