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.
- package/README.md +3 -139
- package/npm-shrinkwrap.json +82 -82
- 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 -89
- 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
package/src/utils/headers.mjs
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export const
|
|
50
|
-
export const
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
return error(`The site this folder is linked to can't be found`)
|
|
14
|
+
try {
|
|
15
|
+
await api.getSite({ siteId });
|
|
24
16
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import {
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
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
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
GITHUB_HOOK_EVENTS.map(async (event) => {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
+
};
|