1
1
import * as vscode from 'vscode'
2
2
3
3
export function activate ( context : vscode . ExtensionContext ) {
4
+ // Track currently webview panel
5
+ let currentPanel : vscode . WebviewPanel | undefined
6
+
4
7
context . subscriptions . push (
5
8
vscode . commands . registerCommand ( 'sourceMapVisualization.show' , ( ) => {
6
- vscode . window . setStatusBarMessage ( 'Show source map visualization...' , show ( context . extensionUri ) )
9
+ if ( currentPanel ) {
10
+ // If we already have a panel, show it in the target column
11
+ currentPanel . reveal ( getViewColumn ( ) )
12
+ updatePanel ( currentPanel )
13
+ }
14
+ else {
15
+ // Otherwise, create a new panel
16
+ vscode . window . setStatusBarMessage ( 'Show source map visualization...' , show ( context . extensionUri ) . then ( ( panel ) => {
17
+ currentPanel = panel
18
+ // Reset when the current panel is closed
19
+ panel . onDidDispose (
20
+ ( ) => {
21
+ currentPanel = undefined
22
+ } ,
23
+ null ,
24
+ context . subscriptions ,
25
+ )
26
+ } ) )
27
+ }
7
28
} ) ,
8
29
)
9
30
}
10
31
11
32
const viewType = 'sourceMapVisualization'
12
33
13
34
async function show ( extensionUri : vscode . Uri ) {
35
+ const panel = vscode . window . createWebviewPanel (
36
+ viewType ,
37
+ 'Source Map Visualization' ,
38
+ getViewColumn ( ) ,
39
+ {
40
+ enableScripts : true ,
41
+ retainContextWhenHidden : true ,
42
+ } ,
43
+ )
44
+
45
+ panel . webview . html = getHtmlForWebview ( panel . webview , extensionUri )
46
+
47
+ updatePanel ( panel )
48
+
49
+ return panel
50
+ }
51
+
52
+ function getViewColumn ( ) {
53
+ return vscode . window . activeTextEditor ?. viewColumn || vscode . ViewColumn . One
54
+ }
55
+
56
+ async function updatePanel ( panel : vscode . WebviewPanel ) {
57
+ if ( ! panel )
58
+ return
59
+ const data = await getCodeAndMap ( )
60
+ if ( ! data )
61
+ return
62
+ panel . webview . postMessage ( {
63
+ command : 'update' ,
64
+ data,
65
+ } )
66
+ }
67
+
68
+ async function getCodeAndMap ( ) {
14
69
const editor = vscode . window . activeTextEditor
15
70
if ( ! editor )
16
71
return
@@ -36,24 +91,7 @@ async function show(extensionUri: vscode.Uri) {
36
91
const code = document . getText ( editor . selection ) || await vscode . workspace . fs . readFile ( vscode . Uri . file ( file ) ) . then ( buffer => new TextDecoder ( 'utf-8' ) . decode ( buffer ) )
37
92
const map = await vscode . workspace . fs . readFile ( vscode . Uri . file ( mapFile ) ) . then ( buffer => new TextDecoder ( 'utf-8' ) . decode ( buffer ) )
38
93
39
- const column = vscode . window . activeTextEditor
40
- ? vscode . window . activeTextEditor . viewColumn
41
- : undefined
42
-
43
- const panel = vscode . window . createWebviewPanel (
44
- viewType ,
45
- 'Source Map Visualization' ,
46
- column || vscode . ViewColumn . One ,
47
- {
48
- enableScripts : true ,
49
- } ,
50
- )
51
-
52
- panel . webview . html = getHtmlForWebview ( panel . webview , extensionUri )
53
- panel . webview . postMessage ( {
54
- command : 'update' ,
55
- data : { code, map } ,
56
- } )
94
+ return { code, map }
57
95
}
58
96
59
97
function getHtmlForWebview ( webview : vscode . Webview , extensionUri : vscode . Uri ) {
0 commit comments