firebase-tools 11.4.2 → 11.7.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 (202) hide show
  1. package/lib/accountImporter.js +1 -1
  2. package/lib/auth.js +3 -4
  3. package/lib/bin/firebase.js +4 -4
  4. package/lib/command.js +35 -10
  5. package/lib/commands/apps-android-sha-create.js +1 -1
  6. package/lib/commands/apps-android-sha-delete.js +1 -1
  7. package/lib/commands/apps-create.js +1 -1
  8. package/lib/commands/apps-list.js +1 -1
  9. package/lib/commands/auth-export.js +1 -1
  10. package/lib/commands/auth-import.js +1 -1
  11. package/lib/commands/crashlytics-mappingfile-generateid.js +26 -0
  12. package/lib/commands/crashlytics-mappingfile-upload.js +46 -0
  13. package/lib/commands/crashlytics-symbols-upload.js +18 -87
  14. package/lib/commands/database-instances-list.js +1 -1
  15. package/lib/commands/database-push.js +1 -1
  16. package/lib/commands/database-remove.js +1 -1
  17. package/lib/commands/database-set.js +1 -1
  18. package/lib/commands/database-update.js +1 -1
  19. package/lib/commands/emulators-exec.js +4 -1
  20. package/lib/commands/emulators-export.js +5 -2
  21. package/lib/commands/emulators-start.js +24 -18
  22. package/lib/commands/ext-dev-deprecate.js +1 -1
  23. package/lib/commands/ext-dev-emulators-exec.js +1 -1
  24. package/lib/commands/ext-dev-emulators-start.js +1 -1
  25. package/lib/commands/ext-dev-extension-delete.js +1 -1
  26. package/lib/commands/ext-dev-list.js +1 -1
  27. package/lib/commands/ext-dev-publish.js +4 -1
  28. package/lib/commands/ext-dev-register.js +1 -1
  29. package/lib/commands/ext-dev-undeprecate.js +1 -1
  30. package/lib/commands/ext-dev-unpublish.js +1 -1
  31. package/lib/commands/ext-dev-usage.js +1 -1
  32. package/lib/commands/ext-info.js +1 -1
  33. package/lib/commands/ext-install.js +2 -2
  34. package/lib/commands/ext-update.js +1 -1
  35. package/lib/commands/ext.js +1 -1
  36. package/lib/commands/firestore-delete.js +2 -2
  37. package/lib/commands/firestore-indexes-list.js +3 -3
  38. package/lib/commands/functions-config-clone.js +1 -1
  39. package/lib/commands/functions-config-export.js +1 -1
  40. package/lib/commands/functions-config-set.js +1 -1
  41. package/lib/commands/functions-config-unset.js +1 -1
  42. package/lib/commands/functions-delete.js +3 -1
  43. package/lib/commands/functions-secrets-get.js +2 -0
  44. package/lib/commands/functions-secrets-set.js +1 -1
  45. package/lib/commands/help.js +1 -1
  46. package/lib/commands/hosting-channel-create.js +5 -5
  47. package/lib/commands/hosting-channel-delete.js +3 -3
  48. package/lib/commands/hosting-channel-deploy.js +6 -6
  49. package/lib/commands/hosting-channel-list.js +2 -2
  50. package/lib/commands/hosting-channel-open.js +2 -2
  51. package/lib/commands/hosting-clone.js +8 -8
  52. package/lib/commands/hosting-disable.js +1 -1
  53. package/lib/commands/hosting-sites-create.js +4 -4
  54. package/lib/commands/hosting-sites-delete.js +4 -4
  55. package/lib/commands/hosting-sites-list.js +2 -2
  56. package/lib/commands/index.js +3 -0
  57. package/lib/commands/init.js +5 -5
  58. package/lib/commands/login-add.js +1 -1
  59. package/lib/commands/login-ci.js +2 -2
  60. package/lib/commands/login-list.js +1 -1
  61. package/lib/commands/login-use.js +1 -1
  62. package/lib/commands/login.js +3 -3
  63. package/lib/commands/logout.js +1 -1
  64. package/lib/commands/open.js +3 -3
  65. package/lib/commands/projects-list.js +2 -2
  66. package/lib/commands/serve.js +1 -1
  67. package/lib/commands/target-apply.js +1 -1
  68. package/lib/commands/target-clear.js +1 -1
  69. package/lib/commands/target-remove.js +1 -1
  70. package/lib/commands/target.js +1 -1
  71. package/lib/commands/use.js +7 -7
  72. package/lib/config.js +1 -1
  73. package/lib/crashlytics/buildToolsJarHelper.js +51 -0
  74. package/lib/deploy/database/prepare.js +3 -3
  75. package/lib/deploy/database/release.js +3 -3
  76. package/lib/deploy/extensions/deploymentSummary.js +1 -1
  77. package/lib/deploy/extensions/errors.js +1 -1
  78. package/lib/deploy/extensions/secrets.js +1 -1
  79. package/lib/deploy/extensions/tasks.js +2 -2
  80. package/lib/deploy/firestore/deploy.js +2 -2
  81. package/lib/deploy/firestore/prepare.js +2 -2
  82. package/lib/deploy/functions/backend.js +4 -4
  83. package/lib/deploy/functions/build.js +78 -8
  84. package/lib/deploy/functions/checkIam.js +9 -8
  85. package/lib/deploy/functions/containerCleaner.js +2 -2
  86. package/lib/deploy/functions/deploy.js +2 -2
  87. package/lib/deploy/functions/ensure.js +1 -1
  88. package/lib/deploy/functions/params.js +15 -15
  89. package/lib/deploy/functions/prepare.js +1 -1
  90. package/lib/deploy/functions/prepareFunctionsUpload.js +2 -2
  91. package/lib/deploy/functions/prompts.js +1 -1
  92. package/lib/deploy/functions/release/fabricator.js +24 -7
  93. package/lib/deploy/functions/release/index.js +3 -1
  94. package/lib/deploy/functions/release/reporter.js +1 -1
  95. package/lib/deploy/functions/runtimes/discovery/index.js +1 -16
  96. package/lib/deploy/functions/runtimes/discovery/parsing.js +16 -0
  97. package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +59 -131
  98. package/lib/deploy/functions/runtimes/node/parseRuntimeAndValidateSDK.js +1 -1
  99. package/lib/deploy/functions/runtimes/node/parseTriggers.js +2 -6
  100. package/lib/deploy/functions/runtimes/node/versioning.js +4 -4
  101. package/lib/deploy/functions/validate.js +1 -1
  102. package/lib/deploy/hosting/deploy.js +10 -9
  103. package/lib/deploy/hosting/uploader.js +2 -2
  104. package/lib/deploy/hosting/validate.js +2 -2
  105. package/lib/deploy/index.js +7 -7
  106. package/lib/deploy/lifecycleHooks.js +5 -2
  107. package/lib/deploy/storage/prepare.js +5 -3
  108. package/lib/deploy/storage/release.js +7 -6
  109. package/lib/emulator/auth/index.js +7 -2
  110. package/lib/emulator/auth/operations.js +10 -10
  111. package/lib/emulator/commandUtils.js +33 -16
  112. package/lib/emulator/constants.js +14 -6
  113. package/lib/emulator/controller.js +50 -18
  114. package/lib/emulator/databaseEmulator.js +1 -1
  115. package/lib/emulator/downloadableEmulators.js +8 -8
  116. package/lib/emulator/emulatorLogger.js +1 -1
  117. package/lib/emulator/eventarcEmulator.js +148 -0
  118. package/lib/emulator/extensionsEmulator.js +5 -3
  119. package/lib/emulator/firestoreEmulator.js +1 -1
  120. package/lib/emulator/functionsEmulator.js +66 -14
  121. package/lib/emulator/functionsEmulatorRuntime.js +12 -23
  122. package/lib/emulator/functionsEmulatorShared.js +6 -1
  123. package/lib/emulator/hub.js +7 -3
  124. package/lib/emulator/hubClient.js +2 -2
  125. package/lib/emulator/hubExport.js +22 -2
  126. package/lib/emulator/loggingEmulator.js +2 -2
  127. package/lib/emulator/registry.js +1 -0
  128. package/lib/emulator/storage/apis/firebase.js +26 -12
  129. package/lib/emulator/storage/apis/gcloud.js +15 -8
  130. package/lib/emulator/storage/files.js +21 -4
  131. package/lib/emulator/storage/multipart.js +6 -5
  132. package/lib/emulator/storage/rules/runtime.js +3 -3
  133. package/lib/emulator/storage/rules/utils.js +4 -2
  134. package/lib/emulator/storage/server.js +2 -1
  135. package/lib/emulator/storage/upload.js +1 -0
  136. package/lib/emulator/types.js +4 -0
  137. package/lib/emulator/ui.js +7 -2
  138. package/lib/ensureApiEnabled.js +7 -7
  139. package/lib/extensions/askUserForConsent.js +1 -1
  140. package/lib/extensions/askUserForEventsConfig.js +1 -1
  141. package/lib/extensions/askUserForParam.js +1 -1
  142. package/lib/extensions/changelog.js +2 -2
  143. package/lib/extensions/checkProjectBilling.js +2 -2
  144. package/lib/extensions/displayExtensionInfo.js +1 -1
  145. package/lib/extensions/extensionsApi.js +3 -2
  146. package/lib/extensions/extensionsHelper.js +30 -2
  147. package/lib/extensions/listExtensions.js +1 -1
  148. package/lib/extensions/manifest.js +1 -1
  149. package/lib/extensions/metricsUtils.js +1 -1
  150. package/lib/extensions/paramHelper.js +1 -1
  151. package/lib/extensions/updateHelper.js +2 -2
  152. package/lib/extensions/warnings.js +2 -2
  153. package/lib/fetchMOTD.js +1 -1
  154. package/lib/firestore/delete.js +1 -1
  155. package/lib/firestore/indexes.js +2 -2
  156. package/lib/firestore/validator.js +1 -1
  157. package/lib/functions/env.js +11 -11
  158. package/lib/functions/runtimeConfigExport.js +1 -1
  159. package/lib/functionsConfig.js +1 -1
  160. package/lib/functionsConfigClone.js +1 -1
  161. package/lib/functionsShellCommandAction.js +1 -1
  162. package/lib/gcp/cloudfunctions.js +3 -3
  163. package/lib/gcp/cloudfunctionsv2.js +5 -5
  164. package/lib/gcp/cloudscheduler.js +63 -22
  165. package/lib/gcp/cloudtasks.js +17 -1
  166. package/lib/gcp/serviceusage.js +2 -2
  167. package/lib/handlePreviewToggles.js +4 -4
  168. package/lib/hosting/implicitInit.js +1 -1
  169. package/lib/hosting/normalizedHostingConfigs.js +3 -3
  170. package/lib/index.js +2 -2
  171. package/lib/init/features/database.js +1 -1
  172. package/lib/init/features/emulators.js +1 -1
  173. package/lib/init/features/firestore/index.js +2 -2
  174. package/lib/init/features/firestore/indexes.js +1 -1
  175. package/lib/init/features/firestore/rules.js +1 -1
  176. package/lib/init/features/functions/golang.js +1 -1
  177. package/lib/init/features/functions/index.js +8 -1
  178. package/lib/init/features/hosting/github.js +9 -9
  179. package/lib/init/features/hosting/index.js +1 -1
  180. package/lib/init/features/project.js +1 -1
  181. package/lib/init/features/remoteconfig.js +1 -1
  182. package/lib/init/features/storage.js +1 -1
  183. package/lib/init/index.js +1 -1
  184. package/lib/logError.js +3 -3
  185. package/lib/management/projects.js +1 -1
  186. package/lib/parseBoltRules.js +1 -1
  187. package/lib/profileReport.js +2 -2
  188. package/lib/projectUtils.js +1 -1
  189. package/lib/rc.js +1 -1
  190. package/lib/requireAuth.js +1 -1
  191. package/lib/requireDatabaseInstance.js +2 -2
  192. package/lib/requirePermissions.js +2 -2
  193. package/lib/rulesDeploy.js +11 -12
  194. package/lib/serve/hosting.js +2 -1
  195. package/lib/serve/index.js +15 -0
  196. package/lib/track.js +122 -3
  197. package/lib/utils.js +24 -11
  198. package/npm-shrinkwrap.json +523 -294
  199. package/package.json +6 -4
  200. package/schema/firebase-config.json +12 -0
  201. package/templates/extensions/CHANGELOG.md +1 -7
  202. package/templates/hosting/init.js +6 -2
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const logger_1 = require("../logger");
7
7
  const utils = require("../utils");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const error_1 = require("../error");
7
7
  const logger_1 = require("../logger");
@@ -19,7 +19,7 @@ exports.command = new command_1.Command("login:ci")
19
19
  const userCredentials = await auth.loginGoogle(options.localhost);
20
20
  logger_1.logger.info();
21
21
  utils.logSuccess("Success! Use this token to login on a CI server:\n\n" +
22
- clc.bold(userCredentials.tokens.refresh_token) +
22
+ clc.bold(userCredentials.tokens.refresh_token || "") +
23
23
  '\n\nExample: firebase deploy --token "$FIREBASE_TOKEN"\n');
24
24
  return userCredentials;
25
25
  });
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const logger_1 = require("../logger");
7
7
  const utils = require("../utils");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const utils = require("../utils");
7
7
  const auth = require("../auth");
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
4
  const _ = require("lodash");
5
- const clc = require("cli-color");
5
+ const clc = require("colorette");
6
6
  const command_1 = require("../command");
7
7
  const logger_1 = require("../logger");
8
8
  const configstore_1 = require("../configstore");
@@ -28,11 +28,11 @@ exports.command = new command_1.Command("login")
28
28
  return user;
29
29
  }
30
30
  if (!options.reauth) {
31
- utils.logBullet("Firebase optionally collects CLI usage and error reporting information to help improve our products. Data is collected in accordance with Google's privacy policy (https://policies.google.com/privacy) and is not used to identify you.\n");
31
+ utils.logBullet("Firebase optionally collects CLI and Emulator Suite usage and error reporting information to help improve our products. Data is collected in accordance with Google's privacy policy (https://policies.google.com/privacy) and is not used to identify you.\n");
32
32
  const collectUsage = await (0, prompt_1.promptOnce)({
33
33
  type: "confirm",
34
34
  name: "collectUsage",
35
- message: "Allow Firebase to collect CLI usage and error reporting information?",
35
+ message: "Allow Firebase to collect CLI and Emulator Suite usage and error reporting information?",
36
36
  });
37
37
  configstore_1.configstore.set("usage", collectUsage);
38
38
  if (collectUsage) {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
4
  const command_1 = require("../command");
5
5
  const logger_1 = require("../logger");
6
- const clc = require("cli-color");
6
+ const clc = require("colorette");
7
7
  const utils = require("../utils");
8
8
  const auth = require("../auth");
9
9
  const prompt_1 = require("../prompt");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const open = require("open");
6
6
  const error_1 = require("../error");
7
7
  const api = require("../api");
@@ -79,10 +79,10 @@ exports.command = new command_1.Command("open [link]")
79
79
  throw new error_1.FirebaseError(`Unable to determine URL for link: ${link}`);
80
80
  }
81
81
  if (link.arg !== linkName) {
82
- logger_1.logger.info(`${clc.bold.cyan("Tip:")} You can also run ${clc.bold.underline(`firebase open ${link.arg}`)}`);
82
+ logger_1.logger.info(`${clc.bold(clc.cyan("Tip:"))} You can also run ${clc.bold(clc.underline(`firebase open ${link.arg}`))}`);
83
83
  logger_1.logger.info();
84
84
  }
85
85
  logger_1.logger.info(`Opening ${clc.bold(link.name)} link in your default browser:`);
86
- logger_1.logger.info(clc.bold.underline(url));
86
+ logger_1.logger.info(clc.bold(clc.underline(url)));
87
87
  open(url);
88
88
  });
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const ora = require("ora");
6
6
  const Table = require("cli-table");
7
7
  const command_1 = require("../command");
@@ -22,7 +22,7 @@ function logProjectsList(projects, currentProjectId) {
22
22
  const table = new Table({ head: tableHead, style: { head: ["green"] } });
23
23
  projects.forEach(({ projectId, projectNumber, displayName, resources }) => {
24
24
  if (projectId === currentProjectId) {
25
- projectId = clc.cyan.bold(`${projectId} (current)`);
25
+ projectId = clc.cyan(clc.bold(`${projectId} (current)`));
26
26
  }
27
27
  table.push([
28
28
  displayName || NOT_SPECIFIED,
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const logger_1 = require("../logger");
7
7
  const utils = require("../utils");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const logger_1 = require("../logger");
7
7
  const requireConfig_1 = require("../requireConfig");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const requireConfig_1 = require("../requireConfig");
7
7
  const utils = require("../utils");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const requireConfig_1 = require("../requireConfig");
7
7
  const utils = require("../utils");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const logger_1 = require("../logger");
7
7
  const requireConfig_1 = require("../requireConfig");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.command = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const command_1 = require("../command");
6
6
  const projects_1 = require("../management/projects");
7
7
  const logger_1 = require("../logger");
@@ -11,12 +11,12 @@ const command_2 = require("../command");
11
11
  const utils = require("../utils");
12
12
  function listAliases(options) {
13
13
  if (options.rc.hasProjects) {
14
- logger_1.logger.info("Project aliases for", clc.bold(options.projectRoot) + ":");
14
+ logger_1.logger.info("Project aliases for", clc.bold(options.projectRoot || "") + ":");
15
15
  logger_1.logger.info();
16
16
  for (const [alias, projectId] of Object.entries(options.rc.projects)) {
17
17
  const listing = alias + " (" + projectId + ")";
18
18
  if (options.project === projectId || options.projectAlias === alias) {
19
- logger_1.logger.info(clc.cyan.bold("* " + listing));
19
+ logger_1.logger.info(clc.cyan(clc.bold("* " + listing)));
20
20
  }
21
21
  else {
22
22
  logger_1.logger.info(" " + listing);
@@ -121,8 +121,8 @@ exports.command = new command_1.Command("use [alias_or_project_id]")
121
121
  options.rc.addProjectAlias(results.alias, results.project);
122
122
  utils.makeActiveProject(options.projectRoot, results.alias);
123
123
  logger_1.logger.info();
124
- logger_1.logger.info("Created alias", clc.bold(results.alias), "for", results.project + ".");
125
- logger_1.logger.info("Now using alias", clc.bold(results.alias) + " (" + results.project + ")");
124
+ logger_1.logger.info("Created alias", clc.bold(results.alias || ""), "for", results.project + ".");
125
+ logger_1.logger.info("Now using alias", clc.bold(results.alias || "") + " (" + results.project + ")");
126
126
  });
127
127
  });
128
128
  }
@@ -143,10 +143,10 @@ exports.command = new command_1.Command("use [alias_or_project_id]")
143
143
  return utils.reject("No active project");
144
144
  }
145
145
  if (options.projectAlias) {
146
- logger_1.logger.info("Active Project:", clc.bold.cyan(options.projectAlias + " (" + options.project + ")"));
146
+ logger_1.logger.info("Active Project:", clc.bold(clc.cyan(options.projectAlias + " (" + options.project + ")")));
147
147
  }
148
148
  else if (options.project) {
149
- logger_1.logger.info("Active Project:", clc.bold.cyan(options.project));
149
+ logger_1.logger.info("Active Project:", clc.bold(clc.cyan(options.project)));
150
150
  }
151
151
  else {
152
152
  let msg = "No project is currently active";
package/lib/config.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Config = void 0;
4
4
  const _ = require("lodash");
5
- const clc = require("cli-color");
5
+ const clc = require("colorette");
6
6
  const fs = require("fs-extra");
7
7
  const path = require("path");
8
8
  const cjson = require("cjson");
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runBuildtoolsCommand = exports.fetchBuildtoolsJar = void 0;
4
+ const fs = require("fs-extra");
5
+ const os = require("os");
6
+ const path = require("path");
7
+ const spawn = require("cross-spawn");
8
+ const downloadUtils = require("../downloadUtils");
9
+ const error_1 = require("../error");
10
+ const logger_1 = require("../logger");
11
+ const rimraf = require("rimraf");
12
+ const utils = require("../utils");
13
+ const JAR_CACHE_DIR = process.env.FIREBASE_CRASHLYTICS_BUILDTOOLS_PATH ||
14
+ path.join(os.homedir(), ".cache", "firebase", "crashlytics", "buildtools");
15
+ const JAR_VERSION = "2.9.1";
16
+ const JAR_URL = `https://dl.google.com/android/maven2/com/google/firebase/firebase-crashlytics-buildtools/${JAR_VERSION}/firebase-crashlytics-buildtools-${JAR_VERSION}.jar`;
17
+ async function fetchBuildtoolsJar() {
18
+ if (process.env.CRASHLYTICS_LOCAL_JAR) {
19
+ return process.env.CRASHLYTICS_LOCAL_JAR;
20
+ }
21
+ const jarPath = path.join(JAR_CACHE_DIR, `crashlytics-buildtools-${JAR_VERSION}.jar`);
22
+ if (fs.existsSync(jarPath)) {
23
+ logger_1.logger.debug(`Buildtools Jar already downloaded at ${jarPath}`);
24
+ return jarPath;
25
+ }
26
+ if (fs.existsSync(JAR_CACHE_DIR)) {
27
+ logger_1.logger.debug(`Deleting Jar cache at ${JAR_CACHE_DIR} because the CLI was run with a newer Jar version`);
28
+ rimraf.sync(JAR_CACHE_DIR);
29
+ }
30
+ utils.logBullet("Downloading crashlytics-buildtools.jar to " + jarPath);
31
+ utils.logBullet("For open source licenses used by this command, look in the META-INF directory in the buildtools.jar file");
32
+ const tmpfile = await downloadUtils.downloadToTmp(JAR_URL);
33
+ fs.mkdirSync(JAR_CACHE_DIR, { recursive: true });
34
+ fs.copySync(tmpfile, jarPath);
35
+ return jarPath;
36
+ }
37
+ exports.fetchBuildtoolsJar = fetchBuildtoolsJar;
38
+ function runBuildtoolsCommand(jarFile, args, debug) {
39
+ var _a;
40
+ const fullArgs = ["-jar", jarFile, ...args, "-clientName", "firebase-cli;crashlytics-buildtools"];
41
+ const outputs = spawn.sync("java", fullArgs, {
42
+ stdio: debug ? "inherit" : "pipe",
43
+ });
44
+ if (outputs.status !== 0) {
45
+ if (!debug) {
46
+ utils.logWarning(((_a = outputs.stdout) === null || _a === void 0 ? void 0 : _a.toString()) || "An unknown error occurred");
47
+ }
48
+ throw new error_1.FirebaseError(`java command failed with args: ${fullArgs}`);
49
+ }
50
+ }
51
+ exports.runBuildtoolsCommand = runBuildtoolsCommand;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.prepare = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const path = require("path");
6
6
  const error_1 = require("../../error");
7
7
  const parseBoltRules_1 = require("../../parseBoltRules");
@@ -39,12 +39,12 @@ function prepare(context, options) {
39
39
  deploys: deploys,
40
40
  ruleFiles: ruleFiles,
41
41
  };
42
- utils.logBullet(clc.bold.cyan("database: ") + "checking rules syntax...");
42
+ utils.logBullet(clc.bold(clc.cyan("database: ")) + "checking rules syntax...");
43
43
  return Promise.all(deploys.map((deploy) => {
44
44
  return rtdb
45
45
  .updateRules(context.projectId, deploy.instance, ruleFiles[deploy.rules], { dryRun: true })
46
46
  .then(() => {
47
- utils.logSuccess(clc.bold.green("database: ") +
47
+ utils.logSuccess(clc.bold(clc.green("database: ")) +
48
48
  "rules syntax for database " +
49
49
  clc.bold(deploy.instance) +
50
50
  " is valid");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.release = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const rtdb = require("../../rtdb");
6
6
  const utils = require("../../utils");
7
7
  function release(context) {
@@ -13,14 +13,14 @@ function release(context) {
13
13
  }
14
14
  const deploys = context.database.deploys;
15
15
  const ruleFiles = context.database.ruleFiles;
16
- utils.logBullet(clc.bold.cyan("database: ") + "releasing rules...");
16
+ utils.logBullet(clc.bold(clc.cyan("database: ")) + "releasing rules...");
17
17
  return Promise.all(deploys.map((deploy) => {
18
18
  return rtdb
19
19
  .updateRules(context.projectId, deploy.instance, ruleFiles[deploy.rules], {
20
20
  dryRun: false,
21
21
  })
22
22
  .then(() => {
23
- utils.logSuccess(clc.bold.green("database: ") +
23
+ utils.logSuccess(clc.bold(clc.green("database: ")) +
24
24
  "rules for database " +
25
25
  clc.bold(deploy.instance) +
26
26
  " released successfully");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deletesSummary = exports.configuresSummary = exports.updatesSummary = exports.createsSummary = exports.humanReadable = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const refs = require("../../extensions/refs");
6
6
  const humanReadable = (dep) => `${clc.bold(dep.instanceId)} (${dep.ref ? `${refs.toExtensionVersionRef(dep.ref)}` : `Installed from local source`})`;
7
7
  exports.humanReadable = humanReadable;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ErrorHandler = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const logger_1 = require("../../logger");
6
6
  class ErrorHandler {
7
7
  constructor() {
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.checkSpecForSecrets = exports.handleSecretParams = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const secretUtils = require("../../extensions/secretsUtils");
6
6
  const secretManager = require("../../gcp/secretManager");
7
7
  const planner_1 = require("./planner");
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deleteExtensionInstanceTask = exports.configureExtensionInstanceTask = exports.updateExtensionInstanceTask = exports.createExtensionInstanceTask = exports.extensionsDeploymentHandler = void 0;
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const error_1 = require("../../error");
6
6
  const extensionsApi = require("../../extensions/extensionsApi");
7
7
  const extensionsHelper_1 = require("../../extensions/extensionsHelper");
@@ -146,5 +146,5 @@ function deleteExtensionInstanceTask(projectId, instanceSpec) {
146
146
  exports.deleteExtensionInstanceTask = deleteExtensionInstanceTask;
147
147
  function printSuccess(instanceId, type, validateOnly) {
148
148
  const action = validateOnly ? `validated ${type} for` : `${type}d`;
149
- utils.logSuccess(clc.bold.green("extensions") + ` Successfully ${action} ${instanceId}`);
149
+ utils.logSuccess(clc.bold(clc.green("extensions")) + ` Successfully ${action} ${instanceId}`);
150
150
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const _ = require("lodash");
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const error_1 = require("../../error");
6
6
  const indexes_1 = require("../../firestore/indexes");
7
7
  const logger_1 = require("../../logger");
@@ -30,7 +30,7 @@ async function deployIndexes(context, options) {
30
30
  }
31
31
  const fieldOverrides = indexesSrc.fieldOverrides || [];
32
32
  await new indexes_1.FirestoreIndexes().deploy(options, indexes, fieldOverrides);
33
- utils.logSuccess(`${clc.bold.green("firestore:")} deployed indexes in ${clc.bold(indexesFileName)} successfully`);
33
+ utils.logSuccess(`${clc.bold(clc.green("firestore:"))} deployed indexes in ${clc.bold(indexesFileName)} successfully`);
34
34
  }
35
35
  async function default_1(context, options) {
36
36
  await Promise.all([deployRules(context), deployIndexes(context, options)]);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const _ = require("lodash");
4
- const clc = require("cli-color");
4
+ const clc = require("colorette");
5
5
  const loadCJSON_1 = require("../../loadCJSON");
6
6
  const rulesDeploy_1 = require("../../rulesDeploy");
7
7
  const utils = require("../../utils");
@@ -23,7 +23,7 @@ function prepareIndexes(context, options) {
23
23
  const indexesFileName = options.config.src.firestore.indexes;
24
24
  const indexesPath = options.config.path(indexesFileName);
25
25
  const parsedSrc = (0, loadCJSON_1.loadCJSON)(indexesPath);
26
- utils.logBullet(`${clc.bold.cyan("firestore:")} reading indexes from ${clc.bold(indexesFileName)}...`);
26
+ utils.logBullet(`${clc.bold(clc.cyan("firestore:"))} reading indexes from ${clc.bold(indexesFileName)}...`);
27
27
  context.firestore = context.firestore || {};
28
28
  context.firestore.indexes = {
29
29
  name: indexesFileName,
@@ -65,8 +65,8 @@ function memoryToGen1Cpu(memory) {
65
65
  2048: 1,
66
66
  4096: 2,
67
67
  8192: 2,
68
- 16384: 3,
69
- 32768: 4,
68
+ 16384: 4,
69
+ 32768: 8,
70
70
  }[memory];
71
71
  }
72
72
  exports.memoryToGen1Cpu = memoryToGen1Cpu;
@@ -79,8 +79,8 @@ function memoryToGen2Cpu(memory) {
79
79
  2048: 1,
80
80
  4096: 2,
81
81
  8192: 2,
82
- 16384: 3,
83
- 32768: 4,
82
+ 16384: 4,
83
+ 32768: 8,
84
84
  }[memory];
85
85
  }
86
86
  exports.memoryToGen2Cpu = memoryToGen2Cpu;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toBackend = exports.resolveBackend = exports.of = exports.empty = void 0;
3
+ exports.toBackend = exports.resolveBackend = exports.AllIngressSettings = exports.AllVpcEgressSettings = exports.AllFunctionsPlatforms = exports.isValidMemoryOption = exports.isBlockingTriggered = exports.isTaskQueueTriggered = exports.isScheduleTriggered = exports.isEventTriggered = exports.isCallableTriggered = exports.isHttpsTriggered = exports.of = exports.empty = void 0;
4
4
  const backend = require("./backend");
5
5
  const proto = require("../../gcp/proto");
6
6
  const api = require("../../.../../api");
@@ -8,6 +8,7 @@ const params = require("./params");
8
8
  const previews_1 = require("../../previews");
9
9
  const error_1 = require("../../error");
10
10
  const functional_1 = require("../../functional");
11
+ const env_1 = require("../../functions/env");
11
12
  const logger_1 = require("../../logger");
12
13
  function empty() {
13
14
  return {
@@ -23,15 +24,79 @@ function of(endpoints) {
23
24
  return build;
24
25
  }
25
26
  exports.of = of;
27
+ function isHttpsTriggered(triggered) {
28
+ return {}.hasOwnProperty.call(triggered, "httpsTrigger");
29
+ }
30
+ exports.isHttpsTriggered = isHttpsTriggered;
31
+ function isCallableTriggered(triggered) {
32
+ return {}.hasOwnProperty.call(triggered, "callableTrigger");
33
+ }
34
+ exports.isCallableTriggered = isCallableTriggered;
35
+ function isEventTriggered(triggered) {
36
+ return {}.hasOwnProperty.call(triggered, "eventTrigger");
37
+ }
38
+ exports.isEventTriggered = isEventTriggered;
39
+ function isScheduleTriggered(triggered) {
40
+ return {}.hasOwnProperty.call(triggered, "scheduleTrigger");
41
+ }
42
+ exports.isScheduleTriggered = isScheduleTriggered;
43
+ function isTaskQueueTriggered(triggered) {
44
+ return {}.hasOwnProperty.call(triggered, "taskQueueTrigger");
45
+ }
46
+ exports.isTaskQueueTriggered = isTaskQueueTriggered;
47
+ function isBlockingTriggered(triggered) {
48
+ return {}.hasOwnProperty.call(triggered, "blockingTrigger");
49
+ }
50
+ exports.isBlockingTriggered = isBlockingTriggered;
51
+ const allMemoryOptions = [128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768];
52
+ function isValidMemoryOption(mem) {
53
+ return allMemoryOptions.includes(mem);
54
+ }
55
+ exports.isValidMemoryOption = isValidMemoryOption;
56
+ exports.AllFunctionsPlatforms = ["gcfv1", "gcfv2"];
57
+ exports.AllVpcEgressSettings = ["PRIVATE_RANGES_ONLY", "ALL_TRAFFIC"];
58
+ exports.AllIngressSettings = [
59
+ "ALLOW_ALL",
60
+ "ALLOW_INTERNAL_ONLY",
61
+ "ALLOW_INTERNAL_AND_GCLB",
62
+ ];
26
63
  async function resolveBackend(build, userEnvOpt, userEnvs) {
64
+ var _a;
27
65
  const projectId = userEnvOpt.projectId;
28
66
  let paramValues = {};
29
67
  if (previews_1.previews.functionsparams) {
30
- paramValues = await params.resolveParams(build.params, projectId, userEnvs);
68
+ paramValues = await params.resolveParams(build.params, projectId, envWithTypes(userEnvs));
69
+ const toWrite = {};
70
+ for (const paramName of Object.keys(paramValues)) {
71
+ if (userEnvs.hasOwnProperty(paramName)) {
72
+ continue;
73
+ }
74
+ toWrite[paramName] = ((_a = paramValues[paramName]) === null || _a === void 0 ? void 0 : _a.toString()) || "";
75
+ }
76
+ (0, env_1.writeUserEnvs)(toWrite, userEnvOpt);
31
77
  }
32
78
  return toBackend(build, paramValues);
33
79
  }
34
80
  exports.resolveBackend = resolveBackend;
81
+ function envWithTypes(rawEnvs) {
82
+ const out = {};
83
+ for (const envName of Object.keys(rawEnvs)) {
84
+ const value = rawEnvs[envName];
85
+ if (!isNaN(+value) && isFinite(+value) && !value.includes("e")) {
86
+ out[envName] = +value;
87
+ }
88
+ else if (value === "true") {
89
+ out[envName] = true;
90
+ }
91
+ else if (value === "false") {
92
+ out[envName] = false;
93
+ }
94
+ else {
95
+ out[envName] = value;
96
+ }
97
+ }
98
+ return out;
99
+ }
35
100
  class Resolver {
36
101
  constructor(paramValues) {
37
102
  this.paramValues = paramValues;
@@ -109,6 +174,9 @@ function toBackend(build, paramValues) {
109
174
  r.resolveInts(bkEndpoint, bdEndpoint, "timeoutSeconds", "maxInstances", "minInstances", "concurrency");
110
175
  proto.convertIfPresent(bkEndpoint, bdEndpoint, "cpu", (0, functional_1.nullsafeVisitor)((cpu) => (cpu === "gcf_gen1" ? cpu : r.resolveInt(cpu))));
111
176
  if (bdEndpoint.vpc) {
177
+ if (bdEndpoint.vpc.connector && !bdEndpoint.vpc.connector.includes("/")) {
178
+ bdEndpoint.vpc.connector = `projects/${bdEndpoint.project}/locations/${region}/connectors/${bdEndpoint.vpc.connector}`;
179
+ }
112
180
  bkEndpoint.vpc = { connector: params.resolveString(bdEndpoint.vpc.connector, paramValues) };
113
181
  proto.copyIfPresent(bkEndpoint.vpc, bdEndpoint.vpc, "egressSettings");
114
182
  }
@@ -124,7 +192,7 @@ function toBackend(build, paramValues) {
124
192
  }
125
193
  exports.toBackend = toBackend;
126
194
  function discoverTrigger(endpoint, region, r) {
127
- if ("httpsTrigger" in endpoint) {
195
+ if (isHttpsTriggered(endpoint)) {
128
196
  const httpsTrigger = {};
129
197
  if (endpoint.httpsTrigger.invoker === null) {
130
198
  httpsTrigger.invoker = null;
@@ -134,13 +202,13 @@ function discoverTrigger(endpoint, region, r) {
134
202
  }
135
203
  return { httpsTrigger };
136
204
  }
137
- else if ("callableTrigger" in endpoint) {
205
+ else if (isCallableTriggered(endpoint)) {
138
206
  return { callableTrigger: {} };
139
207
  }
140
- else if ("blockingTrigger" in endpoint) {
208
+ else if (isBlockingTriggered(endpoint)) {
141
209
  return { blockingTrigger: endpoint.blockingTrigger };
142
210
  }
143
- else if ("eventTrigger" in endpoint) {
211
+ else if (isEventTriggered(endpoint)) {
144
212
  const eventTrigger = {
145
213
  eventType: endpoint.eventTrigger.eventType,
146
214
  retry: r.resolveBoolean(endpoint.eventTrigger.retry) || false,
@@ -154,11 +222,13 @@ function discoverTrigger(endpoint, region, r) {
154
222
  r.resolveStrings(eventTrigger, endpoint.eventTrigger, "serviceAccount", "region", "channel");
155
223
  return { eventTrigger };
156
224
  }
157
- else if ("scheduleTrigger" in endpoint) {
225
+ else if (isScheduleTriggered(endpoint)) {
158
226
  const bkSchedule = {
159
227
  schedule: r.resolveString(endpoint.scheduleTrigger.schedule),
160
- timeZone: r.resolveString(endpoint.scheduleTrigger.timeZone),
161
228
  };
229
+ if (endpoint.scheduleTrigger.timeZone !== undefined) {
230
+ bkSchedule.timeZone = r.resolveString(endpoint.scheduleTrigger.timeZone);
231
+ }
162
232
  if (endpoint.scheduleTrigger.retryConfig) {
163
233
  const bkRetry = {};
164
234
  r.resolveInts(bkRetry, endpoint.scheduleTrigger.retryConfig, "maxBackoffSeconds", "minBackoffSeconds", "maxRetrySeconds", "retryCount", "maxDoublings");