11import * as vscode from 'vscode'
22
33export function activate ( context : vscode . ExtensionContext ) {
4+ // Track currently webview panel
5+ let currentPanel : vscode . WebviewPanel | undefined
6+
47 context . subscriptions . push (
58 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+ }
728 } ) ,
829 )
930}
1031
1132const viewType = 'sourceMapVisualization'
1233
1334async 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 ( ) {
1469 const editor = vscode . window . activeTextEditor
1570 if ( ! editor )
1671 return
@@ -36,24 +91,7 @@ async function show(extensionUri: vscode.Uri) {
3691 const code = document . getText ( editor . selection ) || await vscode . workspace . fs . readFile ( vscode . Uri . file ( file ) ) . then ( buffer => new TextDecoder ( 'utf-8' ) . decode ( buffer ) )
3792 const map = await vscode . workspace . fs . readFile ( vscode . Uri . file ( mapFile ) ) . then ( buffer => new TextDecoder ( 'utf-8' ) . decode ( buffer ) )
3893
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 }
5795}
5896
5997function getHtmlForWebview ( webview : vscode . Webview , extensionUri : vscode . Uri ) {
0 commit comments