@netlify/build 0.5.0 → 1.0.0-dl-test
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/bin.js +5 -0
- package/lib/core/bin.js +66 -0
- package/lib/core/build.js +392 -0
- package/lib/core/config.js +124 -0
- package/lib/core/constants.js +116 -0
- package/lib/core/dev.js +27 -0
- package/lib/core/dry.js +21 -0
- package/lib/core/feature_flags.js +17 -0
- package/lib/core/flags.js +206 -0
- package/lib/core/lingering.js +68 -0
- package/lib/core/main.js +114 -0
- package/lib/core/missing_side_file.js +17 -0
- package/lib/core/normalize_flags.js +62 -0
- package/lib/core/report_metrics.js +17 -0
- package/lib/core/severity.js +21 -0
- package/lib/core/types.js +8 -0
- package/lib/core/user_node_version.js +32 -0
- package/lib/env/changes.js +43 -0
- package/lib/env/main.js +14 -0
- package/lib/env/metadata.js +68 -0
- package/lib/error/api.js +37 -0
- package/lib/error/build.js +36 -0
- package/lib/error/cancel.js +7 -0
- package/lib/error/colors.js +9 -0
- package/lib/error/handle.js +44 -0
- package/lib/error/info.js +37 -0
- package/lib/error/monitor/location.js +16 -0
- package/lib/error/monitor/normalize.js +86 -0
- package/lib/error/monitor/print.js +20 -0
- package/lib/error/monitor/report.js +120 -0
- package/lib/error/monitor/start.js +61 -0
- package/lib/error/parse/clean_stack.js +70 -0
- package/lib/error/parse/location.js +50 -0
- package/lib/error/parse/normalize.js +24 -0
- package/lib/error/parse/parse.js +67 -0
- package/lib/error/parse/plugin.js +55 -0
- package/lib/error/parse/properties.js +16 -0
- package/lib/error/parse/serialize_log.js +34 -0
- package/lib/error/parse/serialize_status.js +18 -0
- package/lib/error/parse/stack.js +34 -0
- package/lib/error/report.js +29 -0
- package/lib/error/type.js +177 -0
- package/lib/install/functions.js +20 -0
- package/lib/install/local.js +45 -0
- package/lib/install/main.js +67 -0
- package/lib/install/missing.js +54 -0
- package/lib/log/colors.js +28 -0
- package/lib/log/description.js +21 -0
- package/lib/log/header.js +12 -0
- package/lib/log/header_func.js +13 -0
- package/lib/log/logger.js +140 -0
- package/lib/log/messages/compatibility.js +120 -0
- package/lib/log/messages/config.js +91 -0
- package/lib/log/messages/core.js +49 -0
- package/lib/log/messages/core_steps.js +75 -0
- package/lib/log/messages/dry.js +41 -0
- package/lib/log/messages/install.js +25 -0
- package/lib/log/messages/ipc.js +29 -0
- package/lib/log/messages/mutations.js +62 -0
- package/lib/log/messages/plugins.js +25 -0
- package/lib/log/messages/status.js +14 -0
- package/lib/log/messages/steps.js +18 -0
- package/lib/log/serialize.js +10 -0
- package/lib/log/stream.js +68 -0
- package/lib/log/theme.js +27 -0
- package/lib/plugins/child/diff.js +46 -0
- package/lib/plugins/child/error.js +26 -0
- package/lib/plugins/child/lazy.js +15 -0
- package/lib/plugins/child/load.js +22 -0
- package/lib/plugins/child/logic.js +57 -0
- package/lib/plugins/child/main.js +37 -0
- package/lib/plugins/child/run.js +19 -0
- package/lib/plugins/child/status.js +63 -0
- package/lib/plugins/child/typescript.js +28 -0
- package/lib/plugins/child/utils.js +42 -0
- package/lib/plugins/child/validate.js +31 -0
- package/lib/plugins/compatibility.js +104 -0
- package/lib/plugins/error.js +46 -0
- package/lib/plugins/events.js +12 -0
- package/lib/plugins/expected_version.js +81 -0
- package/lib/plugins/internal.js +10 -0
- package/lib/plugins/ipc.js +120 -0
- package/lib/plugins/list.js +73 -0
- package/lib/plugins/load.js +50 -0
- package/lib/plugins/manifest/check.js +85 -0
- package/lib/plugins/manifest/load.js +38 -0
- package/lib/plugins/manifest/main.js +19 -0
- package/lib/plugins/manifest/path.js +24 -0
- package/lib/plugins/manifest/validate.js +91 -0
- package/lib/plugins/node_version.js +35 -0
- package/lib/plugins/options.js +70 -0
- package/lib/plugins/pinned_version.js +83 -0
- package/lib/plugins/resolve.js +110 -0
- package/lib/plugins/spawn.js +55 -0
- package/lib/plugins_core/add.js +35 -0
- package/lib/plugins_core/build_command.js +50 -0
- package/lib/plugins_core/deploy/buildbot_client.js +87 -0
- package/lib/plugins_core/deploy/index.js +49 -0
- package/lib/plugins_core/deploy/manifest.yml +1 -0
- package/lib/plugins_core/edge_functions/index.js +106 -0
- package/lib/plugins_core/edge_functions/lib/error.js +17 -0
- package/lib/plugins_core/edge_functions/validate_manifest/validate_edge_functions_manifest.js +14 -0
- package/lib/plugins_core/functions/error.js +123 -0
- package/lib/plugins_core/functions/feature_flags.js +5 -0
- package/lib/plugins_core/functions/index.js +137 -0
- package/lib/plugins_core/functions/utils.js +45 -0
- package/lib/plugins_core/functions/zisi.js +64 -0
- package/lib/plugins_core/functions_install/index.js +10 -0
- package/lib/plugins_core/list.js +20 -0
- package/lib/plugins_core/save_artifacts/index.js +33 -0
- package/lib/report/statsd.js +56 -0
- package/lib/status/add.js +30 -0
- package/lib/status/colors.js +18 -0
- package/lib/status/load_error.js +10 -0
- package/lib/status/report.js +83 -0
- package/lib/status/success.js +14 -0
- package/lib/steps/core_step.js +62 -0
- package/lib/steps/error.js +65 -0
- package/lib/steps/get.js +44 -0
- package/lib/steps/plugin.js +55 -0
- package/lib/steps/return.js +27 -0
- package/lib/steps/run_core_steps.js +117 -0
- package/lib/steps/run_step.js +200 -0
- package/lib/steps/run_steps.js +102 -0
- package/lib/steps/update_config.js +66 -0
- package/lib/telemetry/main.js +94 -0
- package/lib/time/aggregate.js +109 -0
- package/lib/time/main.js +31 -0
- package/lib/time/measure.js +16 -0
- package/lib/time/report.js +30 -0
- package/lib/utils/errors.js +13 -0
- package/lib/utils/json.js +10 -0
- package/lib/utils/omit.js +3 -0
- package/lib/utils/package.js +24 -0
- package/lib/utils/remove_falsy.js +8 -0
- package/lib/utils/resolve.js +41 -0
- package/lib/utils/runtime.js +5 -0
- package/lib/utils/semver.js +28 -0
- package/package.json +119 -56
- package/types/config/build.d.ts +52 -0
- package/types/config/functions.d.ts +36 -0
- package/types/config/inputs.d.ts +7 -0
- package/types/config/netlify_config.d.ts +58 -0
- package/types/index.d.ts +7 -0
- package/types/netlify_event_handler.d.ts +29 -0
- package/types/netlify_plugin.d.ts +29 -0
- package/types/netlify_plugin_constants.d.ts +51 -0
- package/types/netlify_plugin_options.d.ts +23 -0
- package/types/options/index.d.ts +1 -0
- package/types/options/netlify_plugin_build_util.d.ts +7 -0
- package/types/options/netlify_plugin_cache_util.d.ts +39 -0
- package/types/options/netlify_plugin_functions_util.d.ts +32 -0
- package/types/options/netlify_plugin_git_util.d.ts +41 -0
- package/types/options/netlify_plugin_run_util.d.ts +24 -0
- package/types/options/netlify_plugin_status_util.d.ts +24 -0
- package/types/options/netlify_plugin_utils.d.ts +15 -0
- package/types/utils/json_value.d.ts +1 -0
- package/types/utils/many.d.ts +6 -0
- package/README.md +0 -3
- package/src/core/bin.js +0 -139
- package/src/core/commands.js +0 -304
- package/src/core/config.js +0 -130
- package/src/core/constants.js +0 -86
- package/src/core/dry.js +0 -23
- package/src/core/main.js +0 -196
- package/src/env/changes.js +0 -49
- package/src/env/git.js +0 -27
- package/src/env/main.js +0 -97
- package/src/env/metadata.js +0 -81
- package/src/error/api.js +0 -32
- package/src/error/build.js +0 -32
- package/src/error/cancel.js +0 -22
- package/src/error/colors.js +0 -13
- package/src/error/info.js +0 -12
- package/src/error/monitor/normalize.js +0 -50
- package/src/error/monitor/print.js +0 -43
- package/src/error/monitor/report.js +0 -140
- package/src/error/monitor/start.js +0 -50
- package/src/error/parse/clean_stack.js +0 -86
- package/src/error/parse/location.js +0 -50
- package/src/error/parse/parse.js +0 -87
- package/src/error/parse/plugin.js +0 -68
- package/src/error/parse/properties.js +0 -20
- package/src/error/parse/serialize_log.js +0 -46
- package/src/error/parse/serialize_status.js +0 -28
- package/src/error/parse/stack.js +0 -45
- package/src/error/process.js +0 -13
- package/src/error/type.js +0 -143
- package/src/install/functions.js +0 -62
- package/src/install/local.js +0 -74
- package/src/install/main.js +0 -103
- package/src/install/missing.js +0 -86
- package/src/log/colors.js +0 -59
- package/src/log/description.js +0 -38
- package/src/log/header.js +0 -19
- package/src/log/logger.js +0 -55
- package/src/log/main.js +0 -290
- package/src/log/old_version.js +0 -45
- package/src/log/serialize.js +0 -15
- package/src/log/stream.js +0 -15
- package/src/log/theme.js +0 -32
- package/src/log/timer.js +0 -28
- package/src/plugins/child/api.js +0 -59
- package/src/plugins/child/error.js +0 -39
- package/src/plugins/child/load.js +0 -37
- package/src/plugins/child/logic.js +0 -31
- package/src/plugins/child/main.js +0 -48
- package/src/plugins/child/run.js +0 -30
- package/src/plugins/child/status.js +0 -53
- package/src/plugins/child/utils.js +0 -43
- package/src/plugins/child/validate.js +0 -71
- package/src/plugins/error.js +0 -73
- package/src/plugins/events.js +0 -77
- package/src/plugins/ipc.js +0 -136
- package/src/plugins/load.js +0 -66
- package/src/plugins/manifest/check.js +0 -80
- package/src/plugins/manifest/load.js +0 -54
- package/src/plugins/manifest/main.js +0 -24
- package/src/plugins/manifest/path.js +0 -12
- package/src/plugins/manifest/validate.js +0 -136
- package/src/plugins/node_version.js +0 -74
- package/src/plugins/options.js +0 -78
- package/src/plugins/package.js +0 -17
- package/src/plugins/resolve.js +0 -159
- package/src/plugins/spawn.js +0 -82
- package/src/plugins_core/cache/manifest.yml +0 -1
- package/src/plugins_core/cache/plugin.js +0 -75
- package/src/plugins_core/functions/manifest.yml +0 -1
- package/src/plugins_core/functions/plugin.js +0 -37
- package/src/plugins_core/functions_install/plugin.js +0 -14
- package/src/plugins_core/main.js +0 -38
- package/src/status/add.js +0 -56
- package/src/status/colors.js +0 -25
- package/src/status/report.js +0 -57
- package/src/telemetry/complete.js +0 -49
- package/src/telemetry/request.js +0 -28
- package/src/telemetry/track.js +0 -33
- package/src/utils/omit.js +0 -8
- package/src/utils/polyfills.js +0 -3
- package/src/utils/remove_falsy.js +0 -12
- package/src/utils/resolve.js +0 -39
- /package/{src → lib}/plugins_core/functions_install/manifest.yml +0 -0
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
const isPlainObj = require('is-plain-obj')
|
|
2
|
-
|
|
3
|
-
const { serializeArray } = require('../../log/serialize')
|
|
4
|
-
const { THEME } = require('../../log/theme')
|
|
5
|
-
const { API_METHODS } = require('../child/api')
|
|
6
|
-
|
|
7
|
-
// Validate `manifest.yml` syntax
|
|
8
|
-
const validateManifest = function(manifest, rawManifest) {
|
|
9
|
-
try {
|
|
10
|
-
validateBasic(manifest)
|
|
11
|
-
validateUnknownProps(manifest)
|
|
12
|
-
validateName(manifest)
|
|
13
|
-
validateScopes(manifest)
|
|
14
|
-
validateInputs(manifest)
|
|
15
|
-
} catch (error) {
|
|
16
|
-
error.message = `Plugin's "manifest.yml" ${error.message}
|
|
17
|
-
|
|
18
|
-
${THEME.errorSubHeader('manifest.yml')}
|
|
19
|
-
${rawManifest.trim()}`
|
|
20
|
-
throw error
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const validateBasic = function(manifest) {
|
|
25
|
-
if (!isPlainObj(manifest)) {
|
|
26
|
-
throw new Error('must be a plain object')
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const validateUnknownProps = function(manifest) {
|
|
31
|
-
const unknownProp = Object.keys(manifest).find(key => !VALID_PROPS.includes(key))
|
|
32
|
-
if (unknownProp !== undefined) {
|
|
33
|
-
throw new Error(`unknown property "${unknownProp}"`)
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const VALID_PROPS = ['name', 'inputs', 'scopes']
|
|
38
|
-
|
|
39
|
-
const validateName = function({ name }) {
|
|
40
|
-
if (name === undefined) {
|
|
41
|
-
throw new Error('must contain a "name" property')
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (typeof name !== 'string') {
|
|
45
|
-
throw new Error('"name" property must be a string')
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const validateScopes = function({ scopes }) {
|
|
50
|
-
if (scopes === undefined) {
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (!Array.isArray(scopes)) {
|
|
55
|
-
throw new Error('"scopes" property must be an array')
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const wrongScope = scopes.find(scope => !isValidScope(scope))
|
|
59
|
-
if (wrongScope !== undefined) {
|
|
60
|
-
throw new Error(`scope "${wrongScope}" is invalid
|
|
61
|
-
Please use a valid scope. One of:
|
|
62
|
-
${serializeArray(ALLOWED_SCOPES)}`)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const isValidScope = function(scope) {
|
|
67
|
-
return ALLOWED_SCOPES.includes(scope)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const ALLOWED_SCOPES = ['*', ...API_METHODS]
|
|
71
|
-
|
|
72
|
-
const validateInputs = function({ inputs }) {
|
|
73
|
-
if (inputs === undefined) {
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (!isArrayOfObjects(inputs)) {
|
|
78
|
-
throw new Error('"inputs" property must be an array of objects')
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
inputs.forEach(validateInput)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const isArrayOfObjects = function(objects) {
|
|
85
|
-
return Array.isArray(objects) && objects.every(isPlainObj)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const validateInput = function(input, index) {
|
|
89
|
-
try {
|
|
90
|
-
validateUnknownInputProps(input)
|
|
91
|
-
validateInputName(input)
|
|
92
|
-
validateInputDescription(input)
|
|
93
|
-
validateInputRequired(input)
|
|
94
|
-
} catch (error) {
|
|
95
|
-
error.message = `"inputs" property is invalid.
|
|
96
|
-
Input at position ${index} ${error.message}.`
|
|
97
|
-
throw error
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const validateUnknownInputProps = function(input) {
|
|
102
|
-
const unknownProp = Object.keys(input).find(key => !VALID_INPUT_PROPS.includes(key))
|
|
103
|
-
if (unknownProp !== undefined) {
|
|
104
|
-
throw new Error(`has an unknown property "${unknownProp}"`)
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const VALID_INPUT_PROPS = ['name', 'description', 'required', 'default']
|
|
109
|
-
|
|
110
|
-
const validateInputName = function({ name }) {
|
|
111
|
-
if (name === undefined) {
|
|
112
|
-
throw new Error('must contain a "name" property')
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (typeof name !== 'string') {
|
|
116
|
-
throw new Error('"name" property must be a string')
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const validateInputDescription = function({ description }) {
|
|
121
|
-
if (description === undefined) {
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (typeof description !== 'string') {
|
|
126
|
-
throw new Error('"description" property must be a string')
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const validateInputRequired = function({ required }) {
|
|
131
|
-
if (required !== undefined && typeof required !== 'boolean') {
|
|
132
|
-
throw new Error('"required" property must be a boolean')
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
module.exports = { validateManifest }
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
const { version: currentVersion, execPath } = require('process')
|
|
2
|
-
|
|
3
|
-
const execa = require('execa')
|
|
4
|
-
const { satisfies, clean: cleanVersion } = require('semver')
|
|
5
|
-
|
|
6
|
-
const {
|
|
7
|
-
engines: { node: coreNodeVersionRange },
|
|
8
|
-
} = require('../../package.json')
|
|
9
|
-
const { addErrorInfo } = require('../error/info')
|
|
10
|
-
|
|
11
|
-
// Retrieve Node.js version from `--node-path`
|
|
12
|
-
const getUserNodeVersion = async function(nodePath) {
|
|
13
|
-
// No `--node-path` CLI flag
|
|
14
|
-
if (nodePath === execPath) {
|
|
15
|
-
return getCurrentNodeVersion()
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const result = NVM_NODE_VERSION_REGEXP.exec(nodePath)
|
|
19
|
-
if (result !== null) {
|
|
20
|
-
return result[1]
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const { stdout } = await execa(nodePath, ['--version'], { reject: false })
|
|
24
|
-
const version = cleanVersion(stdout)
|
|
25
|
-
if (version === null) {
|
|
26
|
-
throwUserError(`Invalid --node-path CLI flag: ${nodePath}`)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return version
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Retrieve Node.js version if the Node.js path is using nvm.
|
|
33
|
-
// `node.exe` on Windows, `bin/node` on Unix.
|
|
34
|
-
const NVM_NODE_VERSION_REGEXP = /[/\\]v(\d+\.\d+\.\d+)[/\\](bin[/\\]node|node.exe)$/
|
|
35
|
-
|
|
36
|
-
// Retrieve Node.js version from current process
|
|
37
|
-
const getCurrentNodeVersion = function() {
|
|
38
|
-
return cleanVersion(currentVersion)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Ensure Node.js version is recent enough to run this plugin
|
|
42
|
-
const checkNodeVersion = async function({
|
|
43
|
-
childNodeVersion,
|
|
44
|
-
package,
|
|
45
|
-
packageJson: { engines: { node: pluginNodeVersionRange } = {} } = {},
|
|
46
|
-
}) {
|
|
47
|
-
// Build plugins are instrumented with a wrapper code which has a minimal
|
|
48
|
-
// allowed Node.js version.
|
|
49
|
-
// A mismatch can only happen in the conditions described below since:
|
|
50
|
-
// - production builds use a pinned version, except for local plugins and
|
|
51
|
-
// plugins added to `package.json`
|
|
52
|
-
// - Netlify CLI has the same minimal allowed Node.js version as
|
|
53
|
-
// `@netlify/build`, so if users can run Netlify CLI, everything is good
|
|
54
|
-
if (!satisfies(childNodeVersion, coreNodeVersionRange)) {
|
|
55
|
-
throwUserError(`The Node.js version is ${childNodeVersion} but it should be ${coreNodeVersionRange} when using build plugins either:
|
|
56
|
-
- from the same repository (as opposed to npm modules)
|
|
57
|
-
- or added to "package.json"`)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Plugins can also set a minimal version using `engines.node`
|
|
61
|
-
if (pluginNodeVersionRange && !satisfies(childNodeVersion, pluginNodeVersionRange)) {
|
|
62
|
-
throwUserError(
|
|
63
|
-
`The Node.js version is ${childNodeVersion} but the plugin "${package}" requires ${pluginNodeVersionRange}`,
|
|
64
|
-
)
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const throwUserError = function(message) {
|
|
69
|
-
const error = new Error(message)
|
|
70
|
-
addErrorInfo(error, { type: 'resolveConfig' })
|
|
71
|
-
throw error
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
module.exports = { getUserNodeVersion, getCurrentNodeVersion, checkNodeVersion }
|
package/src/plugins/options.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
const { dirname } = require('path')
|
|
2
|
-
|
|
3
|
-
const corePackageJson = require('../../package.json')
|
|
4
|
-
const { checkDeprecatedFunctionsInstall } = require('../install/functions')
|
|
5
|
-
const { installLocalPluginsDependencies } = require('../install/local')
|
|
6
|
-
const { getCorePlugins, CORE_PLUGINS, EARLY_CORE_PLUGINS } = require('../plugins_core/main')
|
|
7
|
-
|
|
8
|
-
const { useManifest } = require('./manifest/main')
|
|
9
|
-
const { getPackageJson } = require('./package')
|
|
10
|
-
const { resolvePluginsPath } = require('./resolve')
|
|
11
|
-
|
|
12
|
-
// Load plugin options (specified by user in `config.plugins`)
|
|
13
|
-
// Do not allow user override of core plugins
|
|
14
|
-
const getPluginsOptions = async function({
|
|
15
|
-
netlifyConfig: { plugins },
|
|
16
|
-
buildDir,
|
|
17
|
-
constants: { FUNCTIONS_SRC },
|
|
18
|
-
mode,
|
|
19
|
-
api,
|
|
20
|
-
}) {
|
|
21
|
-
const corePlugins = getCorePlugins(FUNCTIONS_SRC).map(addCoreProperties)
|
|
22
|
-
const allCorePlugins = corePlugins.filter(corePlugin => !isOptionalCore(corePlugin, plugins))
|
|
23
|
-
const userPlugins = plugins.filter(isUserPlugin)
|
|
24
|
-
const pluginsOptions = [...allCorePlugins, ...userPlugins].map(normalizePluginOptions)
|
|
25
|
-
const pluginsOptionsA = await resolvePluginsPath({ pluginsOptions, buildDir, mode })
|
|
26
|
-
const pluginsOptionsB = await Promise.all(
|
|
27
|
-
pluginsOptionsA.map(pluginOptions => loadPluginFiles({ pluginOptions, mode, api })),
|
|
28
|
-
)
|
|
29
|
-
await Promise.all([
|
|
30
|
-
checkDeprecatedFunctionsInstall(plugins, FUNCTIONS_SRC, buildDir),
|
|
31
|
-
installLocalPluginsDependencies({ plugins, pluginsOptions: pluginsOptionsB, buildDir, mode }),
|
|
32
|
-
])
|
|
33
|
-
return pluginsOptionsB
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const addCoreProperties = function(corePlugin) {
|
|
37
|
-
return { ...corePlugin, loadedFrom: 'core', origin: 'core' }
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Optional core plugins requires user opt-in
|
|
41
|
-
const isOptionalCore = function({ package, optional }, plugins) {
|
|
42
|
-
return optional && plugins.every(plugin => plugin.package !== package)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const isUserPlugin = function({ package }) {
|
|
46
|
-
return !CORE_PLUGINS.includes(package) && !EARLY_CORE_PLUGINS.includes(package)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const normalizePluginOptions = function({ package, pluginPath, loadedFrom, origin, inputs = {} }) {
|
|
50
|
-
return { package, pluginPath, loadedFrom, origin, inputs }
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Retrieve plugin's main file path.
|
|
54
|
-
// Then load plugin's `package.json` and `manifest.yml`.
|
|
55
|
-
const loadPluginFiles = async function({ pluginOptions: { pluginPath, ...pluginOptions }, mode, api }) {
|
|
56
|
-
const pluginDir = dirname(pluginPath)
|
|
57
|
-
const { packageDir, packageJson } = await getPackageJson(pluginDir)
|
|
58
|
-
const { manifest, inputs: inputsA } = await useManifest(pluginOptions, {
|
|
59
|
-
pluginDir,
|
|
60
|
-
packageDir,
|
|
61
|
-
packageJson,
|
|
62
|
-
mode,
|
|
63
|
-
api,
|
|
64
|
-
})
|
|
65
|
-
return { ...pluginOptions, pluginPath, packageDir, packageJson, manifest, inputs: inputsA }
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Retrieve information about @netlify/build when an error happens there and not
|
|
69
|
-
// in a plugin
|
|
70
|
-
const getSpawnInfo = function() {
|
|
71
|
-
const { name } = corePackageJson
|
|
72
|
-
return {
|
|
73
|
-
plugin: { package: name, packageJson: corePackageJson },
|
|
74
|
-
location: { event: 'load', package: name, loadedFrom: 'core', origin: 'core' },
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
module.exports = { getPluginsOptions, getSpawnInfo }
|
package/src/plugins/package.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
const { dirname } = require('path')
|
|
2
|
-
|
|
3
|
-
const readPkgUp = require('read-pkg-up')
|
|
4
|
-
|
|
5
|
-
// Retrieve plugin's `package.json`
|
|
6
|
-
const getPackageJson = async function(pluginDir) {
|
|
7
|
-
const packageObj = await readPkgUp({ cwd: pluginDir })
|
|
8
|
-
if (packageObj === undefined) {
|
|
9
|
-
return { packageJson: {} }
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const { path, packageJson } = packageObj
|
|
13
|
-
const packageDir = dirname(path)
|
|
14
|
-
return { packageDir, packageJson }
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
module.exports = { getPackageJson }
|
package/src/plugins/resolve.js
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
const { resolve } = require('path')
|
|
2
|
-
const { env } = require('process')
|
|
3
|
-
|
|
4
|
-
const pathExists = require('path-exists')
|
|
5
|
-
|
|
6
|
-
const { installMissingPlugins, getAutoPluginsDirPath } = require('../install/missing')
|
|
7
|
-
// const { logMissingPluginsWarning } = require('../log/main')
|
|
8
|
-
const { resolvePath } = require('../utils/resolve')
|
|
9
|
-
|
|
10
|
-
// Try to find plugins in four places, by priority order:
|
|
11
|
-
// - already loaded (core plugins)
|
|
12
|
-
// - local plugin
|
|
13
|
-
// - external plugin already installed in `node_modules`, most likely through `package.json`
|
|
14
|
-
// - cached in the build image
|
|
15
|
-
// - automatically installed by us (fallback)
|
|
16
|
-
const resolvePluginsPath = async function({ pluginsOptions, buildDir, mode }) {
|
|
17
|
-
const autoPluginsDir = getAutoPluginsDirPath(buildDir)
|
|
18
|
-
const pluginsOptionsA = await Promise.all(
|
|
19
|
-
pluginsOptions.map(pluginOptions => resolvePluginPath({ pluginOptions, buildDir, autoPluginsDir, mode })),
|
|
20
|
-
)
|
|
21
|
-
await installMissingPlugins({ pluginsOptions: pluginsOptionsA, autoPluginsDir, mode })
|
|
22
|
-
const pluginsOptionsB = await Promise.all(
|
|
23
|
-
pluginsOptionsA.map(pluginOptions => resolveMissingPluginPath({ pluginOptions, autoPluginsDir })),
|
|
24
|
-
)
|
|
25
|
-
warnOnMissingPlugins(pluginsOptionsB, mode)
|
|
26
|
-
return pluginsOptionsB
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const resolvePluginPath = async function({
|
|
30
|
-
pluginOptions,
|
|
31
|
-
pluginOptions: { package, loadedFrom },
|
|
32
|
-
buildDir,
|
|
33
|
-
autoPluginsDir,
|
|
34
|
-
mode,
|
|
35
|
-
}) {
|
|
36
|
-
// Core plugins
|
|
37
|
-
if (loadedFrom !== undefined) {
|
|
38
|
-
return pluginOptions
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Local plugins
|
|
42
|
-
if (package.startsWith('.') || package.startsWith('/')) {
|
|
43
|
-
const localPath = resolve(buildDir, package)
|
|
44
|
-
return { ...pluginOptions, pluginPath: localPath, loadedFrom: 'local' }
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Plugin already installed in the project, most likely either local plugins,
|
|
48
|
-
// or external plugins added to `package.json`
|
|
49
|
-
const manualPath = await tryResolvePath(package, buildDir)
|
|
50
|
-
if (manualPath !== undefined) {
|
|
51
|
-
return { ...pluginOptions, pluginPath: manualPath, loadedFrom: 'package.json' }
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Cached in the build image
|
|
55
|
-
const buildImagePath = await tryBuildImagePath(package, mode, buildDir)
|
|
56
|
-
if (buildImagePath !== undefined) {
|
|
57
|
-
return { ...pluginOptions, pluginPath: buildImagePath, loadedFrom: 'image_cache' }
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Plugin previously automatically installed
|
|
61
|
-
const automaticPath = await tryAutomaticPath(package, autoPluginsDir)
|
|
62
|
-
if (automaticPath !== undefined) {
|
|
63
|
-
return { ...pluginOptions, pluginPath: automaticPath, loadedFrom: 'auto_install' }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Otherwise, it must be automatically installed, as a fallback
|
|
67
|
-
return pluginOptions
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// In production, we pre-install most Build plugins to that directory, for
|
|
71
|
-
// performance reasons
|
|
72
|
-
const tryBuildImagePath = async function(package, mode, buildDir) {
|
|
73
|
-
if (mode !== 'buildbot') {
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const pluginsDir = getBuildImagePluginsDir()
|
|
78
|
-
const buildImagePath = `${pluginsDir}/${package}`
|
|
79
|
-
if (!(await pathExists(buildImagePath))) {
|
|
80
|
-
return
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return resolvePath(buildImagePath, buildDir)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const getBuildImagePluginsDir = function() {
|
|
87
|
-
if (env.TEST_BUILD_IMAGE_PLUGINS_DIR) {
|
|
88
|
-
return env.TEST_BUILD_IMAGE_PLUGINS_DIR
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return BUILD_IMAGE_PLUGINS_DIR
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const BUILD_IMAGE_PLUGINS_DIR = '/opt/buildhome/.netlify-build-plugins/node_modules'
|
|
95
|
-
|
|
96
|
-
// Try to find plugin previously automatically installed
|
|
97
|
-
const tryAutomaticPath = async function(package, autoPluginsDir) {
|
|
98
|
-
if (!(await pathExists(autoPluginsDir))) {
|
|
99
|
-
return
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return tryResolvePath(package, autoPluginsDir)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Try to `resolve()` the plugin from the build directory
|
|
106
|
-
const tryResolvePath = async function(package, baseDir) {
|
|
107
|
-
try {
|
|
108
|
-
return await resolvePath(package, baseDir)
|
|
109
|
-
} catch (error) {
|
|
110
|
-
return
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Resolve the plugins that just got automatically installed
|
|
115
|
-
const resolveMissingPluginPath = async function({
|
|
116
|
-
pluginOptions,
|
|
117
|
-
pluginOptions: { package, pluginPath },
|
|
118
|
-
autoPluginsDir,
|
|
119
|
-
}) {
|
|
120
|
-
if (pluginPath !== undefined) {
|
|
121
|
-
return pluginOptions
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const automaticPath = await resolvePath(package, autoPluginsDir)
|
|
125
|
-
return { ...pluginOptions, pluginPath: automaticPath, loadedFrom: 'auto_install' }
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Warns when plugins have been automatically installed. This feature is a
|
|
129
|
-
// fallback that should not be relied upon because:
|
|
130
|
-
// - it is much slower
|
|
131
|
-
// - npm can be unreliable
|
|
132
|
-
// Warns both when installing the plugin, and when re-using it in a future build
|
|
133
|
-
// Not done for local builds, since they cannot use the alternative
|
|
134
|
-
// (build-image cached plugins).
|
|
135
|
-
const warnOnMissingPlugins = function(pluginsOptions, mode) {
|
|
136
|
-
if (mode !== 'buildbot') {
|
|
137
|
-
return
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const packages = pluginsOptions.filter(isAutomaticallyInstalled).map(getPackage)
|
|
141
|
-
if (packages.length === 0) {
|
|
142
|
-
return
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// TODO: re-enable warning after the following are available:
|
|
146
|
-
// - UI installs
|
|
147
|
-
// - build-image pre-installed plugins
|
|
148
|
-
// logMissingPluginsWarning(packages)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const isAutomaticallyInstalled = function({ loadedFrom }) {
|
|
152
|
-
return loadedFrom === 'auto_install'
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const getPackage = function({ package }) {
|
|
156
|
-
return package
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
module.exports = { resolvePluginsPath }
|
package/src/plugins/spawn.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
const { execPath } = require('process')
|
|
2
|
-
|
|
3
|
-
const execa = require('execa')
|
|
4
|
-
|
|
5
|
-
const { logLoadingPlugins } = require('../log/main')
|
|
6
|
-
|
|
7
|
-
const { getEventFromChild } = require('./ipc')
|
|
8
|
-
const { getUserNodeVersion, getCurrentNodeVersion, checkNodeVersion } = require('./node_version')
|
|
9
|
-
const { getSpawnInfo } = require('./options')
|
|
10
|
-
|
|
11
|
-
const CHILD_MAIN_FILE = `${__dirname}/child/main.js`
|
|
12
|
-
|
|
13
|
-
// Start child processes used by all plugins
|
|
14
|
-
// We fire plugins through child processes so that:
|
|
15
|
-
// - each plugin is sandboxed, e.g. cannot access/modify its parent `process`
|
|
16
|
-
// (for both security and safety reasons)
|
|
17
|
-
// - logs can be buffered which allows manipulating them for log shipping,
|
|
18
|
-
// transforming and parallel plugins
|
|
19
|
-
const startPlugins = async function({ pluginsOptions, buildDir, nodePath, childEnv, mode }) {
|
|
20
|
-
logLoadingPlugins(pluginsOptions)
|
|
21
|
-
|
|
22
|
-
const spawnInfo = getSpawnInfo()
|
|
23
|
-
const userNodeVersion = await getUserNodeVersion(nodePath)
|
|
24
|
-
return Promise.all(
|
|
25
|
-
pluginsOptions.map(({ package, packageJson, loadedFrom }) =>
|
|
26
|
-
startPlugin({ buildDir, nodePath, childEnv, package, packageJson, loadedFrom, mode, spawnInfo, userNodeVersion }),
|
|
27
|
-
),
|
|
28
|
-
)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const startPlugin = async function({
|
|
32
|
-
buildDir,
|
|
33
|
-
nodePath,
|
|
34
|
-
childEnv,
|
|
35
|
-
package,
|
|
36
|
-
packageJson,
|
|
37
|
-
loadedFrom,
|
|
38
|
-
mode,
|
|
39
|
-
spawnInfo,
|
|
40
|
-
userNodeVersion,
|
|
41
|
-
}) {
|
|
42
|
-
const { childNodePath, childNodeVersion } = getChildNodePath({ loadedFrom, nodePath, userNodeVersion, mode })
|
|
43
|
-
|
|
44
|
-
await checkNodeVersion({ childNodeVersion, package, packageJson })
|
|
45
|
-
|
|
46
|
-
const childProcess = execa.node(CHILD_MAIN_FILE, {
|
|
47
|
-
cwd: buildDir,
|
|
48
|
-
preferLocal: true,
|
|
49
|
-
nodePath: childNodePath,
|
|
50
|
-
execPath: childNodePath,
|
|
51
|
-
env: childEnv,
|
|
52
|
-
extendEnv: false,
|
|
53
|
-
})
|
|
54
|
-
await getEventFromChild(childProcess, 'ready', spawnInfo)
|
|
55
|
-
return { childProcess }
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Local plugins, `package.json`-installed plugins and local builds use user's
|
|
59
|
-
// preferred Node.js version.
|
|
60
|
-
// Other plugins use `@netlify/build` Node.js version.
|
|
61
|
-
const getChildNodePath = function({ loadedFrom, nodePath, userNodeVersion, mode }) {
|
|
62
|
-
if (loadedFrom === 'local' || loadedFrom === 'package.json' || (loadedFrom !== 'core' && mode !== 'buildbot')) {
|
|
63
|
-
return { childNodePath: nodePath, childNodeVersion: userNodeVersion }
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return { childNodePath: execPath, childNodeVersion: getCurrentNodeVersion() }
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Stop all plugins child processes
|
|
70
|
-
const stopPlugins = async function(childProcesses) {
|
|
71
|
-
await Promise.all(childProcesses.map(stopPlugin))
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const stopPlugin = async function({ childProcess }) {
|
|
75
|
-
if (childProcess.connected) {
|
|
76
|
-
childProcess.disconnect()
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
childProcess.kill()
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
module.exports = { startPlugins, stopPlugins }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
name: '@netlify/plugin-cache-core'
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
const { homedir } = require('os')
|
|
2
|
-
const {
|
|
3
|
-
version,
|
|
4
|
-
env: { TEST_CACHE_PATH },
|
|
5
|
-
} = require('process')
|
|
6
|
-
|
|
7
|
-
const { logCacheDir } = require('../../log/main')
|
|
8
|
-
|
|
9
|
-
// Save/restore cache core plugin
|
|
10
|
-
const cachePlugin = {
|
|
11
|
-
async onPostBuild({ utils: { cache }, constants: { IS_LOCAL } }) {
|
|
12
|
-
await Promise.all(ARTIFACTS.map(({ path, digests }) => saveCache({ path, digests, cache, IS_LOCAL })))
|
|
13
|
-
},
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Cache a single directory
|
|
17
|
-
const saveCache = async function({ path, digests, cache, IS_LOCAL }) {
|
|
18
|
-
// In tests we don't run caching since it is slow and make source directory
|
|
19
|
-
// much bigger
|
|
20
|
-
if (TEST_CACHE_PATH !== undefined && TEST_CACHE_PATH !== path) {
|
|
21
|
-
return
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const success = await cache.save(path, { move: !IS_LOCAL, digests })
|
|
25
|
-
|
|
26
|
-
if (success) {
|
|
27
|
-
logCacheDir(path)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// List of directories to cache
|
|
32
|
-
const HOME = homedir()
|
|
33
|
-
const ARTIFACTS = [
|
|
34
|
-
// Node modules
|
|
35
|
-
{ path: 'node_modules', digests: ['package-lock.json', 'yarn.lock'] },
|
|
36
|
-
// Bower components
|
|
37
|
-
{ path: 'bower_components' },
|
|
38
|
-
// Ruby gems
|
|
39
|
-
{ path: '.bundle' },
|
|
40
|
-
// Python virtualenv
|
|
41
|
-
{ path: '.venv' },
|
|
42
|
-
// WAPM packages (WebAssembly)
|
|
43
|
-
{ path: 'wapm_packages' },
|
|
44
|
-
// Yarn
|
|
45
|
-
{ path: `${HOME}/.yarn_cache` },
|
|
46
|
-
// Pip
|
|
47
|
-
{ path: `${HOME}/.cache/pip` },
|
|
48
|
-
// Emacs cask
|
|
49
|
-
{ path: `${HOME}/.cask` },
|
|
50
|
-
// Emacs
|
|
51
|
-
{ path: `${HOME}/.emacs.d` },
|
|
52
|
-
// Maven
|
|
53
|
-
{ path: `${HOME}/.m2` },
|
|
54
|
-
// Boot
|
|
55
|
-
{ path: `${HOME}/.boot` },
|
|
56
|
-
// Composer
|
|
57
|
-
{ path: `${HOME}/.composer` },
|
|
58
|
-
// Wasmer
|
|
59
|
-
{ path: `${HOME}/.wasmer/cache` },
|
|
60
|
-
// Go dependencies
|
|
61
|
-
{ path: `${HOME}/.gimme_cache` },
|
|
62
|
-
// TODO: the buildbot currently uses different file paths. Once Netlify Build
|
|
63
|
-
// handles both saving cache and restoring cache, this should not be an issue
|
|
64
|
-
// anymore.
|
|
65
|
-
// CACHE_DIR/node_version -> CACHE_DIR/.nvm/versions/node[/$NODE_VERSION]
|
|
66
|
-
// CACHE_DIR/ruby_version -> CACHE_DIR/.rvm/rubies[/ruby-$RUBY_VERSION]
|
|
67
|
-
// nvm
|
|
68
|
-
{ path: `${HOME}/.nvm/versions/node/${version}` },
|
|
69
|
-
// TODO: only cache rvm when the version is not already in the Docker image,
|
|
70
|
-
// i.e. it is a custom version
|
|
71
|
-
// rvm
|
|
72
|
-
{ path: `${HOME}/.rvm/rubies` },
|
|
73
|
-
]
|
|
74
|
-
|
|
75
|
-
module.exports = cachePlugin
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
name: '@netlify/plugin-functions-core'
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
const { zipFunctions } = require('@netlify/zip-it-and-ship-it')
|
|
2
|
-
const pathExists = require('path-exists')
|
|
3
|
-
const readdirp = require('readdirp')
|
|
4
|
-
|
|
5
|
-
const { serializeArray } = require('../../log/serialize')
|
|
6
|
-
|
|
7
|
-
// Plugin to package Netlify functions with @netlify/zip-it-and-ship-it
|
|
8
|
-
const onPostBuild = async function({ constants: { FUNCTIONS_SRC, FUNCTIONS_DIST } }) {
|
|
9
|
-
if (!(await pathExists(FUNCTIONS_SRC))) {
|
|
10
|
-
return
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
console.log(`Packaging functions from ${FUNCTIONS_SRC}`)
|
|
14
|
-
await zipFunctions(FUNCTIONS_SRC, FUNCTIONS_DIST)
|
|
15
|
-
|
|
16
|
-
await logResults(FUNCTIONS_DIST)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Print the list of paths to the packaged functions
|
|
20
|
-
const logResults = async function(FUNCTIONS_DIST) {
|
|
21
|
-
const files = await readdirp.promise(FUNCTIONS_DIST)
|
|
22
|
-
|
|
23
|
-
if (files.length === 0) {
|
|
24
|
-
console.log('No functions were packaged')
|
|
25
|
-
return
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const paths = files.map(getLoggedPath)
|
|
29
|
-
console.log(`Functions packaged in ${FUNCTIONS_DIST}
|
|
30
|
-
${serializeArray(paths)}`)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const getLoggedPath = function({ path }) {
|
|
34
|
-
return path
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
module.exports = { onPostBuild }
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
const pathExists = require('path-exists')
|
|
2
|
-
|
|
3
|
-
const { installFunctionDependencies } = require('../../install/functions')
|
|
4
|
-
|
|
5
|
-
// Plugin to package Netlify functions with @netlify/zip-it-and-ship-it
|
|
6
|
-
const onPreBuild = async function({ constants: { FUNCTIONS_SRC, IS_LOCAL } }) {
|
|
7
|
-
if (!(await pathExists(FUNCTIONS_SRC))) {
|
|
8
|
-
return
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
await installFunctionDependencies(FUNCTIONS_SRC, IS_LOCAL)
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
module.exports = { onPreBuild }
|