-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
Copy pathutils.ts
70 lines (65 loc) · 2 KB
/
utils.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { readFileSync } from "fs";
import { FirebaseRc, Project } from "./interfaces";
import { join } from "path";
export function listProjects() {
const firebase = require('firebase-tools');
return firebase.list().catch(
/* If list failed, then login and try again. */
() => firebase.login().then(() => firebase.list())
);
}
// `fuzzy` passes either the original list of projects or an internal object
// which contains the project as a property.
const isProject = (elem: Project | { original: Project }): elem is Project => {
return (<{ original: Project }>elem).original === undefined;
};
const searchProjects = (projects: Project[]) => {
return (_: any, input: string) => {
return Promise.resolve(
require('fuzzy')
.filter(input, projects, {
extract(el: Project) {
return `${el.id} ${el.name} ${el.permission}`;
}
})
.map((result: Project | { original: Project }) => {
let original: Project;
if (isProject(result)) {
original = result;
} else {
original = result.original;
}
return {
name: `${original.id} (${original.name})`,
title: original.name,
value: original.id
};
})
);
};
};
export const projectPrompt = (projects: Project[]) => {
const inquirer = require('inquirer');
inquirer.registerPrompt(
"autocomplete",
require("inquirer-autocomplete-prompt")
);
return inquirer.prompt({
type: "autocomplete",
name: "firebaseProject",
source: searchProjects(projects),
message: "Please select a project:"
});
};
export function getFirebaseProjectName(
workspaceRoot: string,
target: string
): string | undefined {
const { targets }: FirebaseRc = JSON.parse(
readFileSync(join(workspaceRoot, ".firebaserc"), "UTF-8")
);
const projects = Object.keys(targets!);
return projects.find(
project => !!Object.keys(targets![project].hosting).find(t => t === target)
);
}