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
package/src/utils/dev.mjs
CHANGED
|
@@ -1,92 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
import { supportsBackgroundFunctions } from '../lib/account.mjs'
|
|
8
|
-
|
|
9
|
-
import { NETLIFYDEVLOG, chalk, error, log, warn } from './command-helpers.mjs'
|
|
10
|
-
import { loadDotEnvFiles } from './dot-env.mjs'
|
|
11
|
-
|
|
1
|
+
import process from 'process';
|
|
2
|
+
import getPort from 'get-port';
|
|
3
|
+
import isEmpty from 'lodash/isEmpty.js';
|
|
4
|
+
import { supportsBackgroundFunctions } from '../lib/account.mjs';
|
|
5
|
+
import { NETLIFYDEVLOG, chalk, error, log, warn } from './command-helpers.mjs';
|
|
6
|
+
import { loadDotEnvFiles } from './dot-env.mjs';
|
|
12
7
|
// Possible sources of environment variables. For the purpose of printing log messages only. Order does not matter.
|
|
13
8
|
const ENV_VAR_SOURCES = {
|
|
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
|
-
"Double-check your login status with 'netlify status' or contact support with details of your error."
|
|
42
|
-
|
|
9
|
+
account: {
|
|
10
|
+
name: 'shared',
|
|
11
|
+
printFn: chalk.magenta,
|
|
12
|
+
},
|
|
13
|
+
addons: {
|
|
14
|
+
name: 'addon',
|
|
15
|
+
printFn: chalk.yellow,
|
|
16
|
+
},
|
|
17
|
+
configFile: {
|
|
18
|
+
name: 'netlify.toml file',
|
|
19
|
+
printFn: chalk.green,
|
|
20
|
+
},
|
|
21
|
+
general: {
|
|
22
|
+
name: 'general context',
|
|
23
|
+
printFn: chalk.italic,
|
|
24
|
+
},
|
|
25
|
+
process: {
|
|
26
|
+
name: 'process',
|
|
27
|
+
printFn: chalk.red,
|
|
28
|
+
},
|
|
29
|
+
ui: {
|
|
30
|
+
name: 'site settings',
|
|
31
|
+
printFn: chalk.blue,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
const ERROR_CALL_TO_ACTION = "Double-check your login status with 'netlify status' or contact support with details of your error.";
|
|
35
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'site' implicitly has an 'any' typ... Remove this comment to see the full error message
|
|
43
36
|
const validateSiteInfo = ({ site, siteInfo }) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
37
|
+
if (isEmpty(siteInfo)) {
|
|
38
|
+
error(`Failed retrieving site information for site ${chalk.yellow(site.id)}. ${ERROR_CALL_TO_ACTION}`);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
|
|
49
42
|
const getAccounts = async ({ api }) => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
|
|
43
|
+
try {
|
|
44
|
+
const accounts = await api.listAccountsForUser();
|
|
45
|
+
return accounts;
|
|
46
|
+
}
|
|
47
|
+
catch (error_) {
|
|
48
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
49
|
+
error(`Failed retrieving user account: ${error_.message}. ${ERROR_CALL_TO_ACTION}`);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
|
|
58
53
|
const getAddons = async ({ api, site }) => {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
54
|
+
try {
|
|
55
|
+
const addons = await api.listServiceInstancesForSite({ siteId: site.id });
|
|
56
|
+
return addons;
|
|
57
|
+
}
|
|
58
|
+
catch (error_) {
|
|
59
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
60
|
+
error(`Failed retrieving addons for site ${chalk.yellow(site.id)}: ${error_.message}. ${ERROR_CALL_TO_ACTION}`);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'addons' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
67
64
|
const getAddonsInformation = ({ addons, siteInfo }) => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
|
|
65
|
+
const urls = Object.fromEntries(
|
|
66
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'addon' implicitly has an 'any' type.
|
|
67
|
+
addons.map((addon) => [addon.service_slug, `${siteInfo.ssl_url}${addon.service_path}`]));
|
|
68
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'addon' implicitly has an 'any' type.
|
|
69
|
+
const env = Object.assign({}, ...addons.map((addon) => addon.env));
|
|
70
|
+
return { urls, env };
|
|
71
|
+
};
|
|
72
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'accounts' implicitly has an 'any'... Remove this comment to see the full error message
|
|
75
73
|
const getSiteAccount = ({ accounts, siteInfo }) => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
74
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'account' implicitly has an 'any' type.
|
|
75
|
+
const siteAccount = accounts.find((account) => account.slug === siteInfo.account_slug);
|
|
76
|
+
if (!siteAccount) {
|
|
77
|
+
warn(`Could not find account for site '${siteInfo.name}' with account slug '${siteInfo.account_slug}'`);
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
return siteAccount;
|
|
81
|
+
};
|
|
84
82
|
// default 10 seconds for synchronous functions
|
|
85
|
-
const SYNCHRONOUS_FUNCTION_TIMEOUT = 10
|
|
86
|
-
|
|
83
|
+
const SYNCHRONOUS_FUNCTION_TIMEOUT = 10;
|
|
87
84
|
// default 15 minutes for background functions
|
|
88
|
-
const BACKGROUND_FUNCTION_TIMEOUT = 900
|
|
89
|
-
|
|
85
|
+
const BACKGROUND_FUNCTION_TIMEOUT = 900;
|
|
90
86
|
/**
|
|
91
87
|
*
|
|
92
88
|
* @param {object} config
|
|
@@ -96,118 +92,107 @@ const BACKGROUND_FUNCTION_TIMEOUT = 900
|
|
|
96
92
|
* @param {*} config.siteInfo
|
|
97
93
|
* @returns
|
|
98
94
|
*/
|
|
95
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
|
|
99
96
|
export const getSiteInformation = async ({ api, offline, site, siteInfo }) => {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
},
|
|
97
|
+
if (site.id && !offline) {
|
|
98
|
+
validateSiteInfo({ site, siteInfo });
|
|
99
|
+
const [accounts, addons] = await Promise.all([getAccounts({ api }), getAddons({ api, site })]);
|
|
100
|
+
const { urls: addonsUrls } = getAddonsInformation({ siteInfo, addons });
|
|
101
|
+
const account = getSiteAccount({ siteInfo, accounts });
|
|
102
|
+
return {
|
|
103
|
+
addonsUrls,
|
|
104
|
+
siteUrl: siteInfo.ssl_url,
|
|
105
|
+
accountId: account.id,
|
|
106
|
+
capabilities: {
|
|
107
|
+
backgroundFunctions: supportsBackgroundFunctions(account),
|
|
108
|
+
},
|
|
109
|
+
timeouts: {
|
|
110
|
+
syncFunctions: siteInfo.functions_config?.timeout ?? SYNCHRONOUS_FUNCTION_TIMEOUT,
|
|
111
|
+
backgroundFunctions: BACKGROUND_FUNCTION_TIMEOUT,
|
|
112
|
+
},
|
|
113
|
+
};
|
|
118
114
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
|
|
115
|
+
// best defaults we can have without retrieving site information
|
|
116
|
+
return {
|
|
117
|
+
addonsUrls: {},
|
|
118
|
+
siteUrl: '',
|
|
119
|
+
capabilities: {},
|
|
120
|
+
timeouts: {
|
|
121
|
+
syncFunctions: SYNCHRONOUS_FUNCTION_TIMEOUT,
|
|
122
|
+
backgroundFunctions: BACKGROUND_FUNCTION_TIMEOUT,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'source' implicitly has an 'any' type.
|
|
133
127
|
const getEnvSourceName = (source) => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
|
|
128
|
+
// @ts-expect-error TS(7053) FIXME: Element implicitly has an 'any' type because expre... Remove this comment to see the full error message
|
|
129
|
+
const { name = source, printFn = chalk.green } = ENV_VAR_SOURCES[source] || {};
|
|
130
|
+
return printFn(name);
|
|
131
|
+
};
|
|
139
132
|
/**
|
|
140
133
|
* @param {{devConfig: any, env: Record<string, { sources: string[], value: string}>, site: any}} param0
|
|
141
134
|
* @returns {Promise<Record<string, { sources: string[], value: string}>>}
|
|
142
135
|
*/
|
|
136
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'devConfig' implicitly has an 'any... Remove this comment to see the full error message
|
|
143
137
|
export const getDotEnvVariables = async ({ devConfig, env, site }) => {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
return env
|
|
163
|
-
}
|
|
164
|
-
|
|
138
|
+
const dotEnvFiles = await loadDotEnvFiles({ envFiles: devConfig.envFiles, projectDir: site.root });
|
|
139
|
+
// @ts-expect-error TS(2339) FIXME: Property 'env' does not exist on type '{ warning: ... Remove this comment to see the full error message
|
|
140
|
+
dotEnvFiles.forEach(({ env: fileEnv, file }) => {
|
|
141
|
+
const newSourceName = `${file} file`;
|
|
142
|
+
Object.keys(fileEnv).forEach((key) => {
|
|
143
|
+
const sources = key in env ? [newSourceName, ...env[key].sources] : [newSourceName];
|
|
144
|
+
if (sources.includes('internal')) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
env[key] = {
|
|
148
|
+
sources,
|
|
149
|
+
value: fileEnv[key],
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
return env;
|
|
154
|
+
};
|
|
165
155
|
/**
|
|
166
156
|
* Takes a set of environment variables in the format provided by @netlify/config and injects them into `process.env`
|
|
167
157
|
* @param {Record<string, { sources: string[], value: string}>} env
|
|
168
158
|
* @return {void}
|
|
169
159
|
*/
|
|
160
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'env' implicitly has an 'any' type.
|
|
170
161
|
export const injectEnvVariables = (env) => {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (usedSource !== 'general' && !isInternal) {
|
|
192
|
-
log(`${NETLIFYDEVLOG} Injected ${usedSourceName} env var: ${chalk.yellow(key)}`)
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
process.env[key] = variable.value
|
|
162
|
+
for (const [key, variable] of Object.entries(env)) {
|
|
163
|
+
const existsInProcess = process.env[key] !== undefined;
|
|
164
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
165
|
+
const [usedSource, ...overriddenSources] = existsInProcess ? ['process', ...variable.sources] : variable.sources;
|
|
166
|
+
const usedSourceName = getEnvSourceName(usedSource);
|
|
167
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
168
|
+
const isInternal = variable.sources.includes('internal');
|
|
169
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'source' implicitly has an 'any' type.
|
|
170
|
+
overriddenSources.forEach((source) => {
|
|
171
|
+
const sourceName = getEnvSourceName(source);
|
|
172
|
+
log(chalk.dim(`${NETLIFYDEVLOG} Ignored ${chalk.bold(sourceName)} env var: ${chalk.yellow(key)} (defined in ${usedSourceName})`));
|
|
173
|
+
});
|
|
174
|
+
if (!existsInProcess || isInternal) {
|
|
175
|
+
// Omitting `general` and `internal` env vars to reduce noise in the logs.
|
|
176
|
+
if (usedSource !== 'general' && !isInternal) {
|
|
177
|
+
log(`${NETLIFYDEVLOG} Injected ${usedSourceName} env var: ${chalk.yellow(key)}`);
|
|
178
|
+
}
|
|
179
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
180
|
+
process.env[key] = variable.value;
|
|
181
|
+
}
|
|
196
182
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
183
|
+
};
|
|
184
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'configuredPort' implicitly has an... Remove this comment to see the full error message
|
|
200
185
|
export const acquirePort = async ({ configuredPort, defaultPort, errorMessage }) => {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
186
|
+
const acquiredPort = await getPort({ port: configuredPort || defaultPort });
|
|
187
|
+
if (configuredPort && acquiredPort !== configuredPort) {
|
|
188
|
+
throw new Error(`${errorMessage}: '${configuredPort}'`);
|
|
189
|
+
}
|
|
190
|
+
return acquiredPort;
|
|
191
|
+
};
|
|
192
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'fn' implicitly has an 'any' type.
|
|
208
193
|
export const processOnExit = (fn) => {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
194
|
+
const signals = ['SIGINT', 'SIGTERM', 'SIGQUIT', 'SIGHUP', 'exit'];
|
|
195
|
+
signals.forEach((signal) => {
|
|
196
|
+
process.on(signal, fn);
|
|
197
|
+
});
|
|
198
|
+
};
|
package/src/utils/dot-env.mjs
CHANGED
|
@@ -1,47 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
import { isFileAsync } from '../lib/fs.mjs'
|
|
8
|
-
|
|
9
|
-
import { warn } from './command-helpers.mjs'
|
|
10
|
-
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import dotenv from 'dotenv';
|
|
4
|
+
import { isFileAsync } from '../lib/fs.mjs';
|
|
5
|
+
import { warn } from './command-helpers.mjs';
|
|
6
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'envFiles' implicitly has an 'any'... Remove this comment to see the full error message
|
|
11
7
|
export const loadDotEnvFiles = async function ({ envFiles, projectDir }) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
const response = await tryLoadDotEnvFiles({ projectDir, dotenvFiles: envFiles });
|
|
9
|
+
// @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'.
|
|
10
|
+
const filesWithWarning = response.filter((el) => el.warning);
|
|
11
|
+
filesWithWarning.forEach((el) => {
|
|
12
|
+
// @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'.
|
|
13
|
+
warn(el.warning);
|
|
14
|
+
});
|
|
15
|
+
// @ts-expect-error TS(2532) FIXME: Object is possibly 'undefined'.
|
|
16
|
+
return response.filter((el) => el.file && el.env);
|
|
17
|
+
};
|
|
22
18
|
// in the user configuration, the order is highest to lowest
|
|
23
|
-
const defaultEnvFiles = ['.env.development.local', '.env.local', '.env.development', '.env']
|
|
24
|
-
|
|
19
|
+
const defaultEnvFiles = ['.env.development.local', '.env.local', '.env.development', '.env'];
|
|
20
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'projectDir' implicitly has an 'an... Remove this comment to see the full error message
|
|
25
21
|
export const tryLoadDotEnvFiles = async ({ dotenvFiles = defaultEnvFiles, projectDir }) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
const results = await Promise.all(dotenvFiles.map(async (file) => {
|
|
23
|
+
const filepath = path.resolve(projectDir, file);
|
|
24
|
+
try {
|
|
25
|
+
const isFile = await isFileAsync(filepath);
|
|
26
|
+
if (!isFile) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
33
29
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
catch (error) {
|
|
31
|
+
return {
|
|
32
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
33
|
+
warning: `Failed reading env variables from file: ${filepath}: ${error.message}`,
|
|
34
|
+
};
|
|
37
35
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// we return in order of lowest to highest priority
|
|
46
|
-
return results.filter(Boolean).reverse()
|
|
47
|
-
}
|
|
36
|
+
const content = await readFile(filepath, 'utf-8');
|
|
37
|
+
const env = dotenv.parse(content);
|
|
38
|
+
return { file, env };
|
|
39
|
+
}));
|
|
40
|
+
// we return in order of lowest to highest priority
|
|
41
|
+
return results.filter(Boolean).reverse();
|
|
42
|
+
};
|