diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index d9449ff..57c8c14 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -19,9 +19,9 @@ jobs: name: Node ${{ matrix.node-version }} steps: - uses: actions/checkout@v4 - - name: Use Node.js ${{ matrix.node-version }} + - name: Setup Node uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm install - - run: npm run test + - run: npm test diff --git a/.gitignore b/.gitignore index d68dcc8..57e573c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ node_modules dist *.vsix -.tsimp coverage diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c159f6a..0000000 --- a/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - lts/* diff --git a/.xo-config.json b/.xo-config.json index 7d97dbe..a197a67 100644 --- a/.xo-config.json +++ b/.xo-config.json @@ -16,6 +16,12 @@ "rules": { "@typescript-eslint/consistent-type-definitions": ["error", "interface"] } + }, + { + "files": "test/**/*.ts", + "rules": { + "@typescript-eslint/no-floating-promises": "off" + } } ] } diff --git a/package-lock.json b/package-lock.json index 838db88..5979b4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,7 @@ "prettier-plugin-packagejson": "^2.4.9", "rimraf": "^5.0.5", "tsimp": "^2.0.10", + "tsx": "^4.7.0", "typescript": "^5.3.3", "webfont": "^6.0.2", "xo": "^0.56.0" @@ -4205,6 +4206,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -8901,6 +8916,25 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/tsx": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", + "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/ttf2eot": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-2.0.0.tgz", @@ -13291,6 +13325,13 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, "fstream": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", @@ -16705,6 +16746,17 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "tsx": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", + "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "dev": true, + "requires": { + "esbuild": "~0.19.10", + "fsevents": "~2.3.3", + "get-tsconfig": "^4.7.2" + } + }, "ttf2eot": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-2.0.0.tgz", diff --git a/package.json b/package.json index 7390052..664b737 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "lint": "xo && npm run lint:md", "lint:md": "prettier --parser markdown '**/*.md' --check", "prepare": "husky install", - "test:": "rimraf .tsimp && NODE_NO_WARNINGS=1 node --import tsimp/import --test test/native/**/*.ts", - "test:coverage": "rimraf .tsimp && NODE_NO_WARNINGS=1 c8 node --import tsimp/import --test test/native/**/*.ts", + "test": "NODE_NO_WARNINGS=1 node --require tsx/cjs --test test/index.ts", + "test:coverage": "NODE_NO_WARNINGS=1 c8 node --require tsx/cjs --test test/index.ts", "vscode:prepublish": "npm run check && npm run build" }, "contributes": { @@ -212,7 +212,7 @@ "prettier": "^3.1.1", "prettier-plugin-packagejson": "^2.4.9", "rimraf": "^5.0.5", - "tsimp": "^2.0.10", + "tsx": "^4.7.0", "typescript": "^5.3.3", "webfont": "^6.0.2", "xo": "^0.56.0" diff --git a/test/index.ts b/test/index.ts index 359229c..250f208 100644 --- a/test/index.ts +++ b/test/index.ts @@ -1,15 +1,7 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ -import {test, describe} from 'node:test'; -import assert from 'node:assert'; -import Server from '../server/server.js'; +/* eslint-disable import/no-unassigned-import */ +// since globs are not fully supported in node v18 and v20 we import the files manually here -describe('Server', () => { - test('Server is a function', (t) => { - assert.strictEqual(typeof Server, 'function'); - }); - - test('Server can instantiate', (t) => { - const server = new Server({isTest: true}); - assert.strictEqual(typeof server, 'object'); - }); -}); +// TODO: remove this file once node v21 is LTS +import './server.js'; +import './lsp/document-sync.js'; +import './lsp/initialization.js'; diff --git a/test/lsp/document-sync.ts b/test/lsp/document-sync.ts index 0b35841..4c9df4e 100644 --- a/test/lsp/document-sync.ts +++ b/test/lsp/document-sync.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ import {test, describe, mock, type Mock} from 'node:test'; import assert from 'node:assert'; import {TextDocument} from 'vscode-languageserver-textdocument'; diff --git a/test/lsp/initialization.ts b/test/lsp/initialization.ts index 94db7c1..dc2ade3 100644 --- a/test/lsp/initialization.ts +++ b/test/lsp/initialization.ts @@ -1,16 +1,15 @@ -/* eslint-disable @typescript-eslint/no-floating-promises */ import {describe, test} from 'node:test'; import assert from 'node:assert'; import Server from '../../server/server.js'; -const server = new Server({isTest: true}); +describe('Server.handleInitialize', async () => { + const server = new Server({isTest: true}); -describe('Server.handleInitialize', () => { - test('Server.handleInitialize is a function', (t) => { + await test('Server.handleInitialize is a function', (t) => { assert.equal(typeof server.handleInitialize, 'function'); }); - test('InitializeResult matches snapshot', async (t) => { + await test('InitializeResult matches snapshot', async (t) => { const result = await server.handleInitialize(); assert.deepEqual(result, { capabilities: { diff --git a/test/server.ts b/test/server.ts new file mode 100644 index 0000000..222d651 --- /dev/null +++ b/test/server.ts @@ -0,0 +1,14 @@ +import {test, describe} from 'node:test'; +import assert from 'node:assert'; +import Server from '../server/server.js'; + +describe('Server', () => { + test('Server is a function', (t) => { + assert.strictEqual(typeof Server, 'function'); + }); + + test('Server can instantiate', (t) => { + const server = new Server({isTest: true}); + assert.strictEqual(typeof server, 'object'); + }); +});