code-server
Version:
Run VS Code on a remote server.
148 lines (143 loc) • 11.3 kB
JavaScript
"use strict";var E=Object.create;var u=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var j=(t,e)=>{for(var i in e)u(t,i,{get:e[i],enumerable:!0})},I=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of z(e))!R.call(t,o)&&o!==i&&u(t,o,{get:()=>e[o],enumerable:!(r=k(e,o))||r.enumerable});return t};var x=(t,e,i)=>(i=t!=null?E(O(t)):{},I(e||!t||!t.__esModule?u(i,"default",{value:t,enumerable:!0}):i,t)),A=t=>I(u({},"__esModule",{value:!0}),t);var L={};j(L,{activate:()=>J});module.exports=A(L);var p=x(require("vscode"));var n=x(require("vscode"));function b(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function l(){if(typeof crypto.randomUUID=="function")return crypto.randomUUID.bind(crypto)();let t=new Uint8Array(16),e=[];for(let o=0;o<256;o++)e.push(o.toString(16).padStart(2,"0"));crypto.getRandomValues(t),t[6]=t[6]&15|64,t[8]=t[8]&63|128;let i=0,r="";return r+=e[t[i++]],r+=e[t[i++]],r+=e[t[i++]],r+=e[t[i++]],r+="-",r+=e[t[i++]],r+=e[t[i++]],r+="-",r+=e[t[i++]],r+=e[t[i++]],r+="-",r+=e[t[i++]],r+=e[t[i++]],r+="-",r+=e[t[i++]],r+=e[t[i++]],r+=e[t[i++]],r+=e[t[i++]],r+=e[t[i++]],r+=e[t[i++]],r}function W(t){for(;t.length;)t.pop()?.dispose()}var m=class{_isDisposed=!1;_disposables=[];dispose(){this._isDisposed||(this._isDisposed=!0,W(this._disposables))}_register(e){return this._isDisposed?e.dispose():this._disposables.push(e),e}get isDisposed(){return this._isDisposed}};var H="text/vnd.mermaid",Z="vscode.chat-mermaid-features.chatOutputItem",M=class{constructor(e,i){this._extensionUri=e;this._webviewManager=i}async renderChatOutput({value:e},i,r,o){let s=i.webview,d=q(e),c=d.source,v=d.title,w=l(),y=[];y.push(this._webviewManager.registerWebview(w,s,c,v,"chat")),y.push(s.onDidReceiveMessage($=>{$.type==="openInEditor"&&n.commands.executeCommand("_mermaid-chat.openInEditor",{mermaidWebviewId:w})})),i.onDidDispose(()=>{W(y)});let _=n.Uri.joinPath(this._extensionUri,"chat-webview-out");s.options={enableScripts:!0,localResourceRoots:[_]};let P=l(),C=n.Uri.joinPath(_,"index.js"),T=s.asWebviewUri(n.Uri.joinPath(_,"codicon.css"));s.html=`
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mermaid Diagram</title>
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'nonce-${P}'; style-src ${s.cspSource} 'unsafe-inline'; font-src data:;" />
<link rel="stylesheet" type="text/css" href="${T}">
<style>
body {
padding: 0;
}
.mermaid {
visibility: hidden;
}
.mermaid.rendered {
visibility: visible;
}
.open-in-editor-btn {
position: absolute;
top: 8px;
right: 8px;
display: flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
background: var(--vscode-editorWidget-background);
color: var(--vscode-icon-foreground);
border: 1px solid var(--vscode-editorWidget-border);
border-radius: 6px;
cursor: pointer;
z-index: 100;
opacity: 0;
transition: opacity 0.2s;
}
body:hover .open-in-editor-btn {
opacity: 1;
}
.open-in-editor-btn:hover {
opacity: 1;
background: var(--vscode-toolbar-hoverBackground);
}
</style>
</head>
<body data-vscode-context='${JSON.stringify({preventDefaultContextMenuItems:!0,mermaidWebviewId:w})}' data-vscode-mermaid-webview-id="${w}">
<button class="open-in-editor-btn" title="${n.l10n.t("Open in Editor")}"><i class="codicon codicon-open-preview"></i></button>
<pre class="mermaid">
${b(c)}
</pre>
<script type="module" nonce="${P}" src="${s.asWebviewUri(C)}"></script>
</body>
</html>`}};function D(t,e,i){let r=[];r.push(n.commands.registerCommand("_mermaid-chat.openInEditor",s=>{let d=s?.mermaidWebviewId?e.getWebview(s.mermaidWebviewId):e.activeWebview;d&&i.openPreview(d.mermaidSource,d.title)})),r.push(n.lm.registerTool("renderMermaidDiagram",{invoke:async(s,d)=>{let c=s.input.markup,v=s.input.title;return F(c,v)}}));let o=new M(t.extensionUri,e);return r.push(n.chat.registerChatOutputRenderer(Z,o)),n.Disposable.from(...r)}function F(t,e){let i=V(t),r=new n.LanguageModelToolResult([new n.LanguageModelTextPart(`${i}mermaid
${t}
${i}`)]),o=JSON.stringify({source:t,title:e});return r.toolResultDetails2={mime:H,value:new TextEncoder().encode(o)},r}function V(t){let e=t.matchAll(/`+/g);if(!e)return"```";let i=Math.max(...Array.from(e,r=>r[0].length));return"`".repeat(Math.max(3,i+1))}function q(t){let e=new TextDecoder().decode(t);try{let i=JSON.parse(e);if(typeof i=="object"&&typeof i.source=="string")return{title:i.title,source:i.source}}catch{}return{title:void 0,source:e}}var a=x(require("vscode"));var S="vscode.chat-mermaid-features.preview",h=class extends m{constructor(i,r){super();this._extensionUri=i;this._webviewManager=r;this._register(a.window.registerWebviewPanelSerializer(S,this))}_previews=new Map;openPreview(i,r){let o=U(i),s=this._previews.get(o);if(s){s.reveal();return}let d=g.create(o,i,r,this._extensionUri,this._webviewManager,a.ViewColumn.Active);this._registerPreview(d)}async deserializeWebviewPanel(i,r){if(!r?.mermaidSource){i.webview.html=this._getErrorHtml();return}let o=U(r.mermaidSource),s=g.revive(i,o,r.mermaidSource,this._extensionUri,this._webviewManager);this._registerPreview(s)}_registerPreview(i){this._previews.set(i.diagramId,i),i.onDispose(()=>{this._previews.delete(i.diagramId)})}_getErrorHtml(){return`
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mermaid Preview</title>
<meta http-equiv="Content-Security-Policy" content="default-src 'none';">
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
</style>
</head>
<body>
<p>An unexpected error occurred while restoring the Mermaid preview.</p>
</body>
</html>`}dispose(){super.dispose();for(let i of this._previews.values())i.dispose();this._previews.clear()}},g=class t extends m{constructor(i,r,o,s,d){super();this._webviewPanel=i;this.diagramId=r;this._mermaidSource=o;this._extensionUri=s;this._webviewManager=d;this._webviewPanel.iconPath=new a.ThemeIcon("graph"),this._webviewPanel.webview.options={enableScripts:!0,localResourceRoots:[a.Uri.joinPath(this._extensionUri,"chat-webview-out")]},this._webviewPanel.webview.html=this._getHtml(),this._register(this._webviewManager.registerWebview(this.diagramId,this._webviewPanel.webview,this._mermaidSource,void 0,"editor")),this._register(this._webviewPanel.onDidChangeViewState(c=>{c.webviewPanel.active&&this._webviewManager.setActiveWebview(this.diagramId)})),this._register(this._webviewPanel.onDidDispose(()=>{this._onDisposeEmitter.fire(),this.dispose()}))}_onDisposeEmitter=this._register(new a.EventEmitter);onDispose=this._onDisposeEmitter.event;static create(i,r,o,s,d,c){let v=a.window.createWebviewPanel(S,o??a.l10n.t("Mermaid Diagram"),c,{retainContextWhenHidden:!1});return new t(v,i,r,s,d)}static revive(i,r,o,s,d){return new t(i,r,o,s,d)}reveal(){this._webviewPanel.reveal()}dispose(){this._onDisposeEmitter.fire(),super.dispose(),this._webviewPanel.dispose()}_getHtml(){let i=l(),r=a.Uri.joinPath(this._extensionUri,"chat-webview-out"),o=this._webviewPanel.webview.asWebviewUri(a.Uri.joinPath(r,"index-editor.js")),s=this._webviewPanel.webview.asWebviewUri(a.Uri.joinPath(r,"codicon.css"));return`
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mermaid Diagram</title>
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'nonce-${i}'; style-src ${this._webviewPanel.webview.cspSource} 'unsafe-inline'; font-src data:;" />
<link rel="stylesheet" type="text/css" href="${s}">
<style>
html, body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
overflow: hidden;
}
.mermaid {
visibility: hidden;
}
.mermaid.rendered {
visibility: visible;
}
.mermaid-wrapper {
height: 100%;
width: 100%;
}
.zoom-controls {
position: absolute;
top: 8px;
right: 8px;
display: flex;
gap: 2px;
z-index: 100;
background: var(--vscode-editorWidget-background);
border: 1px solid var(--vscode-editorWidget-border);
border-radius: 6px;
padding: 3px;
}
.zoom-controls button {
display: flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
background: transparent;
color: var(--vscode-icon-foreground);
border: none;
border-radius: 4px;
cursor: pointer;
}
.zoom-controls button:hover {
background: var(--vscode-toolbar-hoverBackground);
}
</style>
</head>
<body data-vscode-context='${JSON.stringify({preventDefaultContextMenuItems:!0,mermaidWebviewId:this.diagramId})}' data-vscode-mermaid-webview-id="${this.diagramId}">
<div class="zoom-controls">
<button class="zoom-out-btn" title="${a.l10n.t("Zoom Out")}"><i class="codicon codicon-zoom-out"></i></button>
<button class="zoom-in-btn" title="${a.l10n.t("Zoom In")}"><i class="codicon codicon-zoom-in"></i></button>
<button class="zoom-reset-btn" title="${a.l10n.t("Reset Zoom")}"><i class="codicon codicon-screen-normal"></i></button>
</div>
<pre class="mermaid">
${b(this._mermaidSource)}
</pre>
<script type="module" nonce="${i}" src="${o}"></script>
</body>
</html>`}};function U(t){let e=0;for(let i=0;i<t.length;i++){let r=t.charCodeAt(i);e=(e<<5)-e+r,e=e&e}return Math.abs(e).toString(16)}var f=class{_activeWebviewId;_webviews=new Map;get activeWebview(){return this._activeWebviewId?this._webviews.get(this._activeWebviewId):void 0}registerWebview(e,i,r,o,s){if(this._webviews.has(e))throw new Error(`Webview with id ${e} is already registered.`);let d={id:e,webview:i,mermaidSource:r,title:o,type:s};return this._webviews.set(e,d),{dispose:()=>this.unregisterWebview(e)}}unregisterWebview(e){this._webviews.delete(e),this._activeWebviewId===e&&(this._activeWebviewId=void 0)}setActiveWebview(e){this._webviews.has(e)&&(this._activeWebviewId=e)}getWebview(e){return this._webviews.get(e)}resetPanZoom(e){(e?this._webviews.get(e):this.activeWebview)?.webview.postMessage({type:"resetPanZoom"})}};function J(t){let e=new f,i=new h(t.extensionUri,e);t.subscriptions.push(i),t.subscriptions.push(D(t,e,i)),t.subscriptions.push(p.commands.registerCommand("_mermaid-chat.resetPanZoom",r=>{e.resetPanZoom(r?.mermaidWebviewId)})),t.subscriptions.push(p.commands.registerCommand("_mermaid-chat.copySource",r=>{let o=r?.mermaidWebviewId?e.getWebview(r.mermaidWebviewId):e.activeWebview;o&&p.env.clipboard.writeText(o.mermaidSource)}))}0&&(module.exports={activate});
//# sourceMappingURL=extension.js.map