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,32 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import { listRecipes } from './common.mjs'
|
|
5
|
-
|
|
1
|
+
import AsciiTable from 'ascii-table';
|
|
2
|
+
import { listRecipes } from './common.mjs';
|
|
6
3
|
/**
|
|
7
4
|
* The recipes:list command
|
|
8
5
|
*/
|
|
9
6
|
const recipesListCommand = async () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
table.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.log(table.toString())
|
|
20
|
-
}
|
|
21
|
-
|
|
7
|
+
const recipes = await listRecipes();
|
|
8
|
+
const table = new AsciiTable(`Usage: netlify recipes <name>`);
|
|
9
|
+
table.setHeading('Name', 'Description');
|
|
10
|
+
recipes.forEach(({ description, name }) => {
|
|
11
|
+
table.addRow(name, description);
|
|
12
|
+
});
|
|
13
|
+
console.log(table.toString());
|
|
14
|
+
};
|
|
22
15
|
/**
|
|
23
16
|
* Creates the `netlify recipes:list` command
|
|
24
17
|
* @param {import('../base-command.mjs').default} program
|
|
25
18
|
* @returns
|
|
26
19
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
|
|
21
|
+
export const createRecipesListCommand = (program) => program
|
|
29
22
|
.command('recipes:list')
|
|
30
23
|
.description(`List the recipes available to create and modify files in a project`)
|
|
31
24
|
.addExamples(['netlify recipes:list'])
|
|
32
|
-
.action(recipesListCommand)
|
|
25
|
+
.action(recipesListCommand);
|
|
@@ -1,88 +1,75 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import { getRecipe, listRecipes } from './common.mjs'
|
|
10
|
-
import { createRecipesListCommand } from './recipes-list.mjs'
|
|
11
|
-
|
|
12
|
-
const SUGGESTION_TIMEOUT = 1e4
|
|
13
|
-
|
|
1
|
+
import { basename } from 'path';
|
|
2
|
+
import { closest } from 'fastest-levenshtein';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import { NETLIFYDEVERR, chalk, log } from '../../utils/command-helpers.mjs';
|
|
5
|
+
import { getRecipe, listRecipes } from './common.mjs';
|
|
6
|
+
import { createRecipesListCommand } from './recipes-list.mjs';
|
|
7
|
+
const SUGGESTION_TIMEOUT = 1e4;
|
|
14
8
|
/**
|
|
15
9
|
* The recipes command
|
|
16
10
|
* @param {string} recipeName
|
|
17
11
|
* @param {import('commander').OptionValues} options
|
|
18
12
|
* @param {import('../base-command.mjs').default} command
|
|
19
13
|
*/
|
|
14
|
+
// @ts-expect-error TS(7023) FIXME: 'recipesCommand' implicitly has return type 'any' ... Remove this comment to see the full error message
|
|
20
15
|
const recipesCommand = async (recipeName, options, command) => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return command.help()
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
return await runRecipe({ config, recipeName: sanitizedRecipeName, repositoryRoot })
|
|
30
|
-
} catch (error) {
|
|
31
|
-
if (
|
|
32
|
-
// The ESM loader throws this instead of MODULE_NOT_FOUND
|
|
33
|
-
error.code !== 'ERR_MODULE_NOT_FOUND'
|
|
34
|
-
) {
|
|
35
|
-
throw error
|
|
16
|
+
const { config, repositoryRoot } = command.netlify;
|
|
17
|
+
const sanitizedRecipeName = basename(recipeName || '').toLowerCase();
|
|
18
|
+
if (sanitizedRecipeName.length === 0) {
|
|
19
|
+
return command.help();
|
|
36
20
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const recipes = await listRecipes()
|
|
41
|
-
const recipeNames = recipes.map(({ name }) => name)
|
|
42
|
-
const suggestion = closest(recipeName, recipeNames)
|
|
43
|
-
const applySuggestion = await new Promise((resolve) => {
|
|
44
|
-
const prompt = inquirer.prompt({
|
|
45
|
-
type: 'confirm',
|
|
46
|
-
name: 'suggestion',
|
|
47
|
-
message: `Did you mean ${chalk.blue(suggestion)}`,
|
|
48
|
-
default: false,
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
setTimeout(() => {
|
|
52
|
-
// @ts-ignore
|
|
53
|
-
prompt.ui.close()
|
|
54
|
-
resolve(false)
|
|
55
|
-
}, SUGGESTION_TIMEOUT)
|
|
56
|
-
|
|
57
|
-
// eslint-disable-next-line promise/catch-or-return
|
|
58
|
-
prompt.then((value) => resolve(value.suggestion))
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
if (applySuggestion) {
|
|
62
|
-
return recipesCommand(suggestion, options, command)
|
|
21
|
+
try {
|
|
22
|
+
return await runRecipe({ config, recipeName: sanitizedRecipeName, repositoryRoot });
|
|
63
23
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (
|
|
26
|
+
// The ESM loader throws this instead of MODULE_NOT_FOUND
|
|
27
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
28
|
+
error.code !== 'ERR_MODULE_NOT_FOUND') {
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
log(`${NETLIFYDEVERR} ${chalk.yellow(recipeName)} is not a valid recipe name.`);
|
|
32
|
+
const recipes = await listRecipes();
|
|
33
|
+
const recipeNames = recipes.map(({ name }) => name);
|
|
34
|
+
const suggestion = closest(recipeName, recipeNames);
|
|
35
|
+
const applySuggestion = await new Promise((resolve) => {
|
|
36
|
+
const prompt = inquirer.prompt({
|
|
37
|
+
type: 'confirm',
|
|
38
|
+
name: 'suggestion',
|
|
39
|
+
message: `Did you mean ${chalk.blue(suggestion)}`,
|
|
40
|
+
default: false,
|
|
41
|
+
});
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
// @ts-expect-error TS(2445) FIXME: Property 'close' is protected and only accessible ... Remove this comment to see the full error message
|
|
44
|
+
prompt.ui.close();
|
|
45
|
+
resolve(false);
|
|
46
|
+
}, SUGGESTION_TIMEOUT);
|
|
47
|
+
// eslint-disable-next-line promise/catch-or-return
|
|
48
|
+
prompt.then((value) => resolve(value.suggestion));
|
|
49
|
+
});
|
|
50
|
+
if (applySuggestion) {
|
|
51
|
+
return recipesCommand(suggestion, options, command);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
// @ts-expect-error TS(7031) FIXME: Binding element 'config' implicitly has an 'any' t... Remove this comment to see the full error message
|
|
67
56
|
export const runRecipe = async ({ config, recipeName, repositoryRoot }) => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
57
|
+
const recipe = await getRecipe(recipeName);
|
|
58
|
+
return recipe.run({ config, repositoryRoot });
|
|
59
|
+
};
|
|
73
60
|
/**
|
|
74
61
|
* Creates the `netlify recipes` command
|
|
75
62
|
* @param {import('../base-command.mjs').default} program
|
|
76
63
|
* @returns
|
|
77
64
|
*/
|
|
65
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
|
|
78
66
|
export const createRecipesCommand = (program) => {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
67
|
+
createRecipesListCommand(program);
|
|
68
|
+
program
|
|
69
|
+
.command('recipes')
|
|
70
|
+
.argument('[name]', 'name of the recipe')
|
|
71
|
+
.description(`Create and modify files in a project using pre-defined recipes`)
|
|
72
|
+
.option('-n, --name <name>', 'recipe name to use')
|
|
73
|
+
.addExamples(['netlify recipes my-recipe', 'netlify recipes --name my-recipe'])
|
|
74
|
+
.action(recipesCommand);
|
|
75
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { createServeCommand } from './serve.mjs'
|
|
1
|
+
export { createServeCommand } from './serve.mjs';
|
|
@@ -1,207 +1,160 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
normalizeConfig,
|
|
17
|
-
} from '../../utils/command-helpers.mjs'
|
|
18
|
-
import detectServerSettings, { getConfigWithPlugins } from '../../utils/detect-server-settings.mjs'
|
|
19
|
-
import { getDotEnvVariables, getSiteInformation, injectEnvVariables } from '../../utils/dev.mjs'
|
|
20
|
-
import { getEnvelopeEnv, normalizeContext } from '../../utils/env/index.mjs'
|
|
21
|
-
import { getInternalFunctionsDir } from '../../utils/functions/functions.mjs'
|
|
22
|
-
import { ensureNetlifyIgnore } from '../../utils/gitignore.mjs'
|
|
23
|
-
import openBrowser from '../../utils/open-browser.mjs'
|
|
24
|
-
import { generateInspectSettings, startProxyServer } from '../../utils/proxy-server.mjs'
|
|
25
|
-
import { runBuildTimeline } from '../../utils/run-build.mjs'
|
|
26
|
-
import { getGeoCountryArgParser } from '../../utils/validation.mjs'
|
|
27
|
-
|
|
1
|
+
import process from 'process';
|
|
2
|
+
import { Option } from 'commander';
|
|
3
|
+
import { promptEditorHelper } from '../../lib/edge-functions/editor-helper.mjs';
|
|
4
|
+
import { startFunctionsServer } from '../../lib/functions/server.mjs';
|
|
5
|
+
import { printBanner } from '../../utils/banner.mjs';
|
|
6
|
+
import { chalk, exit, log, NETLIFYDEVERR, NETLIFYDEVLOG, NETLIFYDEVWARN, normalizeConfig, } from '../../utils/command-helpers.mjs';
|
|
7
|
+
import detectServerSettings, { getConfigWithPlugins } from '../../utils/detect-server-settings.mjs';
|
|
8
|
+
import { getDotEnvVariables, getSiteInformation, injectEnvVariables } from '../../utils/dev.mjs';
|
|
9
|
+
import { getEnvelopeEnv, normalizeContext } from '../../utils/env/index.mjs';
|
|
10
|
+
import { getInternalFunctionsDir } from '../../utils/functions/functions.mjs';
|
|
11
|
+
import { ensureNetlifyIgnore } from '../../utils/gitignore.mjs';
|
|
12
|
+
import openBrowser from '../../utils/open-browser.mjs';
|
|
13
|
+
import { generateInspectSettings, startProxyServer } from '../../utils/proxy-server.mjs';
|
|
14
|
+
import { runBuildTimeline } from '../../utils/run-build.mjs';
|
|
15
|
+
import { getGeoCountryArgParser } from '../../utils/validation.mjs';
|
|
28
16
|
/**
|
|
29
17
|
* The serve command
|
|
30
18
|
* @param {import('commander').OptionValues} options
|
|
31
19
|
* @param {import('../base-command.mjs').default} command
|
|
32
20
|
*/
|
|
21
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'options' implicitly has an 'any' type.
|
|
33
22
|
const serve = async (options, command) => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
env = await
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
await
|
|
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
|
-
|
|
143
|
-
projectDir: command.workingDir,
|
|
144
|
-
settings,
|
|
145
|
-
site,
|
|
146
|
-
siteInfo,
|
|
147
|
-
state,
|
|
148
|
-
accountId,
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
if (devConfig.autoLaunch !== false) {
|
|
152
|
-
await openBrowser({ url, silentBrowserNoneError: true })
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
process.env.URL = url
|
|
156
|
-
process.env.DEPLOY_URL = url
|
|
157
|
-
|
|
158
|
-
printBanner({ url })
|
|
159
|
-
}
|
|
160
|
-
|
|
23
|
+
const { api, cachedConfig, config, repositoryRoot, site, siteInfo, state } = command.netlify;
|
|
24
|
+
config.dev = { ...config.dev };
|
|
25
|
+
config.build = { ...config.build };
|
|
26
|
+
/** @type {import('../dev/types').DevConfig} */
|
|
27
|
+
const devConfig = {
|
|
28
|
+
...(config.functionsDirectory && { functions: config.functionsDirectory }),
|
|
29
|
+
...(config.build.publish && { publish: config.build.publish }),
|
|
30
|
+
...config.dev,
|
|
31
|
+
...options,
|
|
32
|
+
// Override the `framework` value so that we start a static server and not
|
|
33
|
+
// the framework's development server.
|
|
34
|
+
framework: '#static',
|
|
35
|
+
};
|
|
36
|
+
let { env } = cachedConfig;
|
|
37
|
+
if (!options.offline && siteInfo.use_envelope) {
|
|
38
|
+
env = await getEnvelopeEnv({ api, context: options.context, env, siteInfo });
|
|
39
|
+
log(`${NETLIFYDEVLOG} Injecting environment variable values for ${chalk.yellow('all scopes')}`);
|
|
40
|
+
}
|
|
41
|
+
env = await getDotEnvVariables({ devConfig, env, site });
|
|
42
|
+
injectEnvVariables(env);
|
|
43
|
+
await promptEditorHelper({ chalk, config, log, NETLIFYDEVLOG, repositoryRoot, state });
|
|
44
|
+
const { accountId, addonsUrls, capabilities, siteUrl, timeouts } = await getSiteInformation({
|
|
45
|
+
// inherited from base command --offline
|
|
46
|
+
offline: options.offline,
|
|
47
|
+
api,
|
|
48
|
+
site,
|
|
49
|
+
siteInfo,
|
|
50
|
+
});
|
|
51
|
+
// Ensure the internal functions directory exists so that the functions
|
|
52
|
+
// server and registry are initialized, and any functions created by
|
|
53
|
+
// Netlify Build are loaded.
|
|
54
|
+
await getInternalFunctionsDir({ base: site.root, ensureExists: true });
|
|
55
|
+
let settings = /** @type {import('../../utils/types.js').ServerSettings} */ ({});
|
|
56
|
+
try {
|
|
57
|
+
settings = await detectServerSettings(devConfig, options, command);
|
|
58
|
+
cachedConfig.config = getConfigWithPlugins(cachedConfig.config, settings);
|
|
59
|
+
}
|
|
60
|
+
catch (error_) {
|
|
61
|
+
// @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
|
|
62
|
+
log(NETLIFYDEVERR, error_.message);
|
|
63
|
+
exit(1);
|
|
64
|
+
}
|
|
65
|
+
command.setAnalyticsPayload({ live: options.live });
|
|
66
|
+
log(`${NETLIFYDEVLOG} Building site for production`);
|
|
67
|
+
log(`${NETLIFYDEVWARN} Changes will not be hot-reloaded, so if you need to rebuild your site you must exit and run 'netlify serve' again`);
|
|
68
|
+
const { configPath: configPathOverride } = await runBuildTimeline({
|
|
69
|
+
command,
|
|
70
|
+
settings,
|
|
71
|
+
options,
|
|
72
|
+
});
|
|
73
|
+
const functionsRegistry = await startFunctionsServer({
|
|
74
|
+
api,
|
|
75
|
+
command,
|
|
76
|
+
config,
|
|
77
|
+
debug: options.debug,
|
|
78
|
+
loadDistFunctions: true,
|
|
79
|
+
settings,
|
|
80
|
+
site,
|
|
81
|
+
siteInfo,
|
|
82
|
+
siteUrl,
|
|
83
|
+
capabilities,
|
|
84
|
+
timeouts,
|
|
85
|
+
geolocationMode: options.geo,
|
|
86
|
+
geoCountry: options.country,
|
|
87
|
+
offline: options.offline,
|
|
88
|
+
state,
|
|
89
|
+
accountId,
|
|
90
|
+
});
|
|
91
|
+
// Try to add `.netlify` to `.gitignore`.
|
|
92
|
+
try {
|
|
93
|
+
await ensureNetlifyIgnore(repositoryRoot);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// no-op
|
|
97
|
+
}
|
|
98
|
+
// TODO: We should consolidate this with the existing config watcher.
|
|
99
|
+
const getUpdatedConfig = async () => {
|
|
100
|
+
const { config: newConfig } = await command.getConfig({ cwd: command.workingDir, offline: true, state });
|
|
101
|
+
const normalizedNewConfig = normalizeConfig(newConfig);
|
|
102
|
+
return normalizedNewConfig;
|
|
103
|
+
};
|
|
104
|
+
const inspectSettings = generateInspectSettings(options.edgeInspect, options.edgeInspectBrk);
|
|
105
|
+
// @ts-expect-error TS(2345) FIXME: Argument of type '{ addonsUrls: { [k: string]: any... Remove this comment to see the full error message
|
|
106
|
+
const url = await startProxyServer({
|
|
107
|
+
addonsUrls,
|
|
108
|
+
config,
|
|
109
|
+
configPath: configPathOverride,
|
|
110
|
+
debug: options.debug,
|
|
111
|
+
env,
|
|
112
|
+
functionsRegistry,
|
|
113
|
+
geolocationMode: options.geo,
|
|
114
|
+
geoCountry: options.country,
|
|
115
|
+
getUpdatedConfig,
|
|
116
|
+
inspectSettings,
|
|
117
|
+
offline: options.offline,
|
|
118
|
+
projectDir: command.workingDir,
|
|
119
|
+
settings,
|
|
120
|
+
site,
|
|
121
|
+
siteInfo,
|
|
122
|
+
state,
|
|
123
|
+
accountId,
|
|
124
|
+
});
|
|
125
|
+
if (devConfig.autoLaunch !== false) {
|
|
126
|
+
await openBrowser({ url, silentBrowserNoneError: true });
|
|
127
|
+
}
|
|
128
|
+
process.env.URL = url;
|
|
129
|
+
process.env.DEPLOY_URL = url;
|
|
130
|
+
printBanner({ url });
|
|
131
|
+
};
|
|
161
132
|
/**
|
|
162
133
|
* Creates the `netlify serve` command
|
|
163
134
|
* @param {import('../base-command.mjs').default} program
|
|
164
135
|
* @returns
|
|
165
136
|
*/
|
|
166
|
-
|
|
167
|
-
|
|
137
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'program' implicitly has an 'any' type.
|
|
138
|
+
export const createServeCommand = (program) => program
|
|
168
139
|
.command('serve')
|
|
169
|
-
.description(
|
|
170
|
-
|
|
171
|
-
)
|
|
172
|
-
.option(
|
|
173
|
-
'--context <context>',
|
|
174
|
-
'Specify a deploy context or branch for environment variables (contexts: "production", "deploy-preview", "branch-deploy", "dev")',
|
|
175
|
-
normalizeContext,
|
|
176
|
-
)
|
|
140
|
+
.description('Build the site for production and serve locally. This does not watch the code for changes, so if you need to rebuild your site then you must exit and run `serve` again.')
|
|
141
|
+
.option('--context <context>', 'Specify a deploy context or branch for environment variables (contexts: "production", "deploy-preview", "branch-deploy", "dev")', normalizeContext)
|
|
142
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'value' implicitly has an 'any' type.
|
|
177
143
|
.option('-p ,--port <port>', 'port of netlify dev', (value) => Number.parseInt(value))
|
|
178
144
|
.option('-d ,--dir <path>', 'dir with static files')
|
|
179
145
|
.option('-f ,--functions <folder>', 'specify a functions folder to serve')
|
|
180
146
|
.option('-o ,--offline', 'disables any features that require network access')
|
|
181
|
-
.addOption(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
)
|
|
147
|
+
.addOption(new Option('--functionsPort <port>', 'Old, prefer --functions-port. Port of functions server')
|
|
148
|
+
.argParser((value) => Number.parseInt(value))
|
|
149
|
+
.hideHelp(true))
|
|
150
|
+
// @ts-expect-error TS(7006) FIXME: Parameter 'value' implicitly has an 'any' type.
|
|
186
151
|
.option('--functions-port <port>', 'port of functions server', (value) => Number.parseInt(value))
|
|
187
|
-
.addOption(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
)
|
|
195
|
-
.addOption(
|
|
196
|
-
new Option(
|
|
197
|
-
'--country <geoCountry>',
|
|
198
|
-
'Two-letter country code (https://ntl.fyi/country-codes) to use as mock geolocation (enables --geo=mock automatically)',
|
|
199
|
-
).argParser(getGeoCountryArgParser('netlify dev --geo=mock --country=FR')),
|
|
200
|
-
)
|
|
201
|
-
.addOption(
|
|
202
|
-
new Option('--staticServerPort <port>', 'port of the static app server used when no framework is detected')
|
|
203
|
-
.argParser((value) => Number.parseInt(value))
|
|
204
|
-
.hideHelp(),
|
|
205
|
-
)
|
|
152
|
+
.addOption(new Option('--geo <mode>', 'force geolocation data to be updated, use cached data from the last 24h if found, or use a mock location')
|
|
153
|
+
.choices(['cache', 'mock', 'update'])
|
|
154
|
+
.default('cache'))
|
|
155
|
+
.addOption(new Option('--country <geoCountry>', 'Two-letter country code (https://ntl.fyi/country-codes) to use as mock geolocation (enables --geo=mock automatically)').argParser(getGeoCountryArgParser('netlify dev --geo=mock --country=FR')))
|
|
156
|
+
.addOption(new Option('--staticServerPort <port>', 'port of the static app server used when no framework is detected')
|
|
157
|
+
.argParser((value) => Number.parseInt(value))
|
|
158
|
+
.hideHelp())
|
|
206
159
|
.addExamples(['netlify serve', 'BROWSER=none netlify serve # disable browser auto opening'])
|
|
207
|
-
.action(serve)
|
|
160
|
+
.action(serve);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { sitesCreate } from './sites-create.mjs'
|
|
2
|
-
export { createSitesCommand } from './sites.mjs'
|
|
1
|
+
export { sitesCreate } from './sites-create.mjs';
|
|
2
|
+
export { createSitesCommand } from './sites.mjs';
|