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
|
@@ -1,265 +1,285 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import { BACKGROUND } from '../../utils/functions/get-functions.mjs'
|
|
11
|
-
|
|
12
|
-
const TYPESCRIPT_EXTENSIONS = new Set(['.cts', '.mts', '.ts'])
|
|
13
|
-
const V2_MIN_NODE_VERSION = '18.14.0'
|
|
14
|
-
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { basename, extname } from 'path';
|
|
3
|
+
import { version as nodeVersion } from 'process';
|
|
4
|
+
import CronParser from 'cron-parser';
|
|
5
|
+
import semver from 'semver';
|
|
6
|
+
import { error as errorExit } from '../../utils/command-helpers.mjs';
|
|
7
|
+
import { BACKGROUND } from '../../utils/functions/get-functions.mjs';
|
|
8
|
+
const TYPESCRIPT_EXTENSIONS = new Set(['.cts', '.mts', '.ts']);
|
|
9
|
+
const V2_MIN_NODE_VERSION = '18.14.0';
|
|
15
10
|
// Returns a new set with all elements of `setA` that don't exist in `setB`.
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'setA' implicitly has an 'any' type.
|
|
12
|
+
const difference = (setA, setB) => new Set([...setA].filter((item) => !setB.has(item)));
|
|
13
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'schedule' implicitly has an 'any' type.
|
|
18
14
|
const getNextRun = function (schedule) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
15
|
+
const cron = CronParser.parseExpression(schedule, {
|
|
16
|
+
tz: 'Etc/UTC',
|
|
17
|
+
});
|
|
18
|
+
return cron.next().toDate();
|
|
19
|
+
};
|
|
25
20
|
export default class NetlifyFunction {
|
|
26
|
-
|
|
27
|
-
blobsContext
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this
|
|
40
|
-
|
|
41
|
-
this
|
|
42
|
-
|
|
43
|
-
this
|
|
44
|
-
|
|
45
|
-
this
|
|
46
|
-
|
|
47
|
-
this
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
21
|
+
constructor({
|
|
22
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'blobsContext' implicitly has an '... Remove this comment to see the full error message
|
|
23
|
+
blobsContext,
|
|
24
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'config' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
25
|
+
config,
|
|
26
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'directory' implicitly has an 'any... Remove this comment to see the full error message
|
|
27
|
+
directory,
|
|
28
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'displayName' implicitly has an 'a... Remove this comment to see the full error message
|
|
29
|
+
displayName,
|
|
30
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'mainFile' implicitly has an 'any'... Remove this comment to see the full error message
|
|
31
|
+
mainFile,
|
|
32
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'name' implicitly has an 'any' typ... Remove this comment to see the full error message
|
|
33
|
+
name,
|
|
34
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'projectRoot' implicitly has an 'a... Remove this comment to see the full error message
|
|
35
|
+
projectRoot,
|
|
36
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'runtime' implicitly has an 'any' ... Remove this comment to see the full error message
|
|
37
|
+
runtime,
|
|
38
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'settings' implicitly has an 'any'... Remove this comment to see the full error message
|
|
39
|
+
settings,
|
|
40
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'timeoutBackground' implicitly has... Remove this comment to see the full error message
|
|
41
|
+
timeoutBackground,
|
|
42
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'timeoutSynchronous' implicitly ha... Remove this comment to see the full error message
|
|
43
|
+
timeoutSynchronous, }) {
|
|
44
|
+
// @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
|
|
45
|
+
this.blobsContext = blobsContext;
|
|
46
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
47
|
+
this.buildError = null;
|
|
48
|
+
// @ts-expect-error TS(2339) FIXME: Property 'config' does not exist on type 'NetlifyF... Remove this comment to see the full error message
|
|
49
|
+
this.config = config;
|
|
50
|
+
// @ts-expect-error TS(2339) FIXME: Property 'directory' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
51
|
+
this.directory = directory;
|
|
52
|
+
// @ts-expect-error TS(2339) FIXME: Property 'errorExit' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
53
|
+
this.errorExit = errorExit;
|
|
54
|
+
// @ts-expect-error TS(2339) FIXME: Property 'mainFile' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
55
|
+
this.mainFile = mainFile;
|
|
56
|
+
// @ts-expect-error TS(2339) FIXME: Property 'name' does not exist on type 'NetlifyFun... Remove this comment to see the full error message
|
|
57
|
+
this.name = name;
|
|
58
|
+
// @ts-expect-error TS(2339) FIXME: Property 'displayName' does not exist on type 'Net... Remove this comment to see the full error message
|
|
59
|
+
this.displayName = displayName ?? name;
|
|
60
|
+
// @ts-expect-error TS(2339) FIXME: Property 'projectRoot' does not exist on type 'Net... Remove this comment to see the full error message
|
|
61
|
+
this.projectRoot = projectRoot;
|
|
62
|
+
// @ts-expect-error TS(2339) FIXME: Property 'runtime' does not exist on type 'Netlify... Remove this comment to see the full error message
|
|
63
|
+
this.runtime = runtime;
|
|
64
|
+
// @ts-expect-error TS(2339) FIXME: Property 'timeoutBackground' does not exist on typ... Remove this comment to see the full error message
|
|
65
|
+
this.timeoutBackground = timeoutBackground;
|
|
66
|
+
// @ts-expect-error TS(2339) FIXME: Property 'timeoutSynchronous' does not exist on ty... Remove this comment to see the full error message
|
|
67
|
+
this.timeoutSynchronous = timeoutSynchronous;
|
|
68
|
+
// @ts-expect-error TS(2339) FIXME: Property 'settings' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
69
|
+
this.settings = settings;
|
|
70
|
+
// Determines whether this is a background function based on the function
|
|
71
|
+
// name.
|
|
72
|
+
// @ts-expect-error TS(2339) FIXME: Property 'isBackground' does not exist on type 'Ne... Remove this comment to see the full error message
|
|
73
|
+
this.isBackground = name.endsWith(BACKGROUND);
|
|
74
|
+
const functionConfig = config.functions && config.functions[name];
|
|
75
|
+
// @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
76
|
+
this.schedule = functionConfig && functionConfig.schedule;
|
|
77
|
+
// List of the function's source files. This starts out as an empty set
|
|
78
|
+
// and will get populated on every build.
|
|
79
|
+
// @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
80
|
+
this.srcFiles = new Set();
|
|
81
|
+
}
|
|
82
|
+
get filename() {
|
|
83
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
84
|
+
if (!this.buildData?.mainFile) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
88
|
+
return basename(this.buildData.mainFile);
|
|
89
|
+
}
|
|
90
|
+
getRecommendedExtension() {
|
|
91
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
92
|
+
if (this.buildData?.runtimeAPIVersion !== 2) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
96
|
+
const extension = this.buildData?.mainFile ? extname(this.buildData.mainFile) : undefined;
|
|
97
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
98
|
+
const moduleFormat = this.buildData?.outputModuleFormat;
|
|
99
|
+
if (moduleFormat === 'esm') {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (extension === '.ts') {
|
|
103
|
+
return '.mts';
|
|
104
|
+
}
|
|
105
|
+
if (extension === '.js') {
|
|
106
|
+
return '.mjs';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
hasValidName() {
|
|
110
|
+
// same as https://github.com/netlify/bitballoon/blob/fbd7881e6c8e8c48e7a0145da4ee26090c794108/app/models/deploy.rb#L482
|
|
111
|
+
// @ts-expect-error TS(2339) FIXME: Property 'name' does not exist on type 'NetlifyFun... Remove this comment to see the full error message
|
|
112
|
+
// eslint-disable-next-line unicorn/better-regex
|
|
113
|
+
return /^[A-Za-z0-9_-]+$/.test(this.name);
|
|
68
114
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (this.buildData?.runtimeAPIVersion !== 2) {
|
|
75
|
-
return
|
|
115
|
+
async isScheduled() {
|
|
116
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
117
|
+
await this.buildQueue;
|
|
118
|
+
// @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
119
|
+
return Boolean(this.schedule);
|
|
76
120
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (moduleFormat === 'esm') {
|
|
82
|
-
return
|
|
121
|
+
isSupported() {
|
|
122
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
123
|
+
return !(this.buildData?.runtimeAPIVersion === 2 && semver.lt(nodeVersion, V2_MIN_NODE_VERSION));
|
|
83
124
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
125
|
+
isTypeScript() {
|
|
126
|
+
if (this.filename === null) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
return TYPESCRIPT_EXTENSIONS.has(extname(this.filename));
|
|
87
130
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
131
|
+
async getNextRun() {
|
|
132
|
+
if (!(await this.isScheduled())) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
// @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
136
|
+
return getNextRun(this.schedule);
|
|
91
137
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
138
|
+
// The `build` method transforms source files into invocable functions. Its
|
|
139
|
+
// return value is an object with:
|
|
140
|
+
//
|
|
141
|
+
// - `srcFilesDiff`: Files that were added and removed since the last time
|
|
142
|
+
// the function was built.
|
|
143
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'cache' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
144
|
+
async build({ cache }) {
|
|
145
|
+
// @ts-expect-error TS(2339) FIXME: Property 'runtime' does not exist on type 'Netlify... Remove this comment to see the full error message
|
|
146
|
+
const buildFunction = await this.runtime.getBuildFunction({
|
|
147
|
+
// @ts-expect-error TS(2339) FIXME: Property 'config' does not exist on type 'NetlifyF... Remove this comment to see the full error message
|
|
148
|
+
config: this.config,
|
|
149
|
+
// @ts-expect-error TS(2339) FIXME: Property 'directory' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
150
|
+
directory: this.directory,
|
|
151
|
+
// @ts-expect-error TS(2339) FIXME: Property 'errorExit' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
152
|
+
errorExit: this.errorExit,
|
|
153
|
+
func: this,
|
|
154
|
+
// @ts-expect-error TS(2339) FIXME: Property 'projectRoot' does not exist on type 'Net... Remove this comment to see the full error message
|
|
155
|
+
projectRoot: this.projectRoot,
|
|
156
|
+
});
|
|
157
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
158
|
+
this.buildQueue = buildFunction({ cache });
|
|
159
|
+
try {
|
|
160
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
161
|
+
const { includedFiles = [], schedule, srcFiles, ...buildData } = await this.buildQueue;
|
|
162
|
+
const srcFilesSet = new Set(srcFiles);
|
|
163
|
+
const srcFilesDiff = this.getSrcFilesDiff(srcFilesSet);
|
|
164
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
165
|
+
this.buildData = buildData;
|
|
166
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
167
|
+
this.buildError = null;
|
|
168
|
+
// @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
169
|
+
this.srcFiles = srcFilesSet;
|
|
170
|
+
// @ts-expect-error TS(2339) FIXME: Property 'schedule' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
171
|
+
this.schedule = schedule || this.schedule;
|
|
172
|
+
if (!this.isSupported()) {
|
|
173
|
+
throw new Error(`Function requires Node.js version ${V2_MIN_NODE_VERSION} or above, but ${nodeVersion.slice(1)} is installed. Refer to https://ntl.fyi/functions-runtime for information on how to update.`);
|
|
174
|
+
}
|
|
175
|
+
return { includedFiles, srcFilesDiff };
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
179
|
+
this.buildError = error;
|
|
180
|
+
return { error };
|
|
181
|
+
}
|
|
113
182
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (!(await this.isScheduled())) {
|
|
120
|
-
return null
|
|
183
|
+
async getBuildData() {
|
|
184
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
185
|
+
await this.buildQueue;
|
|
186
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
187
|
+
return this.buildData;
|
|
121
188
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
directory: this.directory,
|
|
135
|
-
errorExit: this.errorExit,
|
|
136
|
-
func: this,
|
|
137
|
-
projectRoot: this.projectRoot,
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
this.buildQueue = buildFunction({ cache })
|
|
141
|
-
|
|
142
|
-
try {
|
|
143
|
-
const { includedFiles = [], schedule, srcFiles, ...buildData } = await this.buildQueue
|
|
144
|
-
const srcFilesSet = new Set(srcFiles)
|
|
145
|
-
const srcFilesDiff = this.getSrcFilesDiff(srcFilesSet)
|
|
146
|
-
|
|
147
|
-
this.buildData = buildData
|
|
148
|
-
this.buildError = null
|
|
149
|
-
this.srcFiles = srcFilesSet
|
|
150
|
-
this.schedule = schedule || this.schedule
|
|
151
|
-
|
|
152
|
-
if (!this.isSupported()) {
|
|
153
|
-
throw new Error(
|
|
154
|
-
`Function requires Node.js version ${V2_MIN_NODE_VERSION} or above, but ${nodeVersion.slice(
|
|
155
|
-
1,
|
|
156
|
-
)} is installed. Refer to https://ntl.fyi/functions-runtime for information on how to update.`,
|
|
157
|
-
)
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return { includedFiles, srcFilesDiff }
|
|
161
|
-
} catch (error) {
|
|
162
|
-
this.buildError = error
|
|
163
|
-
|
|
164
|
-
return { error }
|
|
189
|
+
// Compares a new set of source files against a previous one, returning an
|
|
190
|
+
// object with two Sets, one with added and the other with deleted files.
|
|
191
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'newSrcFiles' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
192
|
+
getSrcFilesDiff(newSrcFiles) {
|
|
193
|
+
// @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
194
|
+
const added = difference(newSrcFiles, this.srcFiles);
|
|
195
|
+
// @ts-expect-error TS(2339) FIXME: Property 'srcFiles' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
196
|
+
const deleted = difference(this.srcFiles, newSrcFiles);
|
|
197
|
+
return {
|
|
198
|
+
added,
|
|
199
|
+
deleted,
|
|
200
|
+
};
|
|
165
201
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
202
|
+
// Invokes the function and returns its response object.
|
|
203
|
+
async invoke(event = {}, context = {}) {
|
|
204
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
205
|
+
await this.buildQueue;
|
|
206
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
207
|
+
if (this.buildError) {
|
|
208
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildError' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
209
|
+
return { result: null, error: { errorMessage: this.buildError.message } };
|
|
210
|
+
}
|
|
211
|
+
// @ts-expect-error TS(2339) FIXME: Property 'isBackground' does not exist on type 'Ne... Remove this comment to see the full error message
|
|
212
|
+
const timeout = this.isBackground ? this.timeoutBackground : this.timeoutSynchronous;
|
|
213
|
+
const environment = {};
|
|
214
|
+
// @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
|
|
215
|
+
if (this.blobsContext) {
|
|
216
|
+
const payload = JSON.stringify({
|
|
217
|
+
// @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
|
|
218
|
+
url: this.blobsContext.edgeURL,
|
|
219
|
+
// @ts-expect-error TS(2339) FIXME: Property 'blobsContext' does not exist on type 'Ne... Remove this comment to see the full error message
|
|
220
|
+
token: this.blobsContext.token,
|
|
221
|
+
});
|
|
222
|
+
// @ts-expect-error TS(2339) FIXME: Property 'blobs' does not exist on type '{}'.
|
|
223
|
+
event.blobs = Buffer.from(payload).toString('base64');
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
// @ts-expect-error TS(2339) FIXME: Property 'runtime' does not exist on type 'Netlify... Remove this comment to see the full error message
|
|
227
|
+
const result = await this.runtime.invokeFunction({
|
|
228
|
+
context,
|
|
229
|
+
environment,
|
|
230
|
+
event,
|
|
231
|
+
func: this,
|
|
232
|
+
timeout,
|
|
233
|
+
});
|
|
234
|
+
return { result, error: null };
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
return { result: null, error };
|
|
238
|
+
}
|
|
183
239
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
240
|
+
/**
|
|
241
|
+
* Matches all routes agains the incoming request. If a match is found, then the matched route is returned.
|
|
242
|
+
* @param {string} rawPath
|
|
243
|
+
* @param {string} method
|
|
244
|
+
* @returns matched route
|
|
245
|
+
*/
|
|
246
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'rawPath' implicitly has an 'any' type.
|
|
247
|
+
async matchURLPath(rawPath, method) {
|
|
248
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildQueue' does not exist on type 'Netl... Remove this comment to see the full error message
|
|
249
|
+
await this.buildQueue;
|
|
250
|
+
let path = rawPath !== '/' && rawPath.endsWith('/') ? rawPath.slice(0, -1) : rawPath;
|
|
251
|
+
path = path.toLowerCase();
|
|
252
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
253
|
+
const { routes = [] } = this.buildData;
|
|
254
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'expression' implicitly has an 'an... Remove this comment to see the full error message
|
|
255
|
+
return routes.find(({ expression, literal, methods }) => {
|
|
256
|
+
if (methods.length !== 0 && !methods.includes(method)) {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
if (literal !== undefined) {
|
|
260
|
+
return path === literal;
|
|
261
|
+
}
|
|
262
|
+
if (expression !== undefined) {
|
|
263
|
+
const regex = new RegExp(expression);
|
|
264
|
+
return regex.test(path);
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
});
|
|
192
268
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (this.blobsContext) {
|
|
198
|
-
const payload = JSON.stringify({
|
|
199
|
-
url: this.blobsContext.edgeURL,
|
|
200
|
-
token: this.blobsContext.token,
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
event.blobs = Buffer.from(payload).toString('base64')
|
|
269
|
+
get runtimeAPIVersion() {
|
|
270
|
+
// @ts-expect-error TS(2339) FIXME: Property 'buildData' does not exist on type 'Netli... Remove this comment to see the full error message
|
|
271
|
+
return this.buildData?.runtimeAPIVersion ?? 1;
|
|
204
272
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return { result: null, error }
|
|
273
|
+
get url() {
|
|
274
|
+
// This line fixes the issue here https://github.com/netlify/cli/issues/4116
|
|
275
|
+
// Not sure why `settings.port` was used here nor does a valid reference exist.
|
|
276
|
+
// However, it remains here to serve whatever purpose for which it was added.
|
|
277
|
+
// @ts-expect-error TS(2339) FIXME: Property 'settings' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
278
|
+
const port = this.settings.port || this.settings.functionsPort;
|
|
279
|
+
// @ts-expect-error TS(2339) FIXME: Property 'settings' does not exist on type 'Netlif... Remove this comment to see the full error message
|
|
280
|
+
const protocol = this.settings.https ? 'https' : 'http';
|
|
281
|
+
// @ts-expect-error TS(2339) FIXME: Property 'name' does not exist on type 'NetlifyFun... Remove this comment to see the full error message
|
|
282
|
+
const url = new URL(`/.netlify/functions/${this.name}`, `${protocol}://localhost:${port}`);
|
|
283
|
+
return url.href;
|
|
217
284
|
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Matches all routes agains the incoming request. If a match is found, then the matched route is returned.
|
|
222
|
-
* @param {string} rawPath
|
|
223
|
-
* @param {string} method
|
|
224
|
-
* @returns matched route
|
|
225
|
-
*/
|
|
226
|
-
async matchURLPath(rawPath, method) {
|
|
227
|
-
await this.buildQueue
|
|
228
|
-
|
|
229
|
-
let path = rawPath !== '/' && rawPath.endsWith('/') ? rawPath.slice(0, -1) : rawPath
|
|
230
|
-
path = path.toLowerCase()
|
|
231
|
-
const { routes = [] } = this.buildData
|
|
232
|
-
return routes.find(({ expression, literal, methods }) => {
|
|
233
|
-
if (methods.length !== 0 && !methods.includes(method)) {
|
|
234
|
-
return false
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
if (literal !== undefined) {
|
|
238
|
-
return path === literal
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if (expression !== undefined) {
|
|
242
|
-
const regex = new RegExp(expression)
|
|
243
|
-
|
|
244
|
-
return regex.test(path)
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return false
|
|
248
|
-
})
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
get runtimeAPIVersion() {
|
|
252
|
-
return this.buildData?.runtimeAPIVersion ?? 1
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
get url() {
|
|
256
|
-
// This line fixes the issue here https://github.com/netlify/cli/issues/4116
|
|
257
|
-
// Not sure why `settings.port` was used here nor does a valid reference exist.
|
|
258
|
-
// However, it remains here to serve whatever purpose for which it was added.
|
|
259
|
-
const port = this.settings.port || this.settings.functionsPort
|
|
260
|
-
const protocol = this.settings.https ? 'https' : 'http'
|
|
261
|
-
const url = new URL(`/.netlify/functions/${this.name}`, `${protocol}://localhost:${port}`)
|
|
262
|
-
|
|
263
|
-
return url.href
|
|
264
|
-
}
|
|
265
285
|
}
|