You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
4.8 KiB
178 lines
4.8 KiB
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);
|
|
};
|
|
}
|