firebase-tools
Version:
Command-Line Interface for Firebase
88 lines (87 loc) • 3.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.deploy = void 0;
const zod_1 = require("zod");
const tool_1 = require("../../tool");
const deploy_1 = require("../../../deploy");
const util_1 = require("../../util");
const jobs_1 = require("../../util/jobs");
const TARGETS = {
hosting: null,
database: null,
firestore: null,
functions: null,
storage: null,
remoteconfig: null,
extensions: null,
dataconnect: null,
apphosting: null,
auth: null,
};
exports.deploy = (0, tool_1.tool)("core", {
name: "deploy",
description: "Deploy resources to your Firebase project, based on the contents of firebase.json.",
inputSchema: zod_1.z.object({
only: zod_1.z
.string()
.optional()
.describe("Comma-separated list of services to deploy. Valid targets are: database, storage, firestore, functions, hosting, remoteconfig, extensions, dataconnect, apphosting, auth."),
}),
annotations: {
title: "Deploy Firebase Services",
readOnlyHint: false,
},
_meta: {
requiresAuth: true,
requiresProject: true,
ui: {
resourceUri: "ui://core/deploy/mcp-app.html",
},
},
}, async ({ only }, ctx) => {
const validTargets = Object.keys(TARGETS);
let targets = validTargets;
if (only) {
const parts = only.split(",").map((p) => p.trim());
targets = parts.filter((p) => validTargets.includes(p));
}
const jobId = Date.now().toString();
jobs_1.jobTracker.createJob(jobId);
const options = {
only: only || "",
except: "",
filteredTargets: targets,
project: ctx.projectId,
projectId: ctx.projectId,
rc: ctx.rc,
config: ctx.config,
nonInteractive: true,
onProgress: (progress) => {
const phaseNumbers = {
predeploy: 10,
prepare: 30,
deploy: 60,
release: 80,
postdeploy: 100,
};
const percentage = phaseNumbers[progress.phase] || 0;
jobs_1.jobTracker.updateJob(jobId, { progress: percentage });
jobs_1.jobTracker.addLog(jobId, `Deploy [${progress.phase}]: Complete for targets ${(progress.targets || []).join(",")}`);
},
};
void (async () => {
try {
const res = await (0, deploy_1.deploy)(targets, options);
jobs_1.jobTracker.updateJob(jobId, { status: "success", progress: 100, result: res });
}
catch (err) {
const message = err instanceof Error ? err.message : String(err);
jobs_1.jobTracker.updateJob(jobId, { status: "failed", error: message });
}
})();
const contentRes = (0, util_1.toContent)(`Deployment started with Job ID: ${jobId}. Use deploy_status tool to track.`);
return {
...contentRes,
structuredContent: { jobId, message: "Deployment started" },
};
});