firebase-tools
Version:
Command-Line Interface for Firebase
121 lines (120 loc) • 4.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateStudioFirebaseProject = exports.reconcileStudioFirebaseProject = void 0;
const apiv2_1 = require("../apiv2");
const prompt = require("../prompt");
const api = require("../api");
const logger_1 = require("../logger");
const utils = require("../utils");
const configstore_1 = require("../configstore");
const TIMEOUT_MILLIS = 30000;
const studioClient = new apiv2_1.Client({
urlPrefix: api.studioApiOrigin(),
apiVersion: "v1",
});
async function reconcileStudioFirebaseProject(options, activeProjectFromConfig) {
const studioWorkspace = await getStudioWorkspace();
if (!studioWorkspace) {
return activeProjectFromConfig;
}
if (!studioWorkspace.firebaseProjectId) {
if (activeProjectFromConfig) {
await updateStudioFirebaseProject(activeProjectFromConfig);
}
return activeProjectFromConfig;
}
if (!activeProjectFromConfig) {
await writeStudioProjectToConfigStore(options, studioWorkspace.firebaseProjectId);
return studioWorkspace.firebaseProjectId;
}
if (studioWorkspace.firebaseProjectId !== activeProjectFromConfig && !options.nonInteractive) {
const choices = [
{
name: `Set ${studioWorkspace.firebaseProjectId} from Firebase Studio as my active project in both places`,
value: false,
},
{
name: `Set ${activeProjectFromConfig} from Firebase CLI as my active project in both places`,
value: true,
},
];
const useCliProject = await prompt.select({
message: "Found different active Firebase Projects in the Firebase CLI and your Firebase Studio Workspace. Which project would you like to set as your active project?",
choices,
});
if (useCliProject) {
await updateStudioFirebaseProject(activeProjectFromConfig);
return activeProjectFromConfig;
}
else {
await writeStudioProjectToConfigStore(options, studioWorkspace.firebaseProjectId);
return studioWorkspace.firebaseProjectId;
}
}
return studioWorkspace.firebaseProjectId;
}
exports.reconcileStudioFirebaseProject = reconcileStudioFirebaseProject;
async function getStudioWorkspace() {
const workspaceId = process.env.WORKSPACE_SLUG;
if (!workspaceId) {
logger_1.logger.error(`Failed to fetch Firebase Project from Studio Workspace because WORKSPACE_SLUG environment variable is empty`);
return undefined;
}
try {
const res = await studioClient.request({
method: "GET",
path: `/workspaces/${workspaceId}`,
timeout: TIMEOUT_MILLIS,
});
return res.body;
}
catch (err) {
let message = err.message;
if (err.original) {
message += ` (original: ${err.original.message})`;
}
logger_1.logger.error(`Failed to fetch Firebase Project from current Studio Workspace: ${message}`);
return undefined;
}
}
async function writeStudioProjectToConfigStore(options, studioProjectId) {
if (options.projectRoot) {
logger_1.logger.info(`Updating Firebase CLI active project to match Studio Workspace '${studioProjectId}'`);
utils.makeActiveProject(options.projectRoot, studioProjectId);
recordStudioProjectSyncTime();
}
}
async function updateStudioFirebaseProject(projectId) {
logger_1.logger.info(`Updating Studio Workspace active project to match Firebase CLI '${projectId}'`);
const workspaceId = process.env.WORKSPACE_SLUG;
if (!workspaceId) {
logger_1.logger.error(`Failed to update Firebase Project for Studio Workspace because WORKSPACE_SLUG environment variable is empty`);
return;
}
try {
await studioClient.request({
method: "PATCH",
path: `/workspaces/${workspaceId}`,
responseType: "json",
body: {
firebaseProjectId: projectId,
},
queryParams: {
updateMask: "workspace.firebaseProjectId",
},
timeout: TIMEOUT_MILLIS,
});
}
catch (err) {
let message = err.message;
if (err.original) {
message += ` (original: ${err.original.message})`;
}
logger_1.logger.debug(`Failed to update active Firebase Project for current Studio Workspace: ${message}`);
}
recordStudioProjectSyncTime();
}
exports.updateStudioFirebaseProject = updateStudioFirebaseProject;
function recordStudioProjectSyncTime() {
configstore_1.configstore.set("firebaseStudioProjectLastSynced", Date.now());
}