UNPKG

firebase-tools

Version:
93 lines (92 loc) 4.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.actuate = exports.askQuestions = void 0; const rules = require("./rules"); const indexes = require("./indexes"); const error_1 = require("../../../error"); const api_1 = require("../../../firestore/api"); const prompt_1 = require("../../../prompt"); const ensureApiEnabled_1 = require("../../../ensureApiEnabled"); const api_2 = require("../../../api"); async function askQuestions(setup, config) { const firestore = !Array.isArray(setup.config.firestore) ? setup.config.firestore : undefined; const info = { databaseId: (firestore === null || firestore === void 0 ? void 0 : firestore.database) || "", locationId: (firestore === null || firestore === void 0 ? void 0 : firestore.location) || "", rulesFilename: (firestore === null || firestore === void 0 ? void 0 : firestore.rules) || "", rules: "", writeRules: true, indexesFilename: (firestore === null || firestore === void 0 ? void 0 : firestore.indexes) || "", indexes: "", writeIndexes: true, }; if (setup.projectId) { await (0, ensureApiEnabled_1.ensure)(setup.projectId, (0, api_2.firestoreOrigin)(), "firestore"); info.databaseId = info.databaseId || "(default)"; const api = new api_1.FirestoreApi(); const databases = await api.listDatabases(setup.projectId); const nativeDatabaseNames = databases .filter((db) => db.type === "FIRESTORE_NATIVE") .map((db) => db.name.split("/")[3]); if (nativeDatabaseNames.length === 0) { if (databases.length > 0) { throw new error_1.FirebaseError(`It looks like this project is using Cloud Firestore in ${databases[0].type}. The Firebase CLI can only manage projects using Cloud Firestore in Native mode. For more information, visit https://cloud.google.com/datastore/docs/firestore-or-datastore`, { exit: 1 }); } info.databaseId = "(default)"; const locations = await api.locations(setup.projectId); const choice = await (0, prompt_1.select)({ message: "Please select the location of your Firestore database:", choices: locations.map((location) => location.name.split("/")[3]), default: "nam5", }); info.locationId = choice; } else if (nativeDatabaseNames.length === 1) { info.databaseId = nativeDatabaseNames[0]; info.locationId = databases .filter((db) => db.name.endsWith(`databases/${info.databaseId}`)) .map((db) => db.locationId)[0]; } else if (nativeDatabaseNames.length > 1) { const choice = await (0, prompt_1.select)({ message: "Please select the name of the Native Firestore database you would like to use:", choices: nativeDatabaseNames, }); info.databaseId = choice; info.locationId = databases .filter((db) => db.name.endsWith(`databases/${info.databaseId}`)) .map((db) => db.locationId)[0]; } } await rules.initRules(setup, config, info); await indexes.initIndexes(setup, config, info); setup.featureInfo = setup.featureInfo || {}; setup.featureInfo.firestore = info; } exports.askQuestions = askQuestions; async function actuate(setup, config) { var _a; const info = (_a = setup.featureInfo) === null || _a === void 0 ? void 0 : _a.firestore; if (!info) { throw new error_1.FirebaseError("Firestore featureInfo is not found"); } info.databaseId = info.databaseId || "(default)"; info.locationId = info.locationId || "nam5"; info.rules = info.rules || rules.getDefaultRules(); info.rulesFilename = info.rulesFilename || rules.DEFAULT_RULES_FILE; info.indexes = info.indexes || indexes.INDEXES_TEMPLATE; info.indexesFilename = info.indexesFilename || indexes.DEFAULT_INDEXES_FILE; setup.config.firestore = { database: info.databaseId, location: info.locationId, rules: info.rulesFilename, indexes: info.indexesFilename, }; if (info.writeRules) { config.writeProjectFile(info.rulesFilename, info.rules); } if (info.writeIndexes) { config.writeProjectFile(info.indexesFilename, info.indexes); } } exports.actuate = actuate;