firebase-tools
Version:
Command-Line Interface for Firebase
95 lines (94 loc) • 4.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const client = require("../../dataconnect/client");
const utils = require("../../utils");
const types_1 = require("../../dataconnect/types");
const projectUtils_1 = require("../../projectUtils");
const provisionCloudSql_1 = require("../../dataconnect/provisionCloudSql");
const names_1 = require("../../dataconnect/names");
const api_1 = require("../../api");
const ensureApiEnabled = require("../../ensureApiEnabled");
const prompt_1 = require("../../prompt");
async function default_1(context, options) {
const dataconnect = context.dataconnect;
if (!dataconnect) {
throw new Error("dataconnect.prepare must be run before dataconnect.deploy");
}
const projectId = (0, projectUtils_1.needProjectId)(options);
const serviceInfos = dataconnect.serviceInfos;
const services = await client.listAllServices(projectId);
const filters = dataconnect.filters;
if (serviceInfos.some((si) => {
return (0, types_1.requiresVector)(si.deploymentMetadata);
})) {
await ensureApiEnabled.ensure(projectId, (0, api_1.vertexAIOrigin)(), "dataconnect");
}
const servicesToCreate = serviceInfos
.filter((si) => !services.some((s) => matches(si, s)))
.filter((si) => {
return (!filters ||
(filters === null || filters === void 0 ? void 0 : filters.some((f) => si.dataConnectYaml.serviceId === f.serviceId)));
});
dataconnect.deployStats.numServiceCreated = servicesToCreate.length;
const servicesToDelete = filters
? []
: services.filter((s) => !serviceInfos.some((si) => matches(si, s)));
dataconnect.deployStats.numServiceDeleted = servicesToDelete.length;
await Promise.all(servicesToCreate.map(async (s) => {
const { projectId, locationId, serviceId } = splitName(s.serviceName);
await client.createService(projectId, locationId, serviceId);
utils.logLabeledSuccess("dataconnect", `Created service ${s.serviceName}`);
}));
if (servicesToDelete.length) {
const serviceToDeleteList = servicesToDelete.map((s) => " - " + s.name).join("\n");
if (await (0, prompt_1.confirm)({
force: false,
nonInteractive: options.nonInteractive,
message: `The following services exist on ${projectId} but are not listed in your 'firebase.json'\n${serviceToDeleteList}\nWould you like to delete these services?`,
default: false,
})) {
await Promise.all(servicesToDelete.map(async (s) => {
await client.deleteService(s.name);
utils.logLabeledSuccess("dataconnect", `Deleted service ${s.name}`);
}));
}
}
utils.logLabeledBullet("dataconnect", "Checking for CloudSQL resources...");
await Promise.all(serviceInfos
.filter((si) => {
return (!filters ||
(filters === null || filters === void 0 ? void 0 : filters.some((f) => si.dataConnectYaml.serviceId === f.serviceId)));
})
.map(async (s) => {
var _a, _b, _c;
const postgresDatasource = (0, types_1.mainSchema)(s.schemas).datasources.find((d) => d.postgresql);
if (postgresDatasource) {
const instanceId = (_b = (_a = postgresDatasource.postgresql) === null || _a === void 0 ? void 0 : _a.cloudSql) === null || _b === void 0 ? void 0 : _b.instance.split("/").pop();
const databaseId = (_c = postgresDatasource.postgresql) === null || _c === void 0 ? void 0 : _c.database;
if (!instanceId || !databaseId) {
return Promise.resolve();
}
return (0, provisionCloudSql_1.setupCloudSql)({
projectId,
location: (0, names_1.parseServiceName)(s.serviceName).location,
instanceId,
databaseId,
requireGoogleMlIntegration: (0, types_1.requiresVector)(s.deploymentMetadata),
source: "deploy",
});
}
}));
return;
}
exports.default = default_1;
function matches(si, s) {
return si.serviceName === s.name;
}
function splitName(serviceName) {
const parts = serviceName.split("/");
return {
projectId: parts[1],
locationId: parts[3],
serviceId: parts[5],
};
}