Skip to content

Commit 7cb791f

Browse files
committed
enhance structure
1 parent a50027d commit 7cb791f

File tree

10 files changed

+104
-77
lines changed

10 files changed

+104
-77
lines changed

vscode-extension/.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
visualizer
1+
apps/visualizer

vscode-extension/build.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,17 @@ async function main() {
2929
console.log("Building drizzle-lab...");
3030
execSync("npm run -w drizzle-lab build-all", { cwd: "..", stdio: "inherit" });
3131

32+
const visualizerDir = "apps/visualizer";
3233
// copy bundled drizzle-lab visualizer to dist
33-
if (fs.existsSync("visualizer")) {
34-
fs.rmSync("visualizer", { recursive: true, force: true });
34+
if (fs.existsSync(visualizerDir)) {
35+
fs.rmSync(visualizerDir, { recursive: true, force: true });
3536
}
36-
fs.mkdirSync("visualizer");
37-
fs.cpSync("../apps/cli/dist/visualizer", "visualizer", { recursive: true });
38-
fs.copyFileSync("../apps/cli/dist/package.json", "visualizer/package.json");
37+
fs.mkdirSync(visualizerDir, { recursive: true });
38+
fs.cpSync("../apps/cli/dist/visualizer", visualizerDir, { recursive: true });
39+
fs.copyFileSync(
40+
"../apps/cli/dist/package.json",
41+
`${visualizerDir}/package.json`,
42+
);
3943

4044
const ctx = await esbuild.context({
4145
entryPoints: ["src/extension.ts"],

vscode-extension/src/extension.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as vscode from "vscode";
22

3-
import visualizerPkg from "../visualizer/package.json";
3+
import visualizerPkg from "../apps/visualizer/package.json";
44
import { setExtensionContext } from "./context";
5-
import { OpenVisualizerCodeLens } from "./modules/open-visualizer/codelens";
6-
import { OpenVisualizerCommand } from "./modules/open-visualizer/command";
7-
import { StopVisualizerCommand } from "./modules/stop-visualizer/command";
8-
import { stop } from "./server";
5+
import { OpenVisualizerCodeLens } from "./modules/visualizer/open-visualizer/codelens";
6+
import { OpenVisualizerCommand } from "./modules/visualizer/open-visualizer/command";
7+
import { StopVisualizerCommand } from "./modules/visualizer/stop-visualizer/command";
8+
import { stopVisualizer } from "./modules/visualizer/server";
99
import { outputChannel } from "./utils";
1010

1111
export function activate(context: vscode.ExtensionContext) {
@@ -22,7 +22,7 @@ export function activate(context: vscode.ExtensionContext) {
2222

2323
// This method is called when your extension is deactivated
2424
export function deactivate() {
25-
stop();
25+
stopVisualizer();
2626
}
2727

2828
function checkNodeVersion() {

vscode-extension/src/modules/open-visualizer/command.ts vscode-extension/src/modules/visualizer/open-visualizer/command.ts

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as vscode from "vscode";
22

3-
import { getDrizzleVisualizerPanel } from "../../panel";
4-
import { start } from "../../server";
5-
import { outputChannel, render } from "../../utils";
3+
import { createDrizzleVisualizerPanel } from "../panel";
4+
import { startVisualizer } from "../server";
5+
import { outputChannel, render } from "../../../utils";
66

77
export const command = "drizzle.visualizer:open";
88

@@ -23,8 +23,8 @@ export const OpenVisualizerCommand = vscode.commands.registerCommand(
2323
}
2424

2525
try {
26-
const panel = getDrizzleVisualizerPanel();
27-
const { port } = await start(configPath);
26+
const panel = createDrizzleVisualizerPanel();
27+
const { port } = await startVisualizer(configPath);
2828

2929
panel.webview.html = render(`
3030
<iframe
@@ -37,9 +37,7 @@ export const OpenVisualizerCommand = vscode.commands.registerCommand(
3737

3838
panel.reveal();
3939
} catch (error) {
40-
const errorMessage =
41-
error instanceof Error ? error.message : String(error);
42-
const msg = `${OutputKey} Failed to start Drizzle Visualizer: ${errorMessage}`;
40+
const msg = `${OutputKey} Failed to start Drizzle Visualizer: ${error instanceof Error ? error.message : String(error)}`;
4341

4442
vscode.window.showErrorMessage(msg);
4543
outputChannel.appendLine(msg);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import * as vscode from "vscode";
2+
3+
import { createPanel, render } from "../../utils";
4+
5+
/* Local state */
6+
let $panel: vscode.WebviewPanel | undefined = undefined;
7+
8+
export function createDrizzleVisualizerPanel() {
9+
if ($panel) {
10+
return $panel;
11+
}
12+
13+
$panel = createPanel({
14+
id: "DrizzleVisualizer",
15+
title: "Drizzle Visualizer",
16+
onDispose: () => {
17+
$panel = undefined;
18+
},
19+
});
20+
21+
$panel.webview.html = render(`
22+
<p style="display: flex; justify-content: center; align-items: center; height: 100%; margin: 0; font-size: 1.5rem; font-weight: bold;">
23+
Starting Drizzle Visualizer...
24+
</p>
25+
`);
26+
27+
return $panel;
28+
}
29+
30+
export function closeDrizzleVisualizerPanel() {
31+
$panel?.dispose();
32+
}

vscode-extension/src/server.ts vscode-extension/src/modules/visualizer/server.ts

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { ChildProcessWithoutNullStreams, spawn } from "node:child_process";
22
import path from "node:path";
33

4-
import { getProjectWorkingDir } from "./context";
5-
import { outputChannel } from "./utils";
4+
import { getProjectWorkingDir } from "../../context";
5+
import { outputChannel } from "../../utils";
66

77
/* Local state */
88
let $port: string | undefined = undefined;
@@ -13,14 +13,16 @@ let $configPath: string | undefined = undefined;
1313
/* Constants */
1414
const OutputKey = "[App]";
1515
const extensionCwd = path.dirname(__dirname);
16-
const binPath = path.join(extensionCwd, "visualizer", "server", "index.mjs");
16+
const appsCwd = path.join(extensionCwd, "apps");
17+
const binPath = path.join(appsCwd, "visualizer", "server", "index.mjs");
1718

1819
interface ServerStartResult {
1920
port: string;
2021
}
2122

22-
export async function start(configPath: string) {
23+
export async function startVisualizer(configPath: string) {
2324
outputChannel.appendLine(`${OutputKey} extension cwd: ${extensionCwd}`);
25+
outputChannel.appendLine(`${OutputKey} apps cwd: ${appsCwd}`);
2426
outputChannel.appendLine(
2527
`${OutputKey} Using drizzle visualizer from: ${binPath}`,
2628
);
@@ -31,7 +33,7 @@ export async function start(configPath: string) {
3133
outputChannel.appendLine(
3234
`${OutputKey} Config path changed. Killing server and restarting on port ${$port} with new config path: ${configPath}`,
3335
);
34-
stop();
36+
stopVisualizer();
3537
}
3638

3739
if (!$port) {
@@ -66,7 +68,7 @@ export async function start(configPath: string) {
6668
stdio: "pipe",
6769
detached: true,
6870
shell: false,
69-
cwd: extensionCwd,
71+
cwd: appsCwd,
7072
env: {
7173
...process.env,
7274
...drizzleEnvs,
@@ -92,12 +94,17 @@ export async function start(configPath: string) {
9294

9395
// error from the server
9496
$app.stderr.on("data", (error) => {
95-
return reject(error);
97+
outputChannel.appendLine(`${OutputKey} [stderr] ${String(error)}`);
98+
reject(error);
99+
});
100+
101+
$app.on("error", (error) => {
102+
console.error("app error", error);
96103
});
97104
});
98105
}
99106

100-
export function stop() {
107+
export function stopVisualizer() {
101108
outputChannel.appendLine(
102109
`${OutputKey} Stopping Drizzle Visualizer server...`,
103110
);
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import * as vscode from "vscode";
22

3-
import { closeDrizzleVisualizerPanel } from "../../panel";
4-
import { stop } from "../../server";
3+
import { closeDrizzleVisualizerPanel } from "../panel";
4+
import { stopVisualizer } from "../server";
55

66
export const command = "drizzle.visualizer:stop";
77

88
export const StopVisualizerCommand = vscode.commands.registerCommand(
99
command,
1010
() => {
11-
stop();
11+
stopVisualizer();
1212
closeDrizzleVisualizerPanel();
1313
},
1414
);

vscode-extension/src/panel.ts

-46
This file was deleted.

vscode-extension/src/utils.ts

+32
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,41 @@
11
import path from "node:path";
22
import * as vscode from "vscode";
3+
import { getExtensionContext } from "./context";
34

45
export const outputChannel =
56
vscode.window.createOutputChannel("Drizzle Visualizer");
67

8+
export function createPanel({
9+
id,
10+
title,
11+
onDispose = () => {},
12+
}: {
13+
id: string;
14+
title: string;
15+
onDispose?: () => void;
16+
}) {
17+
const context = getExtensionContext();
18+
19+
const panel = vscode.window.createWebviewPanel(
20+
id,
21+
title,
22+
vscode.ViewColumn.One,
23+
{
24+
enableScripts: true,
25+
retainContextWhenHidden: true,
26+
},
27+
);
28+
29+
panel.iconPath = {
30+
light: vscode.Uri.joinPath(context.extensionUri, "media", "drizzle.png"),
31+
dark: vscode.Uri.joinPath(context.extensionUri, "media", "drizzle.png"),
32+
};
33+
34+
panel.onDidDispose(onDispose);
35+
36+
return panel;
37+
}
38+
739
export function render(children: string) {
840
return `
941
<!DOCTYPE html>

0 commit comments

Comments
 (0)