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/run-build.mjs
CHANGED
|
@@ -1,48 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import { startFrameworkServer } from './framework-server.mjs'
|
|
11
|
-
import { INTERNAL_FUNCTIONS_FOLDER } from './functions/index.mjs'
|
|
12
|
-
|
|
13
|
-
const netlifyBuildPromise = import('@netlify/build')
|
|
14
|
-
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path, { join } from 'path';
|
|
3
|
+
import { getBootstrapURL } from '../lib/edge-functions/bootstrap.mjs';
|
|
4
|
+
import { INTERNAL_EDGE_FUNCTIONS_FOLDER } from '../lib/edge-functions/consts.mjs';
|
|
5
|
+
import { getPathInProject } from '../lib/settings.mjs';
|
|
6
|
+
import { error } from './command-helpers.mjs';
|
|
7
|
+
import { startFrameworkServer } from './framework-server.mjs';
|
|
8
|
+
import { INTERNAL_FUNCTIONS_FOLDER } from './functions/index.mjs';
|
|
9
|
+
const netlifyBuildPromise = import('@netlify/build');
|
|
15
10
|
/**
|
|
16
11
|
* Copies `netlify.toml`, if one is defined, into the `.netlify` internal
|
|
17
12
|
* directory and returns the path to its new location.
|
|
18
13
|
* @param {string} configPath
|
|
19
14
|
* @param {string} destinationFolder The folder where it should be copied to. Either the root of the repo or a package inside a monorepo
|
|
20
15
|
*/
|
|
16
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'configPath' implicitly has an 'any' typ... Remove this comment to see the full error message
|
|
21
17
|
const copyConfig = async (configPath, destinationFolder) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
18
|
+
const newConfigPath = path.resolve(destinationFolder, getPathInProject(['netlify.toml']));
|
|
19
|
+
try {
|
|
20
|
+
await fs.copyFile(configPath, newConfigPath);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// no-op
|
|
24
|
+
}
|
|
25
|
+
return newConfigPath;
|
|
26
|
+
};
|
|
33
27
|
/**
|
|
34
28
|
* @param {string} basePath
|
|
35
29
|
*/
|
|
30
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'basePath' implicitly has an 'any' type.
|
|
36
31
|
const cleanInternalDirectory = async (basePath) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
await Promise.all(ops)
|
|
44
|
-
}
|
|
45
|
-
|
|
32
|
+
const ops = [INTERNAL_FUNCTIONS_FOLDER, INTERNAL_EDGE_FUNCTIONS_FOLDER, 'netlify.toml'].map((name) => {
|
|
33
|
+
const fullPath = path.resolve(basePath, getPathInProject([name]));
|
|
34
|
+
return fs.rm(fullPath, { force: true, recursive: true });
|
|
35
|
+
});
|
|
36
|
+
await Promise.all(ops);
|
|
37
|
+
};
|
|
46
38
|
/**
|
|
47
39
|
* @param {object} params
|
|
48
40
|
* @param {import('../commands/base-command.mjs').default} params.command
|
|
@@ -53,110 +45,95 @@ const cleanInternalDirectory = async (basePath) => {
|
|
|
53
45
|
* @param {'build' | 'dev'} [params.timeline]
|
|
54
46
|
* @returns
|
|
55
47
|
*/
|
|
48
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'command' implicitly has an 'any' ... Remove this comment to see the full error message
|
|
56
49
|
export const runNetlifyBuild = async ({ command, env = {}, options, settings, timeline = 'build' }) => {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
// the framework server.
|
|
123
|
-
const settingsOverrides = {
|
|
124
|
-
command: undefined,
|
|
125
|
-
useStaticServer: true,
|
|
50
|
+
const { cachedConfig, site } = command.netlify;
|
|
51
|
+
const { default: buildSite, startDev } = await netlifyBuildPromise;
|
|
52
|
+
const sharedOptions = {
|
|
53
|
+
cachedConfig,
|
|
54
|
+
configPath: cachedConfig.configPath,
|
|
55
|
+
siteId: cachedConfig.siteInfo.id,
|
|
56
|
+
token: cachedConfig.token,
|
|
57
|
+
dry: options.dry,
|
|
58
|
+
debug: options.debug,
|
|
59
|
+
context: options.context,
|
|
60
|
+
mode: 'cli',
|
|
61
|
+
telemetry: false,
|
|
62
|
+
buffer: false,
|
|
63
|
+
offline: options.offline,
|
|
64
|
+
packagePath: command.workspacePackage,
|
|
65
|
+
cwd: cachedConfig.buildDir,
|
|
66
|
+
quiet: options.quiet,
|
|
67
|
+
saveConfig: options.saveConfig,
|
|
68
|
+
edgeFunctionsBootstrapURL: getBootstrapURL(),
|
|
69
|
+
};
|
|
70
|
+
const devCommand = async (settingsOverrides = {}) => {
|
|
71
|
+
let cwd = command.workingDir;
|
|
72
|
+
if (!options.cwd && command.project.workspace?.packages.length) {
|
|
73
|
+
cwd = join(command.project.jsWorkspaceRoot, settings.baseDirectory || '');
|
|
74
|
+
}
|
|
75
|
+
const { ipVersion } = await startFrameworkServer({
|
|
76
|
+
settings: {
|
|
77
|
+
...settings,
|
|
78
|
+
...settingsOverrides,
|
|
79
|
+
},
|
|
80
|
+
cwd,
|
|
81
|
+
});
|
|
82
|
+
settings.frameworkHost = ipVersion === 6 ? '::1' : '127.0.0.1';
|
|
83
|
+
};
|
|
84
|
+
if (timeline === 'build') {
|
|
85
|
+
// Start by cleaning the internal directory, as it may have artifacts left
|
|
86
|
+
// by previous builds.
|
|
87
|
+
await cleanInternalDirectory(site.root);
|
|
88
|
+
// Copy `netlify.toml` into the internal directory. This will be the new
|
|
89
|
+
// location of the config file for the duration of the command.
|
|
90
|
+
const tempConfigPath = await copyConfig(cachedConfig.configPath, command.workingDir);
|
|
91
|
+
const buildSiteOptions = {
|
|
92
|
+
...sharedOptions,
|
|
93
|
+
outputConfigPath: tempConfigPath,
|
|
94
|
+
saveConfig: true,
|
|
95
|
+
};
|
|
96
|
+
// Run Netlify Build using the main entry point.
|
|
97
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{ outputConfigPath: string; save... Remove this comment to see the full error message
|
|
98
|
+
const { netlifyConfig, success } = await buildSite(buildSiteOptions);
|
|
99
|
+
if (!success) {
|
|
100
|
+
error('Could not start local server due to a build error');
|
|
101
|
+
return {};
|
|
102
|
+
}
|
|
103
|
+
// Start the dev server, forcing the usage of a static server as opposed to
|
|
104
|
+
// the framework server.
|
|
105
|
+
const settingsOverrides = {
|
|
106
|
+
command: undefined,
|
|
107
|
+
useStaticServer: true,
|
|
108
|
+
dist: undefined,
|
|
109
|
+
};
|
|
110
|
+
if (!options.dir && netlifyConfig?.build?.publish) {
|
|
111
|
+
settingsOverrides.dist = netlifyConfig.build.publish;
|
|
112
|
+
}
|
|
113
|
+
await devCommand(settingsOverrides);
|
|
114
|
+
return { configPath: tempConfigPath };
|
|
126
115
|
}
|
|
127
|
-
|
|
128
|
-
|
|
116
|
+
const startDevOptions = {
|
|
117
|
+
...sharedOptions,
|
|
118
|
+
// Set `quiet` to suppress non-essential output from Netlify Build unless
|
|
119
|
+
// the `debug` flag is set.
|
|
120
|
+
quiet: !options.debug,
|
|
121
|
+
env,
|
|
122
|
+
};
|
|
123
|
+
// Run Netlify Build using the `startDev` entry point.
|
|
124
|
+
const { error: startDevError, success } = await startDev(devCommand, startDevOptions);
|
|
125
|
+
if (!success && startDevError) {
|
|
126
|
+
error(`Could not start local development server\n\n${startDevError.message}\n\n${startDevError.stack}`);
|
|
129
127
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return { configPath: tempConfigPath }
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const startDevOptions = {
|
|
136
|
-
...sharedOptions,
|
|
137
|
-
|
|
138
|
-
// Set `quiet` to suppress non-essential output from Netlify Build unless
|
|
139
|
-
// the `debug` flag is set.
|
|
140
|
-
quiet: !options.debug,
|
|
141
|
-
env,
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Run Netlify Build using the `startDev` entry point.
|
|
145
|
-
const { error: startDevError, success } = await startDev(devCommand, startDevOptions)
|
|
146
|
-
|
|
147
|
-
if (!success && startDevError) {
|
|
148
|
-
error(`Could not start local development server\n\n${startDevError.message}\n\n${startDevError.stack}`)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return {}
|
|
152
|
-
}
|
|
153
|
-
|
|
128
|
+
return {};
|
|
129
|
+
};
|
|
154
130
|
/**
|
|
155
131
|
* @param {Omit<Parameters<typeof runNetlifyBuild>[0], 'timeline'>} options
|
|
156
132
|
*/
|
|
157
|
-
|
|
158
|
-
|
|
133
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
|
|
134
|
+
export const runDevTimeline = (options) => runNetlifyBuild({ ...options, timeline: 'dev' });
|
|
159
135
|
/**
|
|
160
136
|
* @param {Omit<Parameters<typeof runNetlifyBuild>[0], 'timeline'>} options
|
|
161
137
|
*/
|
|
162
|
-
|
|
138
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
|
|
139
|
+
export const runBuildTimeline = (options) => runNetlifyBuild({ ...options, timeline: 'build' });
|
package/src/utils/shell.mjs
CHANGED
|
@@ -1,42 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
import { chalk, log, NETLIFYDEVERR, NETLIFYDEVWARN } from './command-helpers.mjs'
|
|
8
|
-
import { processOnExit } from './dev.mjs'
|
|
9
|
-
|
|
1
|
+
import process from 'process';
|
|
2
|
+
import execa from 'execa';
|
|
3
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'stri... Remove this comment to see the full error message
|
|
4
|
+
import stripAnsiCc from 'strip-ansi-control-characters';
|
|
5
|
+
import { chalk, log, NETLIFYDEVERR, NETLIFYDEVWARN } from './command-helpers.mjs';
|
|
6
|
+
import { processOnExit } from './dev.mjs';
|
|
10
7
|
/**
|
|
11
8
|
* @type {(() => Promise<void>)[]} - array of functions to run before the process exits
|
|
12
9
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
let cleanupStarted = false
|
|
16
|
-
|
|
10
|
+
// @ts-expect-error TS(7034) FIXME: Variable 'cleanupWork' implicitly has type 'any[]'... Remove this comment to see the full error message
|
|
11
|
+
const cleanupWork = [];
|
|
12
|
+
let cleanupStarted = false;
|
|
17
13
|
/**
|
|
18
14
|
* @param {() => Promise<void>} job
|
|
19
15
|
*/
|
|
16
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'job' implicitly has an 'any' type.
|
|
20
17
|
export const addCleanupJob = (job) => {
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
18
|
+
cleanupWork.push(job);
|
|
19
|
+
};
|
|
24
20
|
/**
|
|
25
21
|
* @param {object} input
|
|
26
22
|
* @param {number=} input.exitCode The exit code to return when exiting the process after cleanup
|
|
27
23
|
*/
|
|
24
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'exitCode' implicitly has an 'any'... Remove this comment to see the full error message
|
|
28
25
|
const cleanupBeforeExit = async ({ exitCode }) => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
// If cleanup has started, then wherever started it will be responsible for exiting
|
|
27
|
+
if (!cleanupStarted) {
|
|
28
|
+
cleanupStarted = true;
|
|
29
|
+
try {
|
|
30
|
+
// @ts-expect-error TS(7005) FIXME: Variable 'cleanupWork' implicitly has an 'any[]' t... Remove this comment to see the full error message
|
|
31
|
+
await Promise.all(cleanupWork.map((cleanup) => cleanup()));
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
process.exit(exitCode);
|
|
35
|
+
}
|
|
36
36
|
}
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
37
|
+
};
|
|
40
38
|
/**
|
|
41
39
|
* Run a command and pipe stdout, stderr and stdin
|
|
42
40
|
* @param {string} command
|
|
@@ -46,70 +44,68 @@ const cleanupBeforeExit = async ({ exitCode }) => {
|
|
|
46
44
|
* @param {string} [options.cwd]
|
|
47
45
|
* @returns {execa.ExecaChildProcess<string>}
|
|
48
46
|
*/
|
|
47
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'command' implicitly has an 'any' type.
|
|
49
48
|
export const runCommand = (command, options = {}) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
// eslint-disable-next-line promise/
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
`'${commandWithoutArgs}'
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return commandProcess
|
|
111
|
-
}
|
|
112
|
-
|
|
49
|
+
// @ts-expect-error TS(2339) FIXME: Property 'cwd' does not exist on type '{}'.
|
|
50
|
+
const { cwd, env = {}, spinner = null } = options;
|
|
51
|
+
const commandProcess = execa.command(command, {
|
|
52
|
+
preferLocal: true,
|
|
53
|
+
// we use reject=false to avoid rejecting synchronously when the command doesn't exist
|
|
54
|
+
reject: false,
|
|
55
|
+
env: {
|
|
56
|
+
// we want always colorful terminal outputs
|
|
57
|
+
FORCE_COLOR: 'true',
|
|
58
|
+
...env,
|
|
59
|
+
},
|
|
60
|
+
// windowsHide needs to be false for child process to terminate properly on Windows
|
|
61
|
+
windowsHide: false,
|
|
62
|
+
cwd,
|
|
63
|
+
});
|
|
64
|
+
// This ensures that an active spinner stays at the bottom of the commandline
|
|
65
|
+
// even though the actual framework command might be outputting stuff
|
|
66
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'writeStream' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
67
|
+
const pipeDataWithSpinner = (writeStream, chunk) => {
|
|
68
|
+
if (spinner && spinner.isSpinning) {
|
|
69
|
+
spinner.clear();
|
|
70
|
+
spinner.isSilent = true;
|
|
71
|
+
}
|
|
72
|
+
writeStream.write(chunk, () => {
|
|
73
|
+
if (spinner && spinner.isSpinning) {
|
|
74
|
+
spinner.isSilent = false;
|
|
75
|
+
spinner.render();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
// @ts-expect-error TS(2531) FIXME: Object is possibly 'null'.
|
|
80
|
+
commandProcess.stdout.pipe(stripAnsiCc.stream()).on('data', pipeDataWithSpinner.bind(null, process.stdout));
|
|
81
|
+
// @ts-expect-error TS(2531) FIXME: Object is possibly 'null'.
|
|
82
|
+
commandProcess.stderr.pipe(stripAnsiCc.stream()).on('data', pipeDataWithSpinner.bind(null, process.stderr));
|
|
83
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type 'Writable | null' is not assignab... Remove this comment to see the full error message
|
|
84
|
+
process.stdin.pipe(commandProcess.stdin);
|
|
85
|
+
// we can't try->await->catch since we don't want to block on the framework server which
|
|
86
|
+
// is a long running process
|
|
87
|
+
// eslint-disable-next-line promise/catch-or-return
|
|
88
|
+
commandProcess
|
|
89
|
+
// eslint-disable-next-line promise/prefer-await-to-then
|
|
90
|
+
.then(async () => {
|
|
91
|
+
const result = await commandProcess;
|
|
92
|
+
const [commandWithoutArgs] = command.split(' ');
|
|
93
|
+
if (result.failed && isNonExistingCommandError({ command: commandWithoutArgs, error: result })) {
|
|
94
|
+
log(`${NETLIFYDEVERR} Failed running command: ${command}. Please verify ${chalk.magenta(`'${commandWithoutArgs}'`)} exists`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const errorMessage = result.failed
|
|
98
|
+
// @ts-expect-error TS(2339) FIXME: Property 'shortMessage' does not exist on type 'Ex... Remove this comment to see the full error message
|
|
99
|
+
? `${NETLIFYDEVERR} ${result.shortMessage}`
|
|
100
|
+
: `${NETLIFYDEVWARN} "${command}" exited with code ${result.exitCode}`;
|
|
101
|
+
log(`${errorMessage}. Shutting down Netlify Dev server`);
|
|
102
|
+
}
|
|
103
|
+
return await cleanupBeforeExit({ exitCode: 1 });
|
|
104
|
+
});
|
|
105
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{}' is not assignable to paramet... Remove this comment to see the full error message
|
|
106
|
+
processOnExit(async () => await cleanupBeforeExit({}));
|
|
107
|
+
return commandProcess;
|
|
108
|
+
};
|
|
113
109
|
/**
|
|
114
110
|
*
|
|
115
111
|
* @param {object} config
|
|
@@ -117,21 +113,18 @@ export const runCommand = (command, options = {}) => {
|
|
|
117
113
|
* @param {*} config.error
|
|
118
114
|
* @returns
|
|
119
115
|
*/
|
|
116
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'command' implicitly has an 'any' ... Remove this comment to see the full error message
|
|
120
117
|
const isNonExistingCommandError = ({ command, error: commandError }) => {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
typeof commandError.message === 'string' &&
|
|
135
|
-
commandError.message.includes('is not recognized as an internal or external command')
|
|
136
|
-
)
|
|
137
|
-
}
|
|
118
|
+
// `ENOENT` is only returned for non Windows systems
|
|
119
|
+
// See https://github.com/sindresorhus/execa/pull/447
|
|
120
|
+
if (commandError.code === 'ENOENT') {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
// if the command is a package manager we let it report the error
|
|
124
|
+
if (['yarn', 'npm', 'pnpm'].includes(command)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
// this only works on English versions of Windows
|
|
128
|
+
return (typeof commandError.message === 'string' &&
|
|
129
|
+
commandError.message.includes('is not recognized as an internal or external command'));
|
|
130
|
+
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'json... Remove this comment to see the full error message
|
|
2
|
+
import jwt from 'jsonwebtoken';
|
|
3
3
|
// https://docs.netlify.com/routing/redirects/rewrites-proxies/#signed-proxy-redirects
|
|
4
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'deployContext' implicitly has an ... Remove this comment to see the full error message
|
|
4
5
|
export const signRedirect = ({ deployContext, secret, siteID, siteURL }) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
6
|
+
const claims = {
|
|
7
|
+
deploy_context: deployContext,
|
|
8
|
+
netlify_id: siteID,
|
|
9
|
+
site_url: siteURL,
|
|
10
|
+
};
|
|
11
|
+
const options = {
|
|
12
|
+
expiresIn: '5 minutes',
|
|
13
|
+
issuer: 'netlify',
|
|
14
|
+
};
|
|
15
|
+
return jwt.sign(claims, secret, options);
|
|
16
|
+
};
|