netlify-cli 17.37.1 → 17.38.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 (157) hide show
  1. package/bin/run.js +4 -2
  2. package/dist/commands/addons/addons-config.d.ts.map +1 -1
  3. package/dist/commands/addons/addons-config.js +0 -1
  4. package/dist/commands/addons/addons-create.d.ts.map +1 -1
  5. package/dist/commands/addons/addons-create.js +0 -1
  6. package/dist/commands/addons/addons-delete.d.ts.map +1 -1
  7. package/dist/commands/addons/addons-delete.js +0 -1
  8. package/dist/commands/addons/addons.d.ts.map +1 -1
  9. package/dist/commands/addons/addons.js +0 -1
  10. package/dist/commands/api/api.d.ts.map +1 -1
  11. package/dist/commands/api/api.js +0 -1
  12. package/dist/commands/base-command.d.ts +2 -2
  13. package/dist/commands/base-command.d.ts.map +1 -1
  14. package/dist/commands/base-command.js +2 -2
  15. package/dist/commands/blobs/blobs-delete.d.ts.map +1 -1
  16. package/dist/commands/blobs/blobs-delete.js +7 -1
  17. package/dist/commands/blobs/blobs-set.d.ts +1 -0
  18. package/dist/commands/blobs/blobs-set.d.ts.map +1 -1
  19. package/dist/commands/blobs/blobs-set.js +10 -2
  20. package/dist/commands/build/build.d.ts.map +1 -1
  21. package/dist/commands/build/build.js +0 -1
  22. package/dist/commands/completion/completion.d.ts.map +1 -1
  23. package/dist/commands/completion/completion.js +35 -2
  24. package/dist/commands/deploy/deploy.d.ts.map +1 -1
  25. package/dist/commands/deploy/deploy.js +3 -5
  26. package/dist/commands/deploy/index.d.ts.map +1 -1
  27. package/dist/commands/deploy/index.js +4 -3
  28. package/dist/commands/env/env-clone.d.ts.map +1 -1
  29. package/dist/commands/env/env-clone.js +12 -3
  30. package/dist/commands/env/env-set.d.ts.map +1 -1
  31. package/dist/commands/env/env-set.js +8 -3
  32. package/dist/commands/env/env-unset.d.ts.map +1 -1
  33. package/dist/commands/env/env-unset.js +7 -3
  34. package/dist/commands/functions/functions-create.d.ts.map +1 -1
  35. package/dist/commands/functions/functions-create.js +2 -5
  36. package/dist/commands/functions/functions-invoke.d.ts.map +1 -1
  37. package/dist/commands/functions/functions-invoke.js +0 -1
  38. package/dist/commands/init/index.d.ts.map +1 -1
  39. package/dist/commands/init/index.js +0 -1
  40. package/dist/commands/integration/deploy.d.ts.map +1 -1
  41. package/dist/commands/integration/deploy.js +13 -24
  42. package/dist/commands/link/link.d.ts.map +1 -1
  43. package/dist/commands/link/link.js +8 -21
  44. package/dist/commands/lm/lm-setup.d.ts.map +1 -1
  45. package/dist/commands/lm/lm-setup.js +0 -1
  46. package/dist/commands/login/login.d.ts.map +1 -1
  47. package/dist/commands/login/login.js +0 -2
  48. package/dist/commands/logout/logout.d.ts.map +1 -1
  49. package/dist/commands/logout/logout.js +0 -1
  50. package/dist/commands/logs/build.d.ts.map +1 -1
  51. package/dist/commands/logs/build.js +4 -0
  52. package/dist/commands/main.d.ts +34 -0
  53. package/dist/commands/main.d.ts.map +1 -1
  54. package/dist/commands/main.js +36 -6
  55. package/dist/commands/sites/sites-create-template.d.ts +2 -2
  56. package/dist/commands/sites/sites-create-template.d.ts.map +1 -1
  57. package/dist/commands/sites/sites-create-template.js +113 -101
  58. package/dist/commands/sites/sites-create.d.ts +2 -2
  59. package/dist/commands/sites/sites-create.d.ts.map +1 -1
  60. package/dist/commands/sites/sites-create.js +1 -9
  61. package/dist/commands/sites/sites-delete.d.ts.map +1 -1
  62. package/dist/commands/sites/sites-delete.js +3 -3
  63. package/dist/commands/sites/sites-list.d.ts.map +1 -1
  64. package/dist/commands/sites/sites-list.js +1 -5
  65. package/dist/commands/sites/sites.d.ts.map +1 -1
  66. package/dist/commands/sites/sites.js +0 -1
  67. package/dist/commands/status/status.js +3 -2
  68. package/dist/commands/unlink/unlink.js +2 -2
  69. package/dist/commands/watch/watch.d.ts.map +1 -1
  70. package/dist/commands/watch/watch.js +0 -1
  71. package/dist/lib/api.d.ts +2 -1
  72. package/dist/lib/api.d.ts.map +1 -1
  73. package/dist/lib/exec-fetcher.d.ts.map +1 -1
  74. package/dist/lib/exec-fetcher.js +0 -1
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/dist/utils/addons/prepare.d.ts.map +1 -1
  77. package/dist/utils/addons/prepare.js +1 -5
  78. package/dist/utils/command-helpers.d.ts +37 -6
  79. package/dist/utils/command-helpers.d.ts.map +1 -1
  80. package/dist/utils/command-helpers.js +21 -9
  81. package/dist/utils/dev.d.ts.map +1 -1
  82. package/dist/utils/dev.js +0 -2
  83. package/dist/utils/framework-server.d.ts.map +1 -1
  84. package/dist/utils/framework-server.js +2 -3
  85. package/dist/utils/get-repo-data.d.ts +2 -2
  86. package/dist/utils/get-repo-data.d.ts.map +1 -1
  87. package/dist/utils/get-repo-data.js +0 -1
  88. package/dist/utils/get-site.d.ts.map +1 -1
  89. package/dist/utils/get-site.js +7 -2
  90. package/dist/utils/gh-auth.js +1 -1
  91. package/dist/utils/hooks/requires-site-info.d.ts.map +1 -1
  92. package/dist/utils/hooks/requires-site-info.js +0 -3
  93. package/dist/utils/prompts/blob-delete-prompts.d.ts +2 -0
  94. package/dist/utils/prompts/blob-delete-prompts.d.ts.map +1 -0
  95. package/dist/utils/prompts/blob-delete-prompts.js +11 -0
  96. package/dist/utils/prompts/blob-set-prompt.d.ts +2 -0
  97. package/dist/utils/prompts/blob-set-prompt.d.ts.map +1 -0
  98. package/dist/utils/prompts/blob-set-prompt.js +11 -0
  99. package/dist/utils/prompts/confirm-prompt.d.ts +2 -0
  100. package/dist/utils/prompts/confirm-prompt.d.ts.map +1 -0
  101. package/dist/utils/prompts/confirm-prompt.js +20 -0
  102. package/dist/utils/prompts/env-clone-prompt.d.ts +11 -0
  103. package/dist/utils/prompts/env-clone-prompt.d.ts.map +1 -0
  104. package/dist/utils/prompts/env-clone-prompt.js +27 -0
  105. package/dist/utils/prompts/env-set-prompts.d.ts +2 -0
  106. package/dist/utils/prompts/env-set-prompts.d.ts.map +1 -0
  107. package/dist/utils/prompts/env-set-prompts.js +11 -0
  108. package/dist/utils/prompts/env-unset-prompts.d.ts +8 -0
  109. package/dist/utils/prompts/env-unset-prompts.d.ts.map +1 -0
  110. package/dist/utils/prompts/env-unset-prompts.js +17 -0
  111. package/dist/utils/prompts/prompt-messages.d.ts +25 -0
  112. package/dist/utils/prompts/prompt-messages.d.ts.map +1 -0
  113. package/dist/utils/prompts/prompt-messages.js +25 -0
  114. package/dist/utils/run-build.d.ts +2 -0
  115. package/dist/utils/run-build.d.ts.map +1 -1
  116. package/dist/utils/run-program.d.ts +3 -0
  117. package/dist/utils/run-program.d.ts.map +1 -0
  118. package/dist/utils/run-program.js +12 -0
  119. package/dist/utils/scripted-commands.d.ts +3 -0
  120. package/dist/utils/scripted-commands.d.ts.map +1 -0
  121. package/dist/utils/scripted-commands.js +17 -0
  122. package/dist/utils/sites/create-template.d.ts +14 -0
  123. package/dist/utils/sites/create-template.d.ts.map +1 -0
  124. package/dist/utils/sites/create-template.js +46 -0
  125. package/dist/utils/sites/utils.d.ts +8 -5
  126. package/dist/utils/sites/utils.d.ts.map +1 -1
  127. package/dist/utils/sites/utils.js +23 -11
  128. package/dist/utils/static-server.d.ts +3 -1
  129. package/dist/utils/static-server.d.ts.map +1 -1
  130. package/dist/utils/static-server.js +2 -0
  131. package/dist/utils/types.d.ts +137 -0
  132. package/dist/utils/types.d.ts.map +1 -1
  133. package/functions-templates/javascript/hello-world/{{name}}.mjs +13 -0
  134. package/functions-templates/javascript/scheduled-function/{{name}}.mjs +11 -0
  135. package/functions-templates/rust/hello-world/Cargo.toml +1 -1
  136. package/functions-templates/typescript/hello-world/package-lock.json +15 -15
  137. package/functions-templates/typescript/hello-world/package.json +1 -1
  138. package/functions-templates/typescript/hello-world/{{name}}.mts +14 -0
  139. package/functions-templates/typescript/scheduled-function/package.json +1 -1
  140. package/functions-templates/typescript/scheduled-function/{{name}}.mts +11 -0
  141. package/npm-shrinkwrap.json +181 -252
  142. package/package.json +9 -9
  143. package/functions-templates/javascript/hello-world/{{name}}.js +0 -17
  144. package/functions-templates/javascript/identity-signup/.netlify-function-template.mjs +0 -5
  145. package/functions-templates/javascript/identity-signup/{{name}}.js +0 -29
  146. package/functions-templates/javascript/sanity-create/.netlify-function-template.mjs +0 -5
  147. package/functions-templates/javascript/sanity-create/package.json +0 -20
  148. package/functions-templates/javascript/sanity-create/{{name}}.js +0 -72
  149. package/functions-templates/javascript/sanity-groq/.netlify-function-template.mjs +0 -5
  150. package/functions-templates/javascript/sanity-groq/package.json +0 -21
  151. package/functions-templates/javascript/sanity-groq/{{name}}.js +0 -56
  152. package/functions-templates/javascript/scheduled-function/{{name}}.js +0 -12
  153. package/functions-templates/javascript/submission-created/.netlify-function-template.mjs +0 -5
  154. package/functions-templates/javascript/submission-created/package.json +0 -19
  155. package/functions-templates/javascript/submission-created/{{name}}.js +0 -29
  156. package/functions-templates/typescript/hello-world/{{name}}.ts +0 -12
  157. package/functions-templates/typescript/scheduled-function/{{name}}.ts +0 -12
package/bin/run.js CHANGED
@@ -3,9 +3,10 @@ import { argv } from 'process'
3
3
 
4
4
  import updateNotifier from 'update-notifier'
5
5
 
6
- import { createMainCommand } from '../dist/commands/index.js'
6
+ import { runProgram } from '../dist/utils/run-program.js'
7
7
  import { error } from '../dist/utils/command-helpers.js'
8
8
  import getPackageJson from '../dist/utils/get-package-json.js'
9
+ import { createMainCommand } from '../dist/commands/main.js'
9
10
 
10
11
  // 12 hours
11
12
  const UPDATE_CHECK_INTERVAL = 432e5
@@ -24,7 +25,8 @@ try {
24
25
  const program = createMainCommand()
25
26
 
26
27
  try {
27
- await program.parseAsync(argv)
28
+ await runProgram(program, argv)
29
+
28
30
  program.onEnd()
29
31
  } catch (error_) {
30
32
  program.onEnd(error_)
@@ -1 +1 @@
1
- {"version":3,"file":"addons-config.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAYxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AA8B5C,eAAO,MAAM,YAAY,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,+BAqHhG,CAAA"}
1
+ {"version":3,"file":"addons-config.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAYxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AA6B5C,eAAO,MAAM,YAAY,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,+BAqHhG,CAAA"}
@@ -31,7 +31,6 @@ const update = async function ({ addonName, api, currentConfig, instanceId, newC
31
31
  log(`Add-on "${addonName}" successfully updated`);
32
32
  }
33
33
  catch (error_) {
34
- // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
35
34
  error(error_.message);
36
35
  }
37
36
  };
@@ -1 +1 @@
1
- {"version":3,"file":"addons-create.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAUxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAoB5C,eAAO,MAAM,YAAY,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,+BA2EhG,CAAA"}
1
+ {"version":3,"file":"addons-create.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAUxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAmB5C,eAAO,MAAM,YAAY,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,+BA2EhG,CAAA"}
@@ -21,7 +21,6 @@ const createAddon = async ({ addonName, api, config, siteData, siteId }) => {
21
21
  }
22
22
  }
23
23
  catch (error_) {
24
- // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
25
24
  error(error_.message);
26
25
  }
27
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"addons-delete.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,YAAY,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,kBA6BhG,CAAA"}
1
+ {"version":3,"file":"addons-delete.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,YAAY,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,kBA4BhG,CAAA"}
@@ -27,7 +27,6 @@ export const addonsDelete = async (addonName, options, command) => {
27
27
  log(`Addon "${addonName}" deleted`);
28
28
  }
29
29
  catch (error_) {
30
- // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
31
30
  error(error_.message);
32
31
  }
33
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"addons.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons.ts"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAM5C,eAAO,MAAM,mBAAmB,YAAa,WAAW,gBAyEvD,CAAA"}
1
+ {"version":3,"file":"addons.d.ts","sourceRoot":"","sources":["../../../src/commands/addons/addons.ts"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAM5C,eAAO,MAAM,mBAAmB,YAAa,WAAW,gBAwEvD,CAAA"}
@@ -39,7 +39,6 @@ Add-ons are a way to extend the functionality of your Netlify site`)
39
39
  .alias('addon:delete')
40
40
  .argument('<name>', 'Add-on namespace')
41
41
  .description(`Remove an add-on extension to your site\nAdd-ons are a way to extend the functionality of your Netlify site`)
42
- .option('-f, --force', 'delete without prompting (useful for CI)')
43
42
  .action(async (addonName, options, command) => {
44
43
  const { addonsDelete } = await import('./addons-delete.js');
45
44
  await addonsDelete(addonName, options, command);
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/commands/api/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,UAAU,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,kBAsC9F,CAAA"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/commands/api/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,UAAU,cAAqB,MAAM,WAAW,YAAY,WAAW,WAAW,kBAqC9F,CAAA"}
@@ -34,7 +34,6 @@ export const apiCommand = async (apiMethod, options, command) => {
34
34
  logJson(apiResponse);
35
35
  }
36
36
  catch (error_) {
37
- // @ts-expect-error TS(2345) FIXME: Argument of type 'unknown' is not assignable to pa... Remove this comment to see the full error message
38
37
  error(error_);
39
38
  }
40
39
  };
@@ -45,8 +45,8 @@ export default class BaseCommand extends Command {
45
45
  createHelp(): Help;
46
46
  /** Will be called on the end of an action to track the metrics */
47
47
  onEnd(error_?: unknown): Promise<void>;
48
- authenticate(tokenFromFlag?: string): Promise<any>;
49
- expensivelyAuthenticate(): Promise<any>;
48
+ authenticate(tokenFromFlag?: string): Promise<string | undefined>;
49
+ expensivelyAuthenticate(): Promise<string | undefined>;
50
50
  /** Adds some data to the analytics payload */
51
51
  setAnalyticsPayload(payload: Record<string, unknown>): void;
52
52
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,WAAW,CAAA;AA0BjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAQxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,KAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAuGD,0EAA0E;AAC1E,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;;IAC9C,4DAA4D;IAE5D,OAAO,EAAE,cAAc,CAAA;IACvB,SAAS,EAAE,SAAS,CAAyC;IAE7D,OAAO,EAAE,OAAO,CAAA;IAEhB;;;;OAIG;IAGH,UAAU,SAAgB;IAE1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,YAAY,EAAE,YAAY,CAAK;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAqDxC,mIAAmI;IACnI,aAAa;IAKb,mFAAmF;IACnF,QAAQ,EAAE,MAAM,EAAE,CAAK;IACvB,oCAAoC;IACpC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE;IAK9B,iEAAiE;IACjE,UAAU,IAAI,IAAI;IAgIlB,kEAAkE;IAC5D,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO;IAwBtB,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM;IAQnC,uBAAuB;IA4D7B,8CAA8C;IAC9C,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOpD;;OAEG;YACW,IAAI;IAkMlB,iDAAiD;IAC3C,SAAS,CAAC,MAAM,EAAE;QACtB,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,2EAA2E;QAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC;IAiDpC;;OAEG;IACH,gBAAgB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAI5C;;;;OAIG;IACH,iBAAiB,IAAI,YAAY,GAAG,KAAK;IAIzC;;OAEG;IACH,cAAc,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;CAGjE"}
1
+ {"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiB,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAU,MAAM,WAAW,CAAA;AA0BjD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAQxD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,KAAK,SAAS,GAAG;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAuGD,0EAA0E;AAC1E,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;;IAC9C,4DAA4D;IAE5D,OAAO,EAAE,cAAc,CAAA;IACvB,SAAS,EAAE,SAAS,CAAyC;IAE7D,OAAO,EAAE,OAAO,CAAA;IAEhB;;;;OAIG;IAGH,UAAU,SAAgB;IAE1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,YAAY,EAAE,YAAY,CAAK;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAsDxC,mIAAmI;IACnI,aAAa;IAKb,mFAAmF;IACnF,QAAQ,EAAE,MAAM,EAAE,CAAK;IACvB,oCAAoC;IACpC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE;IAK9B,iEAAiE;IACjE,UAAU,IAAI,IAAI;IAgIlB,kEAAkE;IAC5D,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO;IAwBtB,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM;IAQnC,uBAAuB;IA4D7B,8CAA8C;IAC9C,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOpD;;OAEG;YACW,IAAI;IAkMlB,iDAAiD;IAC3C,SAAS,CAAC,MAAM,EAAE;QACtB,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,2EAA2E;QAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC;IAgDpC;;OAEG;IACH,gBAAgB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAI5C;;;;OAIG;IACH,iBAAiB,IAAI,YAAY,GAAG,KAAK;IAIzC;;OAEG;IACH,cAAc,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;CAGjE"}
@@ -10,7 +10,6 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
12
  var _BaseCommand_noBaseOptions;
13
- import { isCI } from 'ci-info';
14
13
  import { existsSync } from 'fs';
15
14
  import { join, relative, resolve } from 'path';
16
15
  import process from 'process';
@@ -18,6 +17,7 @@ import { format } from 'util';
18
17
  import { DefaultLogger, Project } from '@netlify/build-info';
19
18
  import { NodeFS, NoopLogger } from '@netlify/build-info/node';
20
19
  import { resolveConfig } from '@netlify/config';
20
+ import { isCI } from 'ci-info';
21
21
  import { Command, Option } from 'commander';
22
22
  // @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'debu... Remove this comment to see the full error message
23
23
  import debug from 'debug';
@@ -140,6 +140,7 @@ class BaseCommand extends Command {
140
140
  createCommand(name) {
141
141
  const base = new BaseCommand(name)
142
142
  // If --silent or --json flag passed disable logger
143
+ // .addOption(new Option('--force', 'Force command to run. Bypasses prompts for certain destructive commands.'))
143
144
  .addOption(new Option('--json', 'Output return values as JSON').hideHelp(true))
144
145
  .addOption(new Option('--silent', 'Silence CLI output').hideHelp(true))
145
146
  .addOption(new Option('--cwd <cwd>').hideHelp(true))
@@ -579,7 +580,6 @@ class BaseCommand extends Command {
579
580
  // the option to say that we don't need API data.)
580
581
  if (isUserError && !config.offline && config.token) {
581
582
  if (flags.debug) {
582
- // @ts-expect-error TS(2345) FIXME: Argument of type 'unknown' is not assignable to pa... Remove this comment to see the full error message
583
583
  error(error_, { exit: false });
584
584
  warn('Failed to resolve config, falling back to offline resolution');
585
585
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blobs-delete.d.ts","sourceRoot":"","sources":["../../../src/commands/blobs/blobs-delete.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,eAAO,MAAM,WAAW,cAAqB,MAAM,OAAO,MAAM,YAAY,OAAO,MAAM,EAAE,OAAO,CAAC,WAAW,GAAG,kBAchH,CAAA"}
1
+ {"version":3,"file":"blobs-delete.d.ts","sourceRoot":"","sources":["../../../src/commands/blobs/blobs-delete.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,WAAW,cAAqB,MAAM,OAAO,MAAM,YAAY,OAAO,MAAM,EAAE,OAAO,CAAC,WAAW,GAAG,kBAsBhH,CAAA"}
@@ -1,18 +1,24 @@
1
1
  import { getStore } from '@netlify/blobs';
2
- import { chalk, error as printError } from '../../utils/command-helpers.js';
2
+ import { chalk, error as printError, log } from '../../utils/command-helpers.js';
3
+ import { promptBlobDelete } from '../../utils/prompts/blob-delete-prompts.js';
3
4
  /**
4
5
  * The blobs:delete command
5
6
  */
6
7
  export const blobsDelete = async (storeName, key, _options, command) => {
7
8
  const { api, siteInfo } = command.netlify;
9
+ const { force } = _options;
8
10
  const store = getStore({
9
11
  apiURL: `${api.scheme}://${api.host}`,
10
12
  name: storeName,
11
13
  siteID: siteInfo.id ?? '',
12
14
  token: api.accessToken ?? '',
13
15
  });
16
+ if (force === undefined) {
17
+ await promptBlobDelete(key, storeName);
18
+ }
14
19
  try {
15
20
  await store.delete(key);
21
+ log(`${chalk.greenBright('Success')}: Blob ${chalk.yellow(key)} deleted from store ${chalk.yellow(storeName)}`);
16
22
  }
17
23
  catch {
18
24
  return printError(`Could not delete blob ${chalk.yellow(key)} from store ${chalk.yellow(storeName)}`);
@@ -2,6 +2,7 @@ import { OptionValues } from 'commander';
2
2
  import BaseCommand from '../base-command.js';
3
3
  interface Options extends OptionValues {
4
4
  input?: string;
5
+ force?: string | boolean;
5
6
  }
6
7
  export declare const blobsSet: (storeName: string, key: string, valueParts: string[], options: Options, command: BaseCommand) => Promise<void>;
7
8
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"blobs-set.d.ts","sourceRoot":"","sources":["../../../src/commands/blobs/blobs-set.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,UAAU,OAAQ,SAAQ,YAAY;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,eAAO,MAAM,QAAQ,cACR,MAAM,OACZ,MAAM,cACC,MAAM,EAAE,WACX,OAAO,WACP,WAAW,kBA8CrB,CAAA"}
1
+ {"version":3,"file":"blobs-set.d.ts","sourceRoot":"","sources":["../../../src/commands/blobs/blobs-set.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,UAAU,OAAQ,SAAQ,YAAY;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB;AAED,eAAO,MAAM,QAAQ,cACR,MAAM,OACZ,MAAM,cACC,MAAM,EAAE,WACX,OAAO,WACP,WAAW,kBAqDrB,CAAA"}
@@ -1,10 +1,11 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import { resolve } from 'path';
3
3
  import { getStore } from '@netlify/blobs';
4
- import { chalk, error as printError, isNodeError } from '../../utils/command-helpers.js';
4
+ import { chalk, error as printError, isNodeError, log } from '../../utils/command-helpers.js';
5
+ import { promptBlobSetOverwrite } from '../../utils/prompts/blob-set-prompt.js';
5
6
  export const blobsSet = async (storeName, key, valueParts, options, command) => {
6
7
  const { api, siteInfo } = command.netlify;
7
- const { input } = options;
8
+ const { force, input } = options;
8
9
  const store = getStore({
9
10
  apiURL: `${api.scheme}://${api.host}`,
10
11
  name: storeName,
@@ -30,8 +31,15 @@ export const blobsSet = async (storeName, key, valueParts, options, command) =>
30
31
  else if (!value) {
31
32
  return printError(`You must provide a value as a command-line parameter (e.g. 'netlify blobs:set my-store my-key my value') or specify the path to a file from where the value should be read (e.g. 'netlify blobs:set my-store my-key --input ./my-file.txt')`);
32
33
  }
34
+ if (force === undefined) {
35
+ const existingValue = await store.get(key);
36
+ if (existingValue) {
37
+ await promptBlobSetOverwrite(key, storeName);
38
+ }
39
+ }
33
40
  try {
34
41
  await store.set(key, value);
42
+ log(`${chalk.greenBright('Success')}: Blob ${chalk.yellow(key)} set in store ${chalk.yellow(storeName)}`);
35
43
  }
36
44
  catch {
37
45
  return printError(`Could not set blob ${chalk.yellow(key)} in store ${chalk.yellow(storeName)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/build/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAMxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C;;GAEG;AAEH,eAAO,MAAM,YAAY;;;;;UAWxB,CAAA;AAED,eAAO,MAAM,KAAK,YAAmB,YAAY,WAAW,WAAW,kBA+BtE,CAAA"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/commands/build/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAMxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C;;GAEG;AAEH,eAAO,MAAM,YAAY;;;;;UAWxB,CAAA;AAED,eAAO,MAAM,KAAK,YAAmB,YAAY,WAAW,WAAW,kBA8BtE,CAAA"}
@@ -19,7 +19,6 @@ export const build = async (options, command) => {
19
19
  const { cachedConfig, siteInfo } = command.netlify;
20
20
  command.setAnalyticsPayload({ dry: options.dry });
21
21
  // Retrieve Netlify Build options
22
- // @ts-expect-error TS(2554) FIXME: Expected 1 arguments, but got 0.
23
22
  const [token] = await getToken();
24
23
  const settings = await detectFrameworkSettings(command, 'build');
25
24
  const buildOptions = await getBuildOptions({
@@ -1 +1 @@
1
- {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/commands/completion/completion.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAMxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAI5C,eAAO,MAAM,kBAAkB,YAAmB,YAAY,WAAW,WAAW,kBAgBnF,CAAA;AAED,eAAO,MAAM,mBAAmB,YAAmB,YAAY,WAAW,WAAW,kBAQpF,CAAA"}
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/commands/completion/completion.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAaxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAI5C,eAAO,MAAM,kBAAkB,YAAmB,YAAY,WAAW,WAAW,kBAkDnF,CAAA;AAED,eAAO,MAAM,mBAAmB,YAAmB,YAAY,WAAW,WAAW,kBAQpF,CAAA"}
@@ -1,9 +1,12 @@
1
+ import fs from 'fs';
2
+ import { homedir } from 'os';
1
3
  import { dirname, join } from 'path';
2
4
  import { fileURLToPath } from 'url';
5
+ import inquirer from 'inquirer';
3
6
  // @ts-expect-error TS(7016) FIXME: Could not find a declaration file for module 'tabt... Remove this comment to see the full error message
4
7
  import { install, uninstall } from 'tabtab';
5
8
  import { generateAutocompletion } from '../../lib/completion/index.js';
6
- import { error } from '../../utils/command-helpers.js';
9
+ import { error, log, chalk, checkFileForLine, TABTAB_CONFIG_LINE, AUTOLOAD_COMPINIT, } from '../../utils/command-helpers.js';
7
10
  const completer = join(dirname(fileURLToPath(import.meta.url)), '../../lib/completion/script.js');
8
11
  export const completionGenerate = async (options, command) => {
9
12
  const { parent } = command;
@@ -16,7 +19,37 @@ export const completionGenerate = async (options, command) => {
16
19
  name: parent.name(),
17
20
  completer,
18
21
  });
19
- console.log(`Completion for ${parent.name()} successful installed!`);
22
+ const zshConfigFilepath = join(process.env.HOME || homedir(), '.zshrc');
23
+ if (fs.existsSync(zshConfigFilepath) &&
24
+ checkFileForLine(zshConfigFilepath, TABTAB_CONFIG_LINE) &&
25
+ !checkFileForLine(zshConfigFilepath, AUTOLOAD_COMPINIT)) {
26
+ log(`To enable Tabtab autocompletion with zsh, the following line may need to be added to your ~/.zshrc:`);
27
+ log(chalk.bold.cyan(`\n${AUTOLOAD_COMPINIT}\n`));
28
+ const { compinitAdded } = await inquirer.prompt([
29
+ {
30
+ type: 'confirm',
31
+ name: 'compinitAdded',
32
+ message: `Would you like to add it?`,
33
+ default: true,
34
+ },
35
+ ]);
36
+ if (compinitAdded) {
37
+ await fs.readFile(zshConfigFilepath, 'utf8', (err, data) => {
38
+ const updatedZshFile = AUTOLOAD_COMPINIT + '\n' + data;
39
+ fs.writeFileSync(zshConfigFilepath, updatedZshFile, 'utf8');
40
+ });
41
+ log('Successfully added compinit line to .zshrc');
42
+ }
43
+ }
44
+ log(`Completion for ${parent.name()} successfully installed!`);
45
+ if (process.platform !== 'win32') {
46
+ log("\nTo ensure proper functionality, you'll need to set appropriate file permissions.");
47
+ log(chalk.bold('Add executable permissions by running the following command:'));
48
+ log(chalk.bold.cyan(`\nchmod +x ${completer}\n`));
49
+ }
50
+ else {
51
+ log(`\nTo ensure proper functionality, you may need to set appropriate file permissions to ${completer}.`);
52
+ }
20
53
  };
21
54
  export const completionUninstall = async (options, command) => {
22
55
  if (!command.parent) {
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/deploy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AAiC7C,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAuvB5C,eAAO,MAAM,MAAM,YAAmB,YAAY,WAAW,WAAW,kBAoHvE,CAAA"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/deploy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AAkC7C,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAqvB5C,eAAO,MAAM,MAAM,YAAmB,YAAY,WAAW,WAAW,kBAoHvE,CAAA"}
@@ -40,12 +40,10 @@ const triggerDeploy = async ({ api, options, siteData, siteId }) => {
40
40
  }
41
41
  }
42
42
  catch (error_) {
43
- // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
44
43
  if (error_.status === 404) {
45
44
  error('Site not found. Please rerun "netlify link" and make sure that your site has CI configured.');
46
45
  }
47
46
  else {
48
- // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
49
47
  error(error_.message);
50
48
  }
51
49
  }
@@ -289,7 +287,8 @@ const uploadDeployBlobs = async ({ cachedConfig, deployId, options, packagePath,
289
287
  msg: 'Uploading blobs to deploy store...\n',
290
288
  phase: 'start',
291
289
  });
292
- const [token] = await getToken(false);
290
+ const [token] = await getToken();
291
+ const blobsToken = token || undefined;
293
292
  const { success } = await runCoreSteps(['blobs_upload'], {
294
293
  ...options,
295
294
  quiet: silent,
@@ -297,7 +296,7 @@ const uploadDeployBlobs = async ({ cachedConfig, deployId, options, packagePath,
297
296
  packagePath,
298
297
  deployId,
299
298
  siteId,
300
- token,
299
+ token: blobsToken,
301
300
  });
302
301
  if (!success) {
303
302
  statusCb({
@@ -448,7 +447,6 @@ const handleBuild = async ({ cachedConfig, currentDir, defaultConfig, deployHand
448
447
  if (!options.build) {
449
448
  return {};
450
449
  }
451
- // @ts-expect-error TS(2554) FIXME: Expected 1 arguments, but got 0.
452
450
  const [token] = await getToken();
453
451
  const resolvedOptions = await getBuildOptions({
454
452
  cachedConfig,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/index.ts"],"names":[],"mappings":"AAIA,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,mBAAmB,YAAa,WAAW,gBAyHlD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy/index.ts"],"names":[],"mappings":"AAIA,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,mBAAmB,YAAa,WAAW,gBAgIlD,CAAA"}
@@ -72,10 +72,11 @@ functions/
72
72
  Support for package.json's main field, and intrinsic index.js entrypoints are coming soon.`)
73
73
  .option('-d, --dir <path>', 'Specify a folder to deploy')
74
74
  .option('-f, --functions <folder>', 'Specify a functions folder to deploy')
75
- .option('-p, --prod', 'Deploy to production', false)
75
+ .addOption(new Option('-p, --prod', 'Deploy to production').default(false).conflicts(['alias', 'branch', 'prodIfUnlocked']))
76
76
  .addOption(new Option('--prodIfUnlocked', 'Old, prefer --prod-if-unlocked. Deploy to production if unlocked, create a draft otherwise')
77
77
  .default(false)
78
- .hideHelp(true))
78
+ .hideHelp(true)
79
+ .conflicts(['alias', 'branch', 'prod']))
79
80
  .option('--prod-if-unlocked', 'Deploy to production if unlocked, create a draft otherwise', false)
80
81
  .option('--alias <name>', 'Specifies the alias for deployment, the string at the beginning of the deploy subdomain. Useful for creating predictable deployment URLs. Avoid setting an alias string to the same value as a deployed branch. `alias` doesn’t create a branch deploy and can’t be used in conjunction with the branch subdomain feature. Maximum 37 characters.')
81
82
  .option('-b, --branch <name>', 'Serves the same functionality as --alias. Deprecated and will be removed in future versions')
@@ -85,7 +86,7 @@ Support for package.json's main field, and intrinsic index.js entrypoints are co
85
86
  .option('-s, --site <name-or-id>', 'A site name or ID to deploy to', env.NETLIFY_SITE_ID)
86
87
  .option('--json', 'Output deployment data as JSON')
87
88
  .option('--timeout <number>', 'Timeout to wait for deployment to finish', (value) => Number.parseInt(value))
88
- .option('--trigger', 'Trigger a new build of your site on Netlify without uploading local files')
89
+ .addOption(new Option('--trigger', 'Trigger a new build of your site on Netlify without uploading local files').conflicts('build'))
89
90
  .option('--build', 'Run build command before deploying')
90
91
  .option('--context <context>', 'Context to use when resolving build configuration')
91
92
  .option('--skip-functions-cache', 'Ignore any functions created as part of a previous `build` or `deploy` commands, forcing them to be bundled again as part of the deployment', false)
@@ -1 +1 @@
1
- {"version":3,"file":"env-clone.d.ts","sourceRoot":"","sources":["../../../src/commands/env/env-clone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAkD5C,eAAO,MAAM,QAAQ,YAAmB,YAAY,WAAW,WAAW,qBAuCzE,CAAA"}
1
+ {"version":3,"file":"env-clone.d.ts","sourceRoot":"","sources":["../../../src/commands/env/env-clone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAqD5C,eAAO,MAAM,QAAQ,YAAmB,YAAY,WAAW,WAAW,qBAgDzE,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { chalk, log, error as logError } from '../../utils/command-helpers.js';
2
+ import { promptEnvCloneOverwrite } from '../../utils/prompts/env-clone-prompt.js';
2
3
  // @ts-expect-error TS(7006) FIXME: Parameter 'api' implicitly has an 'any' type.
3
4
  const safeGetSite = async (api, siteId) => {
4
5
  try {
@@ -14,7 +15,7 @@ const safeGetSite = async (api, siteId) => {
14
15
  * @returns {Promise<boolean>}
15
16
  */
16
17
  // @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
17
- const cloneEnvVars = async ({ api, siteFrom, siteTo }) => {
18
+ const cloneEnvVars = async ({ api, force, siteFrom, siteTo }) => {
18
19
  const [envelopeFrom, envelopeTo] = await Promise.all([
19
20
  api.getEnvVars({ accountId: siteFrom.account_slug, siteId: siteFrom.id }),
20
21
  api.getEnvVars({ accountId: siteTo.account_slug, siteId: siteTo.id }),
@@ -29,6 +30,9 @@ const cloneEnvVars = async ({ api, siteFrom, siteTo }) => {
29
30
  const siteId = siteTo.id;
30
31
  // @ts-expect-error TS(7031) FIXME: Binding element 'key' implicitly has an 'any' type... Remove this comment to see the full error message
31
32
  const envVarsToDelete = envelopeTo.filter(({ key }) => keysFrom.includes(key));
33
+ if (envVarsToDelete.length !== 0 && Boolean(force) === false) {
34
+ await promptEnvCloneOverwrite(siteTo.id, envVarsToDelete);
35
+ }
32
36
  // delete marked env vars in parallel
33
37
  // @ts-expect-error TS(7031) FIXME: Binding element 'key' implicitly has an 'any' type... Remove this comment to see the full error message
34
38
  await Promise.all(envVarsToDelete.map(({ key }) => api.deleteEnvVar({ accountId, siteId, key })));
@@ -44,12 +48,17 @@ const cloneEnvVars = async ({ api, siteFrom, siteTo }) => {
44
48
  };
45
49
  export const envClone = async (options, command) => {
46
50
  const { api, site } = command.netlify;
51
+ const { force } = options;
47
52
  if (!site.id && !options.from) {
48
53
  log('Please include the source site Id as the `--from` option, or run `netlify link` to link this folder to a Netlify site');
49
54
  return false;
50
55
  }
56
+ const sourceId = options.from || site.id;
57
+ if (!sourceId) {
58
+ log('Please include the source site Id as the `--from` option, or run `netlify link` to link this folder to a Netlify site');
59
+ }
51
60
  const siteId = {
52
- from: options.from || site.id,
61
+ from: sourceId,
53
62
  to: options.to,
54
63
  };
55
64
  const [{ data: siteFrom, error: errorFrom }, { data: siteTo, error: errorTo }] = await Promise.all([
@@ -64,7 +73,7 @@ export const envClone = async (options, command) => {
64
73
  logError(`Can't find site with id ${chalk.bold(siteId.to)}. Please make sure the site exists.`);
65
74
  return false;
66
75
  }
67
- const success = await cloneEnvVars({ api, siteFrom, siteTo });
76
+ const success = await cloneEnvVars({ api, siteFrom, siteTo, force });
68
77
  if (!success) {
69
78
  return false;
70
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env-set.d.ts","sourceRoot":"","sources":["../../../src/commands/env/env-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAyG5C,eAAO,MAAM,MAAM,QAAe,MAAM,SAAS,MAAM,WAAW,YAAY,WAAW,WAAW,+BAkCnG,CAAA"}
1
+ {"version":3,"file":"env-set.d.ts","sourceRoot":"","sources":["../../../src/commands/env/env-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AA6G5C,eAAO,MAAM,MAAM,QAAe,MAAM,SAAS,MAAM,WAAW,YAAY,WAAW,WAAW,+BA+BnG,CAAA"}
@@ -1,11 +1,12 @@
1
1
  import { chalk, error, log, logJson } from '../../utils/command-helpers.js';
2
2
  import { AVAILABLE_CONTEXTS, AVAILABLE_SCOPES, translateFromEnvelopeToMongo } from '../../utils/env/index.js';
3
+ import { promptOverwriteEnvVariable } from '../../utils/prompts/env-set-prompts.js';
3
4
  /**
4
5
  * Updates the env for a site configured with Envelope with a new key/value pair
5
6
  * @returns {Promise<object | boolean>}
6
7
  */
7
8
  // @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
8
- const setInEnvelope = async ({ api, context, key, scope, secret, siteInfo, value }) => {
9
+ const setInEnvelope = async ({ api, context, force, key, scope, secret, siteInfo, value }) => {
9
10
  const accountId = siteInfo.account_slug;
10
11
  const siteId = siteInfo.id;
11
12
  // secret values may not be used in the post-processing scope
@@ -33,6 +34,10 @@ const setInEnvelope = async ({ api, context, key, scope, secret, siteInfo, value
33
34
  let values = contexts.map((ctx) => AVAILABLE_CONTEXTS.includes(ctx) ? { context: ctx, value } : { context: 'branch', context_parameter: ctx, value });
34
35
  // @ts-expect-error TS(7006) FIXME: Parameter 'envVar' implicitly has an 'any' type.
35
36
  const existing = envelopeVariables.find((envVar) => envVar.key === key);
37
+ // Checks if --force is passed and if it is an existing variaible, then we need to prompt the user
38
+ if (Boolean(force) === false && existing) {
39
+ await promptOverwriteEnvVariable(key);
40
+ }
36
41
  const params = { accountId, siteId, key };
37
42
  try {
38
43
  if (existing) {
@@ -92,7 +97,7 @@ const setInEnvelope = async ({ api, context, key, scope, secret, siteInfo, value
92
97
  };
93
98
  };
94
99
  export const envSet = async (key, value, options, command) => {
95
- const { context, scope, secret } = options;
100
+ const { context, force, scope, secret } = options;
96
101
  const { api, cachedConfig, site } = command.netlify;
97
102
  const siteId = site.id;
98
103
  if (!siteId) {
@@ -101,7 +106,7 @@ export const envSet = async (key, value, options, command) => {
101
106
  }
102
107
  const { siteInfo } = cachedConfig;
103
108
  // Get current environment variables set in the UI
104
- const finalEnv = await setInEnvelope({ api, siteInfo, key, value, context, scope, secret });
109
+ const finalEnv = await setInEnvelope({ api, siteInfo, force, key, value, context, scope, secret });
105
110
  if (!finalEnv) {
106
111
  return false;
107
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env-unset.d.ts","sourceRoot":"","sources":["../../../src/commands/env/env-unset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AA6D5C,eAAO,MAAM,QAAQ,QAAe,MAAM,WAAW,YAAY,WAAW,WAAW,+BAsBtF,CAAA"}
1
+ {"version":3,"file":"env-unset.d.ts","sourceRoot":"","sources":["../../../src/commands/env/env-unset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAKxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAgE5C,eAAO,MAAM,QAAQ,QAAe,MAAM,WAAW,YAAY,WAAW,WAAW,+BAsBtF,CAAA"}
@@ -1,11 +1,12 @@
1
1
  import { chalk, log, logJson } from '../../utils/command-helpers.js';
2
2
  import { AVAILABLE_CONTEXTS, translateFromEnvelopeToMongo } from '../../utils/env/index.js';
3
+ import { promptOverwriteEnvVariable } from '../../utils/prompts/env-unset-prompts.js';
3
4
  /**
4
5
  * Deletes a given key from the env of a site configured with Envelope
5
6
  * @returns {Promise<object>}
6
7
  */
7
8
  // @ts-expect-error TS(7031) FIXME: Binding element 'api' implicitly has an 'any' type... Remove this comment to see the full error message
8
- const unsetInEnvelope = async ({ api, context, key, siteInfo }) => {
9
+ const unsetInEnvelope = async ({ api, context, force, key, siteInfo }) => {
9
10
  const accountId = siteInfo.account_slug;
10
11
  const siteId = siteInfo.id;
11
12
  // fetch envelope env vars
@@ -19,6 +20,9 @@ const unsetInEnvelope = async ({ api, context, key, siteInfo }) => {
19
20
  // if not, no need to call delete; return early
20
21
  return env;
21
22
  }
23
+ if (Boolean(force) === false) {
24
+ await promptOverwriteEnvVariable(key);
25
+ }
22
26
  const params = { accountId, siteId, key };
23
27
  try {
24
28
  if (context) {
@@ -52,7 +56,7 @@ const unsetInEnvelope = async ({ api, context, key, siteInfo }) => {
52
56
  return env;
53
57
  };
54
58
  export const envUnset = async (key, options, command) => {
55
- const { context } = options;
59
+ const { context, force } = options;
56
60
  const { api, cachedConfig, site } = command.netlify;
57
61
  const siteId = site.id;
58
62
  if (!siteId) {
@@ -60,7 +64,7 @@ export const envUnset = async (key, options, command) => {
60
64
  return false;
61
65
  }
62
66
  const { siteInfo } = cachedConfig;
63
- const finalEnv = await unsetInEnvelope({ api, context, siteInfo, key });
67
+ const finalEnv = await unsetInEnvelope({ api, context, force, siteInfo, key });
64
68
  // Return new environment variables of site if using json flag
65
69
  if (options.json) {
66
70
  logJson(finalEnv);
@@ -1 +1 @@
1
- {"version":3,"file":"functions-create.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/functions-create.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAcxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAutB5C,eAAO,MAAM,eAAe,SAAgB,MAAM,WAAW,YAAY,WAAW,WAAW,kBAQ9F,CAAA"}
1
+ {"version":3,"file":"functions-create.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/functions-create.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAsBxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAotB5C,eAAO,MAAM,eAAe,SAAgB,MAAM,WAAW,YAAY,WAAW,WAAW,kBAQ9F,CAAA"}
@@ -12,7 +12,7 @@ import fetch from 'node-fetch';
12
12
  import ora from 'ora';
13
13
  import { fileExistsAsync } from '../../lib/fs.js';
14
14
  import { getAddons, getCurrentAddon, getSiteData } from '../../utils/addons/prepare.js';
15
- import { NETLIFYDEVERR, NETLIFYDEVLOG, NETLIFYDEVWARN, chalk, error, log } from '../../utils/command-helpers.js';
15
+ import { NETLIFYDEVERR, NETLIFYDEVLOG, NETLIFYDEVWARN, chalk, error, log, } from '../../utils/command-helpers.js';
16
16
  import { copyTemplateDir } from '../../utils/copy-template-dir/copy-template-dir.js';
17
17
  import { getDotEnvVariables, injectEnvVariables } from '../../utils/dev.js';
18
18
  import execa from '../../utils/execa.js';
@@ -410,7 +410,6 @@ const scaffoldFromTemplate = async function (command, options, argumentName, fun
410
410
  }
411
411
  catch (error_) {
412
412
  error(`$${NETLIFYDEVERR} Error downloading from URL: ${options.url}`);
413
- // @ts-expect-error TS(2345) FIXME: Argument of type 'unknown' is not assignable to pa... Remove this comment to see the full error message
414
413
  error(error_);
415
414
  process.exit(1);
416
415
  }
@@ -484,7 +483,6 @@ const createFunctionAddon = async function ({ addonName, addons, api, siteData,
484
483
  return true;
485
484
  }
486
485
  catch (error_) {
487
- // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
488
486
  error(error_.message);
489
487
  }
490
488
  };
@@ -573,8 +571,7 @@ const installAddons = async function (command, functionAddons, fnPath) {
573
571
  await handleAddonDidInstall({ addonCreated, addonDidInstall, command, fnPath });
574
572
  }
575
573
  catch (error_) {
576
- // @ts-expect-error TS(2345) FIXME: Argument of type 'unknown' is not assignable to pa... Remove this comment to see the full error message
577
- error(`${NETLIFYDEVERR} Error installing addon: `, error_);
574
+ error(`${NETLIFYDEVERR} Error installing addon: ${error_}`);
578
575
  }
579
576
  });
580
577
  return Promise.all(arr);
@@ -1 +1 @@
1
- {"version":3,"file":"functions-invoke.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/functions-invoke.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAMxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAwI5C,eAAO,MAAM,eAAe,iBAAwB,MAAM,WAAW,YAAY,WAAW,WAAW,kBA6FtG,CAAA"}
1
+ {"version":3,"file":"functions-invoke.d.ts","sourceRoot":"","sources":["../../../src/commands/functions/functions-invoke.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAMxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAwI5C,eAAO,MAAM,eAAe,iBAAwB,MAAM,WAAW,YAAY,WAAW,WAAW,kBA4FtG,CAAA"}
@@ -204,7 +204,6 @@ export const functionsInvoke = async (nameArgument, options, command) => {
204
204
  console.log(data);
205
205
  }
206
206
  catch (error_) {
207
- // @ts-expect-error TS(2571) FIXME: Object is of type 'unknown'.
208
207
  error(`Ran into an error invoking your function: ${error_.message}`);
209
208
  }
210
209
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,iBAAiB,YAAa,WAAW,gBAkBhD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAEA,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAE5C,eAAO,MAAM,iBAAiB,YAAa,WAAW,gBAiBhD,CAAA"}
@@ -3,7 +3,6 @@ export const createInitCommand = (program) => program
3
3
  .command('init')
4
4
  .description('Configure continuous deployment for a new or existing site. To create a new site without continuous deployment, use `netlify sites:create`')
5
5
  .option('-m, --manual', 'Manually configure a git remote for CI')
6
- .option('--force', 'Reinitialize CI hooks if the linked site is already configured to use CI')
7
6
  .addOption(new Option('--gitRemoteName <name>', 'Old, prefer --git-remote-name. Name of Git remote to use. e.g. "origin"').hideHelp(true))
8
7
  .option('--git-remote-name <name>', 'Name of Git remote to use. e.g. "origin"')
9
8
  .action(async (options, command) => {
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/integration/deploy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAUxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAS5C,wBAAgB,cAAc,CAAC,WAAW,KAAA,EAAE,YAAY,KAAA,OAOvD;AA0FD,wBAAsB,mBAAmB,CAAC,UAAU,KAAA,EAAE,MAAM,KAAA,EAAE,SAAS,KAAA,EAAE,sBAAsB,KAAA,EAAE,KAAK,KAAA,iBA0ErG;AAED,wBAAsB,iBAAiB,CAErC,UAAU,KAAA,EAEV,OAAO,KAAA,EAEP,MAAM,KAAA,EAEN,SAAS,KAAA,EAET,sBAAsB,KAAA,EAEtB,KAAK,KAAA,EAEL,qBAAqB,KAAA,iBA4HtB;AA4BD,eAAO,MAAM,gBAAgB,0BA6B5B,CAAA;AAED,eAAO,MAAM,MAAM,YAAmB,YAAY,WAAW,WAAW,kBAkEvE,CAAA"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/integration/deploy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAUxC,OAAO,WAAW,MAAM,oBAAoB,CAAA;AAS5C,wBAAgB,cAAc,CAAC,WAAW,KAAA,EAAE,YAAY,KAAA,OAOvD;AAuFD,wBAAsB,mBAAmB,CAAC,UAAU,KAAA,EAAE,MAAM,KAAA,EAAE,SAAS,KAAA,EAAE,sBAAsB,KAAA,EAAE,KAAK,KAAA,iBAyErG;AAED,wBAAsB,iBAAiB,CAErC,UAAU,KAAA,EAEV,OAAO,KAAA,EAEP,MAAM,KAAA,EAEN,SAAS,KAAA,EAET,sBAAsB,KAAA,EAEtB,KAAK,KAAA,EAEL,qBAAqB,KAAA,iBAsHtB;AA2BD,eAAO,MAAM,gBAAgB,0BA6B5B,CAAA;AAED,eAAO,MAAM,MAAM,YAAmB,YAAY,WAAW,WAAW,kBAgEvE,CAAA"}