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,265 +1,285 @@
1
- // @ts-check
2
- import { Buffer } from 'buffer'
3
- import { basename, extname } from 'path'
4
- import { version as nodeVersion } from 'process'
5
-
6
- import CronParser from 'cron-parser'
7
- import semver from 'semver'
8
-
9
- import { error as errorExit } from '../../utils/command-helpers.mjs'
10
- import { BACKGROUND } from '../../utils/functions/get-functions.mjs'
11
-
12
- const TYPESCRIPT_EXTENSIONS = new Set(['.cts', '.mts', '.ts'])
13
- const V2_MIN_NODE_VERSION = '18.14.0'
14
-
1
+ import { Buffer } from 'buffer';
2
+ import { basename, extname } from 'path';
3
+ import { version as nodeVersion } from 'process';
4
+ import CronParser from 'cron-parser';
5
+ import semver from 'semver';
6
+ import { error as errorExit } from '../../utils/command-helpers.mjs';
7
+ import { BACKGROUND } from '../../utils/functions/get-functions.mjs';
8
+ const TYPESCRIPT_EXTENSIONS = new Set(['.cts', '.mts', '.ts']);
9
+ const V2_MIN_NODE_VERSION = '18.14.0';
15
10
  // Returns a new set with all elements of `setA` that don't exist in `setB`.
16
- const difference = (setA, setB) => new Set([...setA].filter((item) => !setB.has(item)))
17
-
11
+ // @ts-expect-error TS(7006) FIXME: Parameter 'setA' implicitly has an 'any' type.
12
+ const difference = (setA, setB) => new Set([...setA].filter((item) => !setB.has(item)));
13
+ // @ts-expect-error TS(7006) FIXME: Parameter 'schedule' implicitly has an 'any' type.
18
14
  const getNextRun = function (schedule) {
19
- const cron = CronParser.parseExpression(schedule, {
20
- tz: 'Etc/UTC',
21
- })
22
- return cron.next().toDate()
23
- }
24
-
15
+ const cron = CronParser.parseExpression(schedule, {
16
+ tz: 'Etc/UTC',
17
+ });
18
+ return cron.next().toDate();
19
+ };
25
20
  export default class NetlifyFunction {
26
- constructor({
27
- blobsContext,
28
- config,
29
- directory,
30
- displayName,
31
- mainFile,
32
- name,
33
- projectRoot,
34
- runtime,
35
- settings,
36
- timeoutBackground,
37
- timeoutSynchronous,
38
- }) {
39
- this.blobsContext = blobsContext
40
- this.buildError = null
41
- this.config = config
42
- this.directory = directory
43
- this.errorExit = errorExit
44
- this.mainFile = mainFile
45
- this.name = name
46
- this.displayName = displayName ?? name
47
- this.projectRoot = projectRoot
48
- this.runtime = runtime
49
- this.timeoutBackground = timeoutBackground
50
- this.timeoutSynchronous = timeoutSynchronous
51
- this.settings = settings
52
-
53
- // Determines whether this is a background function based on the function
54
- // name.
55
- this.isBackground = name.endsWith(BACKGROUND)
56
-
57
- const functionConfig = config.functions && config.functions[name]
58
- this.schedule = functionConfig && functionConfig.schedule
59
-
60
- // List of the function's source files. This starts out as an empty set
61
- // and will get populated on every build.
62
- this.srcFiles = new Set()
63
- }
64
-
65
- get filename() {
66
- if (!this.buildData?.mainFile) {
67
- return null
21
+ constructor({
22
+ // @ts-expect-error TS(7031) FIXME: Binding element 'blobsContext' implicitly has an '... Remove this comment to see the full error message
23
+ blobsContext,
24
+ // @ts-expect-error TS(7031) FIXME: Binding element 'config' implicitly has an 'any' t... Remove this comment to see the full error message
25
+ config,
26
+ // @ts-expect-error TS(7031) FIXME: Binding element 'directory' implicitly has an 'any... Remove this comment to see the full error message
27
+ directory,
28
+ // @ts-expect-error TS(7031) FIXME: Binding element 'displayName' implicitly has an 'a... Remove this comment to see the full error message
29
+ displayName,
30
+ // @ts-expect-error TS(7031) FIXME: Binding element 'mainFile' implicitly has an 'any'... Remove this comment to see the full error message
31
+ mainFile,
32
+ // @ts-expect-error TS(7031) FIXME: Binding element 'name' implicitly has an 'any' typ... Remove this comment to see the full error message
33
+ name,
34
+ // @ts-expect-error TS(7031) FIXME: Binding element 'projectRoot' implicitly has an 'a... Remove this comment to see the full error message
35
+ projectRoot,
36
+ // @ts-expect-error TS(7031) FIXME: Binding element 'runtime' implicitly has an 'any' ... Remove this comment to see the full error message
37
+ runtime,
38
+ // @ts-expect-error TS(7031) FIXME: Binding element 'settings' implicitly has an 'any'... Remove this comment to see the full error message
39
+ settings,
40
+ // @ts-expect-error TS(7031) FIXME: Binding element 'timeoutBackground' implicitly has... Remove this comment to see the full error message
41
+ timeoutBackground,
42
+ // @ts-expect-error TS(7031) FIXME: Binding element 'timeoutSynchronous' implicitly ha... Remove this comment to see the full error message
43
+ timeoutSynchronous, }) {
44
+ // @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
45
+ this.blobsContext = blobsContext;
46
+ // @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
47
+ this.buildError = null;
48
+ // @ts-expect-error TS(2339) FIXME: Property 'config' does not exist on type 'NetlifyF... Remove this comment to see the full error message
49
+ this.config = config;
50
+ // @ts-expect-error TS(2339) FIXME: Property 'directory' does not exist on type 'Netli... Remove this comment to see the full error message
51
+ this.directory = directory;
52
+ // @ts-expect-error TS(2339) FIXME: Property 'errorExit' does not exist on type 'Netli... Remove this comment to see the full error message
53
+ this.errorExit = errorExit;
54
+ // @ts-expect-error TS(2339) FIXME: Property 'mainFile' does not exist on type 'Netlif... Remove this comment to see the full error message
55
+ this.mainFile = mainFile;
56
+ // @ts-expect-error TS(2339) FIXME: Property 'name' does not exist on type 'NetlifyFun... Remove this comment to see the full error message
57
+ this.name = name;
58
+ // @ts-expect-error TS(2339) FIXME: Property 'displayName' does not exist on type 'Net... Remove this comment to see the full error message
59
+ this.displayName = displayName ?? name;
60
+ // @ts-expect-error TS(2339) FIXME: Property 'projectRoot' does not exist on type 'Net... Remove this comment to see the full error message
61
+ this.projectRoot = projectRoot;
62
+ // @ts-expect-error TS(2339) FIXME: Property 'runtime' does not exist on type 'Netlify... Remove this comment to see the full error message
63
+ this.runtime = runtime;
64
+ // @ts-expect-error TS(2339) FIXME: Property 'timeoutBackground' does not exist on typ... Remove this comment to see the full error message
65
+ this.timeoutBackground = timeoutBackground;
66
+ // @ts-expect-error TS(2339) FIXME: Property 'timeoutSynchronous' does not exist on ty... Remove this comment to see the full error message
67
+ this.timeoutSynchronous = timeoutSynchronous;
68
+ // @ts-expect-error TS(2339) FIXME: Property 'settings' does not exist on type 'Netlif... Remove this comment to see the full error message
69
+ this.settings = settings;
70
+ // Determines whether this is a background function based on the function
71
+ // name.
72
+ // @ts-expect-error TS(2339) FIXME: Property 'isBackground' does not exist on type 'Ne... Remove this comment to see the full error message
73
+ this.isBackground = name.endsWith(BACKGROUND);
74
+ const functionConfig = config.functions && config.functions[name];
75
+ // @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
76
+ this.schedule = functionConfig && functionConfig.schedule;
77
+ // List of the function's source files. This starts out as an empty set
78
+ // and will get populated on every build.
79
+ // @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
80
+ this.srcFiles = new Set();
81
+ }
82
+ get filename() {
83
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
84
+ if (!this.buildData?.mainFile) {
85
+ return null;
86
+ }
87
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
88
+ return basename(this.buildData.mainFile);
89
+ }
90
+ getRecommendedExtension() {
91
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
92
+ if (this.buildData?.runtimeAPIVersion !== 2) {
93
+ return;
94
+ }
95
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
96
+ const extension = this.buildData?.mainFile ? extname(this.buildData.mainFile) : undefined;
97
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
98
+ const moduleFormat = this.buildData?.outputModuleFormat;
99
+ if (moduleFormat === 'esm') {
100
+ return;
101
+ }
102
+ if (extension === '.ts') {
103
+ return '.mts';
104
+ }
105
+ if (extension === '.js') {
106
+ return '.mjs';
107
+ }
108
+ }
109
+ hasValidName() {
110
+ // same as https://github.com/netlify/bitballoon/blob/fbd7881e6c8e8c48e7a0145da4ee26090c794108/app/models/deploy.rb#L482
111
+ // @ts-expect-error TS(2339) FIXME: Property 'name' does not exist on type 'NetlifyFun... Remove this comment to see the full error message
112
+ // eslint-disable-next-line unicorn/better-regex
113
+ return /^[A-Za-z0-9_-]+$/.test(this.name);
68
114
  }
69
-
70
- return basename(this.buildData.mainFile)
71
- }
72
-
73
- getRecommendedExtension() {
74
- if (this.buildData?.runtimeAPIVersion !== 2) {
75
- return
115
+ async isScheduled() {
116
+ // @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
117
+ await this.buildQueue;
118
+ // @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
119
+ return Boolean(this.schedule);
76
120
  }
77
-
78
- const extension = this.buildData?.mainFile ? extname(this.buildData.mainFile) : undefined
79
- const moduleFormat = this.buildData?.outputModuleFormat
80
-
81
- if (moduleFormat === 'esm') {
82
- return
121
+ isSupported() {
122
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
123
+ return !(this.buildData?.runtimeAPIVersion === 2 && semver.lt(nodeVersion, V2_MIN_NODE_VERSION));
83
124
  }
84
-
85
- if (extension === '.ts') {
86
- return '.mts'
125
+ isTypeScript() {
126
+ if (this.filename === null) {
127
+ return false;
128
+ }
129
+ return TYPESCRIPT_EXTENSIONS.has(extname(this.filename));
87
130
  }
88
-
89
- if (extension === '.js') {
90
- return '.mjs'
131
+ async getNextRun() {
132
+ if (!(await this.isScheduled())) {
133
+ return null;
134
+ }
135
+ // @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
136
+ return getNextRun(this.schedule);
91
137
  }
92
- }
93
-
94
- hasValidName() {
95
- // same as https://github.com/netlify/bitballoon/blob/fbd7881e6c8e8c48e7a0145da4ee26090c794108/app/models/deploy.rb#L482
96
- // eslint-disable-next-line unicorn/better-regex
97
- return /^[A-Za-z0-9_-]+$/.test(this.name)
98
- }
99
-
100
- async isScheduled() {
101
- await this.buildQueue
102
-
103
- return Boolean(this.schedule)
104
- }
105
-
106
- isSupported() {
107
- return !(this.buildData?.runtimeAPIVersion === 2 && semver.lt(nodeVersion, V2_MIN_NODE_VERSION))
108
- }
109
-
110
- isTypeScript() {
111
- if (this.filename === null) {
112
- return false
138
+ // The `build` method transforms source files into invocable functions. Its
139
+ // return value is an object with:
140
+ //
141
+ // - `srcFilesDiff`: Files that were added and removed since the last time
142
+ // the function was built.
143
+ // @ts-expect-error TS(7031) FIXME: Binding element 'cache' implicitly has an 'any' ty... Remove this comment to see the full error message
144
+ async build({ cache }) {
145
+ // @ts-expect-error TS(2339) FIXME: Property 'runtime' does not exist on type 'Netlify... Remove this comment to see the full error message
146
+ const buildFunction = await this.runtime.getBuildFunction({
147
+ // @ts-expect-error TS(2339) FIXME: Property 'config' does not exist on type 'NetlifyF... Remove this comment to see the full error message
148
+ config: this.config,
149
+ // @ts-expect-error TS(2339) FIXME: Property 'directory' does not exist on type 'Netli... Remove this comment to see the full error message
150
+ directory: this.directory,
151
+ // @ts-expect-error TS(2339) FIXME: Property 'errorExit' does not exist on type 'Netli... Remove this comment to see the full error message
152
+ errorExit: this.errorExit,
153
+ func: this,
154
+ // @ts-expect-error TS(2339) FIXME: Property 'projectRoot' does not exist on type 'Net... Remove this comment to see the full error message
155
+ projectRoot: this.projectRoot,
156
+ });
157
+ // @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
158
+ this.buildQueue = buildFunction({ cache });
159
+ try {
160
+ // @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
161
+ const { includedFiles = [], schedule, srcFiles, ...buildData } = await this.buildQueue;
162
+ const srcFilesSet = new Set(srcFiles);
163
+ const srcFilesDiff = this.getSrcFilesDiff(srcFilesSet);
164
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
165
+ this.buildData = buildData;
166
+ // @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
167
+ this.buildError = null;
168
+ // @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
169
+ this.srcFiles = srcFilesSet;
170
+ // @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
171
+ this.schedule = schedule || this.schedule;
172
+ if (!this.isSupported()) {
173
+ throw new Error(`Function requires Node.js version ${V2_MIN_NODE_VERSION} or above, but ${nodeVersion.slice(1)} is installed. Refer to https://ntl.fyi/functions-runtime for information on how to update.`);
174
+ }
175
+ return { includedFiles, srcFilesDiff };
176
+ }
177
+ catch (error) {
178
+ // @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
179
+ this.buildError = error;
180
+ return { error };
181
+ }
113
182
  }
114
-
115
- return TYPESCRIPT_EXTENSIONS.has(extname(this.filename))
116
- }
117
-
118
- async getNextRun() {
119
- if (!(await this.isScheduled())) {
120
- return null
183
+ async getBuildData() {
184
+ // @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
185
+ await this.buildQueue;
186
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
187
+ return this.buildData;
121
188
  }
122
-
123
- return getNextRun(this.schedule)
124
- }
125
-
126
- // The `build` method transforms source files into invocable functions. Its
127
- // return value is an object with:
128
- //
129
- // - `srcFilesDiff`: Files that were added and removed since the last time
130
- // the function was built.
131
- async build({ cache }) {
132
- const buildFunction = await this.runtime.getBuildFunction({
133
- config: this.config,
134
- directory: this.directory,
135
- errorExit: this.errorExit,
136
- func: this,
137
- projectRoot: this.projectRoot,
138
- })
139
-
140
- this.buildQueue = buildFunction({ cache })
141
-
142
- try {
143
- const { includedFiles = [], schedule, srcFiles, ...buildData } = await this.buildQueue
144
- const srcFilesSet = new Set(srcFiles)
145
- const srcFilesDiff = this.getSrcFilesDiff(srcFilesSet)
146
-
147
- this.buildData = buildData
148
- this.buildError = null
149
- this.srcFiles = srcFilesSet
150
- this.schedule = schedule || this.schedule
151
-
152
- if (!this.isSupported()) {
153
- throw new Error(
154
- `Function requires Node.js version ${V2_MIN_NODE_VERSION} or above, but ${nodeVersion.slice(
155
- 1,
156
- )} is installed. Refer to https://ntl.fyi/functions-runtime for information on how to update.`,
157
- )
158
- }
159
-
160
- return { includedFiles, srcFilesDiff }
161
- } catch (error) {
162
- this.buildError = error
163
-
164
- return { error }
189
+ // Compares a new set of source files against a previous one, returning an
190
+ // object with two Sets, one with added and the other with deleted files.
191
+ // @ts-expect-error TS(7006) FIXME: Parameter 'newSrcFiles' implicitly has an 'any' ty... Remove this comment to see the full error message
192
+ getSrcFilesDiff(newSrcFiles) {
193
+ // @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
194
+ const added = difference(newSrcFiles, this.srcFiles);
195
+ // @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
196
+ const deleted = difference(this.srcFiles, newSrcFiles);
197
+ return {
198
+ added,
199
+ deleted,
200
+ };
165
201
  }
166
- }
167
-
168
- async getBuildData() {
169
- await this.buildQueue
170
-
171
- return this.buildData
172
- }
173
-
174
- // Compares a new set of source files against a previous one, returning an
175
- // object with two Sets, one with added and the other with deleted files.
176
- getSrcFilesDiff(newSrcFiles) {
177
- const added = difference(newSrcFiles, this.srcFiles)
178
- const deleted = difference(this.srcFiles, newSrcFiles)
179
-
180
- return {
181
- added,
182
- deleted,
202
+ // Invokes the function and returns its response object.
203
+ async invoke(event = {}, context = {}) {
204
+ // @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
205
+ await this.buildQueue;
206
+ // @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
207
+ if (this.buildError) {
208
+ // @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
209
+ return { result: null, error: { errorMessage: this.buildError.message } };
210
+ }
211
+ // @ts-expect-error TS(2339) FIXME: Property 'isBackground' does not exist on type 'Ne... Remove this comment to see the full error message
212
+ const timeout = this.isBackground ? this.timeoutBackground : this.timeoutSynchronous;
213
+ const environment = {};
214
+ // @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
215
+ if (this.blobsContext) {
216
+ const payload = JSON.stringify({
217
+ // @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
218
+ url: this.blobsContext.edgeURL,
219
+ // @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
220
+ token: this.blobsContext.token,
221
+ });
222
+ // @ts-expect-error TS(2339) FIXME: Property 'blobs' does not exist on type '{}'.
223
+ event.blobs = Buffer.from(payload).toString('base64');
224
+ }
225
+ try {
226
+ // @ts-expect-error TS(2339) FIXME: Property 'runtime' does not exist on type 'Netlify... Remove this comment to see the full error message
227
+ const result = await this.runtime.invokeFunction({
228
+ context,
229
+ environment,
230
+ event,
231
+ func: this,
232
+ timeout,
233
+ });
234
+ return { result, error: null };
235
+ }
236
+ catch (error) {
237
+ return { result: null, error };
238
+ }
183
239
  }
184
- }
185
-
186
- // Invokes the function and returns its response object.
187
- async invoke(event = {}, context = {}) {
188
- await this.buildQueue
189
-
190
- if (this.buildError) {
191
- return { result: null, error: { errorMessage: this.buildError.message } }
240
+ /**
241
+ * Matches all routes agains the incoming request. If a match is found, then the matched route is returned.
242
+ * @param {string} rawPath
243
+ * @param {string} method
244
+ * @returns matched route
245
+ */
246
+ // @ts-expect-error TS(7006) FIXME: Parameter 'rawPath' implicitly has an 'any' type.
247
+ async matchURLPath(rawPath, method) {
248
+ // @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
249
+ await this.buildQueue;
250
+ let path = rawPath !== '/' && rawPath.endsWith('/') ? rawPath.slice(0, -1) : rawPath;
251
+ path = path.toLowerCase();
252
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
253
+ const { routes = [] } = this.buildData;
254
+ // @ts-expect-error TS(7031) FIXME: Binding element 'expression' implicitly has an 'an... Remove this comment to see the full error message
255
+ return routes.find(({ expression, literal, methods }) => {
256
+ if (methods.length !== 0 && !methods.includes(method)) {
257
+ return false;
258
+ }
259
+ if (literal !== undefined) {
260
+ return path === literal;
261
+ }
262
+ if (expression !== undefined) {
263
+ const regex = new RegExp(expression);
264
+ return regex.test(path);
265
+ }
266
+ return false;
267
+ });
192
268
  }
193
-
194
- const timeout = this.isBackground ? this.timeoutBackground : this.timeoutSynchronous
195
- const environment = {}
196
-
197
- if (this.blobsContext) {
198
- const payload = JSON.stringify({
199
- url: this.blobsContext.edgeURL,
200
- token: this.blobsContext.token,
201
- })
202
-
203
- event.blobs = Buffer.from(payload).toString('base64')
269
+ get runtimeAPIVersion() {
270
+ // @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
271
+ return this.buildData?.runtimeAPIVersion ?? 1;
204
272
  }
205
-
206
- try {
207
- const result = await this.runtime.invokeFunction({
208
- context,
209
- environment,
210
- event,
211
- func: this,
212
- timeout,
213
- })
214
- return { result, error: null }
215
- } catch (error) {
216
- return { result: null, error }
273
+ get url() {
274
+ // This line fixes the issue here https://github.com/netlify/cli/issues/4116
275
+ // Not sure why `settings.port` was used here nor does a valid reference exist.
276
+ // However, it remains here to serve whatever purpose for which it was added.
277
+ // @ts-expect-error TS(2339) FIXME: Property 'settings' does not exist on type 'Netlif... Remove this comment to see the full error message
278
+ const port = this.settings.port || this.settings.functionsPort;
279
+ // @ts-expect-error TS(2339) FIXME: Property 'settings' does not exist on type 'Netlif... Remove this comment to see the full error message
280
+ const protocol = this.settings.https ? 'https' : 'http';
281
+ // @ts-expect-error TS(2339) FIXME: Property 'name' does not exist on type 'NetlifyFun... Remove this comment to see the full error message
282
+ const url = new URL(`/.netlify/functions/${this.name}`, `${protocol}://localhost:${port}`);
283
+ return url.href;
217
284
  }
218
- }
219
-
220
- /**
221
- * Matches all routes agains the incoming request. If a match is found, then the matched route is returned.
222
- * @param {string} rawPath
223
- * @param {string} method
224
- * @returns matched route
225
- */
226
- async matchURLPath(rawPath, method) {
227
- await this.buildQueue
228
-
229
- let path = rawPath !== '/' && rawPath.endsWith('/') ? rawPath.slice(0, -1) : rawPath
230
- path = path.toLowerCase()
231
- const { routes = [] } = this.buildData
232
- return routes.find(({ expression, literal, methods }) => {
233
- if (methods.length !== 0 && !methods.includes(method)) {
234
- return false
235
- }
236
-
237
- if (literal !== undefined) {
238
- return path === literal
239
- }
240
-
241
- if (expression !== undefined) {
242
- const regex = new RegExp(expression)
243
-
244
- return regex.test(path)
245
- }
246
-
247
- return false
248
- })
249
- }
250
-
251
- get runtimeAPIVersion() {
252
- return this.buildData?.runtimeAPIVersion ?? 1
253
- }
254
-
255
- get url() {
256
- // This line fixes the issue here https://github.com/netlify/cli/issues/4116
257
- // Not sure why `settings.port` was used here nor does a valid reference exist.
258
- // However, it remains here to serve whatever purpose for which it was added.
259
- const port = this.settings.port || this.settings.functionsPort
260
- const protocol = this.settings.https ? 'https' : 'http'
261
- const url = new URL(`/.netlify/functions/${this.name}`, `${protocol}://localhost:${port}`)
262
-
263
- return url.href
264
- }
265
285
  }