Skip to content

Commit 88a72bf

Browse files
committed
Consolidate rc logic
1 parent fee3197 commit 88a72bf

File tree

7 files changed

+91
-70
lines changed

7 files changed

+91
-70
lines changed

firebase-vscode/package.json

+2-17
Original file line numberDiff line numberDiff line change
@@ -114,28 +114,13 @@
114114
},
115115
"views": {
116116
"firebase-data-connect": [
117-
{
118-
"type": "webview",
119-
"id": "fdc_sidebar",
120-
"name": "Studio",
121-
"initialSize": 2
122-
},
123-
{
124-
"id": "firebase.dataConnect.explorerView",
125-
"name": "Schema explorer",
126-
"when": "firebase-vscode.fdc.enabled",
127-
"visibility": "collapsed",
128-
"initialSize": 1
129-
},
130117
{
131118
"id": "firebase.session",
132-
"name": "Account and Project",
133-
"initialSize": 1
119+
"name": "Account and Project"
134120
},
135121
{
136122
"id": "firebase.emulators",
137-
"name": "Emulator Suite",
138-
"initialSize": 1
123+
"name": "Emulator Suite"
139124
}
140125
],
141126
"firebase-data-connect-execution-view": [

firebase-vscode/src/core/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { registerWebhooks } from "./webhook";
1515
import { createE2eMockable } from "../utils/test_hooks";
1616
import { runTerminalTask } from "../data-connect/terminal";
1717
import { AnalyticsLogger } from "../analytics";
18-
import { EmulatorsProvider } from "./emulators-provider";
18+
import { EmulatorsProvider } from "../emulators/emulators-provider";
1919

2020
export async function registerCore(
2121
broker: ExtensionBrokerImpl,

firebase-vscode/src/core/emulators-provider.ts firebase-vscode/src/emulators/emulators-provider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class EmulatorsProvider
1414
): Promise<EmulatorItem[]> | EmulatorItem[] {
1515
return [
1616
new EmulatorItem("Emulator 1", vscode.TreeItemCollapsibleState.None),
17-
new EmulatorItem("Emulator 2", vscode.TreeItemCollapsibleState.None),
17+
new EmulatorItem("Emulator 123", vscode.TreeItemCollapsibleState.None),
1818
];
1919
}
2020

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import * as vscode from "vscode";
2+
import { EmulatorsStatus, RunningEmulatorInfo } from "../messaging/types";
3+
import { Signal, ReadonlySignal } from "@preact/signals-core";
4+
import { RC } from "../rc";
5+
import { Result } from "../result";
6+
import { EmulatorsProvider } from "./emulators-provider";
7+
8+
export type Emulators = {
9+
status: EmulatorsStatus;
10+
infos?: RunningEmulatorInfo;
11+
};
12+
13+
export function registerEmulators(
14+
emulators: Signal<Emulators>,
15+
rc: ReadonlySignal<Result<RC | undefined>>,
16+
): vscode.Disposable {
17+
const tree = new EmulatorsProvider();
18+
19+
return vscode.Disposable.from(
20+
vscode.window.createStatusBarItem("emulators"),
21+
vscode.window.createTreeView("firebase.emulators", {
22+
treeDataProvider: tree,
23+
}),
24+
);
25+
}

firebase-vscode/src/extension.ts

+51-44
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as vscode from "vscode";
22
import { spawnSync } from "child_process";
33
import * as semver from "semver";
4+
import * as path from "path";
45

56
import { ExtensionBroker } from "./extension-broker";
67
import { createBroker } from "../common/messaging/broker";
@@ -23,62 +24,68 @@ import { env } from "./core/env";
2324

2425
import { suggestGraphqlSyntaxExtension } from "./data-connect/graphql-syntax-highlighter";
2526
import { registerSession } from "./session";
27+
import { computed, ReadonlySignal, Signal, signal } from "@preact/signals-core";
28+
import { checkLogin, User } from "./core/user";
29+
import { requireAuthWrapper } from "./cli";
30+
import { _readRC, getConfigPath } from "./core/config";
31+
import { RC } from "../src/rc";
32+
import { Result, ResultValue } from "./result";
33+
import { Emulators, registerEmulators } from "./emulators";
2634

2735
// This method is called when your extension is activated
28-
export async function activate(context: vscode.ExtensionContext) {
29-
const analyticsLogger = new AnalyticsLogger(context);
30-
31-
// Suggest installing the GraphQL syntax highlighter extension
32-
await suggestGraphqlSyntaxExtension();
33-
34-
await setupFirebasePath(analyticsLogger);
36+
export async function activate(ctx: vscode.ExtensionContext) {
37+
await setupFirebasePath();
3538
const settings = getSettings();
39+
3640
logSetup();
3741
pluginLogger.debug("Activating Firebase extension.");
3842

39-
const broker = createBroker<
40-
ExtensionToWebviewParamsMap,
41-
WebviewToExtensionParamsMap,
42-
vscode.Webview
43-
>(new ExtensionBroker());
43+
await checkCLIInstallation();
4444

45-
const authService = new AuthService(broker);
45+
const user = await createUser();
46+
const rc = await createRC(ctx);
47+
const project = await createProject(rc);
48+
const emulators = signal<Emulators>({ status: "stopped" });
4649

47-
// show IDX data collection notice
48-
if (settings.shouldShowIdxMetricNotice && env.value.isMonospace) {
49-
// don't await/block on this
50-
vscode.window.showInformationMessage(IDX_METRIC_NOTICE, "Ok").then(() => {
51-
updateIdxSetting(false); // don't show message again
52-
});
53-
}
50+
ctx.subscriptions.push(
51+
registerEmulators(emulators, rc),
52+
registerSession(user, project),
53+
);
54+
}
5455

55-
await checkCLIInstallation();
56+
async function createUser(): Promise<Signal<User | undefined>> {
57+
const user = await requireAuthWrapper();
58+
return signal(user ?? undefined);
59+
}
5660

57-
const [emulatorsController, coreDisposable] = await registerCore(
58-
broker,
59-
context,
60-
analyticsLogger,
61+
async function createRC(
62+
ctx: vscode.ExtensionContext,
63+
): Promise<Signal<Result<RC | undefined>>> {
64+
// const folderPath = path.dirname(getConfigPath() ?? "");
65+
const rcUri = vscode.Uri.file(
66+
path.join(getConfigPath() ?? "", ".firebaserc"),
6167
);
68+
console.log("WOWOWOWOWOW");
69+
console.log(rcUri.fsPath);
70+
const watcher = vscode.workspace.createFileSystemWatcher(rcUri.fsPath);
71+
ctx.subscriptions.push(watcher);
6272

63-
context.subscriptions.push(
64-
{ dispose: analyticsLogger.endSession },
65-
{ dispose: analyticsLogger.onDispose },
66-
coreDisposable,
67-
registerWebview({
68-
name: "fdc_sidebar",
69-
broker,
70-
context,
71-
}),
72-
authService,
73-
registerSession(),
74-
registerFdc(
75-
context,
76-
broker,
77-
authService,
78-
emulatorsController,
79-
analyticsLogger,
80-
),
81-
);
73+
const rc = signal<Result<RC | undefined>>(_readRC(rcUri));
74+
watcher.onDidChange(() => (rc.value = _readRC(rcUri)));
75+
watcher.onDidCreate(() => (rc.value = _readRC(rcUri)));
76+
watcher.onDidDelete(() => (rc.value = new ResultValue(undefined)));
77+
78+
return rc;
79+
}
80+
81+
async function createProject(
82+
rc: Signal<Result<RC | undefined>>,
83+
): Promise<ReadonlySignal<string | undefined>> {
84+
return computed(() => {
85+
if (rc.value.tryReadValue) {
86+
return rc.value.tryReadValue.projects.default;
87+
}
88+
});
8289
}
8390

8491
async function checkCLIInstallation(): Promise<void> {

firebase-vscode/src/session/index.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
1-
import { effect } from "@preact/signals-core";
1+
import { effect, ReadonlySignal } from "@preact/signals-core";
22
import * as vscode from "vscode";
33
import { SessionProvider } from "./session-provider";
4-
import { currentUser } from "../core/user";
4+
import { checkLogin, User } from "../core/user";
55
import { currentProjectId } from "../core/project";
66

7-
export function registerSession(): vscode.Disposable {
7+
export function registerSession(
8+
user: ReadonlySignal<User | undefined>,
9+
project: ReadonlySignal<string | undefined>,
10+
): vscode.Disposable {
811
const sessionProvider = new SessionProvider();
912

1013
return vscode.Disposable.from(
1114
{
1215
dispose: effect(() => {
13-
sessionProvider.updateEmail(currentUser.value?.email);
16+
sessionProvider.updateEmail(user.value?.email);
1417
}),
1518
},
1619
{
1720
dispose: effect(() => {
18-
sessionProvider.updateProjectId(currentProjectId.value);
21+
sessionProvider.updateProjectId(project.value);
22+
console.log("project.value", project.value);
1923
}),
2024
},
2125
vscode.window.createTreeView("firebase.session", {

firebase-vscode/src/utils/settings.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export function updateIdxSetting(shouldShow: boolean) {
4646
}
4747

4848
// Persist env var as path setting when path setting doesn't exist
49-
export function setupFirebasePath(analyticsLogger: AnalyticsLogger) {
49+
export function setupFirebasePath() {
5050
const config = workspace.getConfiguration("firebase");
5151
if (process.env.FIREBASE_BINARY && !config.get<string>("firebasePath")) {
5252
config.update(
@@ -55,5 +55,5 @@ export function setupFirebasePath(analyticsLogger: AnalyticsLogger) {
5555
ConfigurationTarget.Global,
5656
);
5757
}
58-
analyticsLogger.logger.logUsage(DATA_CONNECT_EVENT_NAME.SETUP_FIREBASE_BINARY);
58+
// analyticsLogger.logger.logUsage(DATA_CONNECT_EVENT_NAME.SETUP_FIREBASE_BINARY);
5959
}

0 commit comments

Comments
 (0)