UNPKG

firebase-tools

Version:
112 lines (111 loc) 4.67 kB
"use strict"; 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;