netlify-cli 17.3.2 → 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 +2 -138
  2. package/npm-shrinkwrap.json +76 -76
  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 -99
  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,7 +1,5 @@
1
- import { parseAllHeaders } from 'netlify-headers-parser'
2
-
3
- import { NETLIFYDEVERR, log } from './command-helpers.mjs'
4
-
1
+ import { parseAllHeaders } from 'netlify-headers-parser';
2
+ import { NETLIFYDEVERR, log } from './command-helpers.mjs';
5
3
  /**
6
4
  * Get the matching headers for `path` given a set of `rules`.
7
5
  *
@@ -13,39 +11,39 @@ import { NETLIFYDEVERR, log } from './command-helpers.mjs'
13
11
  *
14
12
  * @returns {Object<string,string[]>}
15
13
  */
14
+ // @ts-expect-error TS(7006) FIXME: Parameter 'headers' implicitly has an 'any' type.
16
15
  export const headersForPath = function (headers, path) {
17
- const matchingHeaders = headers.filter(({ forRegExp }) => forRegExp.test(path)).map(getHeaderValues)
18
- const headersRules = Object.assign({}, ...matchingHeaders)
19
- return headersRules
20
- }
21
-
16
+ // @ts-expect-error TS(7031) FIXME: Binding element 'forRegExp' implicitly has an 'any... Remove this comment to see the full error message
17
+ const matchingHeaders = headers.filter(({ forRegExp }) => forRegExp.test(path)).map(getHeaderValues);
18
+ const headersRules = Object.assign({}, ...matchingHeaders);
19
+ return headersRules;
20
+ };
21
+ // @ts-expect-error TS(7031) FIXME: Binding element 'values' implicitly has an 'any' t... Remove this comment to see the full error message
22
22
  const getHeaderValues = function ({ values }) {
23
- return values
24
- }
25
-
23
+ return values;
24
+ };
25
+ // @ts-expect-error TS(7031) FIXME: Binding element 'configPath' implicitly has an 'an... Remove this comment to see the full error message
26
26
  export const parseHeaders = async function ({ configPath, headersFiles }) {
27
- const { errors, headers } = await parseAllHeaders({
28
- headersFiles,
29
- netlifyConfigPath: configPath,
30
- minimal: false,
31
- })
32
- handleHeadersErrors(errors)
33
- return headers
34
- }
35
-
27
+ const { errors, headers } = await parseAllHeaders({
28
+ headersFiles,
29
+ netlifyConfigPath: configPath,
30
+ minimal: false,
31
+ });
32
+ handleHeadersErrors(errors);
33
+ return headers;
34
+ };
35
+ // @ts-expect-error TS(7006) FIXME: Parameter 'errors' implicitly has an 'any' type.
36
36
  const handleHeadersErrors = function (errors) {
37
- if (errors.length === 0) {
38
- return
39
- }
40
-
41
- const errorMessage = errors.map(getErrorMessage).join('\n\n')
42
- log(NETLIFYDEVERR, `Headers syntax errors:\n${errorMessage}`)
43
- }
44
-
37
+ if (errors.length === 0) {
38
+ return;
39
+ }
40
+ const errorMessage = errors.map(getErrorMessage).join('\n\n');
41
+ log(NETLIFYDEVERR, `Headers syntax errors:\n${errorMessage}`);
42
+ };
43
+ // @ts-expect-error TS(7031) FIXME: Binding element 'message' implicitly has an 'any' ... Remove this comment to see the full error message
45
44
  const getErrorMessage = function ({ message }) {
46
- return message
47
- }
48
-
49
- export const NFFunctionName = 'x-nf-function-name'
50
- export const NFFunctionRoute = 'x-nf-function-route'
51
- export const NFRequestID = 'x-nf-request-id'
45
+ return message;
46
+ };
47
+ export const NFFunctionName = 'x-nf-function-name';
48
+ export const NFFunctionRoute = 'x-nf-function-route';
49
+ export const NFRequestID = 'x-nf-request-id';
@@ -1,29 +1,33 @@
1
- import { error, warn } from '../command-helpers.mjs'
1
+ import { error, warn } from '../command-helpers.mjs';
2
2
  /**
3
3
  * A preAction hook that errors out if siteInfo is an empty object
4
4
  * @param {*} command
5
5
  */
6
+ // @ts-expect-error TS(7006) FIXME: Parameter 'command' implicitly has an 'any' type.
6
7
  const requiresSiteInfo = async (command) => {
7
- const { api, site } = command.netlify
8
- const siteId = site.id
9
- if (!siteId) {
10
- warn('Did you run `netlify link` yet?')
11
- return error(`You don't appear to be in a folder that is linked to a site`)
12
- }
13
- try {
14
- await api.getSite({ siteId })
15
- } catch (error_) {
16
- // unauthorized
17
- if (error_.status === 401) {
18
- warn(`Log in with a different account or re-link to a site you have permission for`)
19
- return error(`Not authorized to view the currently linked site (${siteId})`)
8
+ const { api, site } = command.netlify;
9
+ const siteId = site.id;
10
+ if (!siteId) {
11
+ warn('Did you run `netlify link` yet?');
12
+ return error(`You don't appear to be in a folder that is linked to a site`);
20
13
  }
21
- // missing
22
- if (error_.status === 404) {
23
- return error(`The site this folder is linked to can't be found`)
14
+ try {
15
+ await api.getSite({ siteId });
24
16
  }
25
- return error(error_)
26
- }
27
- }
28
-
29
- export default requiresSiteInfo
17
+ catch (error_) {
18
+ // unauthorized
19
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
20
+ if (error_.status === 401) {
21
+ warn(`Log in with a different account or re-link to a site you have permission for`);
22
+ return error(`Not authorized to view the currently linked site (${siteId})`);
23
+ }
24
+ // missing
25
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
26
+ if (error_.status === 404) {
27
+ return error(`The site this folder is linked to can't be found`);
28
+ }
29
+ // @ts-expect-error TS(2345) FIXME: Argument of type 'unknown' is not assignable to pa... Remove this comment to see the full error message
30
+ return error(error_);
31
+ }
32
+ };
33
+ export default requiresSiteInfo;
@@ -1,11 +1,7 @@
1
- // @ts-check
2
- import { Octokit } from '@octokit/rest'
3
-
4
- import { chalk, error as failAndExit, log } from '../command-helpers.mjs'
5
- import { getGitHubToken as ghauth } from '../gh-auth.mjs'
6
-
7
- import { createDeployKey, formatErrorMessage, getBuildSettings, saveNetlifyToml, setupSite } from './utils.mjs'
8
-
1
+ import { Octokit } from '@octokit/rest';
2
+ import { chalk, error as failAndExit, log } from '../command-helpers.mjs';
3
+ import { getGitHubToken as ghauth } from '../gh-auth.mjs';
4
+ import { createDeployKey, formatErrorMessage, getBuildSettings, saveNetlifyToml, setupSite } from './utils.mjs';
9
5
  /**
10
6
  * @typedef Token
11
7
  * @type {object}
@@ -13,189 +9,192 @@ import { createDeployKey, formatErrorMessage, getBuildSettings, saveNetlifyToml,
13
9
  * @property {string} token - The actual token value.
14
10
  * @property {string} provider - The Provider where the token is associated with ('github').
15
11
  */
16
-
12
+ // @ts-expect-error TS(7031) FIXME: Binding element 'repoName' implicitly has an 'any'... Remove this comment to see the full error message
17
13
  const formatRepoAndOwner = ({ repoName, repoOwner }) => ({
18
- name: chalk.magenta(repoName),
19
- owner: chalk.magenta(repoOwner),
20
- })
21
-
22
- const PAGE_SIZE = 100
23
-
14
+ name: chalk.magenta(repoName),
15
+ owner: chalk.magenta(repoOwner),
16
+ });
17
+ const PAGE_SIZE = 100;
24
18
  /**
25
19
  * Get a valid GitHub token
26
20
  * @returns {Promise<string>}
27
21
  */
22
+ // @ts-expect-error TS(7031) FIXME: Binding element 'globalConfig' implicitly has an '... Remove this comment to see the full error message
28
23
  export const getGitHubToken = async ({ globalConfig }) => {
29
- const userId = globalConfig.get('userId')
30
-
31
- /** @type {Token} */
32
- const githubToken = globalConfig.get(`users.${userId}.auth.github`)
33
-
34
- if (githubToken && githubToken.user && githubToken.token) {
35
- try {
36
- const octokit = getGitHubClient(githubToken.token)
37
- const { status } = await octokit.rest.users.getAuthenticated()
38
- if (status < 400) {
39
- return githubToken.token
40
- }
41
- } catch {
42
- log(chalk.yellow('Token is expired or invalid!'))
43
- log('Generating a new Github token...')
24
+ const userId = globalConfig.get('userId');
25
+ /** @type {Token} */
26
+ const githubToken = globalConfig.get(`users.${userId}.auth.github`);
27
+ if (githubToken && githubToken.user && githubToken.token) {
28
+ try {
29
+ const octokit = getGitHubClient(githubToken.token);
30
+ const { status } = await octokit.rest.users.getAuthenticated();
31
+ if (status < 400) {
32
+ return githubToken.token;
33
+ }
34
+ }
35
+ catch {
36
+ log(chalk.yellow('Token is expired or invalid!'));
37
+ log('Generating a new Github token...');
38
+ }
44
39
  }
45
- }
46
-
47
- const newToken = await ghauth()
48
- globalConfig.set(`users.${userId}.auth.github`, newToken)
49
- return newToken.token
50
- }
51
-
40
+ const newToken = await ghauth();
41
+ globalConfig.set(`users.${userId}.auth.github`, newToken);
42
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
43
+ return newToken.token;
44
+ };
52
45
  /**
53
46
  * Retrieves the GitHub octokit client
54
47
  * @param {string} token
55
48
  * @returns {Octokit}
56
49
  */
57
- const getGitHubClient = (token) =>
58
- new Octokit({
50
+ // @ts-expect-error TS(7006) FIXME: Parameter 'token' implicitly has an 'any' type.
51
+ const getGitHubClient = (token) => new Octokit({
59
52
  auth: `token ${token}`,
60
- })
61
-
53
+ });
54
+ // @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
62
55
  const addDeployKey = async ({ api, octokit, repoName, repoOwner }) => {
63
- log('Adding deploy key to repository...')
64
- const key = await createDeployKey({ api })
65
- try {
66
- await octokit.repos.createDeployKey({
67
- title: 'Netlify Deploy Key',
68
- key: key.public_key,
69
- owner: repoOwner,
70
- repo: repoName,
71
- read_only: true,
72
- })
73
- log('Deploy key added!')
74
- return key
75
- } catch (error) {
76
- let message = formatErrorMessage({ message: 'Failed adding GitHub deploy key', error })
77
- if (error.status === 404) {
78
- const { name, owner } = formatRepoAndOwner({ repoName, repoOwner })
79
- message = `${message}. Does the repository ${name} exist and do ${owner} has the correct permissions to set up deploy keys?`
56
+ log('Adding deploy key to repository...');
57
+ const key = await createDeployKey({ api });
58
+ try {
59
+ await octokit.repos.createDeployKey({
60
+ title: 'Netlify Deploy Key',
61
+ key: key.public_key,
62
+ owner: repoOwner,
63
+ repo: repoName,
64
+ read_only: true,
65
+ });
66
+ log('Deploy key added!');
67
+ return key;
68
+ }
69
+ catch (error) {
70
+ let message = formatErrorMessage({ message: 'Failed adding GitHub deploy key', error });
71
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
72
+ if (error.status === 404) {
73
+ const { name, owner } = formatRepoAndOwner({ repoName, repoOwner });
74
+ message = `${message}. Does the repository ${name} exist and do ${owner} has the correct permissions to set up deploy keys?`;
75
+ }
76
+ failAndExit(message);
80
77
  }
81
- failAndExit(message)
82
- }
83
- }
84
-
78
+ };
79
+ // @ts-expect-error TS(7031) FIXME: Binding element 'octokit' implicitly has an 'any' ... Remove this comment to see the full error message
85
80
  const getGitHubRepo = async ({ octokit, repoName, repoOwner }) => {
86
- try {
87
- const { data } = await octokit.repos.get({
88
- owner: repoOwner,
89
- repo: repoName,
90
- })
91
- return data
92
- } catch (error) {
93
- let message = formatErrorMessage({ message: 'Failed retrieving GitHub repository information', error })
94
- if (error.status === 404) {
95
- const { name, owner } = formatRepoAndOwner({ repoName, repoOwner })
96
- message = `${message}. Does the repository ${name} exist and accessible by ${owner}`
81
+ try {
82
+ const { data } = await octokit.repos.get({
83
+ owner: repoOwner,
84
+ repo: repoName,
85
+ });
86
+ return data;
87
+ }
88
+ catch (error) {
89
+ let message = formatErrorMessage({ message: 'Failed retrieving GitHub repository information', error });
90
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
91
+ if (error.status === 404) {
92
+ const { name, owner } = formatRepoAndOwner({ repoName, repoOwner });
93
+ message = `${message}. Does the repository ${name} exist and accessible by ${owner}`;
94
+ }
95
+ failAndExit(message);
97
96
  }
98
- failAndExit(message)
99
- }
100
- }
101
-
97
+ };
98
+ // @ts-expect-error TS(7031) FIXME: Binding element 'deployHook' implicitly has an 'an... Remove this comment to see the full error message
102
99
  const hookExists = async ({ deployHook, octokit, repoName, repoOwner }) => {
103
- try {
104
- const { data: hooks } = await octokit.repos.listWebhooks({
105
- owner: repoOwner,
106
- repo: repoName,
107
- per_page: PAGE_SIZE,
108
- })
109
- const exists = hooks.some((hook) => hook.config.url === deployHook)
110
- return exists
111
- } catch {
112
- // we don't need to fail if listHooks errors out
113
- return false
114
- }
115
- }
116
-
117
- const addDeployHook = async ({ deployHook, octokit, repoName, repoOwner }) => {
118
- const exists = await hookExists({ deployHook, octokit, repoOwner, repoName })
119
- if (!exists) {
120
100
  try {
121
- await octokit.repos.createWebhook({
122
- owner: repoOwner,
123
- repo: repoName,
124
- name: 'web',
125
- config: {
126
- url: deployHook,
127
- content_type: 'json',
128
- },
129
- events: ['push', 'pull_request', 'delete'],
130
- active: true,
131
- })
132
- } catch (error) {
133
- // Ignore exists error if the list doesn't return all installed hooks
134
- if (!error.message.includes('Hook already exists on this repository')) {
135
- let message = formatErrorMessage({ message: 'Failed creating repo hook', error })
136
- if (error.status === 404) {
137
- const { name, owner } = formatRepoAndOwner({ repoName, repoOwner })
138
- message = `${message}. Does the repository ${name} and do ${owner} has the correct permissions to set up hooks`
101
+ const { data: hooks } = await octokit.repos.listWebhooks({
102
+ owner: repoOwner,
103
+ repo: repoName,
104
+ per_page: PAGE_SIZE,
105
+ });
106
+ // @ts-expect-error TS(7006) FIXME: Parameter 'hook' implicitly has an 'any' type.
107
+ const exists = hooks.some((hook) => hook.config.url === deployHook);
108
+ return exists;
109
+ }
110
+ catch {
111
+ // we don't need to fail if listHooks errors out
112
+ return false;
113
+ }
114
+ };
115
+ // @ts-expect-error TS(7031) FIXME: Binding element 'deployHook' implicitly has an 'an... Remove this comment to see the full error message
116
+ const addDeployHook = async ({ deployHook, octokit, repoName, repoOwner }) => {
117
+ const exists = await hookExists({ deployHook, octokit, repoOwner, repoName });
118
+ if (!exists) {
119
+ try {
120
+ await octokit.repos.createWebhook({
121
+ owner: repoOwner,
122
+ repo: repoName,
123
+ name: 'web',
124
+ config: {
125
+ url: deployHook,
126
+ content_type: 'json',
127
+ },
128
+ events: ['push', 'pull_request', 'delete'],
129
+ active: true,
130
+ });
131
+ }
132
+ catch (error) {
133
+ // Ignore exists error if the list doesn't return all installed hooks
134
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
135
+ if (!error.message.includes('Hook already exists on this repository')) {
136
+ let message = formatErrorMessage({ message: 'Failed creating repo hook', error });
137
+ // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
138
+ if (error.status === 404) {
139
+ const { name, owner } = formatRepoAndOwner({ repoName, repoOwner });
140
+ message = `${message}. Does the repository ${name} and do ${owner} has the correct permissions to set up hooks`;
141
+ }
142
+ failAndExit(message);
143
+ }
139
144
  }
140
- failAndExit(message)
141
- }
142
145
  }
143
- }
144
- }
145
-
146
- const GITHUB_HOOK_EVENTS = ['deploy_created', 'deploy_failed', 'deploy_building']
147
- const GITHUB_HOOK_TYPE = 'github_commit_status'
148
-
146
+ };
147
+ const GITHUB_HOOK_EVENTS = ['deploy_created', 'deploy_failed', 'deploy_building'];
148
+ const GITHUB_HOOK_TYPE = 'github_commit_status';
149
+ // @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
149
150
  const upsertHook = async ({ api, event, ntlHooks, siteId, token }) => {
150
- const ntlHook = ntlHooks.find((hook) => hook.type === GITHUB_HOOK_TYPE && hook.event === event)
151
-
152
- if (!ntlHook || ntlHook.disabled) {
153
- return await api.createHookBySiteId({
154
- site_id: siteId,
155
- body: {
156
- type: GITHUB_HOOK_TYPE,
157
- event,
158
- data: {
159
- access_token: token,
151
+ // @ts-expect-error TS(7006) FIXME: Parameter 'hook' implicitly has an 'any' type.
152
+ const ntlHook = ntlHooks.find((hook) => hook.type === GITHUB_HOOK_TYPE && hook.event === event);
153
+ if (!ntlHook || ntlHook.disabled) {
154
+ return await api.createHookBySiteId({
155
+ site_id: siteId,
156
+ body: {
157
+ type: GITHUB_HOOK_TYPE,
158
+ event,
159
+ data: {
160
+ access_token: token,
161
+ },
162
+ },
163
+ });
164
+ }
165
+ return await api.updateHook({
166
+ hook_id: ntlHook.id,
167
+ body: {
168
+ data: {
169
+ access_token: token,
170
+ },
160
171
  },
161
- },
162
- })
163
- }
164
-
165
- return await api.updateHook({
166
- hook_id: ntlHook.id,
167
- body: {
168
- data: {
169
- access_token: token,
170
- },
171
- },
172
- })
173
- }
174
-
172
+ });
173
+ };
174
+ // @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
175
175
  const addNotificationHooks = async ({ api, siteId, token }) => {
176
- log(`Creating Netlify GitHub Notification Hooks...`)
177
-
178
- let ntlHooks
179
- try {
180
- ntlHooks = await api.listHooksBySiteId({ siteId })
181
- } catch (error) {
182
- const message = formatErrorMessage({ message: 'Failed retrieving Netlify hooks', error })
183
- failAndExit(message)
184
- }
185
- await Promise.all(
186
- GITHUB_HOOK_EVENTS.map(async (event) => {
187
- try {
188
- await upsertHook({ ntlHooks, event, api, siteId, token })
189
- } catch (error) {
190
- const message = formatErrorMessage({ message: `Failed settings Netlify hook ${chalk.magenta(event)}`, error })
191
- failAndExit(message)
192
- }
193
- }),
194
- )
195
-
196
- log(`Netlify Notification Hooks configured!`)
197
- }
198
-
176
+ log(`Creating Netlify GitHub Notification Hooks...`);
177
+ // @ts-expect-error TS(7034) FIXME: Variable 'ntlHooks' implicitly has type 'any' in s... Remove this comment to see the full error message
178
+ let ntlHooks;
179
+ try {
180
+ ntlHooks = await api.listHooksBySiteId({ siteId });
181
+ }
182
+ catch (error) {
183
+ const message = formatErrorMessage({ message: 'Failed retrieving Netlify hooks', error });
184
+ failAndExit(message);
185
+ }
186
+ await Promise.all(GITHUB_HOOK_EVENTS.map(async (event) => {
187
+ try {
188
+ // @ts-expect-error TS(7005) FIXME: Variable 'ntlHooks' implicitly has an 'any' type.
189
+ await upsertHook({ ntlHooks, event, api, siteId, token });
190
+ }
191
+ catch (error) {
192
+ const message = formatErrorMessage({ message: `Failed settings Netlify hook ${chalk.magenta(event)}`, error });
193
+ failAndExit(message);
194
+ }
195
+ }));
196
+ log(`Netlify Notification Hooks configured!`);
197
+ };
199
198
  /**
200
199
  * @param {object} config
201
200
  * @param {import('../../commands/base-command.mjs').default} config.command
@@ -203,56 +202,45 @@ const addNotificationHooks = async ({ api, siteId, token }) => {
203
202
  * @param {string} config.repoOwner
204
203
  * @param {string} config.siteId
205
204
  */
205
+ // @ts-expect-error TS(7031) FIXME: Binding element 'command' implicitly has an 'any' ... Remove this comment to see the full error message
206
206
  export const configGithub = async ({ command, repoName, repoOwner, siteId }) => {
207
- const { netlify } = command
208
- const {
209
- api,
210
- cachedConfig: { configPath },
211
- config,
212
- globalConfig,
213
- repositoryRoot,
214
- site: { root: siteRoot },
215
- } = netlify
216
-
217
- const token = await getGitHubToken({ globalConfig })
218
-
219
- const { baseDir, buildCmd, buildDir, functionsDir, pluginsToInstall } = await getBuildSettings({
220
- repositoryRoot,
221
- siteRoot,
222
- config,
223
- command,
224
- })
225
- await saveNetlifyToml({ repositoryRoot, config, configPath, baseDir, buildCmd, buildDir, functionsDir })
226
-
227
- log()
228
-
229
- const octokit = getGitHubClient(token)
230
- const [deployKey, githubRepo] = await Promise.all([
231
- addDeployKey({ api, octokit, repoOwner, repoName }),
232
- getGitHubRepo({ octokit, repoOwner, repoName }),
233
- ])
234
-
235
- const repo = {
236
- id: githubRepo.id,
237
- provider: 'github',
238
- repo_path: githubRepo.full_name,
239
- repo_branch: githubRepo.default_branch,
240
- allowed_branches: [githubRepo.default_branch],
241
- deploy_key_id: deployKey.id,
242
- base: baseDir,
243
- dir: buildDir,
244
- functions_dir: functionsDir,
245
- ...(buildCmd && { cmd: buildCmd }),
246
- }
247
-
248
- const updatedSite = await setupSite({
249
- api,
250
- siteId,
251
- repo,
252
- configPlugins: config.plugins,
253
- pluginsToInstall,
254
- })
255
- await addDeployHook({ deployHook: updatedSite.deploy_hook, octokit, repoOwner, repoName })
256
- log()
257
- await addNotificationHooks({ siteId, api, token })
258
- }
207
+ const { netlify } = command;
208
+ const { api, cachedConfig: { configPath }, config, globalConfig, repositoryRoot, site: { root: siteRoot }, } = netlify;
209
+ const token = await getGitHubToken({ globalConfig });
210
+ const { baseDir, buildCmd, buildDir, functionsDir, pluginsToInstall } = await getBuildSettings({
211
+ // @ts-expect-error TS(2345) FIXME: Argument of type '{ repositoryRoot: any; siteRoot:... Remove this comment to see the full error message
212
+ repositoryRoot,
213
+ siteRoot,
214
+ config,
215
+ command,
216
+ });
217
+ await saveNetlifyToml({ repositoryRoot, config, configPath, baseDir, buildCmd, buildDir, functionsDir });
218
+ log();
219
+ const octokit = getGitHubClient(token);
220
+ const [deployKey, githubRepo] = await Promise.all([
221
+ addDeployKey({ api, octokit, repoOwner, repoName }),
222
+ getGitHubRepo({ octokit, repoOwner, repoName }),
223
+ ]);
224
+ const repo = {
225
+ id: githubRepo.id,
226
+ provider: 'github',
227
+ repo_path: githubRepo.full_name,
228
+ repo_branch: githubRepo.default_branch,
229
+ allowed_branches: [githubRepo.default_branch],
230
+ deploy_key_id: deployKey.id,
231
+ base: baseDir,
232
+ dir: buildDir,
233
+ functions_dir: functionsDir,
234
+ ...(buildCmd && { cmd: buildCmd }),
235
+ };
236
+ const updatedSite = await setupSite({
237
+ api,
238
+ siteId,
239
+ repo,
240
+ configPlugins: config.plugins,
241
+ pluginsToInstall,
242
+ });
243
+ await addDeployHook({ deployHook: updatedSite.deploy_hook, octokit, repoOwner, repoName });
244
+ log();
245
+ await addNotificationHooks({ siteId, api, token });
246
+ };