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,61 +1,62 @@
1
- // @ts-check
2
- import url from 'url'
3
-
4
- import fetch from 'node-fetch'
5
-
1
+ import url from 'url';
2
+ // @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'node... Remove this comment to see the full error message
3
+ import fetch from 'node-fetch';
6
4
  // supported repo host types
7
- const GITHUB = 'GitHub'
8
-
5
+ const GITHUB = 'GitHub';
9
6
  /**
10
7
  * @param {string} _url
11
8
  * Takes a url like https://github.com/netlify-labs/all-the-functions/tree/master/functions/9-using-middleware
12
9
  * and returns https://api.github.com/repos/netlify-labs/all-the-functions/contents/functions/9-using-middleware
13
10
  */
11
+ // @ts-expect-error TS(7006) FIXME: Parameter '_url' implicitly has an 'any' type.
14
12
  export const readRepoURL = async function (_url) {
15
- // TODO: use `url.URL()` instead
16
- // eslint-disable-next-line n/no-deprecated-api
17
- const URL = url.parse(_url)
18
- const repoHost = validateRepoURL(_url)
19
- if (repoHost !== GITHUB) throw new Error('only GitHub repos are supported for now')
20
- const [ownerAndRepo, contentsPath] = parseRepoURL(repoHost, URL)
21
- const folderContents = await getRepoURLContents(repoHost, ownerAndRepo, contentsPath)
22
- return folderContents
23
- }
24
-
13
+ // TODO: use `url.URL()` instead
14
+ // eslint-disable-next-line n/no-deprecated-api
15
+ const URL = url.parse(_url);
16
+ const repoHost = validateRepoURL(_url);
17
+ if (repoHost !== GITHUB)
18
+ throw new Error('only GitHub repos are supported for now');
19
+ const [ownerAndRepo, contentsPath] = parseRepoURL(repoHost, URL);
20
+ const folderContents = await getRepoURLContents(repoHost, ownerAndRepo, contentsPath);
21
+ return folderContents;
22
+ };
23
+ // @ts-expect-error TS(7006) FIXME: Parameter 'repoHost' implicitly has an 'any' type.
25
24
  const getRepoURLContents = async function (repoHost, ownerAndRepo, contentsPath) {
26
- // naive joining strategy for now
27
- if (repoHost === GITHUB) {
28
- // https://developer.github.com/v3/repos/contents/#get-contents
29
- const APIURL = `https://api.github.com/repos/${ownerAndRepo}/contents/${contentsPath}`
30
- try {
31
- const res = await fetch(APIURL)
32
- return await res.json()
33
- } catch (error) {
34
- console.error(`Error occurred while fetching ${APIURL}`, error)
25
+ // naive joining strategy for now
26
+ if (repoHost === GITHUB) {
27
+ // https://developer.github.com/v3/repos/contents/#get-contents
28
+ const APIURL = `https://api.github.com/repos/${ownerAndRepo}/contents/${contentsPath}`;
29
+ try {
30
+ const res = await fetch(APIURL);
31
+ return await res.json();
32
+ }
33
+ catch (error) {
34
+ console.error(`Error occurred while fetching ${APIURL}`, error);
35
+ }
35
36
  }
36
- }
37
- throw new Error('unsupported host ', repoHost)
38
- }
39
-
37
+ throw new Error('unsupported host ', repoHost);
38
+ };
40
39
  /**
41
40
  * @param {string} _url
42
41
  */
42
+ // @ts-expect-error TS(7006) FIXME: Parameter '_url' implicitly has an 'any' type.
43
43
  export const validateRepoURL = function (_url) {
44
- // TODO: use `url.URL()` instead
45
- // eslint-disable-next-line n/no-deprecated-api
46
- const URL = url.parse(_url)
47
- if (URL.host !== 'github.com') return null
48
- // other validation logic here
49
- return GITHUB
50
- }
51
-
44
+ // TODO: use `url.URL()` instead
45
+ // eslint-disable-next-line n/no-deprecated-api
46
+ const URL = url.parse(_url);
47
+ if (URL.host !== 'github.com')
48
+ return null;
49
+ // other validation logic here
50
+ return GITHUB;
51
+ };
52
+ // @ts-expect-error TS(7006) FIXME: Parameter 'repoHost' implicitly has an 'any' type.
52
53
  export const parseRepoURL = function (repoHost, URL) {
53
- // naive splitting strategy for now
54
- if (repoHost === GITHUB) {
55
- // https://developer.github.com/v3/repos/contents/#get-contents
56
- // what if it's not master? note that our contents retrieval may assume it is master
57
- const [ownerAndRepo, contentsPath] = URL.path.slice(1).split('/tree/master/')
58
- return [ownerAndRepo, contentsPath]
59
- }
60
- throw new Error(`Unsupported host ${repoHost}`)
61
- }
54
+ // naive splitting strategy for now
55
+ if (repoHost === GITHUB) {
56
+ // https://developer.github.com/v3/repos/contents/#get-contents
57
+ // what if it's not master? note that our contents retrieval may assume it is master
58
+ const [ownerAndRepo, contentsPath] = URL.path.slice(1).split('/tree/master/');
59
+ return [ownerAndRepo, contentsPath];
60
+ }
61
+ throw new Error(`Unsupported host ${repoHost}`);
62
+ };
@@ -1,58 +1,58 @@
1
- // @ts-check
2
- import { parseAllRedirects } from 'netlify-redirect-parser'
3
-
4
- import { NETLIFYDEVERR, log } from './command-helpers.mjs'
5
-
1
+ import { parseAllRedirects } from 'netlify-redirect-parser';
2
+ import { NETLIFYDEVERR, log } from './command-helpers.mjs';
6
3
  // Parse, normalize and validate all redirects from `_redirects` files
7
4
  // and `netlify.toml`
5
+ // @ts-expect-error TS(7031) FIXME: Binding element 'configPath' implicitly has an 'an... Remove this comment to see the full error message
8
6
  export const parseRedirects = async function ({ configPath, redirectsFiles }) {
9
- const { errors, redirects } = await parseAllRedirects({
10
- redirectsFiles,
11
- netlifyConfigPath: configPath,
12
- minimal: false,
13
- })
14
- handleRedirectParsingErrors(errors)
15
- return redirects.map(normalizeRedirect)
16
- }
17
-
7
+ // @ts-expect-error TS(2345) FIXME: Argument of type '{ redirectsFiles: any; netlifyCo... Remove this comment to see the full error message
8
+ const { errors, redirects } = await parseAllRedirects({
9
+ redirectsFiles,
10
+ netlifyConfigPath: configPath,
11
+ minimal: false,
12
+ });
13
+ handleRedirectParsingErrors(errors);
14
+ // @ts-expect-error TS(2345) FIXME: Argument of type '({ conditions: { country, langua... Remove this comment to see the full error message
15
+ return redirects.map(normalizeRedirect);
16
+ };
17
+ // @ts-expect-error TS(7006) FIXME: Parameter 'errors' implicitly has an 'any' type.
18
18
  const handleRedirectParsingErrors = function (errors) {
19
- if (errors.length === 0) {
20
- return
21
- }
22
-
23
- const errorMessage = errors.map(getErrorMessage).join('\n\n')
24
- log(NETLIFYDEVERR, `Redirects syntax errors:\n${errorMessage}`)
25
- }
26
-
19
+ if (errors.length === 0) {
20
+ return;
21
+ }
22
+ const errorMessage = errors.map(getErrorMessage).join('\n\n');
23
+ log(NETLIFYDEVERR, `Redirects syntax errors:\n${errorMessage}`);
24
+ };
25
+ // @ts-expect-error TS(7031) FIXME: Binding element 'message' implicitly has an 'any' ... Remove this comment to see the full error message
27
26
  const getErrorMessage = function ({ message }) {
28
- return message
29
- }
30
-
27
+ return message;
28
+ };
31
29
  // `netlify-redirector` does not handle the same shape as the backend:
32
30
  // - `from` is called `origin`
33
31
  // - `query` is called `params`
34
32
  // - `conditions.role|country|language` are capitalized
35
- const normalizeRedirect = function ({
36
- conditions: { country, language, role, ...conditions },
37
- from,
38
- query,
39
- signed,
40
- ...redirect
41
- }) {
42
- return {
43
- ...redirect,
44
- origin: from,
45
- params: query,
46
- conditions: {
47
- ...conditions,
48
- ...(role && { Role: role }),
49
- ...(country && { Country: country }),
50
- ...(language && { Language: language }),
51
- },
52
- ...(signed && {
53
- sign: {
54
- jwt_secret: signed,
55
- },
56
- }),
57
- }
58
- }
33
+ const normalizeRedirect = function ({
34
+ // @ts-expect-error TS(7031) FIXME: Binding element 'country' implicitly has an 'any' ... Remove this comment to see the full error message
35
+ conditions: { country, language, role, ...conditions },
36
+ // @ts-expect-error TS(7031) FIXME: Binding element 'from' implicitly has an 'any' typ... Remove this comment to see the full error message
37
+ from,
38
+ // @ts-expect-error TS(7031) FIXME: Binding element 'query' implicitly has an 'any' ty... Remove this comment to see the full error message
39
+ query,
40
+ // @ts-expect-error TS(7031) FIXME: Binding element 'signed' implicitly has an 'any' t... Remove this comment to see the full error message
41
+ signed, ...redirect }) {
42
+ return {
43
+ ...redirect,
44
+ origin: from,
45
+ params: query,
46
+ conditions: {
47
+ ...conditions,
48
+ ...(role && { Role: role }),
49
+ ...(country && { Country: country }),
50
+ ...(language && { Language: language }),
51
+ },
52
+ ...(signed && {
53
+ sign: {
54
+ jwt_secret: signed,
55
+ },
56
+ }),
57
+ };
58
+ };
@@ -1,4 +1,2 @@
1
- // @ts-check
2
- import { ulid } from 'ulid'
3
-
4
- export const generateRequestID = () => ulid()
1
+ import { ulid } from 'ulid';
2
+ export const generateRequestID = () => ulid();
@@ -1,104 +1,100 @@
1
- // @ts-check
2
- import path from 'path'
3
-
4
- import chokidar from 'chokidar'
5
- import cookie from 'cookie'
6
- import redirector from 'netlify-redirector'
7
- import pFilter from 'p-filter'
8
-
9
- import { fileExistsAsync } from '../lib/fs.mjs'
10
-
11
- import { NETLIFYDEVLOG } from './command-helpers.mjs'
12
- import { parseRedirects } from './redirects.mjs'
13
-
14
- const watchers = []
15
-
1
+ import path from 'path';
2
+ import chokidar from 'chokidar';
3
+ // @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'cook... Remove this comment to see the full error message
4
+ import cookie from 'cookie';
5
+ // @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'netl... Remove this comment to see the full error message
6
+ import redirector from 'netlify-redirector';
7
+ import pFilter from 'p-filter';
8
+ import { fileExistsAsync } from '../lib/fs.mjs';
9
+ import { NETLIFYDEVLOG } from './command-helpers.mjs';
10
+ import { parseRedirects } from './redirects.mjs';
11
+ // @ts-expect-error TS(7034) FIXME: Variable 'watchers' implicitly has type 'any[]' in... Remove this comment to see the full error message
12
+ const watchers = [];
13
+ // @ts-expect-error TS(7006) FIXME: Parameter 'files' implicitly has an 'any' type.
16
14
  export const onChanges = function (files, listener) {
17
- files.forEach((file) => {
18
- const watcher = chokidar.watch(file)
19
- watcher.on('change', listener)
20
- watcher.on('unlink', listener)
21
- watchers.push(watcher)
22
- })
23
- }
24
-
15
+ // @ts-expect-error TS(7006) FIXME: Parameter 'file' implicitly has an 'any' type.
16
+ files.forEach((file) => {
17
+ const watcher = chokidar.watch(file);
18
+ watcher.on('change', listener);
19
+ watcher.on('unlink', listener);
20
+ watchers.push(watcher);
21
+ });
22
+ };
25
23
  export const getWatchers = function () {
26
- return watchers
27
- }
28
-
24
+ // @ts-expect-error TS(7005) FIXME: Variable 'watchers' implicitly has an 'any[]' type... Remove this comment to see the full error message
25
+ return watchers;
26
+ };
27
+ // @ts-expect-error TS(7006) FIXME: Parameter 'headers' implicitly has an 'any' type.
29
28
  export const getLanguage = function (headers) {
30
- if (headers['accept-language']) {
31
- return headers['accept-language'].split(',')[0].slice(0, 2)
32
- }
33
- return 'en'
34
- }
35
-
36
- export const createRewriter = async function ({
37
- configPath,
38
- distDir,
39
- geoCountry,
40
- jwtRoleClaim,
41
- jwtSecret,
42
- projectDir,
43
- }) {
44
- let matcher = null
45
- const redirectsFiles = [...new Set([path.resolve(distDir, '_redirects'), path.resolve(projectDir, '_redirects')])]
46
- let redirects = await parseRedirects({ redirectsFiles, configPath })
47
-
48
- const watchedRedirectFiles = configPath === undefined ? redirectsFiles : [...redirectsFiles, configPath]
49
- onChanges(watchedRedirectFiles, async () => {
50
- const existingRedirectsFiles = await pFilter(watchedRedirectFiles, fileExistsAsync)
51
- console.log(
52
- `${NETLIFYDEVLOG} Reloading redirect rules from`,
53
- existingRedirectsFiles.map((redirectFile) => path.relative(projectDir, redirectFile)),
54
- )
55
- redirects = await parseRedirects({ redirectsFiles, configPath })
56
- matcher = null
57
- })
58
-
59
- const getMatcher = async () => {
60
- if (matcher) return matcher
61
-
62
- if (redirects.length !== 0) {
63
- return (matcher = await redirector.parseJSON(JSON.stringify(redirects), {
64
- jwtSecret,
65
- jwtRoleClaim,
66
- }))
29
+ if (headers['accept-language']) {
30
+ return headers['accept-language'].split(',')[0].slice(0, 2);
67
31
  }
68
- return {
69
- match() {
70
- return null
71
- },
72
- }
73
- }
74
-
75
- return async function rewriter(req) {
76
- const matcherFunc = await getMatcher()
77
- const reqUrl = new URL(
78
- req.url,
79
- `${req.protocol || (req.headers.scheme && `${req.headers.scheme}:`) || 'http:'}//${
80
- req.hostname || req.headers.host
81
- }`,
82
- )
83
- const cookieValues = cookie.parse(req.headers.cookie || '')
84
- const headers = {
85
- 'x-language': cookieValues.nf_lang || getLanguage(req.headers),
86
- 'x-country': cookieValues.nf_country || geoCountry || 'us',
87
- ...req.headers,
88
- }
89
-
90
- // Definition: https://github.com/netlify/libredirect/blob/e81bbeeff9f7c260a5fb74cad296ccc67a92325b/node/src/redirects.cpp#L28-L60
91
- const matchReq = {
92
- scheme: reqUrl.protocol.replace(/:.*$/, ''),
93
- host: reqUrl.hostname,
94
- path: decodeURIComponent(reqUrl.pathname),
95
- query: reqUrl.search.slice(1),
96
- headers,
97
- cookieValues,
98
- getHeader: (name) => headers[name.toLowerCase()] || '',
99
- getCookie: (key) => cookieValues[key] || '',
100
- }
101
- const match = matcherFunc.match(matchReq)
102
- return match
103
- }
104
- }
32
+ return 'en';
33
+ };
34
+ export const createRewriter = async function ({
35
+ // @ts-expect-error TS(7031) FIXME: Binding element 'configPath' implicitly has an 'an... Remove this comment to see the full error message
36
+ configPath,
37
+ // @ts-expect-error TS(7031) FIXME: Binding element 'distDir' implicitly has an 'any' ... Remove this comment to see the full error message
38
+ distDir,
39
+ // @ts-expect-error TS(7031) FIXME: Binding element 'geoCountry' implicitly has an 'an... Remove this comment to see the full error message
40
+ geoCountry,
41
+ // @ts-expect-error TS(7031) FIXME: Binding element 'jwtRoleClaim' implicitly has an '... Remove this comment to see the full error message
42
+ jwtRoleClaim,
43
+ // @ts-expect-error TS(7031) FIXME: Binding element 'jwtSecret' implicitly has an 'any... Remove this comment to see the full error message
44
+ jwtSecret,
45
+ // @ts-expect-error TS(7031) FIXME: Binding element 'projectDir' implicitly has an 'an... Remove this comment to see the full error message
46
+ projectDir, }) {
47
+ // @ts-expect-error TS(7034) FIXME: Variable 'matcher' implicitly has type 'any' in so... Remove this comment to see the full error message
48
+ let matcher = null;
49
+ const redirectsFiles = [...new Set([path.resolve(distDir, '_redirects'), path.resolve(projectDir, '_redirects')])];
50
+ let redirects = await parseRedirects({ redirectsFiles, configPath });
51
+ const watchedRedirectFiles = configPath === undefined ? redirectsFiles : [...redirectsFiles, configPath];
52
+ onChanges(watchedRedirectFiles, async () => {
53
+ const existingRedirectsFiles = await pFilter(watchedRedirectFiles, fileExistsAsync);
54
+ console.log(`${NETLIFYDEVLOG} Reloading redirect rules from`, existingRedirectsFiles.map((redirectFile) => path.relative(projectDir, redirectFile)));
55
+ redirects = await parseRedirects({ redirectsFiles, configPath });
56
+ matcher = null;
57
+ });
58
+ const getMatcher = async () => {
59
+ // @ts-expect-error TS(7005) FIXME: Variable 'matcher' implicitly has an 'any' type.
60
+ if (matcher)
61
+ return matcher;
62
+ if (redirects.length !== 0) {
63
+ return (matcher = await redirector.parseJSON(JSON.stringify(redirects), {
64
+ jwtSecret,
65
+ jwtRoleClaim,
66
+ }));
67
+ }
68
+ return {
69
+ match() {
70
+ return null;
71
+ },
72
+ };
73
+ };
74
+ // @ts-expect-error TS(7006) FIXME: Parameter 'req' implicitly has an 'any' type.
75
+ return async function rewriter(req) {
76
+ const matcherFunc = await getMatcher();
77
+ const reqUrl = new URL(req.url, `${req.protocol || (req.headers.scheme && `${req.headers.scheme}:`) || 'http:'}//${req.hostname || req.headers.host}`);
78
+ const cookieValues = cookie.parse(req.headers.cookie || '');
79
+ const headers = {
80
+ 'x-language': cookieValues.nf_lang || getLanguage(req.headers),
81
+ 'x-country': cookieValues.nf_country || geoCountry || 'us',
82
+ ...req.headers,
83
+ };
84
+ // Definition: https://github.com/netlify/libredirect/blob/e81bbeeff9f7c260a5fb74cad296ccc67a92325b/node/src/redirects.cpp#L28-L60
85
+ const matchReq = {
86
+ scheme: reqUrl.protocol.replace(/:.*$/, ''),
87
+ host: reqUrl.hostname,
88
+ path: decodeURIComponent(reqUrl.pathname),
89
+ query: reqUrl.search.slice(1),
90
+ headers,
91
+ cookieValues,
92
+ // @ts-expect-error TS(7006) FIXME: Parameter 'name' implicitly has an 'any' type.
93
+ getHeader: (name) => headers[name.toLowerCase()] || '',
94
+ // @ts-expect-error TS(7006) FIXME: Parameter 'key' implicitly has an 'any' type.
95
+ getCookie: (key) => cookieValues[key] || '',
96
+ };
97
+ const match = matcherFunc.match(matchReq);
98
+ return match;
99
+ };
100
+ };