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.
Files changed (210) hide show
  1. package/README.md +2 -138
  2. package/npm-shrinkwrap.json +76 -76
  3. package/package.json +16 -15
  4. package/src/commands/addons/addons-auth.mjs +27 -30
  5. package/src/commands/addons/addons-config.mjs +145 -154
  6. package/src/commands/addons/addons-create.mjs +94 -108
  7. package/src/commands/addons/addons-delete.mjs +36 -41
  8. package/src/commands/addons/addons-list.mjs +38 -42
  9. package/src/commands/addons/addons.mjs +26 -28
  10. package/src/commands/addons/index.mjs +1 -1
  11. package/src/commands/api/api.mjs +45 -53
  12. package/src/commands/api/index.mjs +1 -1
  13. package/src/commands/base-command.mjs +597 -684
  14. package/src/commands/blobs/blobs-delete.mjs +35 -0
  15. package/src/commands/blobs/blobs-get.mjs +44 -0
  16. package/src/commands/blobs/blobs-list.mjs +48 -0
  17. package/src/commands/blobs/blobs-set.mjs +54 -0
  18. package/src/commands/blobs/blobs.mjs +32 -0
  19. package/src/commands/blobs/index.mjs +1 -0
  20. package/src/commands/build/build.mjs +55 -67
  21. package/src/commands/build/index.mjs +1 -1
  22. package/src/commands/completion/completion.mjs +41 -46
  23. package/src/commands/completion/index.mjs +1 -1
  24. package/src/commands/deploy/deploy.mjs +675 -710
  25. package/src/commands/deploy/index.mjs +1 -1
  26. package/src/commands/dev/dev-exec.mjs +20 -32
  27. package/src/commands/dev/dev.mjs +217 -302
  28. package/src/commands/dev/index.mjs +1 -1
  29. package/src/commands/dev/types.d.ts +30 -0
  30. package/src/commands/env/env-clone.mjs +157 -184
  31. package/src/commands/env/env-get.mjs +49 -68
  32. package/src/commands/env/env-import.mjs +100 -119
  33. package/src/commands/env/env-list.mjs +104 -129
  34. package/src/commands/env/env-set.mjs +160 -185
  35. package/src/commands/env/env-unset.mjs +104 -122
  36. package/src/commands/env/env.mjs +28 -30
  37. package/src/commands/env/index.mjs +1 -1
  38. package/src/commands/functions/functions-build.mjs +29 -41
  39. package/src/commands/functions/functions-create.mjs +533 -601
  40. package/src/commands/functions/functions-invoke.mjs +193 -216
  41. package/src/commands/functions/functions-list.mjs +45 -55
  42. package/src/commands/functions/functions-serve.mjs +51 -61
  43. package/src/commands/functions/functions.mjs +26 -32
  44. package/src/commands/functions/index.mjs +1 -1
  45. package/src/commands/index.mjs +2 -2
  46. package/src/commands/init/index.mjs +1 -1
  47. package/src/commands/init/init.mjs +138 -167
  48. package/src/commands/integration/deploy.mjs +337 -399
  49. package/src/commands/integration/index.mjs +12 -13
  50. package/src/commands/link/index.mjs +1 -1
  51. package/src/commands/link/link.mjs +298 -317
  52. package/src/commands/lm/index.mjs +1 -1
  53. package/src/commands/lm/lm-info.mjs +23 -31
  54. package/src/commands/lm/lm-install.mjs +13 -17
  55. package/src/commands/lm/lm-setup.mjs +80 -84
  56. package/src/commands/lm/lm-uninstall.mjs +7 -12
  57. package/src/commands/lm/lm.mjs +18 -22
  58. package/src/commands/login/index.mjs +1 -1
  59. package/src/commands/login/login.mjs +35 -41
  60. package/src/commands/logout/index.mjs +1 -1
  61. package/src/commands/logout/logout.mjs +25 -31
  62. package/src/commands/main.mjs +166 -201
  63. package/src/commands/open/index.mjs +1 -1
  64. package/src/commands/open/open-admin.mjs +15 -18
  65. package/src/commands/open/open-site.mjs +16 -19
  66. package/src/commands/open/open.mjs +24 -27
  67. package/src/commands/recipes/common.mjs +23 -34
  68. package/src/commands/recipes/index.mjs +1 -1
  69. package/src/commands/recipes/recipes-list.mjs +13 -20
  70. package/src/commands/recipes/recipes.mjs +59 -72
  71. package/src/commands/serve/index.mjs +1 -1
  72. package/src/commands/serve/serve.mjs +142 -189
  73. package/src/commands/sites/index.mjs +2 -2
  74. package/src/commands/sites/sites-create-template.mjs +214 -236
  75. package/src/commands/sites/sites-create.mjs +145 -157
  76. package/src/commands/sites/sites-delete.mjs +75 -81
  77. package/src/commands/sites/sites-list.mjs +63 -66
  78. package/src/commands/sites/sites.mjs +18 -20
  79. package/src/commands/status/index.mjs +1 -1
  80. package/src/commands/status/status-hooks.mjs +32 -34
  81. package/src/commands/status/status.mjs +99 -106
  82. package/src/commands/switch/index.mjs +1 -1
  83. package/src/commands/switch/switch.mjs +32 -37
  84. package/src/commands/types.d.ts +31 -0
  85. package/src/commands/unlink/index.mjs +1 -1
  86. package/src/commands/unlink/unlink.mjs +23 -29
  87. package/src/commands/watch/index.mjs +1 -1
  88. package/src/commands/watch/watch.mjs +91 -105
  89. package/src/functions-templates/javascript/hello/{{name}}.js +2 -3
  90. package/src/lib/account.mjs +4 -5
  91. package/src/lib/api.mjs +22 -20
  92. package/src/lib/blobs/blobs.mjs +36 -45
  93. package/src/lib/build.mjs +82 -85
  94. package/src/lib/completion/constants.mjs +2 -4
  95. package/src/lib/completion/generate-autocompletion.mjs +33 -36
  96. package/src/lib/completion/get-autocompletion.mjs +31 -35
  97. package/src/lib/completion/index.mjs +1 -1
  98. package/src/lib/completion/script.mjs +12 -19
  99. package/src/lib/edge-functions/bootstrap.mjs +3 -5
  100. package/src/lib/edge-functions/consts.mjs +9 -10
  101. package/src/lib/edge-functions/deploy.mjs +28 -34
  102. package/src/lib/edge-functions/editor-helper.mjs +29 -42
  103. package/src/lib/edge-functions/headers.mjs +24 -26
  104. package/src/lib/edge-functions/internal.mjs +38 -44
  105. package/src/lib/edge-functions/proxy.mjs +229 -228
  106. package/src/lib/edge-functions/registry.mjs +473 -574
  107. package/src/lib/exec-fetcher.mjs +115 -122
  108. package/src/lib/fs.mjs +28 -27
  109. package/src/lib/functions/background.mjs +16 -20
  110. package/src/lib/functions/config.mjs +12 -9
  111. package/src/lib/functions/form-submissions-handler.mjs +143 -149
  112. package/src/lib/functions/local-proxy.mjs +40 -44
  113. package/src/lib/functions/memoized-build.mjs +19 -21
  114. package/src/lib/functions/netlify-function.mjs +269 -249
  115. package/src/lib/functions/registry.mjs +509 -568
  116. package/src/lib/functions/runtimes/go/index.mjs +62 -71
  117. package/src/lib/functions/runtimes/index.mjs +8 -15
  118. package/src/lib/functions/runtimes/js/builders/netlify-lambda.mjs +55 -64
  119. package/src/lib/functions/runtimes/js/builders/zisi.mjs +135 -154
  120. package/src/lib/functions/runtimes/js/constants.mjs +1 -1
  121. package/src/lib/functions/runtimes/js/index.mjs +92 -109
  122. package/src/lib/functions/runtimes/js/worker.mjs +43 -45
  123. package/src/lib/functions/runtimes/rust/index.mjs +64 -73
  124. package/src/lib/functions/scheduled.mjs +70 -88
  125. package/src/lib/functions/server.mjs +269 -327
  126. package/src/lib/functions/synchronous.mjs +118 -147
  127. package/src/lib/functions/utils.mjs +38 -46
  128. package/src/lib/geo-location.mjs +69 -81
  129. package/src/lib/http-agent.mjs +87 -90
  130. package/src/lib/images/proxy.mjs +97 -99
  131. package/src/lib/log.mjs +6 -9
  132. package/src/lib/path.mjs +2 -1
  133. package/src/lib/render-error-template.mjs +19 -20
  134. package/src/lib/settings.mjs +17 -19
  135. package/src/lib/spinner.mjs +21 -23
  136. package/src/lib/string.mjs +4 -2
  137. package/src/recipes/vscode/index.mjs +69 -85
  138. package/src/recipes/vscode/settings.mjs +53 -58
  139. package/src/utils/addons/compare.mjs +31 -32
  140. package/src/utils/addons/diffs/index.mjs +16 -17
  141. package/src/utils/addons/diffs/options.mjs +99 -101
  142. package/src/utils/addons/prepare.mjs +100 -97
  143. package/src/utils/addons/prompts.mjs +73 -76
  144. package/src/utils/addons/render.mjs +33 -36
  145. package/src/utils/addons/validation.mjs +19 -15
  146. package/src/utils/banner.mjs +11 -16
  147. package/src/utils/build-info.mjs +65 -66
  148. package/src/utils/command-helpers.mjs +185 -199
  149. package/src/utils/create-deferred.mjs +9 -12
  150. package/src/utils/create-stream-promise.mjs +54 -47
  151. package/src/utils/deploy/constants.mjs +9 -11
  152. package/src/utils/deploy/deploy-site.mjs +162 -182
  153. package/src/utils/deploy/hash-config.mjs +21 -21
  154. package/src/utils/deploy/hash-files.mjs +34 -38
  155. package/src/utils/deploy/hash-fns.mjs +149 -154
  156. package/src/utils/deploy/hasher-segments.mjs +58 -52
  157. package/src/utils/deploy/upload-files.mjs +99 -113
  158. package/src/utils/deploy/util.mjs +85 -91
  159. package/src/utils/detect-server-settings.mjs +236 -268
  160. package/src/utils/dev.mjs +163 -178
  161. package/src/utils/dot-env.mjs +37 -42
  162. package/src/utils/env/index.mjs +148 -148
  163. package/src/utils/execa.mjs +9 -13
  164. package/src/utils/feature-flags.mjs +6 -5
  165. package/src/utils/framework-server.mjs +43 -52
  166. package/src/utils/functions/constants.mjs +1 -1
  167. package/src/utils/functions/functions.mjs +30 -40
  168. package/src/utils/functions/get-functions.mjs +28 -29
  169. package/src/utils/functions/index.mjs +3 -3
  170. package/src/utils/get-global-config.mjs +33 -36
  171. package/src/utils/get-package-json.mjs +14 -15
  172. package/src/utils/get-repo-data.mjs +54 -64
  173. package/src/utils/get-site.mjs +14 -14
  174. package/src/utils/gh-auth.mjs +79 -100
  175. package/src/utils/gitignore.mjs +37 -40
  176. package/src/utils/headers.mjs +33 -35
  177. package/src/utils/hooks/requires-site-info.mjs +26 -22
  178. package/src/utils/init/config-github.mjs +207 -219
  179. package/src/utils/init/config-manual.mjs +83 -100
  180. package/src/utils/init/config.mjs +25 -26
  181. package/src/utils/init/node-version.mjs +23 -30
  182. package/src/utils/init/plugins.mjs +12 -8
  183. package/src/utils/init/utils.mjs +152 -172
  184. package/src/utils/live-tunnel.mjs +118 -141
  185. package/src/utils/lm/install.mjs +220 -259
  186. package/src/utils/lm/requirements.mjs +54 -63
  187. package/src/utils/lm/steps.mjs +31 -31
  188. package/src/utils/lm/ui.mjs +13 -20
  189. package/src/utils/open-browser.mjs +31 -32
  190. package/src/utils/parse-raw-flags.mjs +39 -35
  191. package/src/utils/proxy-server.mjs +84 -71
  192. package/src/utils/proxy.mjs +696 -750
  193. package/src/utils/read-repo-url.mjs +48 -47
  194. package/src/utils/redirects.mjs +49 -49
  195. package/src/utils/request-id.mjs +2 -4
  196. package/src/utils/rules-proxy.mjs +96 -100
  197. package/src/utils/run-build.mjs +109 -132
  198. package/src/utils/shell.mjs +99 -106
  199. package/src/utils/sign-redirect.mjs +14 -14
  200. package/src/utils/sites/utils.mjs +48 -55
  201. package/src/utils/state-config.mjs +101 -101
  202. package/src/utils/static-server.mjs +28 -34
  203. package/src/utils/telemetry/index.mjs +2 -2
  204. package/src/utils/telemetry/report-error.mjs +45 -49
  205. package/src/utils/telemetry/request.mjs +36 -43
  206. package/src/utils/telemetry/telemetry.mjs +90 -105
  207. package/src/utils/telemetry/utils.mjs +5 -6
  208. package/src/utils/telemetry/validation.mjs +55 -53
  209. package/src/utils/types.d.ts +46 -0
  210. package/src/utils/validation.mjs +10 -13
@@ -1,32 +1,25 @@
1
- // @ts-check
2
- import AsciiTable from 'ascii-table'
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
- const recipes = await listRecipes()
11
- const table = new AsciiTable(`Usage: netlify recipes <name>`)
12
-
13
- table.setHeading('Name', 'Description')
14
-
15
- recipes.forEach(({ description, name }) => {
16
- table.addRow(name, description)
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
- export const createRecipesListCommand = (program) =>
28
- program
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
- // @ts-check
2
- import { basename } from 'path'
3
-
4
- import { closest } from 'fastest-levenshtein'
5
- import inquirer from 'inquirer'
6
-
7
- import { NETLIFYDEVERR, chalk, log } from '../../utils/command-helpers.mjs'
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
- const { config, repositoryRoot } = command.netlify
22
- const sanitizedRecipeName = basename(recipeName || '').toLowerCase()
23
-
24
- if (sanitizedRecipeName.length === 0) {
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
- log(`${NETLIFYDEVERR} ${chalk.yellow(recipeName)} is not a valid recipe name.`)
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
- const recipe = await getRecipe(recipeName)
69
-
70
- return recipe.run({ config, repositoryRoot })
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
- createRecipesListCommand(program)
80
-
81
- program
82
- .command('recipes')
83
- .argument('[name]', 'name of the recipe')
84
- .description(`Create and modify files in a project using pre-defined recipes`)
85
- .option('-n, --name <name>', 'recipe name to use')
86
- .addExamples(['netlify recipes my-recipe', 'netlify recipes --name my-recipe'])
87
- .action(recipesCommand)
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
- // @ts-check
2
- import process from 'process'
3
-
4
- import { Option } from 'commander'
5
-
6
- import { promptEditorHelper } from '../../lib/edge-functions/editor-helper.mjs'
7
- import { startFunctionsServer } from '../../lib/functions/server.mjs'
8
- import { printBanner } from '../../utils/banner.mjs'
9
- import {
10
- chalk,
11
- exit,
12
- log,
13
- NETLIFYDEVERR,
14
- NETLIFYDEVLOG,
15
- NETLIFYDEVWARN,
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
- const { api, cachedConfig, config, repositoryRoot, site, siteInfo, state } = command.netlify
35
- config.dev = { ...config.dev }
36
- config.build = { ...config.build }
37
- /** @type {import('../dev/types').DevConfig} */
38
- const devConfig = {
39
- ...(config.functionsDirectory && { functions: config.functionsDirectory }),
40
- ...(config.build.publish && { publish: config.build.publish }),
41
-
42
- ...config.dev,
43
- ...options,
44
- // Override the `framework` value so that we start a static server and not
45
- // the framework's development server.
46
- framework: '#static',
47
- }
48
-
49
- let { env } = cachedConfig
50
-
51
- if (!options.offline && siteInfo.use_envelope) {
52
- env = await getEnvelopeEnv({ api, context: options.context, env, siteInfo })
53
- log(`${NETLIFYDEVLOG} Injecting environment variable values for ${chalk.yellow('all scopes')}`)
54
- }
55
-
56
- env = await getDotEnvVariables({ devConfig, env, site })
57
- injectEnvVariables(env)
58
- await promptEditorHelper({ chalk, config, log, NETLIFYDEVLOG, repositoryRoot, state })
59
-
60
- const { accountId, addonsUrls, capabilities, siteUrl, timeouts } = await getSiteInformation({
61
- // inherited from base command --offline
62
- offline: options.offline,
63
- api,
64
- site,
65
- siteInfo,
66
- })
67
-
68
- // Ensure the internal functions directory exists so that the functions
69
- // server and registry are initialized, and any functions created by
70
- // Netlify Build are loaded.
71
- await getInternalFunctionsDir({ base: site.root, ensureExists: true })
72
-
73
- let settings = /** @type {import('../../utils/types.js').ServerSettings} */ ({})
74
- try {
75
- settings = await detectServerSettings(devConfig, options, command)
76
-
77
- cachedConfig.config = getConfigWithPlugins(cachedConfig.config, settings)
78
- } catch (error_) {
79
- log(NETLIFYDEVERR, error_.message)
80
- exit(1)
81
- }
82
-
83
- command.setAnalyticsPayload({ live: options.live })
84
-
85
- log(`${NETLIFYDEVLOG} Building site for production`)
86
- log(
87
- `${NETLIFYDEVWARN} Changes will not be hot-reloaded, so if you need to rebuild your site you must exit and run 'netlify serve' again`,
88
- )
89
-
90
- const { configPath: configPathOverride } = await runBuildTimeline({
91
- command,
92
- settings,
93
- options,
94
- })
95
-
96
- const functionsRegistry = await startFunctionsServer({
97
- api,
98
- command,
99
- config,
100
- debug: options.debug,
101
- loadDistFunctions: true,
102
- settings,
103
- site,
104
- siteInfo,
105
- siteUrl,
106
- capabilities,
107
- timeouts,
108
- geolocationMode: options.geo,
109
- geoCountry: options.country,
110
- offline: options.offline,
111
- state,
112
- accountId,
113
- })
114
-
115
- // Try to add `.netlify` to `.gitignore`.
116
- try {
117
- await ensureNetlifyIgnore(repositoryRoot)
118
- } catch {
119
- // no-op
120
- }
121
-
122
- // TODO: We should consolidate this with the existing config watcher.
123
- const getUpdatedConfig = async () => {
124
- const { config: newConfig } = await command.getConfig({ cwd: command.workingDir, offline: true, state })
125
- const normalizedNewConfig = normalizeConfig(newConfig)
126
-
127
- return normalizedNewConfig
128
- }
129
-
130
- const inspectSettings = generateInspectSettings(options.edgeInspect, options.edgeInspectBrk)
131
- const url = await startProxyServer({
132
- addonsUrls,
133
- config,
134
- configPath: configPathOverride,
135
- debug: options.debug,
136
- env,
137
- functionsRegistry,
138
- geolocationMode: options.geo,
139
- geoCountry: options.country,
140
- getUpdatedConfig,
141
- inspectSettings,
142
- offline: options.offline,
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
- export const createServeCommand = (program) =>
167
- program
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
- '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.',
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
- new Option('--functionsPort <port>', 'Old, prefer --functions-port. Port of functions server')
183
- .argParser((value) => Number.parseInt(value))
184
- .hideHelp(true),
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
- new Option(
189
- '--geo <mode>',
190
- 'force geolocation data to be updated, use cached data from the last 24h if found, or use a mock location',
191
- )
192
- .choices(['cache', 'mock', 'update'])
193
- .default('cache'),
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';