Skip to content

Commit

Permalink
refactor: ship as an ES module (#547)
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Ship as an ES module. Might be breaking for programmatic users of this server. Read more about consuming ES module packages at gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c
  • Loading branch information
rchl committed Aug 6, 2022
1 parent e76fc64 commit 0dfd411
Show file tree
Hide file tree
Showing 38 changed files with 321 additions and 378 deletions.
File renamed without changes.
3 changes: 3 additions & 0 deletions .mocharc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ require:
- 'source-map-support/register'
- 'ts-node/register'
spec: './src/**/*.spec.ts'
node-option:
- 'experimental-specifier-resolution=node'
- 'loader=ts-node/esm'
# Set to 0 to disable timeout when debugging.
timeout: 20000
watch-files: './src/**/*.ts'
19 changes: 10 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,14 @@
"description": "Language Server Protocol (LSP) implementation for TypeScript using tsserver",
"author": "TypeFox and others",
"license": "Apache-2.0",
"engines": {
"node": ">=12"
},
"eslintIgnore": [
"!.eslintrc.js"
],
"repository": {
"type": "git",
"url": "https://github.com/typescript-language-server/typescript-language-server.git"
},
"type": "module",
"engines": {
"node": ">=14.16"
},
"files": [
"lib"
],
Expand All @@ -32,6 +30,9 @@
"postversion": "git push --follow-tags",
"prepare": "cd test-data/jsx && yarn"
},
"eslintIgnore": [
"!.eslintrc.cjs"
],
"husky": {
"hooks": {
"pre-commit": "yarn lint && yarn build && yarn test:compiled",
Expand All @@ -41,10 +42,10 @@
"dependencies": {
"commander": "^9.4.0",
"fs-extra": "^10.1.0",
"p-debounce": "^2.1.0",
"pkg-up": "^3.1.0",
"p-debounce": "^4.0.0",
"pkg-up": "^4.0.0",
"semver": "^7.3.7",
"tempy": "^1.0.1",
"tempy": "^3.0.0",
"vscode-languageserver": "^8.0.2",
"vscode-languageserver-protocol": "^3.17.2",
"vscode-languageserver-textdocument": "1.0.5",
Expand Down
12 changes: 6 additions & 6 deletions src/calls.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@

import tsp from 'typescript/lib/protocol';
import * as lsp from 'vscode-languageserver/node';
import * as lspcalls from './lsp-protocol.calls.proposed';
import { TspClient } from './tsp-client';
import { CommandTypes } from './tsp-command-types';
import { uriToPath, toLocation, asRange, Range, toSymbolKind, pathToUri } from './protocol-translation';
import type tsp from 'typescript/lib/protocol.d.js';
import * as lsp from 'vscode-languageserver';
import * as lspcalls from './lsp-protocol.calls.proposed.js';
import { TspClient } from './tsp-client.js';
import { CommandTypes } from './tsp-command-types.js';
import { uriToPath, toLocation, asRange, Range, toSymbolKind, pathToUri } from './protocol-translation.js';
import { TextDocument } from 'vscode-languageserver-textdocument';

export async function computeCallers(tspClient: TspClient, args: lsp.TextDocumentPositionParams): Promise<lspcalls.CallsResult> {
Expand Down
9 changes: 5 additions & 4 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import { readFileSync } from 'node:fs';
import { Command } from 'commander';
import { createLspConnection } from './lsp-connection';
import * as lsp from 'vscode-languageserver/node';
import { createLspConnection } from './lsp-connection.js';
import * as lsp from 'vscode-languageserver';

const DEFAULT_LOG_LEVEL = lsp.MessageType.Info;
const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), { encoding: 'utf8' }));

const program = new Command('typescript-language-server')
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
.version(require('../package.json').version)
.version(version)
.requiredOption('--stdio', 'use stdio')
.option('--log-level <logLevel>', 'A number indicating the log level (4 = log, 3 = info, 2 = warn, 1 = error). Defaults to `2`.')
.option('--tsserver-log-file <tsserverLogFile>', 'Specify a tsserver log file. example: --tsserver-log-file ts-logs.txt')
Expand Down
20 changes: 10 additions & 10 deletions src/completion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import * as lsp from 'vscode-languageserver/node';
import type tsp from 'typescript/lib/protocol';
import { LspDocument } from './document';
import { CommandTypes, KindModifiers, ScriptElementKind } from './tsp-command-types';
import { asRange, toTextEdit, asPlainText, asDocumentation, normalizePath } from './protocol-translation';
import { Commands } from './commands';
import { TspClient } from './tsp-client';
import { CompletionOptions, DisplayPartKind, SupportedFeatures } from './ts-protocol';
import SnippetString from './utils/SnippetString';
import * as typeConverters from './utils/typeConverters';
import * as lsp from 'vscode-languageserver';
import type tsp from 'typescript/lib/protocol.js';
import { LspDocument } from './document.js';
import { CommandTypes, KindModifiers, ScriptElementKind } from './tsp-command-types.js';
import { asRange, toTextEdit, asPlainText, asDocumentation, normalizePath } from './protocol-translation.js';
import { Commands } from './commands.js';
import { TspClient } from './tsp-client.js';
import { CompletionOptions, DisplayPartKind, SupportedFeatures } from './ts-protocol.js';
import SnippetString from './utils/SnippetString.js';
import * as typeConverters from './utils/typeConverters.js';

interface TSCompletionItem extends lsp.CompletionItem {
data: tsp.CompletionDetailsRequestArgs;
Expand Down
12 changes: 6 additions & 6 deletions src/diagnostic-queue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import tsp from 'typescript/lib/protocol';
import * as lsp from 'vscode-languageserver/node';
import { Logger } from './logger';
import { pathToUri, toDiagnostic } from './protocol-translation';
import { EventTypes } from './tsp-command-types';
import type tsp from 'typescript/lib/protocol.d.js';
import * as lsp from 'vscode-languageserver';
import debounce from 'p-debounce';
import { LspDocuments } from './document';
import { Logger } from './logger.js';
import { pathToUri, toDiagnostic } from './protocol-translation.js';
import { EventTypes } from './tsp-command-types.js';
import { LspDocuments } from './document.js';

class FileDiagnostics {
private readonly diagnosticsPerKind = new Map<EventTypes, tsp.Diagnostic[]>();
Expand Down
8 changes: 4 additions & 4 deletions src/document-symbol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import * as lsp from 'vscode-languageserver/node';
import tsp from 'typescript/lib/protocol';
import { asRange, toSymbolKind, Range } from './protocol-translation';
import { ScriptElementKind } from './tsp-command-types';
import * as lsp from 'vscode-languageserver';
import type tsp from 'typescript/lib/protocol.d.js';
import { asRange, toSymbolKind, Range } from './protocol-translation.js';
import { ScriptElementKind } from './tsp-command-types.js';

export function collectDocumentSymbols(parent: tsp.NavigationTree, symbols: lsp.DocumentSymbol[]): boolean {
return collectDocumentSymbolsInRange(parent, symbols, { start: asRange(parent.spans[0]).start, end: asRange(parent.spans[parent.spans.length - 1]).end });
Expand Down
2 changes: 1 addition & 1 deletion src/document.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import * as lsp from 'vscode-languageserver/node';
import * as lsp from 'vscode-languageserver';
import { TextDocument } from 'vscode-languageserver-textdocument';

export class LspDocument implements TextDocument {
Expand Down
17 changes: 9 additions & 8 deletions src/features/fix-all.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import tsp, { CommandTypes } from 'typescript/lib/protocol';
import * as lsp from 'vscode-languageserver/node';
import { LspDocuments } from '../document';
import { toFileRangeRequestArgs, toTextDocumentEdit } from '../protocol-translation';
import { TspClient } from '../tsp-client';
import * as errorCodes from '../utils/errorCodes';
import * as fixNames from '../utils/fixNames';
import { CodeActionKind } from '../utils/types';
import type tsp from 'typescript/lib/protocol.d.js';
import * as lsp from 'vscode-languageserver';
import { LspDocuments } from '../document.js';
import { toFileRangeRequestArgs, toTextDocumentEdit } from '../protocol-translation.js';
import { TspClient } from '../tsp-client.js';
import { CommandTypes } from '../tsp-command-types.js';
import * as errorCodes from '../utils/errorCodes.js';
import * as fixNames from '../utils/fixNames.js';
import { CodeActionKind } from '../utils/types.js';

interface AutoFix {
readonly codes: Set<number>;
Expand Down
4 changes: 2 additions & 2 deletions src/file-lsp-server.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
*/

import chai from 'chai';
import { LspServer } from './lsp-server';
import { uri, createServer, lastPosition, filePath, readContents, positionAfter } from './test-utils';
import { LspServer } from './lsp-server.js';
import { uri, createServer, lastPosition, filePath, readContents, positionAfter } from './test-utils.js';

const assert = chai.assert;

Expand Down
6 changes: 3 additions & 3 deletions src/hover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import * as lsp from 'vscode-languageserver/node';
import tsp from 'typescript/lib/protocol';
import { asDocumentation, asPlainText } from './protocol-translation';
import * as lsp from 'vscode-languageserver';
import type tsp from 'typescript/lib/protocol.d.js';
import { asDocumentation, asPlainText } from './protocol-translation.js';

export function asSignatureHelp(info: tsp.SignatureHelpItems): lsp.SignatureHelp {
return {
Expand Down
4 changes: 2 additions & 2 deletions src/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import { LspClient } from './lsp-client';
import * as lsp from 'vscode-languageserver/node';
import { LspClient } from './lsp-client.js';
import * as lsp from 'vscode-languageserver';

/**
* the logger type
Expand Down
4 changes: 2 additions & 2 deletions src/lsp-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import * as lsp from 'vscode-languageserver/node';
import { TypeScriptRenameRequest } from './ts-protocol';
import * as lsp from 'vscode-languageserver';
import { TypeScriptRenameRequest } from './ts-protocol.js';

export interface ProgressReporter {
begin(message?: string): void;
Expand Down
13 changes: 6 additions & 7 deletions src/lsp-connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import * as lsp from 'vscode-languageserver/node';
import * as lspcalls from './lsp-protocol.calls.proposed';
import * as lspinlayHints from './lsp-protocol.inlayHints.proposed';

import { LspClientLogger } from './logger';
import { LspServer } from './lsp-server';
import { LspClientImpl } from './lsp-client';
import * as lsp from 'vscode-languageserver/node.js';
import * as lspcalls from './lsp-protocol.calls.proposed.js';
import * as lspinlayHints from './lsp-protocol.inlayHints.proposed.js';
import { LspClientLogger } from './logger.js';
import { LspServer } from './lsp-server.js';
import { LspClientImpl } from './lsp-client.js';

export interface IServerOptions {
tsserverPath: string;
Expand Down
2 changes: 1 addition & 1 deletion src/lsp-protocol.calls.proposed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import { RequestHandler } from 'vscode-jsonrpc';
import { Location, SymbolKind, Range, DocumentSymbol } from 'vscode-languageserver-types';
import * as lsp from 'vscode-languageserver/node';
import * as lsp from 'vscode-languageserver';

export interface CallsClientCapabilities {
/**
Expand Down
4 changes: 2 additions & 2 deletions src/lsp-protocol.inlayHints.proposed.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as lsp from 'vscode-languageserver/node';
import tsp from 'typescript/lib/protocol';
import * as lsp from 'vscode-languageserver';
import type tsp from 'typescript/lib/protocol.d.js';
import { RequestHandler } from 'vscode-jsonrpc';

export type InlayHintsParams = {
Expand Down
16 changes: 8 additions & 8 deletions src/lsp-server.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
*/

import * as chai from 'chai';
import * as fs from 'fs-extra';
import * as lsp from 'vscode-languageserver/node';
import * as lspcalls from './lsp-protocol.calls.proposed';
import { uri, createServer, position, lastPosition, filePath, getDefaultClientCapabilities, positionAfter, readContents, TestLspServer, toPlatformEOL } from './test-utils';
import fs from 'fs-extra';
import * as lsp from 'vscode-languageserver';
import * as lspcalls from './lsp-protocol.calls.proposed.js';
import { uri, createServer, position, lastPosition, filePath, getDefaultClientCapabilities, positionAfter, readContents, TestLspServer, toPlatformEOL } from './test-utils.js';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { Commands } from './commands';
import { TypeScriptWorkspaceSettings } from './ts-protocol';
import { CodeActionKind } from './utils/types';
import { Commands } from './commands.js';
import { TypeScriptWorkspaceSettings } from './ts-protocol.js';
import { CodeActionKind } from './utils/types.js';

const assert = chai.assert;

Expand Down Expand Up @@ -1426,7 +1426,7 @@ describe('executeCommand', () => {
const change2 = changes![uri('newFn.ts')];
assert.isDefined(change2);
// Clean up file that is created on applying edit.
fs.unlink(filePath('newFn.ts'));
fs.unlinkSync(filePath('newFn.ts'));
assert.deepEqual(
change1,
[
Expand Down
61 changes: 30 additions & 31 deletions src/lsp-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,40 @@
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/

import * as path from 'path';
import tempy from 'tempy';
import * as lsp from 'vscode-languageserver/node';
import * as lspcalls from './lsp-protocol.calls.proposed';
import * as lspinlayHints from './lsp-protocol.inlayHints.proposed';
import * as lspsemanticTokens from './semantic-tokens';
import tsp from 'typescript/lib/protocol';
import * as fs from 'fs-extra';
import * as path from 'node:path';
import fs from 'fs-extra';
import debounce from 'p-debounce';

import API from './utils/api';
import { CommandTypes, EventTypes } from './tsp-command-types';
import { Logger, PrefixingLogger } from './logger';
import { TspClient } from './tsp-client';
import { DiagnosticEventQueue } from './diagnostic-queue';
import { temporaryFile } from 'tempy';
import * as lsp from 'vscode-languageserver';
import * as lspcalls from './lsp-protocol.calls.proposed.js';
import * as lspinlayHints from './lsp-protocol.inlayHints.proposed.js';
import * as lspsemanticTokens from './semantic-tokens.js';
import tsp from 'typescript/lib/protocol.d.js';
import API from './utils/api.js';
import { CommandTypes, EventTypes } from './tsp-command-types.js';
import { Logger, PrefixingLogger } from './logger.js';
import { TspClient } from './tsp-client.js';
import { DiagnosticEventQueue } from './diagnostic-queue.js';
import {
toDocumentHighlight, asRange, asTagsDocumentation,
uriToPath, toSymbolKind, toLocation, toPosition,
pathToUri, toTextEdit, toFileRangeRequestArgs, asPlainText, normalizePath
} from './protocol-translation';
import { LspDocuments, LspDocument } from './document';
import { asCompletionItem, asResolvedCompletionItem, getCompletionTriggerCharacter } from './completion';
import { asSignatureHelp } from './hover';
import { Commands } from './commands';
import { provideQuickFix } from './quickfix';
import { provideRefactors } from './refactor';
import { provideOrganizeImports } from './organize-imports';
import { TypeScriptInitializeParams, TypeScriptInitializationOptions, TypeScriptInitializeResult, TypeScriptWorkspaceSettings, TypeScriptWorkspaceSettingsLanguageSettings, SupportedFeatures } from './ts-protocol';
import { collectDocumentSymbols, collectSymbolInformation } from './document-symbol';
import { computeCallers, computeCallees } from './calls';
import { IServerOptions } from './utils/configuration';
import { TypeScriptVersion, TypeScriptVersionProvider } from './utils/versionProvider';
import { TypeScriptAutoFixProvider } from './features/fix-all';
import { LspClient, ProgressReporter } from './lsp-client';
import { CodeActionKind } from './utils/types';
} from './protocol-translation.js';
import { LspDocuments, LspDocument } from './document.js';
import { asCompletionItem, asResolvedCompletionItem, getCompletionTriggerCharacter } from './completion.js';
import { asSignatureHelp } from './hover.js';
import { Commands } from './commands.js';
import { provideQuickFix } from './quickfix.js';
import { provideRefactors } from './refactor.js';
import { provideOrganizeImports } from './organize-imports.js';
import { TypeScriptInitializeParams, TypeScriptInitializationOptions, TypeScriptInitializeResult, TypeScriptWorkspaceSettings, TypeScriptWorkspaceSettingsLanguageSettings, SupportedFeatures } from './ts-protocol.js';
import { collectDocumentSymbols, collectSymbolInformation } from './document-symbol.js';
import { computeCallers, computeCallees } from './calls.js';
import { IServerOptions } from './utils/configuration.js';
import { TypeScriptVersion, TypeScriptVersionProvider } from './utils/versionProvider.js';
import { TypeScriptAutoFixProvider } from './features/fix-all.js';
import { LspClient, ProgressReporter } from './lsp-client.js';
import { CodeActionKind } from './utils/types.js';

const DEFAULT_TSSERVER_PREFERENCES: Required<tsp.UserPreferences> = {
allowIncompleteCompletions: true,
Expand Down Expand Up @@ -380,7 +379,7 @@ export class LspServer {
fs.ensureFileSync(logFile);
return logFile;
}
return tempy.file(<any>{ name: 'tsserver.log' });
return temporaryFile({ name: 'tsserver.log' });
}
protected doGetLogFile(): string | undefined {
if (process.env.TSSERVER_LOG_FILE) {
Expand Down
8 changes: 4 additions & 4 deletions src/organize-imports.spec.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import tsp from 'typescript/lib/protocol';
import type tsp from 'typescript/lib/protocol.d.js';
import * as chai from 'chai';
import { provideOrganizeImports } from './organize-imports';
import { filePath, uri } from './test-utils';
import { CodeActionKind } from './utils/types';
import { provideOrganizeImports } from './organize-imports.js';
import { filePath, uri } from './test-utils.js';
import { CodeActionKind } from './utils/types.js';

describe('provideOrganizeImports', () => {
it('converts tsserver response to lsp code actions', () => {
Expand Down

0 comments on commit 0dfd411

Please sign in to comment.