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,58 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'node... Remove this comment to see the full error message
|
|
2
|
+
import fetch from 'node-fetch';
|
|
3
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'token' implicitly has an 'any' type.
|
|
3
4
|
export const getTemplatesFromGitHub = async (token) => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
5
|
+
const getPublicGitHubReposFromOrg = new URL(`https://api.github.com/orgs/netlify-templates/repos`);
|
|
6
|
+
// GitHub returns 30 by default and we want to avoid our limit
|
|
7
|
+
// due to our archived repositories at any given time
|
|
8
|
+
const REPOS_PER_PAGE = 70;
|
|
9
|
+
getPublicGitHubReposFromOrg.searchParams.set('type', 'public');
|
|
10
|
+
getPublicGitHubReposFromOrg.searchParams.set('sort', 'full_name');
|
|
11
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type 'number' is not assignable to par... Remove this comment to see the full error message
|
|
12
|
+
getPublicGitHubReposFromOrg.searchParams.set('per_page', REPOS_PER_PAGE);
|
|
13
|
+
const templates = await fetch(getPublicGitHubReposFromOrg, {
|
|
14
|
+
method: 'GET',
|
|
15
|
+
headers: {
|
|
16
|
+
Authorization: `token ${token}`,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
const allTemplates = await templates.json();
|
|
20
|
+
return allTemplates;
|
|
21
|
+
};
|
|
22
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'ghToken' implicitly has an 'any' ... Remove this comment to see the full error message
|
|
24
23
|
export const validateTemplate = async ({ ghToken, templateName }) => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return { exists: true, isTemplate: data.is_template }
|
|
42
|
-
}
|
|
43
|
-
|
|
24
|
+
const response = await fetch(`https://api.github.com/repos/${templateName}`, {
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `token ${ghToken}`,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
if (response.status === 404) {
|
|
30
|
+
return { exists: false };
|
|
31
|
+
}
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
throw new Error(`Error fetching template ${templateName}: ${await response.text()}`);
|
|
34
|
+
}
|
|
35
|
+
const data = await response.json();
|
|
36
|
+
return { exists: true, isTemplate: data.is_template };
|
|
37
|
+
};
|
|
38
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'templateName' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
44
39
|
export const createRepo = async (templateName, ghToken, siteName) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return data
|
|
58
|
-
}
|
|
40
|
+
const resp = await fetch(`https://api.github.com/repos/${templateName}/generate`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: {
|
|
43
|
+
Authorization: `token ${ghToken}`,
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify({
|
|
46
|
+
name: siteName,
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
const data = await resp.json();
|
|
50
|
+
return data;
|
|
51
|
+
};
|
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import path from 'path'
|
|
3
|
-
import process from 'process'
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import writeFileAtomic from 'write-file-atomic'
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const STATE_PATH = getPathInProject(['state.json'])
|
|
12
|
-
const permissionError = "You don't have access to this file."
|
|
13
|
-
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import process from 'process';
|
|
4
|
+
import { deleteProperty, getProperty, hasProperty, setProperty } from 'dot-prop';
|
|
5
|
+
import { findUpSync } from 'find-up';
|
|
6
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'writ... Remove this comment to see the full error message
|
|
7
|
+
import writeFileAtomic from 'write-file-atomic';
|
|
8
|
+
import { getPathInProject } from '../lib/settings.mjs';
|
|
9
|
+
const STATE_PATH = getPathInProject(['state.json']);
|
|
10
|
+
const permissionError = "You don't have access to this file.";
|
|
14
11
|
/**
|
|
15
12
|
* Finds location of `.netlify/state.json`
|
|
16
13
|
* @param {string} cwd
|
|
17
14
|
* @returns {string}
|
|
18
15
|
*/
|
|
16
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'cwd' implicitly has an 'any' type.
|
|
19
17
|
const findStatePath = (cwd) => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return statePath
|
|
27
|
-
}
|
|
28
|
-
|
|
18
|
+
const statePath = findUpSync([STATE_PATH], { cwd });
|
|
19
|
+
if (!statePath) {
|
|
20
|
+
return path.join(cwd, STATE_PATH);
|
|
21
|
+
}
|
|
22
|
+
return statePath;
|
|
23
|
+
};
|
|
29
24
|
export default class StateConfig {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
25
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'cwd' implicitly has an 'any' type.
|
|
26
|
+
constructor(cwd) {
|
|
27
|
+
// @ts-expect-error TS(2339) FIXME: Property 'path' does not exist on type 'StateConfi... Remove this comment to see the full error message
|
|
28
|
+
this.path = findStatePath(cwd);
|
|
29
|
+
}
|
|
30
|
+
get all() {
|
|
31
|
+
try {
|
|
32
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type 'Buffer' is not assignable to par... Remove this comment to see the full error message
|
|
33
|
+
return JSON.parse(fs.readFileSync(this.path));
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// Don't create if it doesn't exist
|
|
37
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
38
|
+
if (error.code === 'ENOENT' || error.code === 'ENOTDIR') {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
// Improve the message of permission errors
|
|
42
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
43
|
+
if (error.code === 'EACCES') {
|
|
44
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
45
|
+
error.message = `${error.message}\n${permissionError}\n`;
|
|
46
|
+
}
|
|
47
|
+
// Empty the file if it encounters invalid JSON
|
|
48
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
49
|
+
if (error.name === 'SyntaxError') {
|
|
50
|
+
// @ts-expect-error TS(2339) FIXME: Property 'path' does not exist on type 'StateConfi... Remove this comment to see the full error message
|
|
51
|
+
writeFileAtomic.sync(this.path, '');
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
set all(val) {
|
|
58
|
+
try {
|
|
59
|
+
// Make sure the folder exists as it could have been deleted in the meantime
|
|
60
|
+
// @ts-expect-error TS(2339) FIXME: Property 'path' does not exist on type 'StateConfi... Remove this comment to see the full error message
|
|
61
|
+
fs.mkdirSync(path.dirname(this.path), { recursive: true });
|
|
62
|
+
// @ts-expect-error TS(2339) FIXME: Property 'path' does not exist on type 'StateConfi... Remove this comment to see the full error message
|
|
63
|
+
writeFileAtomic.sync(this.path, JSON.stringify(val, null, '\t'));
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Improve the message of permission errors
|
|
67
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
68
|
+
if (error.code === 'EACCES') {
|
|
69
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
70
|
+
error.message = `${error.message}\n${permissionError}\n`;
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
get size() {
|
|
76
|
+
return Object.keys(this.all || {}).length;
|
|
77
|
+
}
|
|
78
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'key' implicitly has an 'any' type.
|
|
79
|
+
get(key) {
|
|
80
|
+
if (key === 'siteId' && process.env.NETLIFY_SITE_ID) {
|
|
81
|
+
// TODO figure out cleaner way of grabbing ENV vars
|
|
82
|
+
return process.env.NETLIFY_SITE_ID;
|
|
83
|
+
}
|
|
84
|
+
return getProperty(this.all, key);
|
|
85
|
+
}
|
|
86
|
+
// @ts-expect-error TS(7019) FIXME: Rest parameter 'args' implicitly has an 'any[]' ty... Remove this comment to see the full error message
|
|
87
|
+
set(...args) {
|
|
88
|
+
const [key, val] = args;
|
|
89
|
+
const config = this.all;
|
|
90
|
+
if (args.length === 1) {
|
|
91
|
+
Object.entries(key).forEach(([keyPart, value]) => {
|
|
92
|
+
setProperty(config, keyPart, value);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
setProperty(config, key, val);
|
|
97
|
+
}
|
|
98
|
+
this.all = config;
|
|
55
99
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
// Make sure the folder exists as it could have been deleted in the meantime
|
|
61
|
-
fs.mkdirSync(path.dirname(this.path), { recursive: true })
|
|
62
|
-
writeFileAtomic.sync(this.path, JSON.stringify(val, null, '\t'))
|
|
63
|
-
} catch (error) {
|
|
64
|
-
// Improve the message of permission errors
|
|
65
|
-
if (error.code === 'EACCES') {
|
|
66
|
-
error.message = `${error.message}\n${permissionError}\n`
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
throw error
|
|
100
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'key' implicitly has an 'any' type.
|
|
101
|
+
has(key) {
|
|
102
|
+
return hasProperty(this.all, key);
|
|
70
103
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
get(key) {
|
|
78
|
-
if (key === 'siteId' && process.env.NETLIFY_SITE_ID) {
|
|
79
|
-
// TODO figure out cleaner way of grabbing ENV vars
|
|
80
|
-
return process.env.NETLIFY_SITE_ID
|
|
104
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'key' implicitly has an 'any' type.
|
|
105
|
+
delete(key) {
|
|
106
|
+
const config = this.all;
|
|
107
|
+
deleteProperty(config, key);
|
|
108
|
+
this.all = config;
|
|
81
109
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
set(...args) {
|
|
86
|
-
const [key, val] = args
|
|
87
|
-
const config = this.all
|
|
88
|
-
|
|
89
|
-
if (args.length === 1) {
|
|
90
|
-
Object.entries(key).forEach(([keyPart, value]) => {
|
|
91
|
-
setProperty(config, keyPart, value)
|
|
92
|
-
})
|
|
93
|
-
} else {
|
|
94
|
-
setProperty(config, key, val)
|
|
110
|
+
clear() {
|
|
111
|
+
this.all = {};
|
|
95
112
|
}
|
|
96
|
-
|
|
97
|
-
this.all = config
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
has(key) {
|
|
101
|
-
return hasProperty(this.all, key)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
delete(key) {
|
|
105
|
-
const config = this.all
|
|
106
|
-
deleteProperty(config, key)
|
|
107
|
-
this.all = config
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
clear() {
|
|
111
|
-
this.all = {}
|
|
112
|
-
}
|
|
113
113
|
}
|
|
@@ -1,39 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import Fastify from 'fastify'
|
|
6
|
-
|
|
7
|
-
import { log, NETLIFYDEVLOG } from './command-helpers.mjs'
|
|
8
|
-
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fastifyStatic from '@fastify/static';
|
|
3
|
+
import Fastify from 'fastify';
|
|
4
|
+
import { log, NETLIFYDEVLOG } from './command-helpers.mjs';
|
|
9
5
|
/**
|
|
10
6
|
* @param {object} config
|
|
11
7
|
* @param {import('./types.js').ServerSettings} config.settings
|
|
12
8
|
*/
|
|
9
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'settings' implicitly has an 'any'... Remove this comment to see the full error message
|
|
13
10
|
export const startStaticServer = async ({ settings }) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
await server.listen({ port: settings.frameworkPort })
|
|
38
|
-
log(`\n${NETLIFYDEVLOG} Static server listening to`, settings.frameworkPort)
|
|
39
|
-
}
|
|
11
|
+
const server = Fastify();
|
|
12
|
+
const rootPath = path.resolve(settings.dist);
|
|
13
|
+
server.register(fastifyStatic, {
|
|
14
|
+
root: rootPath,
|
|
15
|
+
etag: false,
|
|
16
|
+
acceptRanges: false,
|
|
17
|
+
lastModified: false,
|
|
18
|
+
});
|
|
19
|
+
server.setNotFoundHandler((_req, res) => {
|
|
20
|
+
res.code(404).sendFile('404.html', rootPath);
|
|
21
|
+
});
|
|
22
|
+
server.addHook('onRequest', (req, reply, done) => {
|
|
23
|
+
reply.header('age', '0');
|
|
24
|
+
reply.header('cache-control', 'public, max-age=0, must-revalidate');
|
|
25
|
+
const validMethods = ['GET', 'HEAD'];
|
|
26
|
+
if (!validMethods.includes(req.method)) {
|
|
27
|
+
reply.code(405).send('Method Not Allowed');
|
|
28
|
+
}
|
|
29
|
+
done();
|
|
30
|
+
});
|
|
31
|
+
await server.listen({ port: settings.frameworkPort });
|
|
32
|
+
log(`\n${NETLIFYDEVLOG} Static server listening to`, settings.frameworkPort);
|
|
33
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { track, identify } from './telemetry.mjs'
|
|
2
|
-
export { reportError } from './report-error.mjs'
|
|
1
|
+
export { track, identify } from './telemetry.mjs';
|
|
2
|
+
export { reportError } from './report-error.mjs';
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
import os from 'os'
|
|
2
|
-
import { dirname, join } from 'path'
|
|
3
|
-
import process, { version as nodejsVersion } from 'process'
|
|
4
|
-
import { fileURLToPath } from 'url'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
import { cliVersion } from './utils.mjs'
|
|
12
|
-
|
|
13
|
-
const dirPath = dirname(fileURLToPath(import.meta.url))
|
|
14
|
-
|
|
1
|
+
import os from 'os';
|
|
2
|
+
import { dirname, join } from 'path';
|
|
3
|
+
import process, { version as nodejsVersion } from 'process';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { isCI } from 'ci-info';
|
|
6
|
+
// @ts-expect-error TS(7034) FIXME: Variable 'execa' implicitly has type 'any' in some... Remove this comment to see the full error message
|
|
7
|
+
import execa from '../execa.mjs';
|
|
8
|
+
import getGlobalConfig from '../get-global-config.mjs';
|
|
9
|
+
import { cliVersion } from './utils.mjs';
|
|
10
|
+
const dirPath = dirname(fileURLToPath(import.meta.url));
|
|
15
11
|
/**
|
|
16
12
|
*
|
|
17
13
|
* @param {import('@bugsnag/js').NotifiableError} error
|
|
@@ -20,39 +16,39 @@ const dirPath = dirname(fileURLToPath(import.meta.url))
|
|
|
20
16
|
* @param {Record<string, Record<string, any>>} [config.metadata]
|
|
21
17
|
* @returns {Promise<void>}
|
|
22
18
|
*/
|
|
19
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'error' implicitly has an 'any' type.
|
|
23
20
|
export const reportError = async function (error, config = {}) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
21
|
+
if (isCI) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// convert a NotifiableError to an error class
|
|
25
|
+
// eslint-disable-next-line unicorn/no-nested-ternary
|
|
26
|
+
const err = error instanceof Error ? error : typeof error === 'string' ? new Error(error) : error;
|
|
27
|
+
const globalConfig = await getGlobalConfig();
|
|
28
|
+
const options = JSON.stringify({
|
|
29
|
+
type: 'error',
|
|
30
|
+
data: {
|
|
31
|
+
message: err.message,
|
|
32
|
+
name: err.name,
|
|
33
|
+
stack: err.stack,
|
|
34
|
+
cause: err.cause,
|
|
35
|
+
// @ts-expect-error TS(2339) FIXME: Property 'severity' does not exist on type '{}'.
|
|
36
|
+
severity: config.severity,
|
|
37
|
+
user: {
|
|
38
|
+
id: globalConfig.get('userId'),
|
|
39
|
+
},
|
|
40
|
+
// @ts-expect-error TS(2339) FIXME: Property 'metadata' does not exist on type '{}'.
|
|
41
|
+
metadata: config.metadata,
|
|
42
|
+
osName: `${os.platform()}-${os.arch()}`,
|
|
43
|
+
cliVersion,
|
|
44
|
+
nodejsVersion,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
// spawn detached child process to handle send and wait for the http request to finish
|
|
48
|
+
// otherwise it can get canceled
|
|
49
|
+
// @ts-expect-error TS(7005) FIXME: Variable 'execa' implicitly has an 'any' type.
|
|
50
|
+
await execa(process.execPath, [join(dirPath, 'request.mjs'), options], {
|
|
51
|
+
detached: true,
|
|
52
|
+
stdio: 'ignore',
|
|
53
|
+
});
|
|
54
|
+
};
|
|
@@ -1,48 +1,41 @@
|
|
|
1
|
-
// @ts-check
|
|
2
1
|
// This file is being called by `src/utils/telemetry/telemetry.js` as a child process
|
|
3
2
|
// to run a s a detached process
|
|
4
|
-
import process from 'process'
|
|
5
|
-
|
|
6
|
-
import fetch from 'node-fetch'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const CLIENT_ID = 'NETLIFY_CLI'
|
|
15
|
-
const TRACK_URL = process.env.NETLIFY_TEST_TRACK_URL || 'https://cli.netlify.com/telemetry/track'
|
|
16
|
-
const IDENTIFY_URL = process.env.NETLIFY_TEST_IDENTIFY_URL || 'https://cli.netlify.com/telemetry/identify'
|
|
17
|
-
const REPORT_ERROR_URL = process.env.NETLIFY_TEST_ERROR_REPORT_URL || 'https://cli.netlify.com/report-error'
|
|
18
|
-
|
|
3
|
+
import process from 'process';
|
|
4
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'node... Remove this comment to see the full error message
|
|
5
|
+
import fetch from 'node-fetch';
|
|
6
|
+
import getPackageJson from '../get-package-json.mjs';
|
|
7
|
+
const { name, version } = await getPackageJson();
|
|
8
|
+
const options = JSON.parse(process.argv[2]);
|
|
9
|
+
const CLIENT_ID = 'NETLIFY_CLI';
|
|
10
|
+
const TRACK_URL = process.env.NETLIFY_TEST_TRACK_URL || 'https://cli.netlify.com/telemetry/track';
|
|
11
|
+
const IDENTIFY_URL = process.env.NETLIFY_TEST_IDENTIFY_URL || 'https://cli.netlify.com/telemetry/identify';
|
|
12
|
+
const REPORT_ERROR_URL = process.env.NETLIFY_TEST_ERROR_REPORT_URL || 'https://cli.netlify.com/report-error';
|
|
19
13
|
const getApiUrl = () => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
14
|
+
switch (options.type) {
|
|
15
|
+
case 'track':
|
|
16
|
+
return TRACK_URL;
|
|
17
|
+
case 'error':
|
|
18
|
+
return REPORT_ERROR_URL;
|
|
19
|
+
default:
|
|
20
|
+
return IDENTIFY_URL;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
30
23
|
// Make telemetry call
|
|
31
24
|
const makeRequest = async function () {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
makeRequest()
|
|
25
|
+
try {
|
|
26
|
+
await fetch(getApiUrl(), {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: {
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
'X-Netlify-Client': CLIENT_ID,
|
|
31
|
+
'User-Agent': `${name}/${version}`,
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify(options.data),
|
|
34
|
+
});
|
|
35
|
+
process.exit();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
makeRequest();
|