firebase-tools
Version:
Command-Line Interface for Firebase
154 lines (153 loc) • 6.89 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.init = void 0;
const zod_1 = require("zod");
const tool_js_1 = require("../../tool.js");
const util_js_1 = require("../../util.js");
const database_js_1 = require("../../../init/features/database.js");
const index_js_1 = require("../../../init/index.js");
exports.init = (0, tool_js_1.tool)({
name: "init",
description: "Initializes selected Firebase features in the workspace (Firestore, Data Connect, Realtime Database). All features are optional; provide only the products you wish to set up. " +
"You can initialize new features into an existing project directory, but re-initializing an existing feature may overwrite configuration. " +
"To deploy the initialized features, run the `firebase deploy` command after `firebase_init` tool.",
inputSchema: zod_1.z.object({
features: zod_1.z.object({
database: zod_1.z
.object({
rules_filename: zod_1.z
.string()
.optional()
.default("database.rules.json")
.describe("The file to use for Realtime Database Security Rules."),
rules: zod_1.z
.string()
.optional()
.default(database_js_1.DEFAULT_RULES)
.describe("The security rules to use for Realtime Database Security Rules."),
})
.optional()
.describe("Provide this object to initialize Firebase Realtime Database in this project directory."),
firestore: zod_1.z
.object({
database_id: zod_1.z
.string()
.optional()
.default("(default)")
.describe("The database ID to use for Firestore."),
location_id: zod_1.z
.string()
.optional()
.default("nam5")
.describe("The GCP region ID to set up the Firestore database."),
rules_filename: zod_1.z
.string()
.optional()
.default("firestore.rules")
.describe("The file to use for Firestore Security Rules."),
rules: zod_1.z
.string()
.optional()
.describe("The security rules to use for Firestore Security Rules. Default to open rules that expire in 30 days."),
})
.optional()
.describe("Provide this object to initialize Cloud Firestore in this project directory."),
dataconnect: zod_1.z
.object({
service_id: zod_1.z
.string()
.optional()
.describe("The Firebase Data Connect service ID to initialize. Default to match the current folder name."),
location_id: zod_1.z
.string()
.optional()
.default("us-central1")
.describe("The GCP region ID to set up the Firebase Data Connect service."),
cloudsql_instance_id: zod_1.z
.string()
.optional()
.describe("The GCP Cloud SQL instance ID to use in the Firebase Data Connect service. By default, use <serviceId>-fdc."),
cloudsql_database: zod_1.z
.string()
.optional()
.default("fdcdb")
.describe("The Postgres database ID to use in the Firebase Data Connect service."),
})
.optional()
.describe("Provide this object to initialize Firebase Data Connect in this project directory."),
storage: zod_1.z
.object({
rules_filename: zod_1.z
.string()
.optional()
.default("storage.rules")
.describe("The file to use for Firebase Storage Security Rules."),
rules: zod_1.z
.string()
.optional()
.describe("The security rules to use for Firebase Storage Security Rules. Default to closed rules that deny all access."),
})
.optional()
.describe("Provide this object to initialize Firebase Storage in this project directory."),
}),
}),
annotations: {
title: "Initialize Firebase Products",
readOnlyHint: false,
idempotentHint: true,
},
_meta: {
requiresProject: false,
requiresAuth: false,
},
}, async ({ features }, { projectId, config, rc }) => {
const featuresList = [];
const featureInfo = {};
if (features.database) {
featuresList.push("database");
featureInfo.database = {
rulesFilename: features.database.rules_filename,
rules: features.database.rules,
writeRules: true,
};
}
if (features.firestore) {
featuresList.push("firestore");
featureInfo.firestore = {
databaseId: features.firestore.database_id,
locationId: features.firestore.location_id,
rulesFilename: features.firestore.rules_filename,
rules: features.firestore.rules || "",
writeRules: true,
indexesFilename: "",
indexes: "",
writeIndexes: true,
};
}
if (features.dataconnect) {
featuresList.push("dataconnect");
featureInfo.dataconnect = {
serviceId: features.dataconnect.service_id || "",
locationId: features.dataconnect.location_id || "",
cloudSqlInstanceId: features.dataconnect.cloudsql_instance_id || "",
cloudSqlDatabase: features.dataconnect.cloudsql_database || "",
connectors: [],
isNewInstance: false,
isNewDatabase: false,
schemaGql: [],
shouldProvisionCSQL: false,
};
}
const setup = {
config: config === null || config === void 0 ? void 0 : config.src,
rcfile: rc === null || rc === void 0 ? void 0 : rc.data,
projectId: projectId,
features: [...featuresList],
featureInfo: featureInfo,
};
await (0, index_js_1.actuate)(setup, config, { force: true });
config.writeProjectFile("firebase.json", setup.config);
config.writeProjectFile(".firebaserc", setup.rcfile);
return (0, util_js_1.toContent)(`Successfully setup the project ${projectId} with those features: ${featuresList.join(", ")}` +
" To deploy them, you can run `firebase deploy` in command line.");
});