diff options
Diffstat (limited to 'tools/vscode/packages/client/src/index.ts')
-rw-r--r-- | tools/vscode/packages/client/src/index.ts | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tools/vscode/packages/client/src/index.ts b/tools/vscode/packages/client/src/index.ts new file mode 100644 index 000000000..9ed016eb0 --- /dev/null +++ b/tools/vscode/packages/client/src/index.ts @@ -0,0 +1,66 @@ +import * as path from 'path'; +import * as vscode from 'vscode'; +import * as lsp from 'vscode-languageclient/node'; +import { activateTagClosing } from './html/autoClose'; + +let docClient: lsp.LanguageClient; + +const TagCloseRequest: lsp.RequestType<lsp.TextDocumentPositionParams, string, any> = new lsp.RequestType('html/tag'); + +/** */ +export async function activate(context: vscode.ExtensionContext) { + docClient = createLanguageService(context, 'doc', 'astro', 'Astro', 6040); + + await docClient.onReady(); +} + +/** */ +function createLanguageService(context: vscode.ExtensionContext, mode: 'doc', id: string, name: string, port: number) { + const { workspace } = vscode; + const serverModule = context.asAbsolutePath(path.join('dist', 'server.js')); + const debugOptions = { execArgv: ['--nolazy', '--inspect=' + port] }; + const serverOptions: lsp.ServerOptions = { + run: { module: serverModule, transport: lsp.TransportKind.ipc }, + debug: { + module: serverModule, + transport: lsp.TransportKind.ipc, + options: debugOptions, + }, + }; + const serverInitOptions: any = { + mode: mode, + appRoot: vscode.env.appRoot, + language: vscode.env.language, + }; + const clientOptions: lsp.LanguageClientOptions = { + documentSelector: [{ scheme: 'file', language: 'astro' }], + synchronize: { + configurationSection: ['javascript', 'typescript', 'prettier'], + fileEvents: workspace.createFileSystemWatcher('{**/*.js,**/*.ts}', false, false, false), + }, + initializationOptions: { + ...serverInitOptions, + configuration: { + prettier: workspace.getConfiguration('prettier'), + emmet: workspace.getConfiguration('emmet'), + typescript: workspace.getConfiguration('typescript'), + javascript: workspace.getConfiguration('javascript'), + }, + dontFilterIncompleteCompletions: true, // VSCode filters client side and is smarter at it than us + }, + }; + const client = new lsp.LanguageClient(id, name, serverOptions, clientOptions); + + context.subscriptions.push(client.start()); + + client.onReady().then(() => { + const tagRequestor = (document: vscode.TextDocument, position: vscode.Position) => { + const param = client.code2ProtocolConverter.asTextDocumentPositionParams(document, position); + return client.sendRequest(TagCloseRequest, param); + }; + const disposable = activateTagClosing(tagRequestor, { astro: true }, 'html.autoClosingTags'); + context.subscriptions.push(disposable); + }); + + return client; +} |