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.
- package/README.md +2 -138
- package/npm-shrinkwrap.json +76 -76
- package/package.json +16 -15
- package/src/commands/addons/addons-auth.mjs +27 -30
- package/src/commands/addons/addons-config.mjs +145 -154
- package/src/commands/addons/addons-create.mjs +94 -108
- package/src/commands/addons/addons-delete.mjs +36 -41
- package/src/commands/addons/addons-list.mjs +38 -42
- package/src/commands/addons/addons.mjs +26 -28
- package/src/commands/addons/index.mjs +1 -1
- package/src/commands/api/api.mjs +45 -53
- package/src/commands/api/index.mjs +1 -1
- package/src/commands/base-command.mjs +597 -684
- package/src/commands/blobs/blobs-delete.mjs +35 -0
- package/src/commands/blobs/blobs-get.mjs +44 -0
- package/src/commands/blobs/blobs-list.mjs +48 -0
- package/src/commands/blobs/blobs-set.mjs +54 -0
- package/src/commands/blobs/blobs.mjs +32 -0
- package/src/commands/blobs/index.mjs +1 -0
- package/src/commands/build/build.mjs +55 -67
- package/src/commands/build/index.mjs +1 -1
- package/src/commands/completion/completion.mjs +41 -46
- package/src/commands/completion/index.mjs +1 -1
- package/src/commands/deploy/deploy.mjs +675 -710
- package/src/commands/deploy/index.mjs +1 -1
- package/src/commands/dev/dev-exec.mjs +20 -32
- package/src/commands/dev/dev.mjs +217 -302
- package/src/commands/dev/index.mjs +1 -1
- package/src/commands/dev/types.d.ts +30 -0
- package/src/commands/env/env-clone.mjs +157 -184
- package/src/commands/env/env-get.mjs +49 -68
- package/src/commands/env/env-import.mjs +100 -119
- package/src/commands/env/env-list.mjs +104 -129
- package/src/commands/env/env-set.mjs +160 -185
- package/src/commands/env/env-unset.mjs +104 -122
- package/src/commands/env/env.mjs +28 -30
- package/src/commands/env/index.mjs +1 -1
- package/src/commands/functions/functions-build.mjs +29 -41
- package/src/commands/functions/functions-create.mjs +533 -601
- package/src/commands/functions/functions-invoke.mjs +193 -216
- package/src/commands/functions/functions-list.mjs +45 -55
- package/src/commands/functions/functions-serve.mjs +51 -61
- package/src/commands/functions/functions.mjs +26 -32
- package/src/commands/functions/index.mjs +1 -1
- package/src/commands/index.mjs +2 -2
- package/src/commands/init/index.mjs +1 -1
- package/src/commands/init/init.mjs +138 -167
- package/src/commands/integration/deploy.mjs +337 -399
- package/src/commands/integration/index.mjs +12 -13
- package/src/commands/link/index.mjs +1 -1
- package/src/commands/link/link.mjs +298 -317
- package/src/commands/lm/index.mjs +1 -1
- package/src/commands/lm/lm-info.mjs +23 -31
- package/src/commands/lm/lm-install.mjs +13 -17
- package/src/commands/lm/lm-setup.mjs +80 -84
- package/src/commands/lm/lm-uninstall.mjs +7 -12
- package/src/commands/lm/lm.mjs +18 -22
- package/src/commands/login/index.mjs +1 -1
- package/src/commands/login/login.mjs +35 -41
- package/src/commands/logout/index.mjs +1 -1
- package/src/commands/logout/logout.mjs +25 -31
- package/src/commands/main.mjs +166 -201
- package/src/commands/open/index.mjs +1 -1
- package/src/commands/open/open-admin.mjs +15 -18
- package/src/commands/open/open-site.mjs +16 -19
- package/src/commands/open/open.mjs +24 -27
- package/src/commands/recipes/common.mjs +23 -34
- package/src/commands/recipes/index.mjs +1 -1
- package/src/commands/recipes/recipes-list.mjs +13 -20
- package/src/commands/recipes/recipes.mjs +59 -72
- package/src/commands/serve/index.mjs +1 -1
- package/src/commands/serve/serve.mjs +142 -189
- package/src/commands/sites/index.mjs +2 -2
- package/src/commands/sites/sites-create-template.mjs +214 -236
- package/src/commands/sites/sites-create.mjs +145 -157
- package/src/commands/sites/sites-delete.mjs +75 -81
- package/src/commands/sites/sites-list.mjs +63 -66
- package/src/commands/sites/sites.mjs +18 -20
- package/src/commands/status/index.mjs +1 -1
- package/src/commands/status/status-hooks.mjs +32 -34
- package/src/commands/status/status.mjs +99 -106
- package/src/commands/switch/index.mjs +1 -1
- package/src/commands/switch/switch.mjs +32 -37
- package/src/commands/types.d.ts +31 -0
- package/src/commands/unlink/index.mjs +1 -1
- package/src/commands/unlink/unlink.mjs +23 -29
- package/src/commands/watch/index.mjs +1 -1
- package/src/commands/watch/watch.mjs +91 -105
- package/src/functions-templates/javascript/hello/{{name}}.js +2 -3
- package/src/lib/account.mjs +4 -5
- package/src/lib/api.mjs +22 -20
- package/src/lib/blobs/blobs.mjs +36 -45
- package/src/lib/build.mjs +82 -85
- package/src/lib/completion/constants.mjs +2 -4
- package/src/lib/completion/generate-autocompletion.mjs +33 -36
- package/src/lib/completion/get-autocompletion.mjs +31 -35
- package/src/lib/completion/index.mjs +1 -1
- package/src/lib/completion/script.mjs +12 -19
- package/src/lib/edge-functions/bootstrap.mjs +3 -5
- package/src/lib/edge-functions/consts.mjs +9 -10
- package/src/lib/edge-functions/deploy.mjs +28 -34
- package/src/lib/edge-functions/editor-helper.mjs +29 -42
- package/src/lib/edge-functions/headers.mjs +24 -26
- package/src/lib/edge-functions/internal.mjs +38 -44
- package/src/lib/edge-functions/proxy.mjs +229 -228
- package/src/lib/edge-functions/registry.mjs +473 -574
- package/src/lib/exec-fetcher.mjs +115 -122
- package/src/lib/fs.mjs +28 -27
- package/src/lib/functions/background.mjs +16 -20
- package/src/lib/functions/config.mjs +12 -9
- package/src/lib/functions/form-submissions-handler.mjs +143 -149
- package/src/lib/functions/local-proxy.mjs +40 -44
- package/src/lib/functions/memoized-build.mjs +19 -21
- package/src/lib/functions/netlify-function.mjs +269 -249
- package/src/lib/functions/registry.mjs +509 -568
- package/src/lib/functions/runtimes/go/index.mjs +62 -71
- package/src/lib/functions/runtimes/index.mjs +8 -15
- package/src/lib/functions/runtimes/js/builders/netlify-lambda.mjs +55 -64
- package/src/lib/functions/runtimes/js/builders/zisi.mjs +135 -154
- package/src/lib/functions/runtimes/js/constants.mjs +1 -1
- package/src/lib/functions/runtimes/js/index.mjs +92 -109
- package/src/lib/functions/runtimes/js/worker.mjs +43 -45
- package/src/lib/functions/runtimes/rust/index.mjs +64 -73
- package/src/lib/functions/scheduled.mjs +70 -88
- package/src/lib/functions/server.mjs +269 -327
- package/src/lib/functions/synchronous.mjs +118 -147
- package/src/lib/functions/utils.mjs +38 -46
- package/src/lib/geo-location.mjs +69 -81
- package/src/lib/http-agent.mjs +87 -90
- package/src/lib/images/proxy.mjs +97 -99
- package/src/lib/log.mjs +6 -9
- package/src/lib/path.mjs +2 -1
- package/src/lib/render-error-template.mjs +19 -20
- package/src/lib/settings.mjs +17 -19
- package/src/lib/spinner.mjs +21 -23
- package/src/lib/string.mjs +4 -2
- package/src/recipes/vscode/index.mjs +69 -85
- package/src/recipes/vscode/settings.mjs +53 -58
- package/src/utils/addons/compare.mjs +31 -32
- package/src/utils/addons/diffs/index.mjs +16 -17
- package/src/utils/addons/diffs/options.mjs +99 -101
- package/src/utils/addons/prepare.mjs +100 -97
- package/src/utils/addons/prompts.mjs +73 -76
- package/src/utils/addons/render.mjs +33 -36
- package/src/utils/addons/validation.mjs +19 -15
- package/src/utils/banner.mjs +11 -16
- package/src/utils/build-info.mjs +65 -66
- package/src/utils/command-helpers.mjs +185 -199
- package/src/utils/create-deferred.mjs +9 -12
- package/src/utils/create-stream-promise.mjs +54 -47
- package/src/utils/deploy/constants.mjs +9 -11
- package/src/utils/deploy/deploy-site.mjs +162 -182
- package/src/utils/deploy/hash-config.mjs +21 -21
- package/src/utils/deploy/hash-files.mjs +34 -38
- package/src/utils/deploy/hash-fns.mjs +149 -154
- package/src/utils/deploy/hasher-segments.mjs +58 -52
- package/src/utils/deploy/upload-files.mjs +99 -113
- package/src/utils/deploy/util.mjs +85 -91
- package/src/utils/detect-server-settings.mjs +236 -268
- package/src/utils/dev.mjs +163 -178
- package/src/utils/dot-env.mjs +37 -42
- package/src/utils/env/index.mjs +148 -148
- package/src/utils/execa.mjs +9 -13
- package/src/utils/feature-flags.mjs +6 -5
- package/src/utils/framework-server.mjs +43 -52
- package/src/utils/functions/constants.mjs +1 -1
- package/src/utils/functions/functions.mjs +30 -40
- package/src/utils/functions/get-functions.mjs +28 -29
- package/src/utils/functions/index.mjs +3 -3
- package/src/utils/get-global-config.mjs +33 -36
- package/src/utils/get-package-json.mjs +14 -15
- package/src/utils/get-repo-data.mjs +54 -64
- package/src/utils/get-site.mjs +14 -14
- package/src/utils/gh-auth.mjs +79 -100
- package/src/utils/gitignore.mjs +37 -40
- package/src/utils/headers.mjs +33 -35
- package/src/utils/hooks/requires-site-info.mjs +26 -22
- package/src/utils/init/config-github.mjs +207 -219
- package/src/utils/init/config-manual.mjs +83 -100
- package/src/utils/init/config.mjs +25 -26
- package/src/utils/init/node-version.mjs +23 -30
- package/src/utils/init/plugins.mjs +12 -8
- package/src/utils/init/utils.mjs +152 -172
- package/src/utils/live-tunnel.mjs +118 -141
- package/src/utils/lm/install.mjs +220 -259
- package/src/utils/lm/requirements.mjs +54 -63
- package/src/utils/lm/steps.mjs +31 -31
- package/src/utils/lm/ui.mjs +13 -20
- package/src/utils/open-browser.mjs +31 -32
- package/src/utils/parse-raw-flags.mjs +39 -35
- package/src/utils/proxy-server.mjs +84 -71
- package/src/utils/proxy.mjs +696 -750
- package/src/utils/read-repo-url.mjs +48 -47
- package/src/utils/redirects.mjs +49 -49
- package/src/utils/request-id.mjs +2 -4
- package/src/utils/rules-proxy.mjs +96 -100
- package/src/utils/run-build.mjs +109 -132
- package/src/utils/shell.mjs +99 -106
- package/src/utils/sign-redirect.mjs +14 -14
- package/src/utils/sites/utils.mjs +48 -55
- package/src/utils/state-config.mjs +101 -101
- package/src/utils/static-server.mjs +28 -34
- package/src/utils/telemetry/index.mjs +2 -2
- package/src/utils/telemetry/report-error.mjs +45 -49
- package/src/utils/telemetry/request.mjs +36 -43
- package/src/utils/telemetry/telemetry.mjs +90 -105
- package/src/utils/telemetry/utils.mjs +5 -6
- package/src/utils/telemetry/validation.mjs +55 -53
- package/src/utils/types.d.ts +46 -0
- package/src/utils/validation.mjs +10 -13
|
@@ -1,61 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
+
};
|
package/src/utils/redirects.mjs
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
+
};
|
package/src/utils/request-id.mjs
CHANGED
|
@@ -1,104 +1,100 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
import redirector from 'netlify-redirector'
|
|
7
|
-
import pFilter from 'p-filter'
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
+
};
|