netlify-cli 17.3.1 → 17.4.0

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 (210) hide show
  1. package/README.md +3 -139
  2. package/npm-shrinkwrap.json +82 -82
  3. package/package.json +16 -15
  4. package/src/commands/addons/addons-auth.mjs +27 -30
  5. package/src/commands/addons/addons-config.mjs +145 -154
  6. package/src/commands/addons/addons-create.mjs +94 -108
  7. package/src/commands/addons/addons-delete.mjs +36 -41
  8. package/src/commands/addons/addons-list.mjs +38 -42
  9. package/src/commands/addons/addons.mjs +26 -28
  10. package/src/commands/addons/index.mjs +1 -1
  11. package/src/commands/api/api.mjs +45 -53
  12. package/src/commands/api/index.mjs +1 -1
  13. package/src/commands/base-command.mjs +597 -684
  14. package/src/commands/blobs/blobs-delete.mjs +35 -0
  15. package/src/commands/blobs/blobs-get.mjs +44 -0
  16. package/src/commands/blobs/blobs-list.mjs +48 -0
  17. package/src/commands/blobs/blobs-set.mjs +54 -0
  18. package/src/commands/blobs/blobs.mjs +32 -0
  19. package/src/commands/blobs/index.mjs +1 -0
  20. package/src/commands/build/build.mjs +55 -67
  21. package/src/commands/build/index.mjs +1 -1
  22. package/src/commands/completion/completion.mjs +41 -46
  23. package/src/commands/completion/index.mjs +1 -1
  24. package/src/commands/deploy/deploy.mjs +675 -710
  25. package/src/commands/deploy/index.mjs +1 -1
  26. package/src/commands/dev/dev-exec.mjs +20 -32
  27. package/src/commands/dev/dev.mjs +217 -302
  28. package/src/commands/dev/index.mjs +1 -1
  29. package/src/commands/dev/types.d.ts +30 -0
  30. package/src/commands/env/env-clone.mjs +157 -184
  31. package/src/commands/env/env-get.mjs +49 -68
  32. package/src/commands/env/env-import.mjs +100 -119
  33. package/src/commands/env/env-list.mjs +104 -129
  34. package/src/commands/env/env-set.mjs +160 -185
  35. package/src/commands/env/env-unset.mjs +104 -122
  36. package/src/commands/env/env.mjs +28 -30
  37. package/src/commands/env/index.mjs +1 -1
  38. package/src/commands/functions/functions-build.mjs +29 -41
  39. package/src/commands/functions/functions-create.mjs +533 -601
  40. package/src/commands/functions/functions-invoke.mjs +193 -216
  41. package/src/commands/functions/functions-list.mjs +45 -55
  42. package/src/commands/functions/functions-serve.mjs +51 -61
  43. package/src/commands/functions/functions.mjs +26 -32
  44. package/src/commands/functions/index.mjs +1 -1
  45. package/src/commands/index.mjs +2 -2
  46. package/src/commands/init/index.mjs +1 -1
  47. package/src/commands/init/init.mjs +138 -167
  48. package/src/commands/integration/deploy.mjs +337 -399
  49. package/src/commands/integration/index.mjs +12 -13
  50. package/src/commands/link/index.mjs +1 -1
  51. package/src/commands/link/link.mjs +298 -317
  52. package/src/commands/lm/index.mjs +1 -1
  53. package/src/commands/lm/lm-info.mjs +23 -31
  54. package/src/commands/lm/lm-install.mjs +13 -17
  55. package/src/commands/lm/lm-setup.mjs +80 -84
  56. package/src/commands/lm/lm-uninstall.mjs +7 -12
  57. package/src/commands/lm/lm.mjs +18 -22
  58. package/src/commands/login/index.mjs +1 -1
  59. package/src/commands/login/login.mjs +35 -41
  60. package/src/commands/logout/index.mjs +1 -1
  61. package/src/commands/logout/logout.mjs +25 -31
  62. package/src/commands/main.mjs +166 -201
  63. package/src/commands/open/index.mjs +1 -1
  64. package/src/commands/open/open-admin.mjs +15 -18
  65. package/src/commands/open/open-site.mjs +16 -19
  66. package/src/commands/open/open.mjs +24 -27
  67. package/src/commands/recipes/common.mjs +23 -34
  68. package/src/commands/recipes/index.mjs +1 -1
  69. package/src/commands/recipes/recipes-list.mjs +13 -20
  70. package/src/commands/recipes/recipes.mjs +59 -72
  71. package/src/commands/serve/index.mjs +1 -1
  72. package/src/commands/serve/serve.mjs +142 -189
  73. package/src/commands/sites/index.mjs +2 -2
  74. package/src/commands/sites/sites-create-template.mjs +214 -236
  75. package/src/commands/sites/sites-create.mjs +145 -157
  76. package/src/commands/sites/sites-delete.mjs +75 -81
  77. package/src/commands/sites/sites-list.mjs +63 -66
  78. package/src/commands/sites/sites.mjs +18 -20
  79. package/src/commands/status/index.mjs +1 -1
  80. package/src/commands/status/status-hooks.mjs +32 -34
  81. package/src/commands/status/status.mjs +99 -106
  82. package/src/commands/switch/index.mjs +1 -1
  83. package/src/commands/switch/switch.mjs +32 -37
  84. package/src/commands/types.d.ts +31 -0
  85. package/src/commands/unlink/index.mjs +1 -1
  86. package/src/commands/unlink/unlink.mjs +23 -29
  87. package/src/commands/watch/index.mjs +1 -1
  88. package/src/commands/watch/watch.mjs +91 -105
  89. package/src/functions-templates/javascript/hello/{{name}}.js +2 -3
  90. package/src/lib/account.mjs +4 -5
  91. package/src/lib/api.mjs +22 -20
  92. package/src/lib/blobs/blobs.mjs +36 -45
  93. package/src/lib/build.mjs +82 -85
  94. package/src/lib/completion/constants.mjs +2 -4
  95. package/src/lib/completion/generate-autocompletion.mjs +33 -36
  96. package/src/lib/completion/get-autocompletion.mjs +31 -35
  97. package/src/lib/completion/index.mjs +1 -1
  98. package/src/lib/completion/script.mjs +12 -19
  99. package/src/lib/edge-functions/bootstrap.mjs +3 -5
  100. package/src/lib/edge-functions/consts.mjs +9 -10
  101. package/src/lib/edge-functions/deploy.mjs +28 -34
  102. package/src/lib/edge-functions/editor-helper.mjs +29 -42
  103. package/src/lib/edge-functions/headers.mjs +24 -26
  104. package/src/lib/edge-functions/internal.mjs +38 -44
  105. package/src/lib/edge-functions/proxy.mjs +229 -228
  106. package/src/lib/edge-functions/registry.mjs +473 -574
  107. package/src/lib/exec-fetcher.mjs +115 -122
  108. package/src/lib/fs.mjs +28 -27
  109. package/src/lib/functions/background.mjs +16 -20
  110. package/src/lib/functions/config.mjs +12 -9
  111. package/src/lib/functions/form-submissions-handler.mjs +143 -149
  112. package/src/lib/functions/local-proxy.mjs +40 -44
  113. package/src/lib/functions/memoized-build.mjs +19 -21
  114. package/src/lib/functions/netlify-function.mjs +269 -249
  115. package/src/lib/functions/registry.mjs +509 -568
  116. package/src/lib/functions/runtimes/go/index.mjs +62 -71
  117. package/src/lib/functions/runtimes/index.mjs +8 -15
  118. package/src/lib/functions/runtimes/js/builders/netlify-lambda.mjs +55 -64
  119. package/src/lib/functions/runtimes/js/builders/zisi.mjs +135 -154
  120. package/src/lib/functions/runtimes/js/constants.mjs +1 -1
  121. package/src/lib/functions/runtimes/js/index.mjs +92 -109
  122. package/src/lib/functions/runtimes/js/worker.mjs +43 -45
  123. package/src/lib/functions/runtimes/rust/index.mjs +64 -73
  124. package/src/lib/functions/scheduled.mjs +70 -88
  125. package/src/lib/functions/server.mjs +269 -327
  126. package/src/lib/functions/synchronous.mjs +118 -147
  127. package/src/lib/functions/utils.mjs +38 -46
  128. package/src/lib/geo-location.mjs +69 -81
  129. package/src/lib/http-agent.mjs +87 -90
  130. package/src/lib/images/proxy.mjs +97 -89
  131. package/src/lib/log.mjs +6 -9
  132. package/src/lib/path.mjs +2 -1
  133. package/src/lib/render-error-template.mjs +19 -20
  134. package/src/lib/settings.mjs +17 -19
  135. package/src/lib/spinner.mjs +21 -23
  136. package/src/lib/string.mjs +4 -2
  137. package/src/recipes/vscode/index.mjs +69 -85
  138. package/src/recipes/vscode/settings.mjs +53 -58
  139. package/src/utils/addons/compare.mjs +31 -32
  140. package/src/utils/addons/diffs/index.mjs +16 -17
  141. package/src/utils/addons/diffs/options.mjs +99 -101
  142. package/src/utils/addons/prepare.mjs +100 -97
  143. package/src/utils/addons/prompts.mjs +73 -76
  144. package/src/utils/addons/render.mjs +33 -36
  145. package/src/utils/addons/validation.mjs +19 -15
  146. package/src/utils/banner.mjs +11 -16
  147. package/src/utils/build-info.mjs +65 -66
  148. package/src/utils/command-helpers.mjs +185 -199
  149. package/src/utils/create-deferred.mjs +9 -12
  150. package/src/utils/create-stream-promise.mjs +54 -47
  151. package/src/utils/deploy/constants.mjs +9 -11
  152. package/src/utils/deploy/deploy-site.mjs +162 -182
  153. package/src/utils/deploy/hash-config.mjs +21 -21
  154. package/src/utils/deploy/hash-files.mjs +34 -38
  155. package/src/utils/deploy/hash-fns.mjs +149 -154
  156. package/src/utils/deploy/hasher-segments.mjs +58 -52
  157. package/src/utils/deploy/upload-files.mjs +99 -113
  158. package/src/utils/deploy/util.mjs +85 -91
  159. package/src/utils/detect-server-settings.mjs +236 -268
  160. package/src/utils/dev.mjs +163 -178
  161. package/src/utils/dot-env.mjs +37 -42
  162. package/src/utils/env/index.mjs +148 -148
  163. package/src/utils/execa.mjs +9 -13
  164. package/src/utils/feature-flags.mjs +6 -5
  165. package/src/utils/framework-server.mjs +43 -52
  166. package/src/utils/functions/constants.mjs +1 -1
  167. package/src/utils/functions/functions.mjs +30 -40
  168. package/src/utils/functions/get-functions.mjs +28 -29
  169. package/src/utils/functions/index.mjs +3 -3
  170. package/src/utils/get-global-config.mjs +33 -36
  171. package/src/utils/get-package-json.mjs +14 -15
  172. package/src/utils/get-repo-data.mjs +54 -64
  173. package/src/utils/get-site.mjs +14 -14
  174. package/src/utils/gh-auth.mjs +79 -100
  175. package/src/utils/gitignore.mjs +37 -40
  176. package/src/utils/headers.mjs +33 -35
  177. package/src/utils/hooks/requires-site-info.mjs +26 -22
  178. package/src/utils/init/config-github.mjs +207 -219
  179. package/src/utils/init/config-manual.mjs +83 -100
  180. package/src/utils/init/config.mjs +25 -26
  181. package/src/utils/init/node-version.mjs +23 -30
  182. package/src/utils/init/plugins.mjs +12 -8
  183. package/src/utils/init/utils.mjs +152 -172
  184. package/src/utils/live-tunnel.mjs +118 -141
  185. package/src/utils/lm/install.mjs +220 -259
  186. package/src/utils/lm/requirements.mjs +54 -63
  187. package/src/utils/lm/steps.mjs +31 -31
  188. package/src/utils/lm/ui.mjs +13 -20
  189. package/src/utils/open-browser.mjs +31 -32
  190. package/src/utils/parse-raw-flags.mjs +39 -35
  191. package/src/utils/proxy-server.mjs +84 -71
  192. package/src/utils/proxy.mjs +696 -750
  193. package/src/utils/read-repo-url.mjs +48 -47
  194. package/src/utils/redirects.mjs +49 -49
  195. package/src/utils/request-id.mjs +2 -4
  196. package/src/utils/rules-proxy.mjs +96 -100
  197. package/src/utils/run-build.mjs +109 -132
  198. package/src/utils/shell.mjs +99 -106
  199. package/src/utils/sign-redirect.mjs +14 -14
  200. package/src/utils/sites/utils.mjs +48 -55
  201. package/src/utils/state-config.mjs +101 -101
  202. package/src/utils/static-server.mjs +28 -34
  203. package/src/utils/telemetry/index.mjs +2 -2
  204. package/src/utils/telemetry/report-error.mjs +45 -49
  205. package/src/utils/telemetry/request.mjs +36 -43
  206. package/src/utils/telemetry/telemetry.mjs +90 -105
  207. package/src/utils/telemetry/utils.mjs +5 -6
  208. package/src/utils/telemetry/validation.mjs +55 -53
  209. package/src/utils/types.d.ts +46 -0
  210. package/src/utils/validation.mjs +10 -13
@@ -1,79 +1,70 @@
1
- // @ts-check
2
- import { dirname, extname } from 'path'
3
- import { platform } from 'process'
4
-
5
- import { temporaryFile } from 'tempy'
6
-
7
- import execa from '../../../../utils/execa.mjs'
8
- import { runFunctionsProxy } from '../../local-proxy.mjs'
9
-
10
- const isWindows = platform === 'win32'
11
-
12
- export const name = 'go'
13
-
1
+ import { dirname, extname } from 'path';
2
+ import { platform } from 'process';
3
+ import { temporaryFile } from 'tempy';
4
+ // @ts-expect-error TS(7034) FIXME: Variable 'execa' implicitly has type 'any' in some... Remove this comment to see the full error message
5
+ import execa from '../../../../utils/execa.mjs';
6
+ import { runFunctionsProxy } from '../../local-proxy.mjs';
7
+ const isWindows = platform === 'win32';
8
+ export const name = 'go';
9
+ // @ts-expect-error TS(7031) FIXME: Binding element 'binaryPath' implicitly has an 'an... Remove this comment to see the full error message
14
10
  const build = async ({ binaryPath, functionDirectory }) => {
15
- try {
16
- await execa('go', ['build', '-o', binaryPath], { cwd: functionDirectory })
17
-
18
- return { binaryPath, srcFiles: [functionDirectory] }
19
- } catch (error) {
20
- const isGoInstalled = await checkGoInstallation({ cwd: functionDirectory })
21
-
22
- if (!isGoInstalled) {
23
- throw new Error(
24
- "You don't seem to have Go installed. Go to https://golang.org/doc/install for installation instructions.",
25
- )
11
+ try {
12
+ // @ts-expect-error TS(7005) FIXME: Variable 'execa' implicitly has an 'any' type.
13
+ await execa('go', ['build', '-o', binaryPath], { cwd: functionDirectory });
14
+ return { binaryPath, srcFiles: [functionDirectory] };
26
15
  }
27
-
28
- throw error
29
- }
30
- }
31
-
16
+ catch (error) {
17
+ const isGoInstalled = await checkGoInstallation({ cwd: functionDirectory });
18
+ if (!isGoInstalled) {
19
+ throw new Error("You don't seem to have Go installed. Go to https://golang.org/doc/install for installation instructions.");
20
+ }
21
+ throw error;
22
+ }
23
+ };
24
+ // @ts-expect-error TS(7031) FIXME: Binding element 'cwd' implicitly has an 'any' type... Remove this comment to see the full error message
32
25
  const checkGoInstallation = async ({ cwd }) => {
33
- try {
34
- await execa('go', ['version'], { cwd })
35
-
36
- return true
37
- } catch {
38
- return false
39
- }
40
- }
41
-
26
+ try {
27
+ // @ts-expect-error TS(7005) FIXME: Variable 'execa' implicitly has an 'any' type.
28
+ await execa('go', ['version'], { cwd });
29
+ return true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ };
35
+ // @ts-expect-error TS(7031) FIXME: Binding element 'func' implicitly has an 'any' typ... Remove this comment to see the full error message
42
36
  export const getBuildFunction = ({ func }) => {
43
- const functionDirectory = dirname(func.mainFile)
44
- const binaryPath = temporaryFile(isWindows ? { extension: 'exe' } : undefined)
45
-
46
- return () => build({ binaryPath, functionDirectory })
47
- }
48
-
37
+ const functionDirectory = dirname(func.mainFile);
38
+ const binaryPath = temporaryFile(isWindows ? { extension: 'exe' } : undefined);
39
+ return () => build({ binaryPath, functionDirectory });
40
+ };
41
+ // @ts-expect-error TS(7031) FIXME: Binding element 'context' implicitly has an 'any' ... Remove this comment to see the full error message
49
42
  export const invokeFunction = async ({ context, event, func, timeout }) => {
50
- const { stdout } = await runFunctionsProxy({
51
- binaryPath: func.buildData.binaryPath,
52
- context,
53
- directory: dirname(func.mainFile),
54
- event,
55
- name: func.name,
56
- timeout,
57
- })
58
-
59
- try {
60
- const { body, headers, multiValueHeaders, statusCode } = JSON.parse(stdout)
61
-
62
- return {
63
- body,
64
- headers,
65
- multiValueHeaders,
66
- statusCode,
43
+ const { stdout } = await runFunctionsProxy({
44
+ binaryPath: func.buildData.binaryPath,
45
+ context,
46
+ directory: dirname(func.mainFile),
47
+ event,
48
+ name: func.name,
49
+ timeout,
50
+ });
51
+ try {
52
+ const { body, headers, multiValueHeaders, statusCode } = JSON.parse(stdout);
53
+ return {
54
+ body,
55
+ headers,
56
+ multiValueHeaders,
57
+ statusCode,
58
+ };
67
59
  }
68
- } catch {
69
- return {
70
- statusCode: 500,
60
+ catch {
61
+ return {
62
+ statusCode: 500,
63
+ };
71
64
  }
72
- }
73
- }
74
-
65
+ };
66
+ // @ts-expect-error TS(7006) FIXME: Parameter 'func' implicitly has an 'any' type.
75
67
  export const onRegister = (func) => {
76
- const isSource = extname(func.mainFile) === '.go'
77
-
78
- return isSource ? func : null
79
- }
68
+ const isSource = extname(func.mainFile) === '.go';
69
+ return isSource ? func : null;
70
+ };
@@ -1,38 +1,33 @@
1
1
  /* eslint-disable import/no-namespace */
2
- import * as go from './go/index.mjs'
3
- import * as js from './js/index.mjs'
4
- import * as rust from './rust/index.mjs'
2
+ import * as go from './go/index.mjs';
3
+ import * as js from './js/index.mjs';
4
+ import * as rust from './rust/index.mjs';
5
5
  /* eslint-enable import/no-namespace */
6
6
  /**
7
7
  * @callback BuildFunction
8
8
  * @param {object} func
9
9
  * @returns {Promise<{srcFiles: string[], buildPath?: string}>}
10
10
  */
11
-
12
11
  /**
13
12
  * @callback GetBuildFunction
14
13
  * @param {{ config: object, context: object, errorExit: function, func: object, functionsDirectory: string, projectRoot: string }} params
15
14
  * @returns {Promise<BuildFunction>}
16
15
  */
17
-
18
16
  /**
19
17
  * @callback InvokeFunction
20
18
  * @param {{ context: object, event: object, func: object, timeout: number }} params
21
19
  * @returns {Promise<{ body: object, statusCode: number }>}
22
20
  */
23
-
24
21
  /**
25
22
  * @callback OnDirectoryScanFunction
26
23
  * @param {{ directory: string }} params
27
24
  * @returns {Promise<undefined>}
28
25
  */
29
-
30
26
  /**
31
27
  * @callback OnRegisterFunction
32
28
  * @param {object} func
33
29
  * @returns {object|null}
34
30
  */
35
-
36
31
  /**
37
32
  * @typedef {object} Runtime
38
33
  * @property {GetBuildFunction} getBuildFunction
@@ -41,11 +36,9 @@ import * as rust from './rust/index.mjs'
41
36
  * @property {OnRegisterFunction} [onRegister]
42
37
  * @property {string} name
43
38
  */
44
-
45
39
  const runtimes = {
46
- [go.name]: go,
47
- [js.name]: js,
48
- [rust.name]: rust,
49
- }
50
-
51
- export default runtimes
40
+ [go.name]: go,
41
+ [js.name]: js,
42
+ [rust.name]: rust,
43
+ };
44
+ export default runtimes;
@@ -1,69 +1,60 @@
1
- // @ts-check
2
- import { readFile } from 'fs/promises'
3
- import { resolve } from 'path'
4
-
5
- import minimist from 'minimist'
6
-
7
- import execa from '../../../../../utils/execa.mjs'
8
- import { fileExistsAsync } from '../../../../fs.mjs'
9
- import { memoizedBuild } from '../../../memoized-build.mjs'
10
-
1
+ import { readFile } from 'fs/promises';
2
+ import { resolve } from 'path';
3
+ import minimist from 'minimist';
4
+ // @ts-expect-error TS(7034) FIXME: Variable 'execa' implicitly has type 'any' in some... Remove this comment to see the full error message
5
+ import execa from '../../../../../utils/execa.mjs';
6
+ import { fileExistsAsync } from '../../../../fs.mjs';
7
+ import { memoizedBuild } from '../../../memoized-build.mjs';
8
+ // @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
11
9
  export const detectNetlifyLambda = async function ({ packageJson } = {}) {
12
- const { dependencies, devDependencies, scripts } = packageJson || {}
13
- if (!((dependencies && dependencies['netlify-lambda']) || (devDependencies && devDependencies['netlify-lambda']))) {
14
- return false
15
- }
16
-
17
- const matchingScripts = Object.entries(scripts).filter(([, script]) => script.match(/netlify-lambda\s+build/))
18
-
19
- for (const [key, script] of matchingScripts) {
20
- // E.g. ["netlify-lambda", "build", "functions/folder"]
21
- const match = minimist(script.split(' '), {
22
- // these are all valid options for netlify-lambda
23
- boolean: ['s', 'static'],
24
- string: ['c', 'config', 'p', 'port', 'b', 'babelrc', 't', 'timeout'],
25
- })
26
- // We are not interested in 'netlify-lambda' and 'build' commands
27
- const functionDirectories = match._.slice(2)
28
- if (functionDirectories.length === 1) {
29
- const srcFiles = [resolve(functionDirectories[0])]
30
-
31
- const yarnExists = await fileExistsAsync('yarn.lock')
32
- const buildCommand = () => execa(yarnExists ? 'yarn' : 'npm', ['run', key])
33
-
34
- return {
35
- build: async ({ cache = {} } = {}) => {
36
- await memoizedBuild({ cache, cacheKey: `netlify-lambda-${key}`, command: buildCommand })
37
-
38
- return {
39
- srcFiles,
40
- }
41
- },
42
- builderName: 'netlify-lambda',
43
-
44
- // Currently used for tests only.
45
- npmScript: key,
46
- }
10
+ const { dependencies, devDependencies, scripts } = packageJson || {};
11
+ if (!((dependencies && dependencies['netlify-lambda']) || (devDependencies && devDependencies['netlify-lambda']))) {
12
+ return false;
47
13
  }
48
- if (functionDirectories.length === 0) {
49
- console.warn(`Command 'netlify-lambda build' was detected in script '${key}', but contained no functions folder`)
50
- } else {
51
- console.warn(
52
- `Command 'netlify-lambda build' was detected in script '${key}', but contained 2 or more function folders`,
53
- )
14
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
15
+ const matchingScripts = Object.entries(scripts).filter(([, script]) => script.match(/netlify-lambda\s+build/));
16
+ for (const [key, script] of matchingScripts) {
17
+ // E.g. ["netlify-lambda", "build", "functions/folder"]
18
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
19
+ const match = minimist(script.split(' '), {
20
+ // these are all valid options for netlify-lambda
21
+ boolean: ['s', 'static'],
22
+ string: ['c', 'config', 'p', 'port', 'b', 'babelrc', 't', 'timeout'],
23
+ });
24
+ // We are not interested in 'netlify-lambda' and 'build' commands
25
+ const functionDirectories = match._.slice(2);
26
+ if (functionDirectories.length === 1) {
27
+ const srcFiles = [resolve(functionDirectories[0])];
28
+ const yarnExists = await fileExistsAsync('yarn.lock');
29
+ // @ts-expect-error TS(7005) FIXME: Variable 'execa' implicitly has an 'any' type.
30
+ const buildCommand = () => execa(yarnExists ? 'yarn' : 'npm', ['run', key]);
31
+ return {
32
+ build: async ({ cache = {} } = {}) => {
33
+ await memoizedBuild({ cache, cacheKey: `netlify-lambda-${key}`, command: buildCommand });
34
+ return {
35
+ srcFiles,
36
+ };
37
+ },
38
+ builderName: 'netlify-lambda',
39
+ // Currently used for tests only.
40
+ npmScript: key,
41
+ };
42
+ }
43
+ if (functionDirectories.length === 0) {
44
+ console.warn(`Command 'netlify-lambda build' was detected in script '${key}', but contained no functions folder`);
45
+ }
46
+ else {
47
+ console.warn(`Command 'netlify-lambda build' was detected in script '${key}', but contained 2 or more function folders`);
48
+ }
54
49
  }
55
- }
56
-
57
- return false
58
- }
59
-
50
+ return false;
51
+ };
60
52
  export default async function handler() {
61
- const exists = await fileExistsAsync('package.json')
62
- if (!exists) {
63
- return false
64
- }
65
-
66
- const content = await readFile('package.json', 'utf-8')
67
- const packageJson = JSON.parse(content)
68
- return detectNetlifyLambda({ packageJson })
53
+ const exists = await fileExistsAsync('package.json');
54
+ if (!exists) {
55
+ return false;
56
+ }
57
+ const content = await readFile('package.json', 'utf-8');
58
+ const packageJson = JSON.parse(content);
59
+ return detectNetlifyLambda({ packageJson });
69
60
  }