firebase-tools 11.0.1 → 11.2.1

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 (214) hide show
  1. package/lib/accountExporter.js +11 -4
  2. package/lib/accountImporter.js +93 -95
  3. package/lib/api.js +77 -218
  4. package/lib/apiv2.js +5 -4
  5. package/lib/appdistribution/client.js +7 -9
  6. package/lib/auth.js +72 -52
  7. package/lib/bin/firebase.js +42 -47
  8. package/lib/checkValidTargetFilters.js +36 -25
  9. package/lib/commands/appdistribution-distribute.js +2 -1
  10. package/lib/commands/appdistribution-testers-add.js +2 -1
  11. package/lib/commands/appdistribution-testers-remove.js +2 -1
  12. package/lib/commands/apps-android-sha-create.js +2 -1
  13. package/lib/commands/apps-android-sha-delete.js +2 -1
  14. package/lib/commands/apps-android-sha-list.js +2 -1
  15. package/lib/commands/apps-create.js +2 -1
  16. package/lib/commands/apps-list.js +2 -1
  17. package/lib/commands/apps-sdkconfig.js +2 -1
  18. package/lib/commands/auth-export.js +2 -1
  19. package/lib/commands/auth-import.js +7 -10
  20. package/lib/commands/crashlytics-symbols-upload.js +2 -1
  21. package/lib/commands/database-get.js +4 -3
  22. package/lib/commands/database-instances-create.js +2 -1
  23. package/lib/commands/database-instances-list.js +3 -3
  24. package/lib/commands/database-profile.js +4 -4
  25. package/lib/commands/database-push.js +4 -4
  26. package/lib/commands/database-remove.js +3 -3
  27. package/lib/commands/database-rules-canary.js +2 -1
  28. package/lib/commands/database-rules-get.js +2 -1
  29. package/lib/commands/database-rules-list.js +2 -1
  30. package/lib/commands/database-rules-release.js +2 -1
  31. package/lib/commands/database-rules-stage.js +2 -1
  32. package/lib/commands/database-set.js +3 -3
  33. package/lib/commands/database-settings-get.js +2 -1
  34. package/lib/commands/database-settings-set.js +2 -1
  35. package/lib/commands/database-update.js +2 -1
  36. package/lib/commands/deploy.js +26 -25
  37. package/lib/commands/emulators-exec.js +2 -1
  38. package/lib/commands/emulators-export.js +2 -1
  39. package/lib/commands/emulators-start.js +2 -1
  40. package/lib/commands/experimental-functions-shell.js +10 -8
  41. package/lib/commands/ext-configure.js +2 -1
  42. package/lib/commands/ext-dev-deprecate.js +2 -1
  43. package/lib/commands/ext-dev-emulators-exec.js +3 -2
  44. package/lib/commands/ext-dev-emulators-start.js +3 -2
  45. package/lib/commands/ext-dev-extension-delete.js +2 -1
  46. package/lib/commands/ext-dev-init.js +2 -1
  47. package/lib/commands/ext-dev-list.js +8 -8
  48. package/lib/commands/ext-dev-publish.js +2 -1
  49. package/lib/commands/ext-dev-register.js +2 -1
  50. package/lib/commands/ext-dev-undeprecate.js +2 -1
  51. package/lib/commands/ext-dev-unpublish.js +2 -1
  52. package/lib/commands/ext-dev-usage.js +2 -1
  53. package/lib/commands/ext-export.js +2 -1
  54. package/lib/commands/ext-info.js +14 -14
  55. package/lib/commands/ext-install.js +2 -1
  56. package/lib/commands/ext-list.js +2 -1
  57. package/lib/commands/ext-sources-create.js +2 -1
  58. package/lib/commands/ext-uninstall.js +2 -1
  59. package/lib/commands/ext-update.js +2 -1
  60. package/lib/commands/ext.js +4 -4
  61. package/lib/commands/firestore-delete.js +2 -1
  62. package/lib/commands/firestore-indexes-list.js +2 -1
  63. package/lib/commands/functions-config-clone.js +4 -3
  64. package/lib/commands/functions-config-export.js +2 -1
  65. package/lib/commands/functions-config-get.js +2 -1
  66. package/lib/commands/functions-config-set.js +2 -1
  67. package/lib/commands/functions-config-unset.js +2 -1
  68. package/lib/commands/functions-delete.js +3 -8
  69. package/lib/commands/functions-deletegcfartifacts.js +2 -1
  70. package/lib/commands/functions-list.js +2 -1
  71. package/lib/commands/functions-log.js +2 -1
  72. package/lib/commands/functions-secrets-access.js +2 -1
  73. package/lib/commands/functions-secrets-destroy.js +2 -1
  74. package/lib/commands/functions-secrets-get.js +2 -1
  75. package/lib/commands/functions-secrets-prune.js +2 -1
  76. package/lib/commands/functions-secrets-set.js +2 -1
  77. package/lib/commands/functions-shell.js +12 -10
  78. package/lib/commands/help.js +2 -1
  79. package/lib/commands/hosting-channel-create.js +2 -1
  80. package/lib/commands/hosting-channel-delete.js +2 -1
  81. package/lib/commands/hosting-channel-deploy.js +2 -1
  82. package/lib/commands/hosting-channel-list.js +2 -1
  83. package/lib/commands/hosting-channel-open.js +2 -1
  84. package/lib/commands/hosting-clone.js +2 -1
  85. package/lib/commands/hosting-disable.js +2 -1
  86. package/lib/commands/hosting-sites-create.js +2 -1
  87. package/lib/commands/hosting-sites-delete.js +2 -1
  88. package/lib/commands/hosting-sites-get.js +2 -1
  89. package/lib/commands/hosting-sites-list.js +2 -1
  90. package/lib/commands/index.js +23 -13
  91. package/lib/commands/init.js +47 -43
  92. package/lib/commands/login-add.js +2 -1
  93. package/lib/commands/login-ci.js +2 -1
  94. package/lib/commands/login-list.js +2 -1
  95. package/lib/commands/login-use.js +2 -1
  96. package/lib/commands/login.js +2 -1
  97. package/lib/commands/logout.js +2 -1
  98. package/lib/commands/open.js +7 -7
  99. package/lib/commands/projects-addfirebase.js +2 -1
  100. package/lib/commands/projects-create.js +2 -1
  101. package/lib/commands/projects-list.js +2 -1
  102. package/lib/commands/remoteconfig-get.js +2 -1
  103. package/lib/commands/remoteconfig-rollback.js +2 -1
  104. package/lib/commands/remoteconfig-versions-list.js +2 -1
  105. package/lib/commands/serve.js +30 -30
  106. package/lib/commands/setup-emulators-database.js +2 -1
  107. package/lib/commands/setup-emulators-firestore.js +2 -1
  108. package/lib/commands/setup-emulators-pubsub.js +2 -1
  109. package/lib/commands/setup-emulators-storage.js +2 -1
  110. package/lib/commands/setup-emulators-ui.js +2 -1
  111. package/lib/commands/target-apply.js +2 -1
  112. package/lib/commands/target-clear.js +2 -1
  113. package/lib/commands/target-remove.js +2 -1
  114. package/lib/commands/target.js +2 -1
  115. package/lib/commands/use.js +54 -53
  116. package/lib/config.js +7 -6
  117. package/lib/deploy/database/deploy.js +3 -2
  118. package/lib/deploy/database/index.js +8 -5
  119. package/lib/deploy/database/prepare.js +22 -20
  120. package/lib/deploy/database/release.js +12 -9
  121. package/lib/deploy/extensions/secrets.js +3 -3
  122. package/lib/deploy/firestore/prepare.js +2 -2
  123. package/lib/deploy/functions/build.js +33 -20
  124. package/lib/deploy/functions/ensure.js +1 -11
  125. package/lib/deploy/functions/prepare.js +3 -13
  126. package/lib/deploy/functions/prepareFunctionsUpload.js +2 -3
  127. package/lib/deploy/functions/release/fabricator.js +0 -1
  128. package/lib/deploy/functions/release/index.js +1 -5
  129. package/lib/deploy/functions/runtimes/discovery/index.js +18 -3
  130. package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +188 -54
  131. package/lib/deploy/functions/runtimes/golang/index.js +2 -22
  132. package/lib/deploy/functions/runtimes/node/index.js +3 -7
  133. package/lib/deploy/functions/runtimes/node/parseTriggers.js +16 -4
  134. package/lib/deploy/functions/services/database.js +14 -0
  135. package/lib/deploy/functions/services/index.js +14 -0
  136. package/lib/deploy/index.js +3 -3
  137. package/lib/deploy/lifecycleHooks.js +27 -27
  138. package/lib/deploy/remoteconfig/prepare.js +2 -2
  139. package/lib/deploy/storage/prepare.js +1 -1
  140. package/lib/emulator/auth/apiSpec.js +14 -46
  141. package/lib/emulator/auth/index.js +1 -1
  142. package/lib/emulator/auth/operations.js +342 -93
  143. package/lib/emulator/auth/server.js +2 -2
  144. package/lib/emulator/auth/state.js +34 -32
  145. package/lib/emulator/commandUtils.js +1 -1
  146. package/lib/emulator/constants.js +1 -1
  147. package/lib/emulator/controller.js +7 -6
  148. package/lib/emulator/databaseEmulator.js +4 -4
  149. package/lib/emulator/download.js +1 -1
  150. package/lib/emulator/downloadableEmulators.js +5 -5
  151. package/lib/emulator/events/types.js +2 -3
  152. package/lib/emulator/firestoreEmulator.js +2 -2
  153. package/lib/emulator/functionsEmulator.js +31 -45
  154. package/lib/emulator/functionsEmulatorRuntime.js +12 -16
  155. package/lib/emulator/functionsEmulatorShared.js +7 -5
  156. package/lib/emulator/functionsRuntimeWorker.js +0 -6
  157. package/lib/emulator/hostingEmulator.js +1 -1
  158. package/lib/emulator/hub.js +1 -1
  159. package/lib/emulator/loggingEmulator.js +1 -1
  160. package/lib/emulator/pubsubEmulator.js +1 -1
  161. package/lib/emulator/storage/crc.js +4 -4
  162. package/lib/emulator/storage/index.js +1 -1
  163. package/lib/emulator/types.js +1 -1
  164. package/lib/errorOut.js +2 -2
  165. package/lib/extensions/askUserForConsent.js +1 -2
  166. package/lib/extensions/askUserForParam.js +15 -18
  167. package/lib/extensions/emulator/optionsHelper.js +4 -4
  168. package/lib/extensions/extensionsApi.js +1 -22
  169. package/lib/extensions/extensionsHelper.js +6 -6
  170. package/lib/extensions/listExtensions.js +9 -10
  171. package/lib/extensions/manifest.js +2 -2
  172. package/lib/extensions/resolveSource.js +11 -7
  173. package/lib/extensions/secretsUtils.js +3 -3
  174. package/lib/extensions/types.js +24 -0
  175. package/lib/extensions/updateHelper.js +1 -1
  176. package/lib/extensions/utils.js +1 -2
  177. package/lib/extensions/warnings.js +3 -3
  178. package/lib/firestore/encodeFirestoreValue.js +11 -8
  179. package/lib/fsAsync.js +3 -3
  180. package/lib/functions/events/v2.js +7 -1
  181. package/lib/functionsConfig.js +17 -14
  182. package/lib/functionsConfigClone.js +46 -46
  183. package/lib/gcp/cloudfunctions.js +2 -15
  184. package/lib/gcp/cloudfunctionsv2.js +17 -2
  185. package/lib/gcp/iam.js +1 -1
  186. package/lib/gcp/index.js +10 -10
  187. package/lib/gcp/rules.js +1 -1
  188. package/lib/gcp/runtimeconfig.js +45 -47
  189. package/lib/hosting/proxy.js +1 -1
  190. package/lib/index.js +29 -28
  191. package/lib/init/features/database.js +10 -2
  192. package/lib/init/features/functions/index.js +1 -1
  193. package/lib/init/features/functions/javascript.js +23 -20
  194. package/lib/init/features/functions/npm-dependencies.js +17 -14
  195. package/lib/init/features/functions/typescript.js +27 -24
  196. package/lib/init/features/hosting/github.js +6 -5
  197. package/lib/init/features/hosting/index.js +2 -2
  198. package/lib/loadCJSON.js +9 -6
  199. package/lib/localFunction.js +4 -4
  200. package/lib/logError.js +15 -12
  201. package/lib/parseBoltRules.js +15 -14
  202. package/lib/previews.js +1 -1
  203. package/lib/profileReport.js +504 -512
  204. package/lib/profiler.js +4 -4
  205. package/lib/prompt.js +1 -2
  206. package/lib/rc.js +1 -1
  207. package/lib/requireAuth.js +0 -1
  208. package/lib/responseToError.js +8 -5
  209. package/lib/rulesDeploy.js +2 -2
  210. package/lib/scopes.js +9 -9
  211. package/lib/serve/index.js +4 -5
  212. package/lib/utils.js +30 -6
  213. package/npm-shrinkwrap.json +537 -193
  214. package/package.json +17 -14
package/lib/api.js CHANGED
@@ -1,221 +1,80 @@
1
1
  "use strict";
2
- var _ = require("lodash");
3
- var querystring = require("querystring");
4
- var request = require("request");
5
- var url = require("url");
6
- var { Constants } = require("./emulator/constants");
7
- var { FirebaseError } = require("./error");
8
- const { logger } = require("./logger");
9
- var responseToError = require("./responseToError");
10
- var scopes = require("./scopes");
11
- var utils = require("./utils");
12
- var CLI_VERSION = require("../package.json").version;
13
- var accessToken;
14
- var refreshToken;
15
- var commandScopes;
16
- var _request = function (options, logOptions) {
17
- logOptions = logOptions || {};
18
- var qsLog = "";
19
- var bodyLog = "<request body omitted>";
20
- if (options.qs && !logOptions.skipQueryParams) {
21
- qsLog = JSON.stringify(options.qs);
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getScopes = exports.githubClientSecret = exports.githubClientId = exports.secretManagerOrigin = exports.githubApiOrigin = exports.githubOrigin = exports.serviceUsageOrigin = exports.cloudRunApiOrigin = exports.hostingApiOrigin = exports.firebaseStorageOrigin = exports.storageOrigin = exports.runtimeconfigOrigin = exports.rulesOrigin = exports.resourceManagerOrigin = exports.remoteConfigApiOrigin = exports.rtdbMetadataOrigin = exports.rtdbManagementOrigin = exports.realtimeOrigin = exports.extensionsOrigin = exports.iamOrigin = exports.identityOrigin = exports.hostingOrigin = exports.googleOrigin = exports.pubsubOrigin = exports.cloudTasksOrigin = exports.cloudschedulerOrigin = exports.functionsDefaultRegion = exports.runOrigin = exports.functionsV2Origin = exports.functionsOrigin = exports.firestoreOrigin = exports.firestoreOriginOrEmulator = exports.firedataOrigin = exports.firebaseExtensionsRegistryOrigin = exports.firebaseApiOrigin = exports.dynamicLinksKey = exports.dynamicLinksOrigin = exports.deployOrigin = exports.consoleOrigin = exports.authOrigin = exports.appengineOrigin = exports.appDistributionOrigin = exports.artifactRegistryDomain = exports.containerRegistryDomain = exports.cloudMonitoringOrigin = exports.cloudloggingOrigin = exports.cloudbillingOrigin = exports.clientSecret = exports.clientId = exports.authProxyOrigin = void 0;
4
+ exports.setScopes = void 0;
5
+ const constants_1 = require("./emulator/constants");
6
+ const logger_1 = require("./logger");
7
+ const scopes = require("./scopes");
8
+ const utils = require("./utils");
9
+ let commandScopes = new Set();
10
+ exports.authProxyOrigin = utils.envOverride("FIREBASE_AUTHPROXY_URL", "https://auth.firebase.tools");
11
+ exports.clientId = utils.envOverride("FIREBASE_CLIENT_ID", "563584335869-fgrhgmd47bqnekij5i8b5pr03ho849e6.apps.googleusercontent.com");
12
+ exports.clientSecret = utils.envOverride("FIREBASE_CLIENT_SECRET", "j9iVZfS8kkCEFUPaAeJV0sAi");
13
+ exports.cloudbillingOrigin = utils.envOverride("FIREBASE_CLOUDBILLING_URL", "https://cloudbilling.googleapis.com");
14
+ exports.cloudloggingOrigin = utils.envOverride("FIREBASE_CLOUDLOGGING_URL", "https://logging.googleapis.com");
15
+ exports.cloudMonitoringOrigin = utils.envOverride("CLOUD_MONITORING_URL", "https://monitoring.googleapis.com");
16
+ exports.containerRegistryDomain = utils.envOverride("CONTAINER_REGISTRY_DOMAIN", "gcr.io");
17
+ exports.artifactRegistryDomain = utils.envOverride("ARTIFACT_REGISTRY_DOMAIN", "https://artifactregistry.googleapis.com");
18
+ exports.appDistributionOrigin = utils.envOverride("FIREBASE_APP_DISTRIBUTION_URL", "https://firebaseappdistribution.googleapis.com");
19
+ exports.appengineOrigin = utils.envOverride("FIREBASE_APPENGINE_URL", "https://appengine.googleapis.com");
20
+ exports.authOrigin = utils.envOverride("FIREBASE_AUTH_URL", "https://accounts.google.com");
21
+ exports.consoleOrigin = utils.envOverride("FIREBASE_CONSOLE_URL", "https://console.firebase.google.com");
22
+ exports.deployOrigin = utils.envOverride("FIREBASE_DEPLOY_URL", utils.envOverride("FIREBASE_UPLOAD_URL", "https://deploy.firebase.com"));
23
+ exports.dynamicLinksOrigin = utils.envOverride("FIREBASE_DYNAMIC_LINKS_URL", "https://firebasedynamiclinks.googleapis.com");
24
+ exports.dynamicLinksKey = utils.envOverride("FIREBASE_DYNAMIC_LINKS_KEY", "AIzaSyB6PtY5vuiSB8MNgt20mQffkOlunZnHYiQ");
25
+ exports.firebaseApiOrigin = utils.envOverride("FIREBASE_API_URL", "https://firebase.googleapis.com");
26
+ exports.firebaseExtensionsRegistryOrigin = utils.envOverride("FIREBASE_EXT_REGISTRY_ORIGIN", "https://extensions-registry.firebaseapp.com");
27
+ exports.firedataOrigin = utils.envOverride("FIREBASE_FIREDATA_URL", "https://mobilesdk-pa.googleapis.com");
28
+ exports.firestoreOriginOrEmulator = utils.envOverride(constants_1.Constants.FIRESTORE_EMULATOR_HOST, utils.envOverride("FIRESTORE_URL", "https://firestore.googleapis.com"), (val) => {
29
+ if (val.startsWith("http")) {
30
+ return val;
22
31
  }
23
- if (!logOptions.skipRequestBody) {
24
- bodyLog = options.body || options.form || "";
32
+ return `http://${val}`;
33
+ });
34
+ exports.firestoreOrigin = utils.envOverride("FIRESTORE_URL", "https://firestore.googleapis.com");
35
+ exports.functionsOrigin = utils.envOverride("FIREBASE_FUNCTIONS_URL", "https://cloudfunctions.googleapis.com");
36
+ exports.functionsV2Origin = utils.envOverride("FIREBASE_FUNCTIONS_V2_URL", "https://cloudfunctions.googleapis.com");
37
+ exports.runOrigin = utils.envOverride("CLOUD_RUN_URL", "https://run.googleapis.com");
38
+ exports.functionsDefaultRegion = utils.envOverride("FIREBASE_FUNCTIONS_DEFAULT_REGION", "us-central1");
39
+ exports.cloudschedulerOrigin = utils.envOverride("FIREBASE_CLOUDSCHEDULER_URL", "https://cloudscheduler.googleapis.com");
40
+ exports.cloudTasksOrigin = utils.envOverride("FIREBASE_CLOUD_TAKS_URL", "https://cloudtasks.googleapis.com");
41
+ exports.pubsubOrigin = utils.envOverride("FIREBASE_PUBSUB_URL", "https://pubsub.googleapis.com");
42
+ exports.googleOrigin = utils.envOverride("FIREBASE_TOKEN_URL", utils.envOverride("FIREBASE_GOOGLE_URL", "https://www.googleapis.com"));
43
+ exports.hostingOrigin = utils.envOverride("FIREBASE_HOSTING_URL", "https://web.app");
44
+ exports.identityOrigin = utils.envOverride("FIREBASE_IDENTITY_URL", "https://identitytoolkit.googleapis.com");
45
+ exports.iamOrigin = utils.envOverride("FIREBASE_IAM_URL", "https://iam.googleapis.com");
46
+ exports.extensionsOrigin = utils.envOverride("FIREBASE_EXT_URL", "https://firebaseextensions.googleapis.com");
47
+ exports.realtimeOrigin = utils.envOverride("FIREBASE_REALTIME_URL", "https://firebaseio.com");
48
+ exports.rtdbManagementOrigin = utils.envOverride("FIREBASE_RTDB_MANAGEMENT_URL", "https://firebasedatabase.googleapis.com");
49
+ exports.rtdbMetadataOrigin = utils.envOverride("FIREBASE_RTDB_METADATA_URL", "https://metadata-dot-firebase-prod.appspot.com");
50
+ exports.remoteConfigApiOrigin = utils.envOverride("FIREBASE_REMOTE_CONFIG_URL", "https://firebaseremoteconfig.googleapis.com");
51
+ exports.resourceManagerOrigin = utils.envOverride("FIREBASE_RESOURCEMANAGER_URL", "https://cloudresourcemanager.googleapis.com");
52
+ exports.rulesOrigin = utils.envOverride("FIREBASE_RULES_URL", "https://firebaserules.googleapis.com");
53
+ exports.runtimeconfigOrigin = utils.envOverride("FIREBASE_RUNTIMECONFIG_URL", "https://runtimeconfig.googleapis.com");
54
+ exports.storageOrigin = utils.envOverride("FIREBASE_STORAGE_URL", "https://storage.googleapis.com");
55
+ exports.firebaseStorageOrigin = utils.envOverride("FIREBASE_FIREBASESTORAGE_URL", "https://firebasestorage.googleapis.com");
56
+ exports.hostingApiOrigin = utils.envOverride("FIREBASE_HOSTING_API_URL", "https://firebasehosting.googleapis.com");
57
+ exports.cloudRunApiOrigin = utils.envOverride("CLOUD_RUN_API_URL", "https://run.googleapis.com");
58
+ exports.serviceUsageOrigin = utils.envOverride("FIREBASE_SERVICE_USAGE_URL", "https://serviceusage.googleapis.com");
59
+ exports.githubOrigin = utils.envOverride("GITHUB_URL", "https://github.com");
60
+ exports.githubApiOrigin = utils.envOverride("GITHUB_API_URL", "https://api.github.com");
61
+ exports.secretManagerOrigin = utils.envOverride("CLOUD_SECRET_MANAGER_URL", "https://secretmanager.googleapis.com");
62
+ exports.githubClientId = utils.envOverride("GITHUB_CLIENT_ID", "89cf50f02ac6aaed3484");
63
+ exports.githubClientSecret = utils.envOverride("GITHUB_CLIENT_SECRET", "3330d14abc895d9a74d5f17cd7a00711fa2c5bf0");
64
+ function getScopes() {
65
+ return Array.from(commandScopes);
66
+ }
67
+ exports.getScopes = getScopes;
68
+ function setScopes(sps = []) {
69
+ commandScopes = new Set([
70
+ scopes.EMAIL,
71
+ scopes.OPENID,
72
+ scopes.CLOUD_PROJECTS_READONLY,
73
+ scopes.FIREBASE_PLATFORM,
74
+ ]);
75
+ for (const s of sps) {
76
+ commandScopes.add(s);
25
77
  }
26
- logger.debug(">>> HTTP REQUEST", options.method, options.url, qsLog, "\n", bodyLog);
27
- options.headers = options.headers || {};
28
- options.headers["connection"] = "keep-alive";
29
- return new Promise(function (resolve, reject) {
30
- var req = request(options, function (err, response, body) {
31
- if (err) {
32
- return reject(new FirebaseError("Server Error. " + err.message, {
33
- original: err,
34
- exit: 2,
35
- }));
36
- }
37
- logger.debug("<<< HTTP RESPONSE", response.statusCode, response.headers);
38
- if (response.statusCode >= 400 && !logOptions.skipResponseBody) {
39
- logger.debug("<<< HTTP RESPONSE BODY", response.body);
40
- if (!options.resolveOnHTTPError) {
41
- return reject(responseToError(response, body));
42
- }
43
- }
44
- return resolve({
45
- status: response.statusCode,
46
- response: response,
47
- body: body,
48
- });
49
- });
50
- if (_.size(options.files) > 0) {
51
- var form = req.form();
52
- _.forEach(options.files, function (details, param) {
53
- form.append(param, details.stream, {
54
- knownLength: details.knownLength,
55
- filename: details.filename,
56
- contentType: details.contentType,
57
- });
58
- });
59
- }
60
- });
61
- };
62
- var _appendQueryData = function (path, data) {
63
- if (data && _.size(data) > 0) {
64
- path += _.includes(path, "?") ? "&" : "?";
65
- path += querystring.stringify(data);
66
- }
67
- return path;
68
- };
69
- var api = {
70
- authProxyOrigin: utils.envOverride("FIREBASE_AUTHPROXY_URL", "https://auth.firebase.tools"),
71
- clientId: utils.envOverride("FIREBASE_CLIENT_ID", "563584335869-fgrhgmd47bqnekij5i8b5pr03ho849e6.apps.googleusercontent.com"),
72
- clientSecret: utils.envOverride("FIREBASE_CLIENT_SECRET", "j9iVZfS8kkCEFUPaAeJV0sAi"),
73
- cloudbillingOrigin: utils.envOverride("FIREBASE_CLOUDBILLING_URL", "https://cloudbilling.googleapis.com"),
74
- cloudloggingOrigin: utils.envOverride("FIREBASE_CLOUDLOGGING_URL", "https://logging.googleapis.com"),
75
- cloudMonitoringOrigin: utils.envOverride("CLOUD_MONITORING_URL", "https://monitoring.googleapis.com"),
76
- containerRegistryDomain: utils.envOverride("CONTAINER_REGISTRY_DOMAIN", "gcr.io"),
77
- artifactRegistryDomain: utils.envOverride("ARTIFACT_REGISTRY_DOMAIN", "https://artifactregistry.googleapis.com"),
78
- appDistributionOrigin: utils.envOverride("FIREBASE_APP_DISTRIBUTION_URL", "https://firebaseappdistribution.googleapis.com"),
79
- appengineOrigin: utils.envOverride("FIREBASE_APPENGINE_URL", "https://appengine.googleapis.com"),
80
- authOrigin: utils.envOverride("FIREBASE_AUTH_URL", "https://accounts.google.com"),
81
- consoleOrigin: utils.envOverride("FIREBASE_CONSOLE_URL", "https://console.firebase.google.com"),
82
- deployOrigin: utils.envOverride("FIREBASE_DEPLOY_URL", utils.envOverride("FIREBASE_UPLOAD_URL", "https://deploy.firebase.com")),
83
- dynamicLinksOrigin: utils.envOverride("FIREBASE_DYNAMIC_LINKS_URL", "https://firebasedynamiclinks.googleapis.com"),
84
- dynamicLinksKey: utils.envOverride("FIREBASE_DYNAMIC_LINKS_KEY", "AIzaSyB6PtY5vuiSB8MNgt20mQffkOlunZnHYiQ"),
85
- firebaseApiOrigin: utils.envOverride("FIREBASE_API_URL", "https://firebase.googleapis.com"),
86
- firebaseExtensionsRegistryOrigin: utils.envOverride("FIREBASE_EXT_REGISTRY_ORIGIN", "https://extensions-registry.firebaseapp.com"),
87
- firedataOrigin: utils.envOverride("FIREBASE_FIREDATA_URL", "https://mobilesdk-pa.googleapis.com"),
88
- firestoreOriginOrEmulator: utils.envOverride(Constants.FIRESTORE_EMULATOR_HOST, utils.envOverride("FIRESTORE_URL", "https://firestore.googleapis.com"), (val) => {
89
- if (val.startsWith("http")) {
90
- return val;
91
- }
92
- return `http://${val}`;
93
- }),
94
- firestoreOrigin: utils.envOverride("FIRESTORE_URL", "https://firestore.googleapis.com"),
95
- functionsOrigin: utils.envOverride("FIREBASE_FUNCTIONS_URL", "https://cloudfunctions.googleapis.com"),
96
- functionsV2Origin: utils.envOverride("FIREBASE_FUNCTIONS_V2_URL", "https://cloudfunctions.googleapis.com"),
97
- runOrigin: utils.envOverride("CLOUD_RUN_URL", "https://run.googleapis.com"),
98
- functionsDefaultRegion: utils.envOverride("FIREBASE_FUNCTIONS_DEFAULT_REGION", "us-central1"),
99
- cloudschedulerOrigin: utils.envOverride("FIREBASE_CLOUDSCHEDULER_URL", "https://cloudscheduler.googleapis.com"),
100
- cloudTasksOrigin: utils.envOverride("FIREBASE_CLOUD_TAKS_URL", "https://cloudtasks.googleapis.com"),
101
- pubsubOrigin: utils.envOverride("FIREBASE_PUBSUB_URL", "https://pubsub.googleapis.com"),
102
- googleOrigin: utils.envOverride("FIREBASE_TOKEN_URL", utils.envOverride("FIREBASE_GOOGLE_URL", "https://www.googleapis.com")),
103
- hostingOrigin: utils.envOverride("FIREBASE_HOSTING_URL", "https://web.app"),
104
- identityOrigin: utils.envOverride("FIREBASE_IDENTITY_URL", "https://identitytoolkit.googleapis.com"),
105
- iamOrigin: utils.envOverride("FIREBASE_IAM_URL", "https://iam.googleapis.com"),
106
- extensionsOrigin: utils.envOverride("FIREBASE_EXT_URL", "https://firebaseextensions.googleapis.com"),
107
- realtimeOrigin: utils.envOverride("FIREBASE_REALTIME_URL", "https://firebaseio.com"),
108
- rtdbManagementOrigin: utils.envOverride("FIREBASE_RTDB_MANAGEMENT_URL", "https://firebasedatabase.googleapis.com"),
109
- rtdbMetadataOrigin: utils.envOverride("FIREBASE_RTDB_METADATA_URL", "https://metadata-dot-firebase-prod.appspot.com"),
110
- remoteConfigApiOrigin: utils.envOverride("FIREBASE_REMOTE_CONFIG_URL", "https://firebaseremoteconfig.googleapis.com"),
111
- resourceManagerOrigin: utils.envOverride("FIREBASE_RESOURCEMANAGER_URL", "https://cloudresourcemanager.googleapis.com"),
112
- rulesOrigin: utils.envOverride("FIREBASE_RULES_URL", "https://firebaserules.googleapis.com"),
113
- runtimeconfigOrigin: utils.envOverride("FIREBASE_RUNTIMECONFIG_URL", "https://runtimeconfig.googleapis.com"),
114
- storageOrigin: utils.envOverride("FIREBASE_STORAGE_URL", "https://storage.googleapis.com"),
115
- firebaseStorageOrigin: utils.envOverride("FIREBASE_FIREBASESTORAGE_URL", "https://firebasestorage.googleapis.com"),
116
- hostingApiOrigin: utils.envOverride("FIREBASE_HOSTING_API_URL", "https://firebasehosting.googleapis.com"),
117
- cloudRunApiOrigin: utils.envOverride("CLOUD_RUN_API_URL", "https://run.googleapis.com"),
118
- serviceUsageOrigin: utils.envOverride("FIREBASE_SERVICE_USAGE_URL", "https://serviceusage.googleapis.com"),
119
- githubOrigin: utils.envOverride("GITHUB_URL", "https://github.com"),
120
- githubApiOrigin: utils.envOverride("GITHUB_API_URL", "https://api.github.com"),
121
- secretManagerOrigin: utils.envOverride("CLOUD_SECRET_MANAGER_URL", "https://secretmanager.googleapis.com"),
122
- githubClientId: utils.envOverride("GITHUB_CLIENT_ID", "89cf50f02ac6aaed3484"),
123
- githubClientSecret: utils.envOverride("GITHUB_CLIENT_SECRET", "3330d14abc895d9a74d5f17cd7a00711fa2c5bf0"),
124
- setRefreshToken: function (token) {
125
- refreshToken = token;
126
- },
127
- setAccessToken: function (token) {
128
- accessToken = token;
129
- },
130
- getScopes: function () {
131
- return commandScopes;
132
- },
133
- setScopes: function (s) {
134
- commandScopes = _.uniq(_.flatten([
135
- scopes.EMAIL,
136
- scopes.OPENID,
137
- scopes.CLOUD_PROJECTS_READONLY,
138
- scopes.FIREBASE_PLATFORM,
139
- ].concat(s || [])));
140
- logger.debug("> command requires scopes:", JSON.stringify(commandScopes));
141
- },
142
- getAccessToken: function () {
143
- return accessToken
144
- ? Promise.resolve({ access_token: accessToken })
145
- : require("./auth").getAccessToken(refreshToken, commandScopes);
146
- },
147
- addRequestHeaders: function (reqOptions, options) {
148
- _.set(reqOptions, ["headers", "User-Agent"], "FirebaseCLI/" + CLI_VERSION);
149
- _.set(reqOptions, ["headers", "X-Client-Version"], "FirebaseCLI/" + CLI_VERSION);
150
- var secureRequest = true;
151
- if (options && options.origin) {
152
- const originUrl = url.parse(options.origin);
153
- secureRequest = originUrl.protocol === "https:";
154
- }
155
- var getTokenPromise = secureRequest
156
- ? api.getAccessToken()
157
- : Promise.resolve({ access_token: "owner" });
158
- return getTokenPromise.then(function (result) {
159
- _.set(reqOptions, "headers.authorization", "Bearer " + result.access_token);
160
- return reqOptions;
161
- });
162
- },
163
- request: function (method, resource, options) {
164
- options = _.extend({
165
- data: {},
166
- resolveOnHTTPError: false,
167
- json: true,
168
- }, options);
169
- if (!options.origin) {
170
- throw new FirebaseError("Cannot make request without an origin", { exit: 2 });
171
- }
172
- var validMethods = ["GET", "PUT", "POST", "DELETE", "PATCH"];
173
- if (validMethods.indexOf(method) < 0) {
174
- method = "GET";
175
- }
176
- var reqOptions = {
177
- method: method,
178
- };
179
- if (options.query) {
180
- resource = _appendQueryData(resource, options.query);
181
- }
182
- if (method === "GET") {
183
- resource = _appendQueryData(resource, options.data);
184
- }
185
- else {
186
- if (_.size(options.data) > 0) {
187
- reqOptions.body = options.data;
188
- }
189
- else if (_.size(options.form) > 0) {
190
- reqOptions.form = options.form;
191
- }
192
- }
193
- reqOptions.url = options.origin + resource;
194
- reqOptions.files = options.files;
195
- reqOptions.resolveOnHTTPError = options.resolveOnHTTPError;
196
- reqOptions.json = options.json;
197
- reqOptions.qs = options.qs;
198
- reqOptions.headers = options.headers;
199
- reqOptions.timeout = options.timeout;
200
- var requestFunction = function () {
201
- return _request(reqOptions, options.logOptions);
202
- };
203
- if (options.auth === true) {
204
- requestFunction = function () {
205
- return api.addRequestHeaders(reqOptions, options).then(function (reqOptionsWithToken) {
206
- return _request(reqOptionsWithToken, options.logOptions);
207
- });
208
- };
209
- }
210
- return requestFunction().catch(function (err) {
211
- if (options.retryCodes &&
212
- _.includes(options.retryCodes, _.get(err, "context.response.statusCode"))) {
213
- return new Promise(function (resolve) {
214
- setTimeout(resolve, 1000);
215
- }).then(requestFunction);
216
- }
217
- return Promise.reject(err);
218
- });
219
- },
220
- };
221
- module.exports = api;
78
+ logger_1.logger.debug("> command requires scopes:", Array.from(commandScopes));
79
+ }
80
+ exports.setScopes = setScopes;
package/lib/apiv2.js CHANGED
@@ -11,7 +11,8 @@ const util_1 = require("util");
11
11
  const auth = require("./auth");
12
12
  const error_1 = require("./error");
13
13
  const logger_1 = require("./logger");
14
- const responseToError = require("./responseToError");
14
+ const responseToError_1 = require("./responseToError");
15
+ const FormData = require("form-data");
15
16
  const pkg = require("../package.json");
16
17
  const CLI_VERSION = pkg.version;
17
18
  let accessToken = "";
@@ -277,13 +278,13 @@ class Client {
277
278
  this.logResponse(res, body, options);
278
279
  if (res.status >= 400) {
279
280
  if ((_a = options.retryCodes) === null || _a === void 0 ? void 0 : _a.includes(res.status)) {
280
- const err = responseToError({ statusCode: res.status }, body) || undefined;
281
+ const err = (0, responseToError_1.responseToError)({ statusCode: res.status }, body) || undefined;
281
282
  if (operation.retry(err)) {
282
283
  return;
283
284
  }
284
285
  }
285
286
  if (!options.resolveOnHTTPError) {
286
- return reject(responseToError({ statusCode: res.status }, body));
287
+ return reject((0, responseToError_1.responseToError)({ statusCode: res.status }, body));
287
288
  }
288
289
  }
289
290
  resolve({
@@ -346,5 +347,5 @@ function bodyToString(body) {
346
347
  }
347
348
  }
348
349
  function isStream(o) {
349
- return o instanceof stream_1.Readable;
350
+ return o instanceof stream_1.Readable || o instanceof FormData;
350
351
  }
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AppDistributionClient = exports.UploadReleaseResult = exports.IntegrationState = void 0;
4
- const _ = require("lodash");
5
4
  const utils = require("../utils");
6
5
  const operationPoller = require("../operation-poller");
7
6
  const error_1 = require("../error");
@@ -83,6 +82,7 @@ class AppDistributionClient {
83
82
  utils.logSuccess("added release notes successfully");
84
83
  }
85
84
  async distribute(releaseName, testerEmails = [], groupAliases = []) {
85
+ var _a, _b, _c;
86
86
  if (testerEmails.length === 0 && groupAliases.length === 0) {
87
87
  utils.logWarning("no testers or groups specified, skipping");
88
88
  return;
@@ -97,14 +97,12 @@ class AppDistributionClient {
97
97
  }
98
98
  catch (err) {
99
99
  let errorMessage = err.message;
100
- if (_.has(err, "context.body.error")) {
101
- const errorStatus = _.get(err, "context.body.error.status");
102
- if (errorStatus === "FAILED_PRECONDITION") {
103
- errorMessage = "invalid testers";
104
- }
105
- else if (errorStatus === "INVALID_ARGUMENT") {
106
- errorMessage = "invalid groups";
107
- }
100
+ const errorStatus = (_c = (_b = (_a = err === null || err === void 0 ? void 0 : err.context) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b.error) === null || _c === void 0 ? void 0 : _c.status;
101
+ if (errorStatus === "FAILED_PRECONDITION") {
102
+ errorMessage = "invalid testers";
103
+ }
104
+ else if (errorStatus === "INVALID_ARGUMENT") {
105
+ errorMessage = "invalid groups";
108
106
  }
109
107
  throw new error_1.FirebaseError(`failed to distribute to testers/groups: ${errorMessage}`, {
110
108
  exit: 1,
package/lib/auth.js CHANGED
@@ -2,15 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.logout = exports.getAccessToken = exports.findAccountByEmail = exports.loginGithub = exports.loginGoogle = exports.setGlobalDefaultAccount = exports.setProjectAccount = exports.loginAdditionalAccount = exports.selectAccount = exports.setRefreshToken = exports.setActiveAccount = exports.getAllAccounts = exports.getAdditionalAccounts = exports.getProjectDefaultAccount = exports.getGlobalDefaultAccount = void 0;
4
4
  const clc = require("cli-color");
5
+ const FormData = require("form-data");
5
6
  const fs = require("fs");
6
- const jwt = require("jsonwebtoken");
7
7
  const http = require("http");
8
+ const jwt = require("jsonwebtoken");
8
9
  const opn = require("open");
9
10
  const path = require("path");
10
11
  const portfinder = require("portfinder");
11
12
  const url = require("url");
12
13
  const util = require("util");
13
- const api = require("./api");
14
14
  const apiv2 = require("./apiv2");
15
15
  const configstore_1 = require("./configstore");
16
16
  const error_1 = require("./error");
@@ -23,6 +23,7 @@ const uuid_1 = require("uuid");
23
23
  const crypto_1 = require("crypto");
24
24
  const cli_color_1 = require("cli-color");
25
25
  const track_1 = require("./track");
26
+ const api_1 = require("./api");
26
27
  portfinder.basePort = 9005;
27
28
  function getGlobalDefaultAccount() {
28
29
  const user = configstore_1.configstore.get("user");
@@ -72,7 +73,6 @@ function setActiveAccount(options, account) {
72
73
  }
73
74
  exports.setActiveAccount = setActiveAccount;
74
75
  function setRefreshToken(token) {
75
- api.setRefreshToken(token);
76
76
  apiv2.setRefreshToken(token);
77
77
  }
78
78
  exports.setRefreshToken = setRefreshToken;
@@ -175,10 +175,10 @@ function queryParamString(args) {
175
175
  return tokens.join("&");
176
176
  }
177
177
  function getLoginUrl(callbackUrl, userHint) {
178
- return (api.authOrigin +
178
+ return (api_1.authOrigin +
179
179
  "/o/oauth2/auth?" +
180
180
  queryParamString({
181
- client_id: api.clientId,
181
+ client_id: api_1.clientId,
182
182
  scope: SCOPES.join(" "),
183
183
  response_type: "code",
184
184
  state: _nonce,
@@ -187,22 +187,29 @@ function getLoginUrl(callbackUrl, userHint) {
187
187
  }));
188
188
  }
189
189
  async function getTokensFromAuthorizationCode(code, callbackUrl, verifier) {
190
- var _a, _b;
191
- let res;
192
190
  const params = {
193
191
  code: code,
194
- client_id: api.clientId,
195
- client_secret: api.clientSecret,
192
+ client_id: api_1.clientId,
193
+ client_secret: api_1.clientSecret,
196
194
  redirect_uri: callbackUrl,
197
195
  grant_type: "authorization_code",
198
196
  };
199
197
  if (verifier) {
200
198
  params["code_verifier"] = verifier;
201
199
  }
200
+ let res;
202
201
  try {
203
- res = await api.request("POST", "/o/oauth2/token", {
204
- origin: api.authOrigin,
205
- form: params,
202
+ const client = new apiv2.Client({ urlPrefix: api_1.authOrigin, auth: false });
203
+ const form = new FormData();
204
+ for (const [k, v] of Object.entries(params)) {
205
+ form.append(k, v);
206
+ }
207
+ res = await client.request({
208
+ method: "POST",
209
+ path: "/o/oauth2/token",
210
+ body: form,
211
+ headers: form.getHeaders(),
212
+ skipLog: { body: true, queryParams: true, resBody: true },
206
213
  });
207
214
  }
208
215
  catch (err) {
@@ -214,8 +221,8 @@ async function getTokensFromAuthorizationCode(code, callbackUrl, verifier) {
214
221
  }
215
222
  throw invalidCredentialError();
216
223
  }
217
- if (!((_a = res === null || res === void 0 ? void 0 : res.body) === null || _a === void 0 ? void 0 : _a.access_token) && !((_b = res === null || res === void 0 ? void 0 : res.body) === null || _b === void 0 ? void 0 : _b.refresh_token)) {
218
- logger_1.logger.debug("Token Fetch Error:", res.statusCode, res.body);
224
+ if (!res.body.access_token && !res.body.refresh_token) {
225
+ logger_1.logger.debug("Token Fetch Error:", res.status, res.body);
219
226
  throw invalidCredentialError();
220
227
  }
221
228
  lastAccessToken = Object.assign({
@@ -225,25 +232,35 @@ async function getTokensFromAuthorizationCode(code, callbackUrl, verifier) {
225
232
  }
226
233
  const GITHUB_SCOPES = ["read:user", "repo", "public_repo"];
227
234
  function getGithubLoginUrl(callbackUrl) {
228
- return (api.githubOrigin +
235
+ return (api_1.githubOrigin +
229
236
  "/login/oauth/authorize?" +
230
237
  queryParamString({
231
- client_id: api.githubClientId,
238
+ client_id: api_1.githubClientId,
232
239
  state: _nonce,
233
240
  redirect_uri: callbackUrl,
234
241
  scope: GITHUB_SCOPES.join(" "),
235
242
  }));
236
243
  }
237
244
  async function getGithubTokensFromAuthorizationCode(code, callbackUrl) {
238
- const res = await api.request("POST", "/login/oauth/access_token", {
239
- origin: api.githubOrigin,
240
- form: {
241
- client_id: api.githubClientId,
242
- client_secret: api.githubClientSecret,
243
- code,
244
- redirect_uri: callbackUrl,
245
- state: _nonce,
246
- },
245
+ const client = new apiv2.Client({ urlPrefix: api_1.githubOrigin, auth: false });
246
+ const data = {
247
+ client_id: api_1.githubClientId,
248
+ client_secret: api_1.githubClientSecret,
249
+ code,
250
+ redirect_uri: callbackUrl,
251
+ state: _nonce,
252
+ };
253
+ const form = new FormData();
254
+ for (const [k, v] of Object.entries(data)) {
255
+ form.append(k, v);
256
+ }
257
+ const headers = form.getHeaders();
258
+ headers.accept = "application/json";
259
+ const res = await client.request({
260
+ method: "POST",
261
+ path: "/login/oauth/access_token",
262
+ body: form,
263
+ headers,
247
264
  });
248
265
  return res.body.access_token;
249
266
  }
@@ -259,10 +276,10 @@ async function respondWithFile(req, res, statusCode, filename) {
259
276
  function urlsafeBase64(base64string) {
260
277
  return base64string.replace(/\+/g, "-").replace(/=+$/, "").replace(/\//g, "_");
261
278
  }
262
- async function loginRemotely(userHint) {
279
+ async function loginRemotely() {
263
280
  var _a;
264
281
  const authProxyClient = new apiv2.Client({
265
- urlPrefix: api.authProxyOrigin,
282
+ urlPrefix: api_1.authProxyOrigin,
266
283
  auth: false,
267
284
  });
268
285
  const sessionId = (0, uuid_1.v4)();
@@ -271,7 +288,7 @@ async function loginRemotely(userHint) {
271
288
  const attestToken = (_a = (await authProxyClient.post("/attest", {
272
289
  session_id: sessionId,
273
290
  })).body) === null || _a === void 0 ? void 0 : _a.token;
274
- const loginUrl = `${api.authProxyOrigin}/login?code_challenge=${codeChallenge}&session=${sessionId}&attest=${attestToken}`;
291
+ const loginUrl = `${api_1.authProxyOrigin}/login?code_challenge=${codeChallenge}&session=${sessionId}&attest=${attestToken}`;
275
292
  logger_1.logger.info();
276
293
  logger_1.logger.info("To sign in to the Firebase CLI:");
277
294
  logger_1.logger.info();
@@ -290,7 +307,7 @@ async function loginRemotely(userHint) {
290
307
  message: "Enter authorization code:",
291
308
  });
292
309
  try {
293
- const tokens = await getTokensFromAuthorizationCode(code, `${api.authProxyOrigin}/complete`, codeVerifier);
310
+ const tokens = await getTokensFromAuthorizationCode(code, `${api_1.authProxyOrigin}/complete`, codeVerifier);
294
311
  void (0, track_1.track)("login", "google_remote");
295
312
  return {
296
313
  user: jwt.decode(tokens.id_token),
@@ -325,7 +342,6 @@ async function loginWithLocalhostGitHub(port) {
325
342
  async function loginWithLocalhost(port, callbackUrl, authUrl, successTemplate, getTokens) {
326
343
  return new Promise((resolve, reject) => {
327
344
  const server = http.createServer(async (req, res) => {
328
- let tokens;
329
345
  const query = url.parse(`${req.url}`, true).query || {};
330
346
  const queryState = query.state;
331
347
  const queryCode = query.code;
@@ -362,16 +378,15 @@ async function loginWithLocalhost(port, callbackUrl, authUrl, successTemplate, g
362
378
  }
363
379
  async function loginGoogle(localhost, userHint) {
364
380
  if (localhost) {
365
- const port = await getPort();
366
381
  try {
367
382
  const port = await getPort();
368
383
  return await loginWithLocalhostGoogle(port, userHint);
369
384
  }
370
385
  catch (_a) {
371
- return await loginRemotely(userHint);
386
+ return await loginRemotely();
372
387
  }
373
388
  }
374
- return await loginRemotely(userHint);
389
+ return await loginRemotely();
375
390
  }
376
391
  exports.loginGoogle = loginGoogle;
377
392
  async function loginGithub() {
@@ -442,24 +457,33 @@ function logoutCurrentSession(refreshToken) {
442
457
  deleteAccount(account);
443
458
  }
444
459
  async function refreshTokens(refreshToken, authScopes) {
445
- var _a, _b, _c;
460
+ var _a, _b;
446
461
  logger_1.logger.debug("> refreshing access token with scopes:", JSON.stringify(authScopes));
447
462
  try {
448
- const res = await api.request("POST", "/oauth2/v3/token", {
449
- origin: api.googleOrigin,
450
- form: {
451
- refresh_token: refreshToken,
452
- client_id: api.clientId,
453
- client_secret: api.clientSecret,
454
- grant_type: "refresh_token",
455
- scope: (authScopes || []).join(" "),
456
- },
457
- logOptions: { skipRequestBody: true, skipQueryParams: true, skipResponseBody: true },
463
+ const client = new apiv2.Client({ urlPrefix: api_1.googleOrigin, auth: false });
464
+ const data = {
465
+ refresh_token: refreshToken,
466
+ client_id: api_1.clientId,
467
+ client_secret: api_1.clientSecret,
468
+ grant_type: "refresh_token",
469
+ scope: (authScopes || []).join(" "),
470
+ };
471
+ const form = new FormData();
472
+ for (const [k, v] of Object.entries(data)) {
473
+ form.append(k, v);
474
+ }
475
+ const res = await client.request({
476
+ method: "POST",
477
+ path: "/oauth2/v3/token",
478
+ body: form,
479
+ headers: form.getHeaders(),
480
+ skipLog: { body: true, queryParams: true, resBody: true },
481
+ resolveOnHTTPError: true,
458
482
  });
459
483
  if (res.status === 401 || res.status === 400) {
460
484
  return { access_token: refreshToken };
461
485
  }
462
- if (typeof ((_a = res.body) === null || _a === void 0 ? void 0 : _a.access_token) !== "string") {
486
+ if (typeof res.body.access_token !== "string") {
463
487
  throw invalidCredentialError();
464
488
  }
465
489
  lastAccessToken = Object.assign({
@@ -475,7 +499,7 @@ async function refreshTokens(refreshToken, authScopes) {
475
499
  return lastAccessToken;
476
500
  }
477
501
  catch (err) {
478
- if (((_c = (_b = err === null || err === void 0 ? void 0 : err.context) === null || _b === void 0 ? void 0 : _b.body) === null || _c === void 0 ? void 0 : _c.error) === "invalid_scope") {
502
+ if (((_b = (_a = err === null || err === void 0 ? void 0 : err.context) === null || _a === void 0 ? void 0 : _a.body) === null || _b === void 0 ? void 0 : _b.error) === "invalid_scope") {
479
503
  throw new error_1.FirebaseError("This command requires new authorization scopes not granted to your current session. Please run " +
480
504
  clc.bold("firebase login --reauth") +
481
505
  "\n\n" +
@@ -498,12 +522,8 @@ async function logout(refreshToken) {
498
522
  }
499
523
  logoutCurrentSession(refreshToken);
500
524
  try {
501
- await api.request("GET", "/o/oauth2/revoke", {
502
- origin: api.authOrigin,
503
- data: {
504
- token: refreshToken,
505
- },
506
- });
525
+ const client = new apiv2.Client({ urlPrefix: api_1.authOrigin, auth: false });
526
+ await client.get("/o/oauth2/revoke", { queryParams: { token: refreshToken } });
507
527
  }
508
528
  catch (thrown) {
509
529
  const err = thrown instanceof Error ? thrown : new Error(thrown);