diff --git a/package.json b/package.json index c0437d4e381..97be489b4c1 100644 --- a/package.json +++ b/package.json @@ -98,9 +98,9 @@ "ts-jest": "^25.5.1", "ts-node": "^8.10.1", "tslint": "^6.1.2", - "typescript": ">=3.3.1 <4.0.0" + "typescript": ">=3.3.1 <4.0.0 || 4.0.0-beta" }, "resolutions": { - "typescript": "3.9.2" + "typescript": "4.0.0-beta" } } diff --git a/packages/scope-manager/package.json b/packages/scope-manager/package.json index f4144b548fb..5f3f8362552 100644 --- a/packages/scope-manager/package.json +++ b/packages/scope-manager/package.json @@ -31,6 +31,7 @@ "build": "tsc -b tsconfig.build.json", "postbuild": "downlevel-dts dist _ts3.4/dist", "clean": "tsc -b tsconfig.build.json --clean", + "postclean": "rimraf dist", "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore", "generate:lib": "../../node_modules/.bin/ts-node --files --transpile-only tools/generate-lib.ts", "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'", diff --git a/packages/types/package.json b/packages/types/package.json index f2fed8bd8ff..0debad16ccc 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -33,7 +33,6 @@ "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore", "generate:lib": "../../node_modules/.bin/ts-node --files --transpile-only ../scope-manager/tools/generate-lib.ts", "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'", - "test": "jest --coverage", "typecheck": "tsc -p tsconfig.json --noEmit" }, "funding": { diff --git a/packages/typescript-estree/src/ast-converter.ts b/packages/typescript-estree/src/ast-converter.ts index 36ca1830ccd..e42f722ff66 100644 --- a/packages/typescript-estree/src/ast-converter.ts +++ b/packages/typescript-estree/src/ast-converter.ts @@ -40,9 +40,13 @@ export function astConverter( simpleTraverse(estree, { enter: node => { if (!extra.range) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- TS 4.0 made this an error because the types aren't optional + // @ts-expect-error delete node.range; } if (!extra.loc) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- TS 4.0 made this an error because the types aren't optional + // @ts-expect-error delete node.loc; } }, diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index 3f53b4c8205..4a5b9f513d6 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -1983,19 +1983,12 @@ export class Converter { raw: 'false', }); - case SyntaxKind.NullKeyword: { - if (this.inTypeMode) { - return this.createNode(node, { - type: AST_NODE_TYPES.TSNullKeyword, - }); - } else { - return this.createNode(node as ts.NullLiteral, { - type: AST_NODE_TYPES.Literal, - value: null, - raw: 'null', - }); - } - } + case SyntaxKind.NullKeyword: + return this.createNode(node, { + type: AST_NODE_TYPES.Literal, + value: null, + raw: 'null', + }); case SyntaxKind.EmptyStatement: return this.createNode(node, { @@ -2620,9 +2613,12 @@ export class Converter { // In TS 4.0, the `elementTypes` property was changed to `elements`. // To support both at compile time, we cast to access the newer version // if the former does not exist. - const elementTypes = node.elementTypes - ? node.elementTypes.map(el => this.convertType(el)) - : (node as any).elements.map((el: ts.Node) => this.convertType(el)); + const elementTypes = + 'elementTypes' in node + ? (node as any).elementTypes.map((el: ts.Node) => + this.convertType(el), + ) + : node.elements.map((el: ts.Node) => this.convertType(el)); return this.createNode(node, { type: AST_NODE_TYPES.TSTupleType, @@ -2661,10 +2657,21 @@ export class Converter { }); } case SyntaxKind.LiteralType: { - return this.createNode(node, { - type: AST_NODE_TYPES.TSLiteralType, - literal: this.convertType(node.literal), - }); + if (node.literal.kind === SyntaxKind.NullKeyword) { + // 4.0.0 started nesting null types inside a LiteralType node + // but our AST is designed around the old way of null being a keyword + return this.createNode( + node.literal as ts.NullLiteral, + { + type: AST_NODE_TYPES.TSNullKeyword, + }, + ); + } else { + return this.createNode(node, { + type: AST_NODE_TYPES.TSLiteralType, + literal: this.convertType(node.literal), + }); + } } case SyntaxKind.TypeAssertionExpression: { return this.createNode(node, { diff --git a/packages/typescript-estree/src/node-utils.ts b/packages/typescript-estree/src/node-utils.ts index 39459935c87..b97f78b8dbd 100644 --- a/packages/typescript-estree/src/node-utils.ts +++ b/packages/typescript-estree/src/node-utils.ts @@ -67,8 +67,11 @@ interface TokenToText { [SyntaxKind.GreaterThanGreaterThanEqualsToken]: '>>='; [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: '>>>='; [SyntaxKind.AmpersandEqualsToken]: '&='; + [SyntaxKind.AmpersandAmpersandEqualsToken]: '&&='; [SyntaxKind.BarEqualsToken]: '|='; + [SyntaxKind.BarBarEqualsToken]: '||='; [SyntaxKind.CaretEqualsToken]: '^='; + [SyntaxKind.QuestionQuestionEqualsToken]: '??='; [SyntaxKind.AtToken]: '@'; [SyntaxKind.InKeyword]: 'in'; [SyntaxKind.UniqueKeyword]: 'unique'; diff --git a/packages/typescript-estree/tests/lib/__snapshots__/convert.test.ts.snap b/packages/typescript-estree/tests/lib/__snapshots__/convert.test.ts.snap index 448b85afda1..7da28080eb3 100644 --- a/packages/typescript-estree/tests/lib/__snapshots__/convert.test.ts.snap +++ b/packages/typescript-estree/tests/lib/__snapshots__/convert.test.ts.snap @@ -170,7 +170,7 @@ Object { }, ], "text": "new foo()", - "transformFlags": 0, + "transformFlags": 9, "type": "TSSourceFile", "typeReferenceDirectives": Array [], } @@ -190,6 +190,8 @@ Object { "line": 1, }, }, + "localSymbol": undefined, + "locals": undefined, "modifiers": undefined, "name": Object { "escapedText": "foo", @@ -203,6 +205,7 @@ Object { "line": 1, }, }, + "originalKeywordKind": undefined, "range": Array [ 5, 8, @@ -210,11 +213,13 @@ Object { "transformFlags": 0, "type": "TSUnparsedPrologue", }, + "nextContainer": undefined, "range": Array [ 0, 35, ], - "transformFlags": 0, + "symbol": undefined, + "transformFlags": 1, "type": "TSUnparsedPrologue", "typeAnnotation": null, "typeParameters": null, @@ -289,6 +294,8 @@ Object { "line": 1, }, }, + "localSymbol": undefined, + "locals": undefined, "members": Array [], "modifiers": undefined, "name": Object { @@ -309,11 +316,13 @@ Object { ], "type": "Identifier", }, + "nextContainer": undefined, "range": Array [ 0, 18, ], - "transformFlags": 0, + "symbol": undefined, + "transformFlags": 2305, "type": "TSClassDeclaration", "typeParameters": null, } @@ -354,7 +363,7 @@ Object { 0, 12, ], - "transformFlags": 0, + "transformFlags": 9, "type": "TSNewExpression", "typeParameters": Object { "loc": Object { @@ -427,7 +436,10 @@ Object { "line": 1, }, }, + "localSymbol": undefined, + "locals": undefined, "members": Array [], + "modifiers": undefined, "name": Object { "loc": Object { "end": Object { @@ -446,11 +458,13 @@ Object { ], "type": "Identifier", }, + "nextContainer": undefined, "range": Array [ 0, 15, ], - "transformFlags": 0, + "symbol": undefined, + "transformFlags": 257, "type": "TSClassDeclaration", "typeParameters": Object { "loc": Object { diff --git a/packages/typescript-estree/tests/lib/__snapshots__/semantic-diagnostics-enabled.test.ts.snap b/packages/typescript-estree/tests/lib/__snapshots__/semantic-diagnostics-enabled.test.ts.snap index f94806437fe..df2e9b945df 100644 --- a/packages/typescript-estree/tests/lib/__snapshots__/semantic-diagnostics-enabled.test.ts.snap +++ b/packages/typescript-estree/tests/lib/__snapshots__/semantic-diagnostics-enabled.test.ts.snap @@ -1499,8 +1499,8 @@ Object { exports[`Parse all fixtures with "errorOnTypeScriptSyntacticAndSemanticIssues" enabled fixtures/jsx/invalid-no-common-parent.src 1`] = ` Object { - "column": 36, - "index": 36, + "column": 8, + "index": 8, "lineNumber": 1, "message": "JSX expressions must have one parent element.", } @@ -1508,8 +1508,8 @@ Object { exports[`Parse all fixtures with "errorOnTypeScriptSyntacticAndSemanticIssues" enabled fixtures/jsx/invalid-no-common-parent-with-comment.src 1`] = ` Object { - "column": 63, - "index": 63, + "column": 8, + "index": 8, "lineNumber": 1, "message": "JSX expressions must have one parent element.", } diff --git a/packages/typescript-estree/tests/lib/convert.test.ts b/packages/typescript-estree/tests/lib/convert.test.ts index 0dd26908dd6..52bd377a5bf 100644 --- a/packages/typescript-estree/tests/lib/convert.test.ts +++ b/packages/typescript-estree/tests/lib/convert.test.ts @@ -19,6 +19,8 @@ describe('convert', () => { function fakeUnknownKind(node: ts.Node): void { ts.forEachChild(node, fakeUnknownKind); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment -- intentionally writing to a readonly field + // @ts-expect-error node.kind = ts.SyntaxKind.UnparsedPrologue; } diff --git a/packages/typescript-estree/tests/snapshots/typescript/errorRecovery/enum-with-keywords.src.ts.shot b/packages/typescript-estree/tests/snapshots/typescript/errorRecovery/enum-with-keywords.src.ts.shot index 2e05ff3b652..2a93eb27f3d 100644 --- a/packages/typescript-estree/tests/snapshots/typescript/errorRecovery/enum-with-keywords.src.ts.shot +++ b/packages/typescript-estree/tests/snapshots/typescript/errorRecovery/enum-with-keywords.src.ts.shot @@ -50,7 +50,7 @@ Object { 7, 14, ], - "transformFlags": 0, + "transformFlags": 1, "type": "TSPrivateKeyword", }, Object { @@ -68,7 +68,7 @@ Object { 15, 21, ], - "transformFlags": 0, + "transformFlags": 1, "type": "TSPublicKeyword", }, Object { @@ -86,7 +86,7 @@ Object { 22, 31, ], - "transformFlags": 0, + "transformFlags": 1, "type": "TSProtectedKeyword", }, Object { @@ -104,7 +104,7 @@ Object { 32, 38, ], - "transformFlags": 0, + "transformFlags": 256, "type": "TSStaticKeyword", }, Object { @@ -122,7 +122,7 @@ Object { 39, 47, ], - "transformFlags": 0, + "transformFlags": 1, "type": "TSReadonlyKeyword", }, Object { @@ -157,7 +157,7 @@ Object { 57, 62, ], - "transformFlags": 0, + "transformFlags": 96, "type": "TSAsyncKeyword", }, ], diff --git a/yarn.lock b/yarn.lock index 2dd7bc3c78c..2a4e539b470 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8575,10 +8575,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@*, typescript@3.9.2, "typescript@>=3.3.1 <4.0.0", typescript@^3.8.0-dev.20200111: - version "3.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.2.tgz#64e9c8e9be6ea583c54607677dd4680a1cf35db9" - integrity sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw== +typescript@*, typescript@4.0.0-beta, "typescript@>=3.3.1 <4.0.0 || 4.0.0-beta", typescript@^3.8.0-dev.20200111: + version "4.0.0-beta" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.0-beta.tgz#a6a65e430562131de69496a3ef5484346bc0cdd2" + integrity sha512-d3s/CogGtB2uPZ2Z8ts6eoUxxyB9PH3R27/UrzvpthuOvpCg4FWWnBbBiqJ0K4eu6eTlgmLiqQkh2dquReJweA== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6"