firebase-tools
Version:
Command-Line Interface for Firebase
112 lines (111 loc) • 4.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.addSchemaToDataConnectYaml = exports.actuate = exports.askQuestions = void 0;
const clc = require("colorette");
const fs = require("fs-extra");
const path_1 = require("path");
const yaml = require("yaml");
const prompt_1 = require("../../../prompt");
const utils_1 = require("../../../utils");
const load_1 = require("../../../dataconnect/load");
const names_1 = require("../../../dataconnect/names");
const experiments = require("../../../experiments");
const cloudbilling_1 = require("../../../gcp/cloudbilling");
const track_1 = require("../../../track");
async function askQuestions(setup, config) {
var _a;
const resolverInfo = {
id: "",
uri: "",
serviceInfo: {},
};
const serviceInfos = await (0, load_1.loadAll)(setup.projectId || "", config);
if (!serviceInfos.length) {
throw new Error(`No Firebase Data Connect workspace found. Run ${clc.bold("firebase init dataconnect")} to set up a service and main schema.`);
}
else if (serviceInfos.length === 1) {
resolverInfo.serviceInfo = serviceInfos[0];
}
else {
const choices = serviceInfos.map((si) => {
const serviceName = (0, names_1.parseServiceName)(si.serviceName);
return {
name: `${serviceName.location}/${serviceName.serviceId}`,
value: si,
};
});
resolverInfo.serviceInfo = await (0, prompt_1.select)({
message: "Which service would you like to set up a custom resolver for?",
choices,
});
}
resolverInfo.id = await (0, prompt_1.input)({
message: `What ID would you like to use for your custom resolver?`,
default: (0, utils_1.newUniqueId)(`resolver`, ((_a = resolverInfo.serviceInfo.dataConnectYaml.schemas) === null || _a === void 0 ? void 0 : _a.map((sch) => sch.id || "")) || []),
});
resolverInfo.uri = `https://${resolverInfo.id}-${setup.projectNumber || "PROJECT_NUMBER"}.${resolverInfo.serviceInfo.dataConnectYaml.location}.run.app/graphql`;
(0, utils_1.logBullet)("Setting " +
clc.bold(resolverInfo.uri) +
" as the custom resolver URL. To change this, update your " +
clc.bold(`dataconnect.yaml`) +
" later.");
setup.featureInfo = setup.featureInfo || {};
setup.featureInfo.dataconnectResolver = resolverInfo;
}
exports.askQuestions = askQuestions;
async function actuate(setup, config) {
var _a;
if (!experiments.isEnabled("fdcwebhooks")) {
return;
}
const resolverInfo = (_a = setup.featureInfo) === null || _a === void 0 ? void 0 : _a.dataconnectResolver;
if (!resolverInfo) {
throw new Error("Data Connect resolver feature ResolverRequiredInfo not provided");
}
const startTime = Date.now();
try {
actuateWithInfo(config, resolverInfo);
}
finally {
const source = "init_resolver";
void (0, track_1.trackGA4)("dataconnect_init", {
source,
project_status: setup.projectId
? (await (0, cloudbilling_1.isBillingEnabled)(setup))
? "blaze"
: "spark"
: "missing",
}, Date.now() - startTime);
}
}
exports.actuate = actuate;
function actuateWithInfo(config, info) {
var _a;
const dataConnectYaml = JSON.parse(JSON.stringify((_a = info.serviceInfo) === null || _a === void 0 ? void 0 : _a.dataConnectYaml));
addSchemaToDataConnectYaml(dataConnectYaml, info);
info.serviceInfo.dataConnectYaml = dataConnectYaml;
const dataConnectYamlContents = yaml.stringify(dataConnectYaml);
const dataConnectYamlPath = (0, path_1.join)(info.serviceInfo.sourceDirectory, "dataconnect.yaml");
config.writeProjectFile((0, path_1.relative)(config.projectDir, dataConnectYamlPath), dataConnectYamlContents);
fs.ensureFileSync((0, path_1.join)(info.serviceInfo.sourceDirectory, `schema_${info.id}`, "schema.gql"));
}
function addSchemaToDataConnectYaml(dataConnectYaml, info) {
const secondarySchema = {
source: `./schema_${info.id}`,
id: info.id,
datasource: {
httpGraphql: {
uri: info.uri,
},
},
};
if (!dataConnectYaml.schemas) {
dataConnectYaml.schemas = [];
if (dataConnectYaml.schema) {
dataConnectYaml.schemas.push(dataConnectYaml.schema);
dataConnectYaml.schema = undefined;
}
}
dataConnectYaml.schemas.push(secondarySchema);
}
exports.addSchemaToDataConnectYaml = addSchemaToDataConnectYaml;