123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- const spawn = require("child_process").spawn;
- const fork = require("child_process").fork;
- const readline = require("readline");
-
- const chalk = require("chalk");
- const banner = ` ######## #### ######## ######## ######## ### ###### ######## ##
- ## ## ## ## ## ## ## ## ## ## ## ##
- ###### ## ######## ###### ######## ######### ###### ###### ##
- ## ## ## ## ## ## ## ## ## ## ##
- ## #### ## ## ######## ######## ## ## ###### ######## ##
- `;
- const firebase_exe = process.argv[2];
- let firebase_bin;
-
- (async () => {
- const line = new Array(process.stdout.columns)
- .fill(undefined)
- .map(() => "#")
- .join("");
- const thin_line = new Array(process.stdout.columns)
- .fill(undefined)
- .map(() => "-")
- .join("");
- console.log(line);
- console.log("");
- console.log(" Welcome to...");
- console.log(chalk.yellow(banner));
- console.log("");
- console.log(line);
- console.log("");
- await CheckFirebaseTools();
- console.log("");
- await CheckIsLoggedIn();
- console.log("");
- console.log(
- `${chalk.green("+")} You can now use the 'firebase' or 'npm' commands!`
- );
- console.log(
- `${chalk.blue("~")} For more help see https://firebase.google.com/docs/cli/`
- );
- console.log("");
- console.log(thin_line);
- process.exit();
- })();
-
- async function CheckFirebaseTools() {
- console.log(
- `${chalk.cyan("~")} Let's make sure your Firebase CLI is ready...`
- );
- firebase_bin = await GetFirebaseToolsBins();
- const isSetup = !!firebase_bin;
-
- if (isSetup) {
- console.log(
- `${chalk.green("+")} Looks like ${chalk.green("your CLI is set up")}!`
- );
- } else {
- console.log(
- `${chalk.cyan("~")} Looks like ${chalk.yellow(
- "your CLI needs to be set up"
- )}.\n`
- );
- console.log(`${chalk.cyan("~")} This may take a moment`);
- process.stdout.write(`${chalk.green("+")} Setting up environment...`);
-
- return new Promise(resolve => {
- const exe_split = firebase_exe.split(" ");
- const install = spawn(
- exe_split[0],
- [...exe_split.slice(1), "--tool:force-setup"],
- {}
- );
-
- install.stderr.on("data", buf => {
- readline.clearLine(process.stdout, 2);
- readline.cursorTo(process.stdout, 2, null);
- const line = (
- buf
- .toString()
- .split("\n")
- .filter(l => l)
- .slice(-1)[0] || ""
- )
- .trim()
- .slice(0, process.stdout.columns - 5);
- process.stdout.write(line);
- });
-
- install.on("exit", () => {
- readline.clearLine(process.stdout, 0);
- readline.cursorTo(process.stdout, 0, null);
- process.stdout.write(
- `${chalk.green("+")} Alright, ${chalk.green("your CLI is set up")}!\n`
- );
- resolve();
- });
- });
- }
- }
-
- async function GetFirebaseToolsBins() {
- return new Promise(resolve => {
- const exe_split = firebase_exe.split(" ");
- const checkSpawn = spawn(exe_split[0], [
- ...exe_split.slice(1),
- "--tool:setup-check"
- ]);
- let checkSpawnData = "";
-
- checkSpawn.stdout.on("data", buf => {
- checkSpawnData += buf;
- });
-
- checkSpawn.on("close", () => {
- firebase_bin = JSON.parse(checkSpawnData).bins[0];
- resolve(firebase_bin);
- });
- });
- }
-
- async function CheckIsLoggedIn() {
- firebase_bin = firebase_bin || (await GetFirebaseToolsBins());
- return new Promise(resolve => {
- const finish = SimpleSpinner(
- `${chalk.cyan("~")} Checking your Firebase credentials`
- );
- const listSpawn = fork(firebase_bin, ["projects:list", "--json"], { silent: true });
- let listSpawnData = "";
-
- listSpawn.stdout.on("data", buf => {
- listSpawnData += buf;
- });
-
- listSpawn.on("close", () => {
- const isLoggedIn =
- JSON.parse(listSpawnData.toString()).status === "success";
-
- if (!isLoggedIn) {
- finish(
- "🚫",
- `${chalk.cyan(
- "~"
- )} Looks like you're not authenticated. ${chalk.yellow(
- "Let's log in"
- )}!\n`
- );
- } else {
- finish("", "");
- }
-
- const login = fork(firebase_bin, ["login"], { stdio: "inherit" });
- login.on("exit", () => {
- resolve(isLoggedIn);
- });
- });
- });
- }
-
- function SimpleSpinner(message) {
- const icons = ["[/]", "[-]", "[\\]", "[-]", "[|]"];
- let index = 0;
-
- const cancel = setInterval(() => {
- readline.clearLine(process.stdout, 0);
- readline.cursorTo(process.stdout, 0, null);
- process.stdout.write(message + chalk.white(icons[index]));
-
- index++;
- index %= icons.length;
- }, 300);
-
- return (_, final_message) => {
- clearInterval(cancel);
- readline.clearLine(process.stdout, 0);
- readline.cursorTo(process.stdout, 0, null);
- process.stdout.write(final_message);
- };
- }
|