-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.ts
113 lines (109 loc) · 3.15 KB
/
main.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import {
CancellationToken,
CustomDocument,
CustomDocumentBackup,
CustomDocumentBackupContext,
CustomDocumentContentChangeEvent,
CustomDocumentOpenContext,
CustomEditorProvider,
ExtensionContext,
importVsCodeApi,
Uri,
WebviewPanel,
} from "https://deno.land/x/vscode@1.90.0/mod.ts";
import { viewType } from "./lib.ts";
export function activate(context: ExtensionContext) {
const vscode = importVsCodeApi();
if (vscode === undefined) {
throw new Error(
"Could not import vscode api because it was not working within the extension",
);
}
const eventEmitter = new vscode.EventEmitter<
CustomDocumentContentChangeEvent<BsonEditorDocument>
>();
/**
* https://code.visualstudio.com/api/extension-guides/custom-editors
*/
const customEditorProvider: CustomEditorProvider<BsonEditorDocument> = {
// deno-lint-ignore require-await
backupCustomDocument: async (
document: BsonEditorDocument,
_context: CustomDocumentBackupContext,
_cancellation: CancellationToken,
): Promise<CustomDocumentBackup> => {
return {
id: document.uri.toString(),
delete: () => {},
};
},
onDidChangeCustomDocument: eventEmitter.event,
openCustomDocument: async (
uri: Uri,
_openContext: CustomDocumentOpenContext,
_token: CancellationToken,
): Promise<BsonEditorDocument> => {
const file = await vscode.workspace.fs.readFile(uri);
return {
uri,
originalBinary: file,
dispose: () => {},
};
},
// deno-lint-ignore require-await
resolveCustomEditor: async (
_document: BsonEditorDocument,
webviewPanel: WebviewPanel,
_token: CancellationToken,
): Promise<void> => {
webviewPanel.webview.options = {
enableScripts: true,
};
const scriptUri = webviewPanel.webview.asWebviewUri(
vscode.Uri.joinPath(context.extensionUri, "client.js"),
);
webviewPanel.webview.html = `<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Bson Editor</title>
<script type="module" src="${scriptUri}"></script>
</head>
<body>
<div id="loading">Bson Editor loading</div>
</body>
</html>`;
},
saveCustomDocument: async (
document: BsonEditorDocument,
_cancellation: CancellationToken,
): Promise<void> => {
await vscode.workspace.fs.writeFile(
document.uri,
document.originalBinary,
);
},
saveCustomDocumentAs: async (
document: BsonEditorDocument,
destination: Uri,
_cancellation: CancellationToken,
): Promise<void> => {
await vscode.workspace.fs.writeFile(destination, document.originalBinary);
},
revertCustomDocument: async (
document: BsonEditorDocument,
_cancellation: CancellationToken,
): Promise<void> => {
const file = await vscode.workspace.fs.readFile(document.uri);
document.originalBinary = file;
},
};
const provider = vscode.window.registerCustomEditorProvider(
viewType,
customEditorProvider,
);
context.subscriptions.push(provider);
}
export type BsonEditorDocument = CustomDocument & {
originalBinary: Uint8Array;
};