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,67 +1,59 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { join, resolve } from 'path'
|
|
5
|
-
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { rm } from 'fs/promises';
|
|
3
|
+
import { join, resolve } from 'path';
|
|
6
4
|
// eslint-disable-next-line import/no-namespace
|
|
7
|
-
import * as bundler from '@netlify/edge-bundler'
|
|
8
|
-
import getAvailablePort from 'get-port'
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const headersSymbol = Symbol('Edge Functions Headers')
|
|
22
|
-
|
|
23
|
-
const LOCAL_HOST = '127.0.0.1'
|
|
24
|
-
|
|
5
|
+
import * as bundler from '@netlify/edge-bundler';
|
|
6
|
+
import getAvailablePort from 'get-port';
|
|
7
|
+
import { NETLIFYDEVERR, chalk, error as printError } from '../../utils/command-helpers.mjs';
|
|
8
|
+
import { getGeoLocation } from '../geo-location.mjs';
|
|
9
|
+
import { getPathInProject } from '../settings.mjs';
|
|
10
|
+
import { startSpinner, stopSpinner } from '../spinner.mjs';
|
|
11
|
+
import { getBootstrapURL } from './bootstrap.mjs';
|
|
12
|
+
import { DIST_IMPORT_MAP_PATH, EDGE_FUNCTIONS_SERVE_FOLDER } from './consts.mjs';
|
|
13
|
+
import { headers, getFeatureFlagsHeader, getInvocationMetadataHeader } from './headers.mjs';
|
|
14
|
+
import { getInternalFunctions } from './internal.mjs';
|
|
15
|
+
import { EdgeFunctionsRegistry } from './registry.mjs';
|
|
16
|
+
const headersSymbol = Symbol('Edge Functions Headers');
|
|
17
|
+
const LOCAL_HOST = '127.0.0.1';
|
|
25
18
|
const getDownloadUpdateFunctions = () => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
19
|
+
// @ts-expect-error TS(7034) FIXME: Variable 'spinner' implicitly has type 'any' in so... Remove this comment to see the full error message
|
|
20
|
+
let spinner;
|
|
21
|
+
/**
|
|
22
|
+
* @param {Error=} error_
|
|
23
|
+
*/
|
|
24
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'error_' implicitly has an 'any' type.
|
|
25
|
+
const onAfterDownload = (error_) => {
|
|
26
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{ error: boolean; spinner: any; ... Remove this comment to see the full error message
|
|
27
|
+
stopSpinner({ error: Boolean(error_), spinner });
|
|
28
|
+
};
|
|
29
|
+
const onBeforeDownload = () => {
|
|
30
|
+
spinner = startSpinner({ text: 'Setting up the Edge Functions environment. This may take a couple of minutes.' });
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
onAfterDownload,
|
|
34
|
+
onBeforeDownload,
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'req' implicitly has an 'any' type.
|
|
45
38
|
export const handleProxyRequest = (req, proxyReq) => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
39
|
+
Object.entries(req[headersSymbol]).forEach(([header, value]) => {
|
|
40
|
+
proxyReq.setHeader(header, value);
|
|
41
|
+
});
|
|
42
|
+
};
|
|
51
43
|
export const createSiteInfoHeader = (siteInfo = {}) => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
44
|
+
// @ts-expect-error TS(2339) FIXME: Property 'id' does not exist on type '{}'.
|
|
45
|
+
const { id, name, url } = siteInfo;
|
|
46
|
+
const site = { id, name, url };
|
|
47
|
+
const siteString = JSON.stringify(site);
|
|
48
|
+
return Buffer.from(siteString).toString('base64');
|
|
49
|
+
};
|
|
58
50
|
export const createAccountInfoHeader = (accountInfo = {}) => {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
51
|
+
// @ts-expect-error TS(2339) FIXME: Property 'id' does not exist on type '{}'.
|
|
52
|
+
const { id } = accountInfo;
|
|
53
|
+
const account = { id };
|
|
54
|
+
const accountString = JSON.stringify(account);
|
|
55
|
+
return Buffer.from(accountString).toString('base64');
|
|
56
|
+
};
|
|
65
57
|
/**
|
|
66
58
|
*
|
|
67
59
|
* @param {object} config
|
|
@@ -84,174 +76,183 @@ export const createAccountInfoHeader = (accountInfo = {}) => {
|
|
|
84
76
|
* @param {*} config.state
|
|
85
77
|
* @returns
|
|
86
78
|
*/
|
|
87
|
-
export const initializeProxy = async ({
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
79
|
+
export const initializeProxy = async ({
|
|
80
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'accountId' implicitly has an 'any... Remove this comment to see the full error message
|
|
81
|
+
accountId,
|
|
82
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'blobsContext' implicitly has an '... Remove this comment to see the full error message
|
|
83
|
+
blobsContext,
|
|
84
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'config' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
85
|
+
config,
|
|
86
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'configPath' implicitly has an 'an... Remove this comment to see the full error message
|
|
87
|
+
configPath,
|
|
88
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'debug' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
89
|
+
debug,
|
|
90
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'configEnv' implicitly has an 'any... Remove this comment to see the full error message
|
|
91
|
+
env: configEnv,
|
|
92
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'geoCountry' implicitly has an 'an... Remove this comment to see the full error message
|
|
93
|
+
geoCountry,
|
|
94
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'geolocationMode' implicitly has a... Remove this comment to see the full error message
|
|
95
|
+
geolocationMode,
|
|
96
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'getUpdatedConfig' implicitly has ... Remove this comment to see the full error message
|
|
97
|
+
getUpdatedConfig,
|
|
98
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'inspectSettings' implicitly has a... Remove this comment to see the full error message
|
|
99
|
+
inspectSettings,
|
|
100
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'mainPort' implicitly has an 'any'... Remove this comment to see the full error message
|
|
101
|
+
mainPort,
|
|
102
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'offline' implicitly has an 'any' ... Remove this comment to see the full error message
|
|
103
|
+
offline,
|
|
104
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'passthroughPort' implicitly has a... Remove this comment to see the full error message
|
|
105
|
+
passthroughPort,
|
|
106
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'projectDir' implicitly has an 'an... Remove this comment to see the full error message
|
|
107
|
+
projectDir,
|
|
108
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'repositoryRoot' implicitly has an... Remove this comment to see the full error message
|
|
109
|
+
repositoryRoot,
|
|
110
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'settings' implicitly has an 'any'... Remove this comment to see the full error message
|
|
111
|
+
settings,
|
|
112
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'siteInfo' implicitly has an 'any'... Remove this comment to see the full error message
|
|
113
|
+
siteInfo,
|
|
114
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'state' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
115
|
+
state, }) => {
|
|
116
|
+
const { functions: internalFunctions,
|
|
117
|
+
// @ts-expect-error TS(2339) FIXME: Property 'importMap' does not exist on type '{ fun... Remove this comment to see the full error message
|
|
118
|
+
importMap, path: internalFunctionsPath, } = await getInternalFunctions(projectDir);
|
|
119
|
+
const userFunctionsPath = config.build.edge_functions;
|
|
120
|
+
const isolatePort = await getAvailablePort();
|
|
121
|
+
const buildFeatureFlags = {
|
|
122
|
+
edge_functions_npm_modules: true,
|
|
123
|
+
};
|
|
124
|
+
const runtimeFeatureFlags = ['edge_functions_bootstrap_failure_mode'];
|
|
125
|
+
// Initializes the server, bootstrapping the Deno CLI and downloading it from
|
|
126
|
+
// the network if needed. We don't want to wait for that to be completed, or
|
|
127
|
+
// the command will be left hanging.
|
|
128
|
+
const server = prepareServer({
|
|
129
|
+
config,
|
|
130
|
+
configPath,
|
|
131
|
+
debug,
|
|
132
|
+
directory: userFunctionsPath,
|
|
133
|
+
env: configEnv,
|
|
134
|
+
featureFlags: buildFeatureFlags,
|
|
135
|
+
getUpdatedConfig,
|
|
136
|
+
importMaps: [importMap].filter(Boolean),
|
|
137
|
+
inspectSettings,
|
|
138
|
+
internalDirectory: internalFunctionsPath,
|
|
139
|
+
internalFunctions,
|
|
140
|
+
port: isolatePort,
|
|
141
|
+
projectDir,
|
|
142
|
+
repositoryRoot,
|
|
143
|
+
});
|
|
144
|
+
const hasEdgeFunctions = userFunctionsPath !== undefined || internalFunctionsPath;
|
|
145
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'req' implicitly has an 'any' type.
|
|
146
|
+
return async (req) => {
|
|
147
|
+
if (req.headers[headers.Passthrough] !== undefined || !hasEdgeFunctions) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const [geoLocation, registry] = await Promise.all([
|
|
151
|
+
getGeoLocation({ mode: geolocationMode, geoCountry, offline, state }),
|
|
152
|
+
server,
|
|
153
|
+
]);
|
|
154
|
+
if (!registry)
|
|
155
|
+
return;
|
|
156
|
+
// Setting header with geolocation and site info.
|
|
157
|
+
req.headers[headers.Geo] = Buffer.from(JSON.stringify(geoLocation)).toString('base64');
|
|
158
|
+
req.headers[headers.DeployID] = '0';
|
|
159
|
+
req.headers[headers.Site] = createSiteInfoHeader(siteInfo);
|
|
160
|
+
req.headers[headers.Account] = createAccountInfoHeader({ id: accountId });
|
|
161
|
+
if (blobsContext?.edgeURL && blobsContext?.token) {
|
|
162
|
+
req.headers[headers.BlobsInfo] = Buffer.from(JSON.stringify({ url: blobsContext.edgeURL, token: blobsContext.token })).toString('base64');
|
|
163
|
+
}
|
|
164
|
+
await registry.initialize();
|
|
165
|
+
const url = new URL(req.url, `http://${LOCAL_HOST}:${mainPort}`);
|
|
166
|
+
const { functionNames, invocationMetadata } = registry.matchURLPath(url.pathname, req.method);
|
|
167
|
+
if (functionNames.length === 0) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
req[headersSymbol] = {
|
|
171
|
+
[headers.FeatureFlags]: getFeatureFlagsHeader(runtimeFeatureFlags),
|
|
172
|
+
[headers.ForwardedProtocol]: settings.https ? 'https:' : 'http:',
|
|
173
|
+
[headers.Functions]: functionNames.join(','),
|
|
174
|
+
[headers.InvocationMetadata]: getInvocationMetadataHeader(invocationMetadata),
|
|
175
|
+
[headers.IP]: LOCAL_HOST,
|
|
176
|
+
[headers.Passthrough]: 'passthrough',
|
|
177
|
+
[headers.PassthroughHost]: `localhost:${passthroughPort}`,
|
|
178
|
+
[headers.PassthroughProtocol]: 'http:',
|
|
179
|
+
};
|
|
180
|
+
if (debug) {
|
|
181
|
+
req[headersSymbol][headers.DebugLogging] = '1';
|
|
182
|
+
}
|
|
183
|
+
return `http://${LOCAL_HOST}:${isolatePort}`;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'req' implicitly has an 'any' type.
|
|
187
|
+
export const isEdgeFunctionsRequest = (req) => req[headersSymbol] !== undefined;
|
|
188
|
+
const prepareServer = async ({
|
|
189
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'config' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
190
|
+
config,
|
|
191
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'configPath' implicitly has an 'an... Remove this comment to see the full error message
|
|
192
|
+
configPath,
|
|
193
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'debug' implicitly has an 'any' ty... Remove this comment to see the full error message
|
|
194
|
+
debug,
|
|
195
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'directory' implicitly has an 'any... Remove this comment to see the full error message
|
|
196
|
+
directory,
|
|
197
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'configEnv' implicitly has an 'any... Remove this comment to see the full error message
|
|
198
|
+
env: configEnv,
|
|
199
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'featureFlags' implicitly has an '... Remove this comment to see the full error message
|
|
200
|
+
featureFlags,
|
|
201
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'getUpdatedConfig' implicitly has ... Remove this comment to see the full error message
|
|
202
|
+
getUpdatedConfig,
|
|
203
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'importMaps' implicitly has an 'an... Remove this comment to see the full error message
|
|
204
|
+
importMaps,
|
|
205
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'inspectSettings' implicitly has a... Remove this comment to see the full error message
|
|
206
|
+
inspectSettings,
|
|
207
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'internalDirectory' implicitly has... Remove this comment to see the full error message
|
|
208
|
+
internalDirectory,
|
|
209
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'internalFunctions' implicitly has... Remove this comment to see the full error message
|
|
210
|
+
internalFunctions,
|
|
211
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'port' implicitly has an 'any' typ... Remove this comment to see the full error message
|
|
212
|
+
port,
|
|
213
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'projectDir' implicitly has an 'an... Remove this comment to see the full error message
|
|
214
|
+
projectDir,
|
|
215
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'repositoryRoot' implicitly has an... Remove this comment to see the full error message
|
|
216
|
+
repositoryRoot, }) => {
|
|
217
|
+
// Merging internal with user-defined import maps.
|
|
218
|
+
const importMapPaths = [...importMaps, config.functions['*'].deno_import_map];
|
|
219
|
+
try {
|
|
220
|
+
const distImportMapPath = getPathInProject([DIST_IMPORT_MAP_PATH]);
|
|
221
|
+
const servePath = resolve(projectDir, getPathInProject([EDGE_FUNCTIONS_SERVE_FOLDER]));
|
|
222
|
+
await rm(servePath, { force: true, recursive: true });
|
|
223
|
+
const runIsolate = await bundler.serve({
|
|
224
|
+
...getDownloadUpdateFunctions(),
|
|
225
|
+
basePath: projectDir,
|
|
226
|
+
bootstrapURL: getBootstrapURL(),
|
|
227
|
+
debug,
|
|
228
|
+
distImportMapPath: join(projectDir, distImportMapPath),
|
|
229
|
+
featureFlags,
|
|
230
|
+
formatExportTypeError: (name) => `${NETLIFYDEVERR} ${chalk.red('Failed')} to load Edge Function ${chalk.yellow(name)}. The file does not seem to have a function as the default export.`,
|
|
231
|
+
formatImportError: (name) => `${NETLIFYDEVERR} ${chalk.red('Failed')} to run Edge Function ${chalk.yellow(name)}:`,
|
|
232
|
+
importMapPaths,
|
|
233
|
+
inspectSettings,
|
|
234
|
+
port,
|
|
235
|
+
rootPath: repositoryRoot,
|
|
236
|
+
servePath,
|
|
237
|
+
});
|
|
238
|
+
const registry = new EdgeFunctionsRegistry({
|
|
239
|
+
bundler,
|
|
240
|
+
config,
|
|
241
|
+
configPath,
|
|
242
|
+
debug,
|
|
243
|
+
directories: [directory].filter(Boolean),
|
|
244
|
+
env: configEnv,
|
|
245
|
+
getUpdatedConfig,
|
|
246
|
+
internalDirectories: [internalDirectory].filter(Boolean),
|
|
247
|
+
internalFunctions,
|
|
248
|
+
projectDir,
|
|
249
|
+
runIsolate,
|
|
250
|
+
servePath,
|
|
251
|
+
});
|
|
252
|
+
return registry;
|
|
143
253
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
server,
|
|
148
|
-
])
|
|
149
|
-
|
|
150
|
-
if (!registry) return
|
|
151
|
-
|
|
152
|
-
// Setting header with geolocation and site info.
|
|
153
|
-
req.headers[headers.Geo] = Buffer.from(JSON.stringify(geoLocation)).toString('base64')
|
|
154
|
-
req.headers[headers.DeployID] = '0'
|
|
155
|
-
req.headers[headers.Site] = createSiteInfoHeader(siteInfo)
|
|
156
|
-
req.headers[headers.Account] = createAccountInfoHeader({ id: accountId })
|
|
157
|
-
|
|
158
|
-
if (blobsContext?.edgeURL && blobsContext?.token) {
|
|
159
|
-
req.headers[headers.BlobsInfo] = Buffer.from(
|
|
160
|
-
JSON.stringify({ url: blobsContext.edgeURL, token: blobsContext.token }),
|
|
161
|
-
).toString('base64')
|
|
254
|
+
catch (error) {
|
|
255
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
256
|
+
printError(error.message, { exit: false });
|
|
162
257
|
}
|
|
163
|
-
|
|
164
|
-
await registry.initialize()
|
|
165
|
-
|
|
166
|
-
const url = new URL(req.url, `http://${LOCAL_HOST}:${mainPort}`)
|
|
167
|
-
const { functionNames, invocationMetadata } = registry.matchURLPath(url.pathname, req.method)
|
|
168
|
-
|
|
169
|
-
if (functionNames.length === 0) {
|
|
170
|
-
return
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
req[headersSymbol] = {
|
|
174
|
-
[headers.FeatureFlags]: getFeatureFlagsHeader(runtimeFeatureFlags),
|
|
175
|
-
[headers.ForwardedProtocol]: settings.https ? 'https:' : 'http:',
|
|
176
|
-
[headers.Functions]: functionNames.join(','),
|
|
177
|
-
[headers.InvocationMetadata]: getInvocationMetadataHeader(invocationMetadata),
|
|
178
|
-
[headers.IP]: LOCAL_HOST,
|
|
179
|
-
[headers.Passthrough]: 'passthrough',
|
|
180
|
-
[headers.PassthroughHost]: `localhost:${passthroughPort}`,
|
|
181
|
-
[headers.PassthroughProtocol]: 'http:',
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (debug) {
|
|
185
|
-
req[headersSymbol][headers.DebugLogging] = '1'
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return `http://${LOCAL_HOST}:${isolatePort}`
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export const isEdgeFunctionsRequest = (req) => req[headersSymbol] !== undefined
|
|
193
|
-
|
|
194
|
-
const prepareServer = async ({
|
|
195
|
-
config,
|
|
196
|
-
configPath,
|
|
197
|
-
debug,
|
|
198
|
-
directory,
|
|
199
|
-
env: configEnv,
|
|
200
|
-
featureFlags,
|
|
201
|
-
getUpdatedConfig,
|
|
202
|
-
importMaps,
|
|
203
|
-
inspectSettings,
|
|
204
|
-
internalDirectory,
|
|
205
|
-
internalFunctions,
|
|
206
|
-
port,
|
|
207
|
-
projectDir,
|
|
208
|
-
repositoryRoot,
|
|
209
|
-
}) => {
|
|
210
|
-
// Merging internal with user-defined import maps.
|
|
211
|
-
const importMapPaths = [...importMaps, config.functions['*'].deno_import_map]
|
|
212
|
-
|
|
213
|
-
try {
|
|
214
|
-
const distImportMapPath = getPathInProject([DIST_IMPORT_MAP_PATH])
|
|
215
|
-
const servePath = resolve(projectDir, getPathInProject([EDGE_FUNCTIONS_SERVE_FOLDER]))
|
|
216
|
-
|
|
217
|
-
await rm(servePath, { force: true, recursive: true })
|
|
218
|
-
|
|
219
|
-
const runIsolate = await bundler.serve({
|
|
220
|
-
...getDownloadUpdateFunctions(),
|
|
221
|
-
basePath: projectDir,
|
|
222
|
-
bootstrapURL: getBootstrapURL(),
|
|
223
|
-
debug,
|
|
224
|
-
distImportMapPath: join(projectDir, distImportMapPath),
|
|
225
|
-
featureFlags,
|
|
226
|
-
formatExportTypeError: (name) =>
|
|
227
|
-
`${NETLIFYDEVERR} ${chalk.red('Failed')} to load Edge Function ${chalk.yellow(
|
|
228
|
-
name,
|
|
229
|
-
)}. The file does not seem to have a function as the default export.`,
|
|
230
|
-
formatImportError: (name) =>
|
|
231
|
-
`${NETLIFYDEVERR} ${chalk.red('Failed')} to run Edge Function ${chalk.yellow(name)}:`,
|
|
232
|
-
importMapPaths,
|
|
233
|
-
inspectSettings,
|
|
234
|
-
port,
|
|
235
|
-
rootPath: repositoryRoot,
|
|
236
|
-
servePath,
|
|
237
|
-
})
|
|
238
|
-
const registry = new EdgeFunctionsRegistry({
|
|
239
|
-
bundler,
|
|
240
|
-
config,
|
|
241
|
-
configPath,
|
|
242
|
-
debug,
|
|
243
|
-
directories: [directory].filter(Boolean),
|
|
244
|
-
env: configEnv,
|
|
245
|
-
getUpdatedConfig,
|
|
246
|
-
internalDirectories: [internalDirectory].filter(Boolean),
|
|
247
|
-
internalFunctions,
|
|
248
|
-
projectDir,
|
|
249
|
-
runIsolate,
|
|
250
|
-
servePath,
|
|
251
|
-
})
|
|
252
|
-
|
|
253
|
-
return registry
|
|
254
|
-
} catch (error) {
|
|
255
|
-
printError(error.message, { exit: false })
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
+
};
|