UNPKG

firebase-tools

Version:
121 lines (120 loc) 4.79 kB
"use strict"; 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()); }