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,13 +1,10 @@
|
|
|
1
|
-
// @ts-check
|
|
2
1
|
const createDeferred = () => {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export default createDeferred
|
|
2
|
+
let resolveDeferred;
|
|
3
|
+
let rejectDeferred;
|
|
4
|
+
const promise = new Promise((resolve, reject) => {
|
|
5
|
+
resolveDeferred = resolve;
|
|
6
|
+
rejectDeferred = reject;
|
|
7
|
+
});
|
|
8
|
+
return { promise, reject: rejectDeferred, resolve: resolveDeferred };
|
|
9
|
+
};
|
|
10
|
+
export default createDeferred;
|
|
@@ -1,49 +1,56 @@
|
|
|
1
|
-
import { Buffer } from 'buffer'
|
|
2
|
-
|
|
3
|
-
const SEC_TO_MILLISEC = 1e3
|
|
4
|
-
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
const SEC_TO_MILLISEC = 1e3;
|
|
5
3
|
// 6 MiB
|
|
6
|
-
const DEFAULT_BYTES_LIMIT = 6e6
|
|
7
|
-
|
|
4
|
+
const DEFAULT_BYTES_LIMIT = 6e6;
|
|
5
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'stream' implicitly has an 'any' type.
|
|
8
6
|
const createStreamPromise = function (stream, timeoutSeconds, bytesLimit = DEFAULT_BYTES_LIMIT) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
7
|
+
return new Promise(function streamPromiseFunc(resolve, reject) {
|
|
8
|
+
// @ts-expect-error TS(7034) FIXME: Variable 'data' implicitly has type 'any[]' in som... Remove this comment to see the full error message
|
|
9
|
+
let data = [];
|
|
10
|
+
let dataLength = 0;
|
|
11
|
+
// @ts-expect-error TS(7034) FIXME: Variable 'timeoutId' implicitly has type 'any' in ... Remove this comment to see the full error message
|
|
12
|
+
let timeoutId = null;
|
|
13
|
+
if (timeoutSeconds != null && Number.isFinite(timeoutSeconds)) {
|
|
14
|
+
timeoutId = setTimeout(() => {
|
|
15
|
+
// @ts-expect-error TS(2322) FIXME: Type 'null' is not assignable to type 'any[]'.
|
|
16
|
+
data = null;
|
|
17
|
+
reject(new Error('Request timed out waiting for body'));
|
|
18
|
+
}, timeoutSeconds * SEC_TO_MILLISEC);
|
|
19
|
+
}
|
|
20
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'chunk' implicitly has an 'any' type.
|
|
21
|
+
stream.on('data', function onData(chunk) {
|
|
22
|
+
// @ts-expect-error TS(7005) FIXME: Variable 'data' implicitly has an 'any[]' type.
|
|
23
|
+
if (!Array.isArray(data)) {
|
|
24
|
+
// Stream harvesting closed
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
dataLength += chunk.length;
|
|
28
|
+
if (dataLength > bytesLimit) {
|
|
29
|
+
// @ts-expect-error TS(2322) FIXME: Type 'null' is not assignable to type 'any[]'.
|
|
30
|
+
data = null;
|
|
31
|
+
reject(new Error('Stream body too big'));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
data.push(chunk);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'error' implicitly has an 'any' type.
|
|
38
|
+
stream.on('error', function onError(error) {
|
|
39
|
+
// @ts-expect-error TS(2322) FIXME: Type 'null' is not assignable to type 'any[]'.
|
|
40
|
+
data = null;
|
|
41
|
+
reject(error);
|
|
42
|
+
// @ts-expect-error TS(7005) FIXME: Variable 'timeoutId' implicitly has an 'any' type.
|
|
43
|
+
clearTimeout(timeoutId);
|
|
44
|
+
});
|
|
45
|
+
stream.on('end', function onEnd() {
|
|
46
|
+
// @ts-expect-error TS(7005) FIXME: Variable 'timeoutId' implicitly has an 'any' type.
|
|
47
|
+
clearTimeout(timeoutId);
|
|
48
|
+
// @ts-expect-error TS(7005) FIXME: Variable 'data' implicitly has an 'any[]' type.
|
|
49
|
+
if (data) {
|
|
50
|
+
// @ts-expect-error TS(7005) FIXME: Variable 'data' implicitly has an 'any[]' type.
|
|
51
|
+
resolve(Buffer.concat(data));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
export default createStreamPromise;
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
// Local deploy timeout in ms: 20 mins
|
|
2
|
-
export const DEFAULT_DEPLOY_TIMEOUT =
|
|
2
|
+
export const DEFAULT_DEPLOY_TIMEOUT = 1200000;
|
|
3
3
|
// Concurrent file hash calls
|
|
4
|
-
export const DEFAULT_CONCURRENT_HASH = 100
|
|
4
|
+
export const DEFAULT_CONCURRENT_HASH = 100;
|
|
5
5
|
// Number of concurrent uploads
|
|
6
|
-
export const DEFAULT_CONCURRENT_UPLOAD = 5
|
|
6
|
+
export const DEFAULT_CONCURRENT_UPLOAD = 5;
|
|
7
7
|
// Number of files
|
|
8
|
-
export const DEFAULT_SYNC_LIMIT = 100
|
|
8
|
+
export const DEFAULT_SYNC_LIMIT = 100;
|
|
9
9
|
// Number of times to retry an upload
|
|
10
|
-
export const DEFAULT_MAX_RETRY = 5
|
|
11
|
-
|
|
12
|
-
export const UPLOAD_RANDOM_FACTOR = 0.5
|
|
10
|
+
export const DEFAULT_MAX_RETRY = 5;
|
|
11
|
+
export const UPLOAD_RANDOM_FACTOR = 0.5;
|
|
13
12
|
// 5 seconds
|
|
14
|
-
export const UPLOAD_INITIAL_DELAY = 5000
|
|
13
|
+
export const UPLOAD_INITIAL_DELAY = 5000;
|
|
15
14
|
// 1.5 minute (90s)
|
|
16
|
-
export const UPLOAD_MAX_DELAY =
|
|
17
|
-
|
|
15
|
+
export const UPLOAD_MAX_DELAY = 90000;
|
|
18
16
|
// 1 second
|
|
19
|
-
export const DEPLOY_POLL = 1000
|
|
17
|
+
export const DEPLOY_POLL = 1000;
|
|
@@ -1,116 +1,104 @@
|
|
|
1
|
-
import { rm } from 'fs/promises'
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
DEFAULT_DEPLOY_TIMEOUT,
|
|
13
|
-
DEFAULT_MAX_RETRY,
|
|
14
|
-
DEFAULT_SYNC_LIMIT,
|
|
15
|
-
} from './constants.mjs'
|
|
16
|
-
import { hashConfig } from './hash-config.mjs'
|
|
17
|
-
import hashFiles from './hash-files.mjs'
|
|
18
|
-
import hashFns from './hash-fns.mjs'
|
|
19
|
-
import uploadFiles from './upload-files.mjs'
|
|
20
|
-
import { getUploadList, waitForDeploy, waitForDiff } from './util.mjs'
|
|
21
|
-
|
|
1
|
+
import { rm } from 'fs/promises';
|
|
2
|
+
import cleanDeep from 'clean-deep';
|
|
3
|
+
import { temporaryDirectory } from 'tempy';
|
|
4
|
+
import { deployFileNormalizer, getDistPathIfExists, isEdgeFunctionFile } from '../../lib/edge-functions/deploy.mjs';
|
|
5
|
+
import { warn } from '../command-helpers.mjs';
|
|
6
|
+
import { DEFAULT_CONCURRENT_HASH, DEFAULT_CONCURRENT_UPLOAD, DEFAULT_DEPLOY_TIMEOUT, DEFAULT_MAX_RETRY, DEFAULT_SYNC_LIMIT, } from './constants.mjs';
|
|
7
|
+
import { hashConfig } from './hash-config.mjs';
|
|
8
|
+
import hashFiles from './hash-files.mjs';
|
|
9
|
+
import hashFns from './hash-fns.mjs';
|
|
10
|
+
import uploadFiles from './upload-files.mjs';
|
|
11
|
+
import { getUploadList, waitForDeploy, waitForDiff } from './util.mjs';
|
|
22
12
|
export const deploySite = async (
|
|
23
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
configFile,
|
|
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
|
-
warn(`Modules with native dependencies\n
|
|
113
|
-
${functionsWithNativeModules.map(({ name }) => `- ${name}`).join('\n')}
|
|
13
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'api' implicitly has an 'any' type.
|
|
14
|
+
api,
|
|
15
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'siteId' implicitly has an 'any' type.
|
|
16
|
+
siteId,
|
|
17
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'dir' implicitly has an 'any' type.
|
|
18
|
+
dir, {
|
|
19
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
20
|
+
assetType,
|
|
21
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
22
|
+
branch, concurrentHash = DEFAULT_CONCURRENT_HASH, concurrentUpload = DEFAULT_CONCURRENT_UPLOAD,
|
|
23
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
24
|
+
config,
|
|
25
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
26
|
+
deployId, deployTimeout = DEFAULT_DEPLOY_TIMEOUT, draft = false,
|
|
27
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
28
|
+
filter, fnDir = [],
|
|
29
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
30
|
+
functionsConfig,
|
|
31
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
32
|
+
hashAlgorithm,
|
|
33
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
34
|
+
manifestPath, maxRetry = DEFAULT_MAX_RETRY,
|
|
35
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
36
|
+
siteEnv,
|
|
37
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
38
|
+
siteRoot,
|
|
39
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
40
|
+
skipFunctionsCache, statusCb = () => {
|
|
41
|
+
/* default to noop */
|
|
42
|
+
}, syncFileLimit = DEFAULT_SYNC_LIMIT, tmpDir = temporaryDirectory(),
|
|
43
|
+
// @ts-expect-error TS(2525) FIXME: Initializer provides no value for this binding ele... Remove this comment to see the full error message
|
|
44
|
+
workingDir, } = {}) => {
|
|
45
|
+
// @ts-expect-error TS(2554) FIXME: Expected 0 arguments, but got 1.
|
|
46
|
+
statusCb({
|
|
47
|
+
type: 'hashing',
|
|
48
|
+
msg: `Hashing files...`,
|
|
49
|
+
phase: 'start',
|
|
50
|
+
});
|
|
51
|
+
const edgeFunctionsDistPath = await getDistPathIfExists(workingDir);
|
|
52
|
+
const [{ files: staticFiles, filesShaMap: staticShaMap }, { fnConfig, fnShaMap, functionSchedules, functions, functionsWithNativeModules }, configFile,] = await Promise.all([
|
|
53
|
+
hashFiles({
|
|
54
|
+
assetType,
|
|
55
|
+
concurrentHash,
|
|
56
|
+
directories: [dir, edgeFunctionsDistPath].filter(Boolean),
|
|
57
|
+
filter,
|
|
58
|
+
hashAlgorithm,
|
|
59
|
+
normalizer: deployFileNormalizer.bind(null, workingDir),
|
|
60
|
+
statusCb,
|
|
61
|
+
}),
|
|
62
|
+
hashFns(fnDir, {
|
|
63
|
+
functionsConfig,
|
|
64
|
+
tmpDir,
|
|
65
|
+
concurrentHash,
|
|
66
|
+
hashAlgorithm,
|
|
67
|
+
statusCb,
|
|
68
|
+
assetType,
|
|
69
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{ functionsConfig: any; tmpDir: ... Remove this comment to see the full error message
|
|
70
|
+
workingDir,
|
|
71
|
+
manifestPath,
|
|
72
|
+
skipFunctionsCache,
|
|
73
|
+
siteEnv,
|
|
74
|
+
rootDir: siteRoot,
|
|
75
|
+
}),
|
|
76
|
+
hashConfig({ config }),
|
|
77
|
+
]);
|
|
78
|
+
const files = { ...staticFiles, [configFile.normalizedPath]: configFile.hash };
|
|
79
|
+
const filesShaMap = { ...staticShaMap, [configFile.hash]: [configFile] };
|
|
80
|
+
const edgeFunctionsCount = Object.keys(files).filter(isEdgeFunctionFile).length;
|
|
81
|
+
const filesCount = Object.keys(files).length - edgeFunctionsCount;
|
|
82
|
+
const functionsCount = Object.keys(functions).length;
|
|
83
|
+
const stats = buildStatsString([
|
|
84
|
+
filesCount > 0 && `${filesCount} files`,
|
|
85
|
+
functionsCount > 0 && `${functionsCount} functions`,
|
|
86
|
+
edgeFunctionsCount > 0 && 'edge functions',
|
|
87
|
+
]);
|
|
88
|
+
// @ts-expect-error TS(2554) FIXME: Expected 0 arguments, but got 1.
|
|
89
|
+
statusCb({
|
|
90
|
+
type: 'hashing',
|
|
91
|
+
msg: `Finished hashing ${stats}`,
|
|
92
|
+
phase: 'stop',
|
|
93
|
+
});
|
|
94
|
+
if (filesCount === 0 && functionsCount === 0) {
|
|
95
|
+
throw new Error('No files or functions to deploy');
|
|
96
|
+
}
|
|
97
|
+
if (functionsWithNativeModules.length !== 0) {
|
|
98
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'name' implicitly has an 'any' typ... Remove this comment to see the full error message
|
|
99
|
+
const functionsWithNativeModulesMessage = functionsWithNativeModules.map(({ name }) => `- ${name}`).join('\n');
|
|
100
|
+
warn(`Modules with native dependencies\n
|
|
101
|
+
${functionsWithNativeModulesMessage}
|
|
114
102
|
|
|
115
103
|
The serverless functions above use Node.js modules with native dependencies, which
|
|
116
104
|
must be installed on a system with the same architecture as the function runtime. A
|
|
@@ -118,74 +106,66 @@ mismatch in the system and runtime may lead to errors when invoking your functio
|
|
|
118
106
|
To ensure your functions work as expected, we recommend using continuous deployment
|
|
119
107
|
instead of manual deployment.
|
|
120
108
|
|
|
121
|
-
For more information, visit https://ntl.fyi/cli-native-modules.`)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
deployId,
|
|
180
|
-
deploy,
|
|
181
|
-
uploadList,
|
|
182
|
-
}
|
|
183
|
-
return deployManifest
|
|
184
|
-
}
|
|
185
|
-
|
|
109
|
+
For more information, visit https://ntl.fyi/cli-native-modules.`);
|
|
110
|
+
}
|
|
111
|
+
// @ts-expect-error TS(2554) FIXME: Expected 0 arguments, but got 1.
|
|
112
|
+
statusCb({
|
|
113
|
+
type: 'create-deploy',
|
|
114
|
+
msg: 'CDN diffing files...',
|
|
115
|
+
phase: 'start',
|
|
116
|
+
});
|
|
117
|
+
// @ts-expect-error TS(2349) This expression is not callable
|
|
118
|
+
const deployParams = cleanDeep({
|
|
119
|
+
siteId,
|
|
120
|
+
deploy_id: deployId,
|
|
121
|
+
body: {
|
|
122
|
+
files,
|
|
123
|
+
functions,
|
|
124
|
+
function_schedules: functionSchedules,
|
|
125
|
+
functions_config: fnConfig,
|
|
126
|
+
async: Object.keys(files).length > syncFileLimit,
|
|
127
|
+
branch,
|
|
128
|
+
draft,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
let deploy = await api.updateSiteDeploy(deployParams);
|
|
132
|
+
if (deployParams.body.async)
|
|
133
|
+
deploy = await waitForDiff(api, deploy.id, siteId, deployTimeout);
|
|
134
|
+
const { required: requiredFiles, required_functions: requiredFns } = deploy;
|
|
135
|
+
// @ts-expect-error TS(2554) FIXME: Expected 0 arguments, but got 1.
|
|
136
|
+
statusCb({
|
|
137
|
+
type: 'create-deploy',
|
|
138
|
+
msg: `CDN requesting ${requiredFiles.length} files${Array.isArray(requiredFns) ? ` and ${requiredFns.length} functions` : ''}`,
|
|
139
|
+
phase: 'stop',
|
|
140
|
+
});
|
|
141
|
+
const filesUploadList = getUploadList(requiredFiles, filesShaMap);
|
|
142
|
+
const functionsUploadList = getUploadList(requiredFns, fnShaMap);
|
|
143
|
+
const uploadList = [...filesUploadList, ...functionsUploadList];
|
|
144
|
+
await uploadFiles(api, deployId, uploadList, { concurrentUpload, statusCb, maxRetry });
|
|
145
|
+
// @ts-expect-error TS(2554) FIXME: Expected 0 arguments, but got 1.
|
|
146
|
+
statusCb({
|
|
147
|
+
type: 'wait-for-deploy',
|
|
148
|
+
msg: 'Waiting for deploy to go live...',
|
|
149
|
+
phase: 'start',
|
|
150
|
+
});
|
|
151
|
+
deploy = await waitForDeploy(api, deployId, siteId, deployTimeout);
|
|
152
|
+
// @ts-expect-error TS(2554) FIXME: Expected 0 arguments, but got 1.
|
|
153
|
+
statusCb({
|
|
154
|
+
type: 'wait-for-deploy',
|
|
155
|
+
msg: draft ? 'Draft deploy is live!' : 'Deploy is live!',
|
|
156
|
+
phase: 'stop',
|
|
157
|
+
});
|
|
158
|
+
await rm(tmpDir, { force: true, recursive: true });
|
|
159
|
+
const deployManifest = {
|
|
160
|
+
deployId,
|
|
161
|
+
deploy,
|
|
162
|
+
uploadList,
|
|
163
|
+
};
|
|
164
|
+
return deployManifest;
|
|
165
|
+
};
|
|
166
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'possibleParts' implicitly has an 'any' ... Remove this comment to see the full error message
|
|
186
167
|
const buildStatsString = (possibleParts) => {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
168
|
+
const parts = possibleParts.filter(Boolean);
|
|
169
|
+
const message = parts.slice(0, -1).join(', ');
|
|
170
|
+
return parts.length > 1 ? `${message} and ${parts[parts.length - 1]}` : message;
|
|
171
|
+
};
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
import hasha from 'hasha'
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import hasha from 'hasha';
|
|
2
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'toml... Remove this comment to see the full error message
|
|
3
|
+
import tomlify from 'tomlify-j0.4';
|
|
4
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'config' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
4
5
|
export const hashConfig = ({ config }) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
if (!config)
|
|
7
|
+
throw new Error('Missing config option');
|
|
8
|
+
const configString = serializeToml(config);
|
|
9
|
+
const hash = hasha(configString, { algorithm: 'sha1' });
|
|
10
|
+
return {
|
|
11
|
+
assetType: 'file',
|
|
12
|
+
body: configString,
|
|
13
|
+
hash,
|
|
14
|
+
normalizedPath: 'netlify.toml',
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'object' implicitly has an 'any' type.
|
|
18
18
|
export const serializeToml = function (object) {
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
19
|
+
return tomlify.toToml(object, { space: 2, replace: replaceTomlValue });
|
|
20
|
+
};
|
|
22
21
|
// `tomlify-j0.4` serializes integers as floats, e.g. `200.0`.
|
|
23
22
|
// This is a problem with `redirects[*].status`.
|
|
23
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'key' implicitly has an 'any' type.
|
|
24
24
|
const replaceTomlValue = function (key, value) {
|
|
25
|
-
|
|
26
|
-
}
|
|
25
|
+
return Number.isInteger(value) ? String(value) : false;
|
|
26
|
+
};
|
|
@@ -1,38 +1,34 @@
|
|
|
1
|
-
import { promisify } from 'util'
|
|
2
|
-
|
|
3
|
-
import walker from 'folder-walker'
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { fileFilterCtor, fileNormalizerCtor, hasherCtor, manifestCollectorCtor } from './hasher-segments.mjs'
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return { files, filesShaMap }
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export default hashFiles
|
|
1
|
+
import { promisify } from 'util';
|
|
2
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'fold... Remove this comment to see the full error message
|
|
3
|
+
import walker from 'folder-walker';
|
|
4
|
+
// @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'pump... Remove this comment to see the full error message
|
|
5
|
+
import pumpModule from 'pump';
|
|
6
|
+
import { fileFilterCtor, fileNormalizerCtor, hasherCtor, manifestCollectorCtor } from './hasher-segments.mjs';
|
|
7
|
+
const pump = promisify(pumpModule);
|
|
8
|
+
const hashFiles = async ({ assetType = 'file',
|
|
9
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'concurrentHash' implicitly has an... Remove this comment to see the full error message
|
|
10
|
+
concurrentHash,
|
|
11
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'directories' implicitly has an 'a... Remove this comment to see the full error message
|
|
12
|
+
directories,
|
|
13
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'filter' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
14
|
+
filter, hashAlgorithm = 'sha1',
|
|
15
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'normalizer' implicitly has an 'an... Remove this comment to see the full error message
|
|
16
|
+
normalizer,
|
|
17
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'statusCb' implicitly has an 'any'... Remove this comment to see the full error message
|
|
18
|
+
statusCb, }) => {
|
|
19
|
+
if (!filter)
|
|
20
|
+
throw new Error('Missing filter function option');
|
|
21
|
+
const fileStream = walker(directories, { filter });
|
|
22
|
+
const fileFilter = fileFilterCtor();
|
|
23
|
+
const hasher = hasherCtor({ concurrentHash, hashAlgorithm });
|
|
24
|
+
const fileNormalizer = fileNormalizerCtor({ assetType, normalizer });
|
|
25
|
+
// Written to by manifestCollector
|
|
26
|
+
// normalizedPath: hash (wanted by deploy API)
|
|
27
|
+
const files = {};
|
|
28
|
+
// hash: [fileObj, fileObj, fileObj]
|
|
29
|
+
const filesShaMap = {};
|
|
30
|
+
const manifestCollector = manifestCollectorCtor(files, filesShaMap, { statusCb, assetType });
|
|
31
|
+
await pump(fileStream, fileFilter, hasher, fileNormalizer, manifestCollector);
|
|
32
|
+
return { files, filesShaMap };
|
|
33
|
+
};
|
|
34
|
+
export default hashFiles;
|