From e98d044f006f6b5fa1070ff4c9945d80fc88049a Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 9 Feb 2022 12:49:32 +0100 Subject: [PATCH] chore: update to `typescript@4.5` (#11142) --- .eslintrc.js | 4 -- .github/workflows/nodejs.yml | 2 +- CHANGELOG.md | 1 + e2e/__tests__/resolveConditions.test.ts | 2 +- package.json | 6 +-- packages/expect/package.json | 2 +- packages/expect/src/__tests__/isError.test.ts | 2 +- packages/expect/src/toThrowMatchers.ts | 2 +- packages/jest-circus/src/run.ts | 4 +- packages/jest-circus/src/types.ts | 2 +- packages/jest-circus/src/utils.ts | 2 +- .../src/readConfigFileAndSetRootDir.ts | 2 +- packages/jest-core/src/TestScheduler.ts | 2 +- packages/jest-core/src/cli/index.ts | 2 +- packages/jest-core/src/runGlobalHook.ts | 2 +- .../jest-fake-timers/src/legacyFakeTimers.ts | 2 +- packages/jest-globals/src/index.ts | 2 +- packages/jest-jasmine2/src/PCancelable.ts | 2 +- .../jest-jasmine2/src/jasmineAsyncInstall.ts | 2 +- packages/jest-jasmine2/src/types.ts | 2 +- packages/jest-mock/src/index.ts | 2 +- packages/jest-resolve/src/resolver.ts | 2 +- packages/jest-runner/src/types.ts | 2 +- packages/jest-runtime/src/index.ts | 12 ++--- packages/jest-snapshot/src/index.ts | 2 +- packages/jest-types/package.json | 2 +- scripts/verifyOldTs.js | 12 ++--- yarn.lock | 48 +++++++++---------- 28 files changed, 63 insertions(+), 66 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e57f5c6f144e..053c92417e1a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,10 +35,6 @@ module.exports = { rules: { '@typescript-eslint/array-type': ['error', {default: 'generic'}], '@typescript-eslint/ban-types': 'error', - '@typescript-eslint/no-implicit-any-catch': [ - 'error', - {allowExplicitAny: true}, - ], '@typescript-eslint/no-unused-vars': [ 'error', {argsIgnorePattern: '^_'}, diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index ec9454127096..95e0f67f199a 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -59,7 +59,7 @@ jobs: run: yarn build - name: test typings run: yarn test-types - - name: verify TypeScript@3.8 compatibility + - name: verify TypeScript@4.2 compatibility run: yarn verify-old-ts - name: verify Yarn PnP compatibility run: yarn verify-pnp diff --git a/CHANGELOG.md b/CHANGELOG.md index f46fc07180b5..a67810c12ac3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### Chore & Maintenance - `[*]` [**BREAKING**] Drop support for Node v10 and v15 and target first LTS `16.13.0` ([#12220](https://github.com/facebook/jest/pull/12220)) +- `[*]` [**BREAKING**] Drop support for `typescript@3.8`, minimum version is now `4.2` ([#11142](https://github.com/facebook/jest/pull/11142)) - `[@jest/core]` Use `index.ts` instead of `jest.ts` as main export ([#12329](https://github.com/facebook/jest/pull/12329)) - `[jest]` Use `index.ts` instead of `jest.ts` as main export ([#12329](https://github.com/facebook/jest/pull/12329)) diff --git a/e2e/__tests__/resolveConditions.test.ts b/e2e/__tests__/resolveConditions.test.ts index 991a2b27e8b1..d1b8dd644a99 100644 --- a/e2e/__tests__/resolveConditions.test.ts +++ b/e2e/__tests__/resolveConditions.test.ts @@ -21,7 +21,7 @@ onNodeVersions('>=12.16.0', () => { }); try { expect(exitCode).toBe(0); - } catch (error: unknown) { + } catch (error) { console.log(`Test failed on iteration ${i + 1}`); throw error; } diff --git a/package.json b/package.json index 7d23024857a0..3c250f2bf109 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "@jest/globals": "workspace:*", "@jest/test-utils": "workspace:*", "@tsconfig/node12": "^1.0.9", - "@tsd/typescript": "~4.1.5", + "@tsd/typescript": "~4.5.5", "@types/babel__core": "^7.0.0", "@types/babel__generator": "^7.0.0", "@types/babel__template": "^7.0.0", @@ -55,7 +55,7 @@ "jest-changed-files": "workspace:*", "jest-junit": "^13.0.0", "jest-mock": "workspace:*", - "jest-runner-tsd": "^2.0.0", + "jest-runner-tsd": "^3.0.0", "jest-silent-reporter": "^0.5.0", "jest-snapshot": "workspace:*", "jest-watch-typeahead": "^0.6.0", @@ -79,7 +79,7 @@ "tempy": "^1.0.0", "throat": "^6.0.1", "ts-node": "^9.0.0", - "type-fest": "^1.1.1", + "type-fest": "^2.11.2", "typescript": "^4.0.2", "which": "^2.0.1" }, diff --git a/packages/expect/package.json b/packages/expect/package.json index 7687b97bc953..a7048305dffb 100644 --- a/packages/expect/package.json +++ b/packages/expect/package.json @@ -26,7 +26,7 @@ }, "devDependencies": { "@jest/test-utils": "^27.5.1", - "@tsd/typescript": "~4.1.5", + "@tsd/typescript": "~4.5.5", "chalk": "^4.0.0", "fast-check": "^2.0.0", "immutable": "^4.0.0", diff --git a/packages/expect/src/__tests__/isError.test.ts b/packages/expect/src/__tests__/isError.test.ts index ddfecd088f86..bb6a77c47e6d 100644 --- a/packages/expect/src/__tests__/isError.test.ts +++ b/packages/expect/src/__tests__/isError.test.ts @@ -43,7 +43,7 @@ describe('isError', () => { testErrorFromDifferentContext((win: Window) => { try { win.document.querySelectorAll(''); - } catch (e: unknown) { + } catch (e) { return e; } return null; diff --git a/packages/expect/src/toThrowMatchers.ts b/packages/expect/src/toThrowMatchers.ts index 3e5933551a49..8be9a79ae5fd 100644 --- a/packages/expect/src/toThrowMatchers.ts +++ b/packages/expect/src/toThrowMatchers.ts @@ -107,7 +107,7 @@ export const createMatcher = ( } else { try { received(); - } catch (e: unknown) { + } catch (e) { thrown = getThrown(e); } } diff --git a/packages/jest-circus/src/run.ts b/packages/jest-circus/src/run.ts index 287bad08a2dc..65d0cf283a9b 100644 --- a/packages/jest-circus/src/run.ts +++ b/packages/jest-circus/src/run.ts @@ -157,7 +157,7 @@ const _callCircusHook = async ({ timeout, }); await dispatch({describeBlock, hook, name: 'hook_success', test}); - } catch (error: unknown) { + } catch (error) { await dispatch({describeBlock, error, hook, name: 'hook_failure', test}); } }; @@ -180,7 +180,7 @@ const _callCircusTest = async ( timeout, }); await dispatch({name: 'test_fn_success', test}); - } catch (error: unknown) { + } catch (error) { await dispatch({error, name: 'test_fn_failure', test}); } }; diff --git a/packages/jest-circus/src/types.ts b/packages/jest-circus/src/types.ts index 98f36bf05af5..cb518790624a 100644 --- a/packages/jest-circus/src/types.ts +++ b/packages/jest-circus/src/types.ts @@ -7,7 +7,7 @@ // Used as type import type {Circus} from '@jest/types'; -import expect = require('expect'); +import type expect = require('expect'); export const STATE_SYM = Symbol( 'JEST_STATE_SYMBOL', diff --git a/packages/jest-circus/src/utils.ts b/packages/jest-circus/src/utils.ts index ff0eb059ce5f..faeb9dab00aa 100644 --- a/packages/jest-circus/src/utils.ts +++ b/packages/jest-circus/src/utils.ts @@ -253,7 +253,7 @@ export const callAsyncCircusFn = ( } else { try { returnedValue = fn.call(testContext); - } catch (error: unknown) { + } catch (error) { reject(error); return; } diff --git a/packages/jest-config/src/readConfigFileAndSetRootDir.ts b/packages/jest-config/src/readConfigFileAndSetRootDir.ts index 68155ff43b4a..a3e9d89abb58 100644 --- a/packages/jest-config/src/readConfigFileAndSetRootDir.ts +++ b/packages/jest-config/src/readConfigFileAndSetRootDir.ts @@ -39,7 +39,7 @@ export default async function readConfigFileAndSetRootDir( } else { configObject = await requireOrImportModule(configPath); } - } catch (error: unknown) { + } catch (error) { if (isTS) { throw new Error( `Jest: Failed to parse the TypeScript config file ${configPath}\n` + diff --git a/packages/jest-core/src/TestScheduler.ts b/packages/jest-core/src/TestScheduler.ts index 708e1a7bfd7e..2786a65f6753 100644 --- a/packages/jest-core/src/TestScheduler.ts +++ b/packages/jest-core/src/TestScheduler.ts @@ -286,7 +286,7 @@ class TestScheduler { ); } } - } catch (error: unknown) { + } catch (error) { if (!watcher.isInterrupted()) { throw error; } diff --git a/packages/jest-core/src/cli/index.ts b/packages/jest-core/src/cli/index.ts index 6e74f98b0250..8a546027d6b5 100644 --- a/packages/jest-core/src/cli/index.ts +++ b/packages/jest-core/src/cli/index.ts @@ -175,7 +175,7 @@ const _run10000 = async ( filterSetupPromise = (async () => { try { await rawFilter.setup(); - } catch (err: unknown) { + } catch (err) { return err; } return undefined; diff --git a/packages/jest-core/src/runGlobalHook.ts b/packages/jest-core/src/runGlobalHook.ts index 60de3085592e..93cf857ac4cd 100644 --- a/packages/jest-core/src/runGlobalHook.ts +++ b/packages/jest-core/src/runGlobalHook.ts @@ -58,7 +58,7 @@ export default async function runGlobalHook({ await globalModule(globalConfig); }, ); - } catch (error: unknown) { + } catch (error) { if (util.types.isNativeError(error)) { error.message = `Jest: Got error running ${moduleName} - ${modulePath}, reason: ${error.message}`; diff --git a/packages/jest-fake-timers/src/legacyFakeTimers.ts b/packages/jest-fake-timers/src/legacyFakeTimers.ts index 0afc385c638e..8d07c01920bf 100644 --- a/packages/jest-fake-timers/src/legacyFakeTimers.ts +++ b/packages/jest-fake-timers/src/legacyFakeTimers.ts @@ -308,7 +308,7 @@ export default class FakeTimers { let errThrown = false; try { cb(); - } catch (e: unknown) { + } catch (e) { errThrown = true; cbErr = e; } diff --git a/packages/jest-globals/src/index.ts b/packages/jest-globals/src/index.ts index 772ee1a8c5ff..6bebf8628f84 100644 --- a/packages/jest-globals/src/index.ts +++ b/packages/jest-globals/src/index.ts @@ -7,7 +7,7 @@ import type {Jest} from '@jest/environment'; import type {Global} from '@jest/types'; -import importedExpect = require('expect'); +import type importedExpect = require('expect'); export declare const jest: Jest; diff --git a/packages/jest-jasmine2/src/PCancelable.ts b/packages/jest-jasmine2/src/PCancelable.ts index d58e58ad0a3e..2c7b0aa826fe 100644 --- a/packages/jest-jasmine2/src/PCancelable.ts +++ b/packages/jest-jasmine2/src/PCancelable.ts @@ -75,7 +75,7 @@ export default class PCancelable implements PromiseLike { if (typeof this._cancel === 'function') { try { this._cancel(); - } catch (err: unknown) { + } catch (err) { this._reject(err); } } diff --git a/packages/jest-jasmine2/src/jasmineAsyncInstall.ts b/packages/jest-jasmine2/src/jasmineAsyncInstall.ts index 84836e81dba4..b7f705bd4b4e 100644 --- a/packages/jest-jasmine2/src/jasmineAsyncInstall.ts +++ b/packages/jest-jasmine2/src/jasmineAsyncInstall.ts @@ -212,7 +212,7 @@ function makeConcurrent( `Jest: concurrent test "${spec.getFullName()}" must return a Promise.`, ); }); - } catch (error: unknown) { + } catch (error) { promise = Promise.reject(error); } // Avoid triggering the uncaught promise rejection handler in case the test errors before diff --git a/packages/jest-jasmine2/src/types.ts b/packages/jest-jasmine2/src/types.ts index 4d0ff244005e..4efe3220864f 100644 --- a/packages/jest-jasmine2/src/types.ts +++ b/packages/jest-jasmine2/src/types.ts @@ -7,7 +7,7 @@ import type {AssertionError} from 'assert'; import type {Config} from '@jest/types'; -import expect = require('expect'); +import type expect = require('expect'); import type CallTracker from './jasmine/CallTracker'; import type Env from './jasmine/Env'; import type JsApiReporter from './jasmine/JsApiReporter'; diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index fb0e99fef11b..bd3e3e11c809 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -672,7 +672,7 @@ export class ModuleMocker { return undefined; })(); - } catch (error: unknown) { + } catch (error) { // Store the thrown error so we can record it, then re-throw it. thrownError = error; callDidThrowError = true; diff --git a/packages/jest-resolve/src/resolver.ts b/packages/jest-resolve/src/resolver.ts index f21bf9a4570c..4dacbc8fc5fd 100644 --- a/packages/jest-resolve/src/resolver.ts +++ b/packages/jest-resolve/src/resolver.ts @@ -123,7 +123,7 @@ export default class Resolver { paths: paths ? (nodePaths || []).concat(paths) : nodePaths, rootDir: options.rootDir, }); - } catch (e: unknown) { + } catch (e) { if (options.throwIfNotFound) { throw e; } diff --git a/packages/jest-runner/src/types.ts b/packages/jest-runner/src/types.ts index 65d0f7fdbd46..47c8194eeb30 100644 --- a/packages/jest-runner/src/types.ts +++ b/packages/jest-runner/src/types.ts @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import Emittery = require('emittery'); +import type Emittery = require('emittery'); import type {JestEnvironment} from '@jest/environment'; import type { SerializableError, diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 410dd84d9e0b..6d90e3845005 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import * as nativeModule from 'module'; +import nativeModule = require('module'); import * as path from 'path'; import {URL, fileURLToPath, pathToFileURL} from 'url'; import { @@ -512,7 +512,7 @@ export default class Runtime { this._esmoduleRegistry.set(cacheKey, module); transformResolve(); - } catch (error: unknown) { + } catch (error) { transformReject(error); throw error; } @@ -838,7 +838,7 @@ export default class Runtime { options, moduleRegistry, ); - } catch (error: unknown) { + } catch (error) { moduleRegistry.delete(modulePath); throw error; } @@ -1013,7 +1013,7 @@ export default class Runtime { } else { return this.requireModule(from, moduleName); } - } catch (e: unknown) { + } catch (e) { const moduleNotFound = Resolver.tryCastModuleNotFoundError(e); if (moduleNotFound) { if ( @@ -1279,7 +1279,7 @@ export default class Runtime { return this._resolveModule(from, moduleName, { conditions: this.cjsConditions, }); - } catch (err: unknown) { + } catch (err) { const module = this._resolver.getMockModule(from, moduleName); if (module) { @@ -1718,7 +1718,7 @@ export default class Runtime { let modulePath; try { modulePath = this._resolveModule(from, moduleName, options); - } catch (e: unknown) { + } catch (e) { const manualMock = this._resolver.getMockModule(from, moduleName); if (manualMock) { this._shouldMockModuleCache.set(moduleID, true); diff --git a/packages/jest-snapshot/src/index.ts b/packages/jest-snapshot/src/index.ts index 6a5d09c0f155..0c8e627f441e 100644 --- a/packages/jest-snapshot/src/index.ts +++ b/packages/jest-snapshot/src/index.ts @@ -511,7 +511,7 @@ const _toThrowErrorMatchingSnapshot = ( } else { try { received(); - } catch (e: unknown) { + } catch (e) { error = e; } } diff --git a/packages/jest-types/package.json b/packages/jest-types/package.json index b7fce84e5ae1..db5e3cdda5f2 100644 --- a/packages/jest-types/package.json +++ b/packages/jest-types/package.json @@ -27,7 +27,7 @@ "chalk": "^4.0.0" }, "devDependencies": { - "@tsd/typescript": "~4.1.5", + "@tsd/typescript": "~4.5.5", "tsd-lite": "^0.5.1" }, "publishConfig": { diff --git a/scripts/verifyOldTs.js b/scripts/verifyOldTs.js index 543b9c5c0d22..63fb10a88e24 100644 --- a/scripts/verifyOldTs.js +++ b/scripts/verifyOldTs.js @@ -16,25 +16,25 @@ const tempy = require('tempy'); const jestDirectory = path.resolve(__dirname, '../packages/jest'); +/* eslint-disable sort-keys */ const tsConfig = { + extends: '@tsconfig/node12/tsconfig.json', compilerOptions: { esModuleInterop: false, - lib: ['es2018'], - module: 'commonjs', moduleResolution: 'node', noEmit: true, - strict: true, - target: 'es5', }, }; +/* eslint-enable */ + const cwd = tempy.directory(); -const tsVersion = '3.8'; +const tsVersion = '4.2'; try { fs.writeFileSync(path.join(cwd, '.yarnrc.yml'), 'nodeLinker: node-modules\n'); execa.sync('yarn', ['init', '--yes'], {cwd, stdio: 'inherit'}); - execa.sync('yarn', ['add', `typescript@~${tsVersion}`], { + execa.sync('yarn', ['add', `typescript@~${tsVersion}`, '@tsconfig/node12'], { cwd, stdio: 'inherit', }); diff --git a/yarn.lock b/yarn.lock index 82608c7f82f6..3770031ed896 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2600,7 +2600,7 @@ __metadata: "@jest/globals": "workspace:*" "@jest/test-utils": "workspace:*" "@tsconfig/node12": ^1.0.9 - "@tsd/typescript": ~4.1.5 + "@tsd/typescript": ~4.5.5 "@types/babel__core": ^7.0.0 "@types/babel__generator": ^7.0.0 "@types/babel__template": ^7.0.0 @@ -2642,7 +2642,7 @@ __metadata: jest-changed-files: "workspace:*" jest-junit: ^13.0.0 jest-mock: "workspace:*" - jest-runner-tsd: ^2.0.0 + jest-runner-tsd: ^3.0.0 jest-silent-reporter: ^0.5.0 jest-snapshot: "workspace:*" jest-watch-typeahead: ^0.6.0 @@ -2666,7 +2666,7 @@ __metadata: tempy: ^1.0.0 throat: ^6.0.1 ts-node: ^9.0.0 - type-fest: ^1.1.1 + type-fest: ^2.11.2 typescript: ^4.0.2 which: ^2.0.1 languageName: unknown @@ -2803,7 +2803,7 @@ __metadata: version: 0.0.0-use.local resolution: "@jest/types@workspace:packages/jest-types" dependencies: - "@tsd/typescript": ~4.1.5 + "@tsd/typescript": ~4.5.5 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" @@ -4486,13 +4486,13 @@ __metadata: languageName: node linkType: hard -"@tsd/typescript@npm:~4.1.5": - version: 4.1.5 - resolution: "@tsd/typescript@npm:4.1.5" +"@tsd/typescript@npm:~4.5.5": + version: 4.5.5 + resolution: "@tsd/typescript@npm:4.5.5" bin: tsc: typescript/bin/tsc tsserver: typescript/bin/tsserver - checksum: a4a26ccec418c9f55b50eaa8b1d24566d56cced6657812b84d075dba7c5a5267e8c0f36288bebcdac6ced9ced7dd418ff106557f18bf2b6311b695c5288591fc + checksum: 6b57a087b713530966f073b47837c47a52adf7f4b036495853283ff0a6d7b39ec6d6a59105ca4708bb715f7a8551f4dd004de20ca0b72c396103c360841b6aab languageName: node linkType: hard @@ -9935,7 +9935,7 @@ __metadata: dependencies: "@jest/test-utils": ^27.5.1 "@jest/types": ^27.5.1 - "@tsd/typescript": ~4.1.5 + "@tsd/typescript": ~4.5.5 chalk: ^4.0.0 fast-check: ^2.0.0 immutable: ^4.0.0 @@ -13026,9 +13026,9 @@ __metadata: languageName: unknown linkType: soft -"jest-runner-tsd@npm:^2.0.0": - version: 2.0.0 - resolution: "jest-runner-tsd@npm:2.0.0" +"jest-runner-tsd@npm:^3.0.0": + version: 3.0.0 + resolution: "jest-runner-tsd@npm:3.0.0" dependencies: "@babel/code-frame": ^7.15.8 chalk: ^4.1.2 @@ -13036,7 +13036,7 @@ __metadata: tsd-lite: ^0.5.0 peerDependencies: "@tsd/typescript": ^3.8.3 || ^4.0.7 - checksum: 5c86e565036b4d5dd11c2669d5e8ac8508d794c6ee39044ae10f979d5b5ead7d98b6cae34bb1b31d4d197d3fe0bcc11a85ef158aaa61d7ab955c008758ac646d + checksum: 33f7145d7dc983ccfa9706e9926c57d30957265bf3c2171a8ecca5bfd7f3ab06b4dd668edcf02b0bd7f356020c4999d16d76aa666eed5b64da8d73ef7b12a061 languageName: node linkType: hard @@ -20857,10 +20857,10 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^1.1.1": - version: 1.4.0 - resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 +"type-fest@npm:^2.11.2": + version: 2.11.2 + resolution: "type-fest@npm:2.11.2" + checksum: b36f73b9e739d4044f511fa3233eb36d365f5fbf5b120810ec5c6a31b8a6c7a2caeba2fb725491ccfb41a37aac8862e67f4383fc178a0c6074d27c424fe7c764 languageName: node linkType: hard @@ -20890,23 +20890,23 @@ __metadata: languageName: node linkType: hard -"typescript@*, typescript@^4.0.2, typescript@^4.0.3": - version: 4.1.6 - resolution: "typescript@npm:4.1.6" +"typescript@*, typescript@npm:^4.0.2, typescript@npm:^4.0.3": + version: 4.5.5 + resolution: "typescript@npm:4.5.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 54aed909f94b16178c8a8d8911871b4e1c04454a3e6c82166715e28083e7ce6271e4d1df6f82c89544a4759b07aec780785032534e9c93b254e2107a18712c05 + checksum: 506f4c919dc8aeaafa92068c997f1d213b9df4d9756d0fae1a1e7ab66b585ab3498050e236113a1c9e57ee08c21ec6814ca7a7f61378c058d79af50a4b1f5a5e languageName: node linkType: hard "typescript@patch:typescript@*#~builtin, typescript@patch:typescript@^4.0.2#~builtin, typescript@patch:typescript@^4.0.3#~builtin": - version: 4.1.6 - resolution: "typescript@patch:typescript@npm%3A4.1.6#~builtin::version=4.1.6&hash=493e53" + version: 4.5.5 + resolution: "typescript@patch:typescript@npm%3A4.5.5#~builtin::version=4.5.5&hash=493e53" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 3bd9915f236817e4e2d32dd0d90e8902875929f014bb87a478000e32adda91d12f0425931ee6f9d6a2bc7d0c9242588fcee1050ac294497dfabf27d3d73b335c + checksum: c05c318d79c690f101d7ffb34cd6c7d6bbd884d3af9cefe7749ad0cd6be43c7082f098280982ca945dcba23fde34a08fed9602bb26540936baf8c0520727d3ba languageName: node linkType: hard