firebase-tools 11.0.1 → 11.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/accountImporter.js +92 -93
- package/lib/api.js +77 -218
- package/lib/apiv2.js +5 -4
- package/lib/auth.js +69 -47
- package/lib/bin/firebase.js +42 -47
- package/lib/checkValidTargetFilters.js +13 -12
- package/lib/commands/appdistribution-distribute.js +2 -1
- package/lib/commands/appdistribution-testers-add.js +2 -1
- package/lib/commands/appdistribution-testers-remove.js +2 -1
- package/lib/commands/apps-android-sha-create.js +2 -1
- package/lib/commands/apps-android-sha-delete.js +2 -1
- package/lib/commands/apps-android-sha-list.js +2 -1
- package/lib/commands/apps-create.js +2 -1
- package/lib/commands/apps-list.js +2 -1
- package/lib/commands/apps-sdkconfig.js +2 -1
- package/lib/commands/auth-export.js +2 -1
- package/lib/commands/auth-import.js +7 -10
- package/lib/commands/crashlytics-symbols-upload.js +2 -1
- package/lib/commands/database-get.js +4 -3
- package/lib/commands/database-instances-create.js +2 -1
- package/lib/commands/database-instances-list.js +3 -3
- package/lib/commands/database-profile.js +2 -1
- package/lib/commands/database-push.js +2 -1
- package/lib/commands/database-remove.js +2 -1
- package/lib/commands/database-rules-canary.js +2 -1
- package/lib/commands/database-rules-get.js +2 -1
- package/lib/commands/database-rules-list.js +2 -1
- package/lib/commands/database-rules-release.js +2 -1
- package/lib/commands/database-rules-stage.js +2 -1
- package/lib/commands/database-set.js +2 -1
- package/lib/commands/database-settings-get.js +2 -1
- package/lib/commands/database-settings-set.js +2 -1
- package/lib/commands/database-update.js +2 -1
- package/lib/commands/deploy.js +23 -21
- package/lib/commands/emulators-exec.js +2 -1
- package/lib/commands/emulators-export.js +2 -1
- package/lib/commands/emulators-start.js +2 -1
- package/lib/commands/experimental-functions-shell.js +10 -8
- package/lib/commands/ext-configure.js +2 -1
- package/lib/commands/ext-dev-deprecate.js +2 -1
- package/lib/commands/ext-dev-emulators-exec.js +2 -1
- package/lib/commands/ext-dev-emulators-start.js +2 -1
- package/lib/commands/ext-dev-extension-delete.js +2 -1
- package/lib/commands/ext-dev-init.js +2 -1
- package/lib/commands/ext-dev-list.js +2 -1
- package/lib/commands/ext-dev-publish.js +2 -1
- package/lib/commands/ext-dev-register.js +2 -1
- package/lib/commands/ext-dev-undeprecate.js +2 -1
- package/lib/commands/ext-dev-unpublish.js +2 -1
- package/lib/commands/ext-dev-usage.js +2 -1
- package/lib/commands/ext-export.js +2 -1
- package/lib/commands/ext-info.js +2 -1
- package/lib/commands/ext-install.js +2 -1
- package/lib/commands/ext-list.js +2 -1
- package/lib/commands/ext-sources-create.js +2 -1
- package/lib/commands/ext-uninstall.js +2 -1
- package/lib/commands/ext-update.js +2 -1
- package/lib/commands/ext.js +2 -1
- package/lib/commands/firestore-delete.js +2 -1
- package/lib/commands/firestore-indexes-list.js +2 -1
- package/lib/commands/functions-config-clone.js +4 -3
- package/lib/commands/functions-config-export.js +2 -1
- package/lib/commands/functions-config-get.js +2 -1
- package/lib/commands/functions-config-set.js +2 -1
- package/lib/commands/functions-config-unset.js +2 -1
- package/lib/commands/functions-delete.js +2 -1
- package/lib/commands/functions-deletegcfartifacts.js +2 -1
- package/lib/commands/functions-list.js +2 -1
- package/lib/commands/functions-log.js +2 -1
- package/lib/commands/functions-secrets-access.js +2 -1
- package/lib/commands/functions-secrets-destroy.js +2 -1
- package/lib/commands/functions-secrets-get.js +2 -1
- package/lib/commands/functions-secrets-prune.js +2 -1
- package/lib/commands/functions-secrets-set.js +2 -1
- package/lib/commands/functions-shell.js +12 -10
- package/lib/commands/help.js +2 -1
- package/lib/commands/hosting-channel-create.js +2 -1
- package/lib/commands/hosting-channel-delete.js +2 -1
- package/lib/commands/hosting-channel-deploy.js +2 -1
- package/lib/commands/hosting-channel-list.js +2 -1
- package/lib/commands/hosting-channel-open.js +2 -1
- package/lib/commands/hosting-clone.js +2 -1
- package/lib/commands/hosting-disable.js +2 -1
- package/lib/commands/hosting-sites-create.js +2 -1
- package/lib/commands/hosting-sites-delete.js +2 -1
- package/lib/commands/hosting-sites-get.js +2 -1
- package/lib/commands/hosting-sites-list.js +2 -1
- package/lib/commands/index.js +23 -13
- package/lib/commands/init.js +47 -43
- package/lib/commands/login-add.js +2 -1
- package/lib/commands/login-ci.js +2 -1
- package/lib/commands/login-list.js +2 -1
- package/lib/commands/login-use.js +2 -1
- package/lib/commands/login.js +2 -1
- package/lib/commands/logout.js +2 -1
- package/lib/commands/open.js +2 -1
- package/lib/commands/projects-addfirebase.js +2 -1
- package/lib/commands/projects-create.js +2 -1
- package/lib/commands/projects-list.js +2 -1
- package/lib/commands/remoteconfig-get.js +2 -1
- package/lib/commands/remoteconfig-rollback.js +2 -1
- package/lib/commands/remoteconfig-versions-list.js +2 -1
- package/lib/commands/serve.js +29 -27
- package/lib/commands/setup-emulators-database.js +2 -1
- package/lib/commands/setup-emulators-firestore.js +2 -1
- package/lib/commands/setup-emulators-pubsub.js +2 -1
- package/lib/commands/setup-emulators-storage.js +2 -1
- package/lib/commands/setup-emulators-ui.js +2 -1
- package/lib/commands/target-apply.js +2 -1
- package/lib/commands/target-clear.js +2 -1
- package/lib/commands/target-remove.js +2 -1
- package/lib/commands/target.js +2 -1
- package/lib/commands/use.js +54 -52
- package/lib/config.js +3 -3
- package/lib/deploy/database/deploy.js +3 -2
- package/lib/deploy/database/index.js +8 -5
- package/lib/deploy/database/prepare.js +22 -19
- package/lib/deploy/database/release.js +12 -9
- package/lib/deploy/firestore/prepare.js +2 -2
- package/lib/deploy/functions/build.js +32 -20
- package/lib/deploy/functions/runtimes/discovery/v1alpha1.js +187 -54
- package/lib/deploy/functions/runtimes/node/parseTriggers.js +14 -2
- package/lib/deploy/functions/services/database.js +14 -0
- package/lib/deploy/functions/services/index.js +14 -0
- package/lib/deploy/index.js +3 -3
- package/lib/deploy/lifecycleHooks.js +23 -20
- package/lib/deploy/remoteconfig/prepare.js +2 -2
- package/lib/emulator/auth/apiSpec.js +14 -46
- package/lib/emulator/auth/operations.js +6 -29
- package/lib/emulator/auth/state.js +2 -25
- package/lib/emulator/controller.js +1 -1
- package/lib/emulator/databaseEmulator.js +2 -2
- package/lib/errorOut.js +2 -2
- package/lib/functions/events/v2.js +7 -1
- package/lib/functionsConfigClone.js +43 -41
- package/lib/gcp/cloudfunctionsv2.js +17 -2
- package/lib/gcp/iam.js +1 -1
- package/lib/gcp/index.js +10 -10
- package/lib/gcp/runtimeconfig.js +45 -47
- package/lib/index.js +29 -28
- package/lib/init/features/database.js +10 -2
- package/lib/init/features/functions/index.js +1 -1
- package/lib/init/features/functions/javascript.js +23 -20
- package/lib/init/features/functions/npm-dependencies.js +17 -14
- package/lib/init/features/functions/typescript.js +27 -24
- package/lib/init/features/hosting/github.js +5 -4
- package/lib/loadCJSON.js +9 -6
- package/lib/logError.js +15 -12
- package/lib/parseBoltRules.js +15 -14
- package/lib/profileReport.js +503 -511
- package/lib/profiler.js +4 -4
- package/lib/requireAuth.js +0 -1
- package/lib/responseToError.js +8 -5
- package/lib/scopes.js +9 -9
- package/npm-shrinkwrap.json +537 -193
- package/package.json +8 -6
package/lib/api.js
CHANGED
|
@@ -1,221 +1,80 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
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("
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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
|
}
|
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 (
|
|
178
|
+
return (api_1.authOrigin +
|
|
179
179
|
"/o/oauth2/auth?" +
|
|
180
180
|
queryParamString({
|
|
181
|
-
client_id:
|
|
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:
|
|
195
|
-
client_secret:
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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 (!
|
|
218
|
-
logger_1.logger.debug("Token Fetch Error:", res.
|
|
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 (
|
|
235
|
+
return (api_1.githubOrigin +
|
|
229
236
|
"/login/oauth/authorize?" +
|
|
230
237
|
queryParamString({
|
|
231
|
-
client_id:
|
|
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
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
}
|
|
@@ -262,7 +279,7 @@ function urlsafeBase64(base64string) {
|
|
|
262
279
|
async function loginRemotely(userHint) {
|
|
263
280
|
var _a;
|
|
264
281
|
const authProxyClient = new apiv2.Client({
|
|
265
|
-
urlPrefix:
|
|
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 = `${
|
|
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, `${
|
|
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),
|
|
@@ -442,24 +459,33 @@ function logoutCurrentSession(refreshToken) {
|
|
|
442
459
|
deleteAccount(account);
|
|
443
460
|
}
|
|
444
461
|
async function refreshTokens(refreshToken, authScopes) {
|
|
445
|
-
var _a, _b
|
|
462
|
+
var _a, _b;
|
|
446
463
|
logger_1.logger.debug("> refreshing access token with scopes:", JSON.stringify(authScopes));
|
|
447
464
|
try {
|
|
448
|
-
const
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
465
|
+
const client = new apiv2.Client({ urlPrefix: api_1.googleOrigin, auth: false });
|
|
466
|
+
const data = {
|
|
467
|
+
refresh_token: refreshToken,
|
|
468
|
+
client_id: api_1.clientId,
|
|
469
|
+
client_secret: api_1.clientSecret,
|
|
470
|
+
grant_type: "refresh_token",
|
|
471
|
+
scope: (authScopes || []).join(" "),
|
|
472
|
+
};
|
|
473
|
+
const form = new FormData();
|
|
474
|
+
for (const [k, v] of Object.entries(data)) {
|
|
475
|
+
form.append(k, v);
|
|
476
|
+
}
|
|
477
|
+
const res = await client.request({
|
|
478
|
+
method: "POST",
|
|
479
|
+
path: "/oauth2/v3/token",
|
|
480
|
+
body: form,
|
|
481
|
+
headers: form.getHeaders(),
|
|
482
|
+
skipLog: { body: true, queryParams: true, resBody: true },
|
|
483
|
+
resolveOnHTTPError: true,
|
|
458
484
|
});
|
|
459
485
|
if (res.status === 401 || res.status === 400) {
|
|
460
486
|
return { access_token: refreshToken };
|
|
461
487
|
}
|
|
462
|
-
if (typeof
|
|
488
|
+
if (typeof res.body.access_token !== "string") {
|
|
463
489
|
throw invalidCredentialError();
|
|
464
490
|
}
|
|
465
491
|
lastAccessToken = Object.assign({
|
|
@@ -475,7 +501,7 @@ async function refreshTokens(refreshToken, authScopes) {
|
|
|
475
501
|
return lastAccessToken;
|
|
476
502
|
}
|
|
477
503
|
catch (err) {
|
|
478
|
-
if (((
|
|
504
|
+
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
505
|
throw new error_1.FirebaseError("This command requires new authorization scopes not granted to your current session. Please run " +
|
|
480
506
|
clc.bold("firebase login --reauth") +
|
|
481
507
|
"\n\n" +
|
|
@@ -498,12 +524,8 @@ async function logout(refreshToken) {
|
|
|
498
524
|
}
|
|
499
525
|
logoutCurrentSession(refreshToken);
|
|
500
526
|
try {
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
data: {
|
|
504
|
-
token: refreshToken,
|
|
505
|
-
},
|
|
506
|
-
});
|
|
527
|
+
const client = new apiv2.Client({ urlPrefix: api_1.authOrigin, auth: false });
|
|
528
|
+
await client.get("/o/oauth2/revoke", { queryParams: { token: refreshToken } });
|
|
507
529
|
}
|
|
508
530
|
catch (thrown) {
|
|
509
531
|
const err = thrown instanceof Error ? thrown : new Error(thrown);
|