diff --git a/.eslintrc.js b/.eslintrc.js index f505a7f012eb..4aa35ae4305f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -6,6 +6,7 @@ module.exports = { 'jest', 'import', 'eslint-comments', + '@typescript-eslint/internal', ], env: { es6: true, @@ -117,6 +118,11 @@ module.exports = { 'import/no-self-import': 'error', // Require modules with a single export to use a default export 'import/prefer-default-export': 'off', // we want everything to be named + + // + // Internal repo rules + // + '@typescript-eslint/internal/no-typescript-default-import': 'error', }, parserOptions: { sourceType: 'module', @@ -127,8 +133,10 @@ module.exports = { tsconfigRootDir: __dirname, }, overrides: [ + // all test files { files: [ + 'packages/eslint-plugin-internal/tests/**/*.test.ts', 'packages/eslint-plugin-tslint/tests/**/*.ts', 'packages/eslint-plugin/tests/**/*.test.ts', 'packages/parser/tests/**/*.ts', @@ -138,6 +146,7 @@ module.exports = { 'jest/globals': true, }, rules: { + 'eslint-plugin/no-identical-tests': 'error', 'jest/no-disabled-tests': 'warn', 'jest/no-focused-tests': 'error', 'jest/no-alias-methods': 'error', @@ -152,26 +161,31 @@ module.exports = { 'jest/valid-expect': 'error', }, }, + // plugin source files { files: [ - 'packages/eslint-plugin/tests/**/*.test.ts', - 'packages/eslint-plugin-tslint/tests/**/*.spec.ts', + 'packages/eslint-plugin-internal/**/*.ts', + 'packages/eslint-plugin-tslint/**/*.ts', + 'packages/eslint-plugin/**/*.ts', ], rules: { - 'eslint-plugin/no-identical-tests': 'error', + '@typescript-eslint/internal/no-typescript-estree-import': 'error', }, }, + // rule source files { files: [ - 'packages/eslint-plugin/src/rules/**/*.ts', - 'packages/eslint-plugin/src/configs/**/*.ts', + 'packages/eslint-plugin-internal/src/rules/**/*.ts', 'packages/eslint-plugin-tslint/src/rules/**/*.ts', + 'packages/eslint-plugin/src/configs/**/*.ts', + 'packages/eslint-plugin/src/rules/**/*.ts', ], rules: { // specifically for rules - default exports makes the tooling easier 'import/no-default-export': 'off', }, }, + // tools and tests { files: ['**/tools/**/*.ts', '**/tests/**/*.ts'], rules: { diff --git a/.vscode/launch.json b/.vscode/launch.json index 6552aae66136..9f1633f32aba 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -20,6 +20,22 @@ "console": "integratedTerminal", "internalConsoleOptions": "neverOpen" }, + { + "type": "node", + "request": "launch", + "name": "Jest Test Current eslint-plugin-internal Rule", + "cwd": "${workspaceFolder}/packages/eslint-plugin-internal/", + "program": "${workspaceFolder}/node_modules/jest/bin/jest.js", + "args": [ + "--runInBand", + "--no-coverage", + // needs the '' around it so that the () are properly handled + "'tests/(.+/)?${fileBasenameNoExtension}'" + ], + "sourceMaps": true, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, { "type": "node", "request": "launch", diff --git a/packages/eslint-plugin-internal/README.md b/packages/eslint-plugin-internal/README.md new file mode 100644 index 000000000000..bf6ed0bbe384 --- /dev/null +++ b/packages/eslint-plugin-internal/README.md @@ -0,0 +1,5 @@ +# `eslint-plugin-internal` + +This is just a collection of internal lint rules to help enforce some guidelines specific to this repository. + +These are not intended to be used externally. diff --git a/packages/eslint-plugin-internal/jest.config.js b/packages/eslint-plugin-internal/jest.config.js new file mode 100644 index 000000000000..b64d433b01aa --- /dev/null +++ b/packages/eslint-plugin-internal/jest.config.js @@ -0,0 +1,13 @@ +'use strict'; + +module.exports = { + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + testRegex: './tests/.+\\.test\\.ts$', + collectCoverage: false, + collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + coverageReporters: ['text-summary', 'lcov'], +}; diff --git a/packages/eslint-plugin-internal/package.json b/packages/eslint-plugin-internal/package.json new file mode 100644 index 000000000000..d8c69d15f6fa --- /dev/null +++ b/packages/eslint-plugin-internal/package.json @@ -0,0 +1,18 @@ +{ + "name": "@typescript-eslint/eslint-plugin-internal", + "version": "2.13.0", + "private": true, + "main": "dist/index.js", + "scripts": { + "build": "tsc -b tsconfig.build.json", + "clean": "tsc -b tsconfig.build.json --clean", + "format": "prettier --write \"./**/*.{ts,js,json,md}\" --ignore-path ../../.prettierignore", + "lint": "eslint . --ext .js,.ts --ignore-path='../../.eslintignore'", + "test": "jest --coverage", + "typecheck": "tsc -p tsconfig.json --noEmit" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": "2.13.0" + }, + "devDependencies": {} +} diff --git a/packages/eslint-plugin-internal/src/index.ts b/packages/eslint-plugin-internal/src/index.ts new file mode 100644 index 000000000000..0802acef98a8 --- /dev/null +++ b/packages/eslint-plugin-internal/src/index.ts @@ -0,0 +1,5 @@ +import rules from './rules'; + +export = { + rules, +}; diff --git a/packages/eslint-plugin-internal/src/rules/index.ts b/packages/eslint-plugin-internal/src/rules/index.ts new file mode 100644 index 000000000000..800c448e041b --- /dev/null +++ b/packages/eslint-plugin-internal/src/rules/index.ts @@ -0,0 +1,7 @@ +import noTypescriptDefaultImport from './no-typescript-default-import'; +import noTypescriptEstreeImport from './no-typescript-estree-import'; + +export default { + 'no-typescript-default-import': noTypescriptDefaultImport, + 'no-typescript-estree-import': noTypescriptEstreeImport, +}; diff --git a/packages/eslint-plugin-internal/src/rules/no-typescript-default-import.ts b/packages/eslint-plugin-internal/src/rules/no-typescript-default-import.ts new file mode 100644 index 000000000000..ff4e35dc4f60 --- /dev/null +++ b/packages/eslint-plugin-internal/src/rules/no-typescript-default-import.ts @@ -0,0 +1,80 @@ +import { + TSESTree, + AST_NODE_TYPES, +} from '@typescript-eslint/experimental-utils'; +import { createRule } from '../util'; + +/* +We have `allowSyntheticDefaultImports` turned on in this project, so there are two problems that arise: +- TypeScript's auto import will suggest `import ts = require('typescript');` if you type `ts` +- VSCode's suggestion feature will suggest changing `import * as ts from 'typescript'` to `import ts from 'typescript'` + +In order to keep compatibility with a wide range of consumers, some of whom don't use `allowSyntheticDefaultImports`, we should +always use either: +- `import * as ts from 'typescript';` +- `import { SyntaxKind } from 'typescript';` +*/ + +export default createRule({ + name: 'no-typescript-default-import', + meta: { + type: 'problem', + docs: { + description: + "Enforces that packages rules don't do `import ts from 'typescript';`", + category: 'Possible Errors', + recommended: 'error', + }, + fixable: 'code', + schema: [], + messages: { + noTSDefaultImport: [ + "Do not use the default import for typescript. Doing so will cause the package's type definitions to do the same.", + "This causes errors for consumers if they don't use the allowSyntheticDefaultImports compiler option.", + ].join('\n'), + }, + }, + defaultOptions: [], + create(context) { + return { + 'ImportDeclaration > ImportDefaultSpecifier'( + node: TSESTree.ImportDefaultSpecifier, + ): void { + const importStatement = node.parent as TSESTree.ImportDeclaration; + if (importStatement.source.value === 'typescript') { + context.report({ + node, + messageId: 'noTSDefaultImport', + fix(fixer) { + if (importStatement.specifiers.length === 1) { + return fixer.replaceText(node, '* as ts'); + } + + return null; + }, + }); + } + }, + 'TSImportEqualsDeclaration > TSExternalModuleReference'( + node: TSESTree.TSExternalModuleReference, + ): void { + const parent = node.parent as TSESTree.TSImportEqualsDeclaration; + if ( + node.expression.type === AST_NODE_TYPES.Literal && + node.expression.value === 'typescript' + ) { + context.report({ + node, + messageId: 'noTSDefaultImport', + fix(fixer) { + return fixer.replaceText( + parent, + "import * as ts from 'typescript';", + ); + }, + }); + } + }, + }; + }, +}); diff --git a/packages/eslint-plugin-internal/src/rules/no-typescript-estree-import.ts b/packages/eslint-plugin-internal/src/rules/no-typescript-estree-import.ts new file mode 100644 index 000000000000..2a879c142094 --- /dev/null +++ b/packages/eslint-plugin-internal/src/rules/no-typescript-estree-import.ts @@ -0,0 +1,52 @@ +import { createRule } from '../util'; + +const TSESTREE_NAME = '@typescript-eslint/typescript-estree'; +const UTILS_NAME = '@typescript-eslint/experimental-utils'; + +/* +Typescript will not error if people use typescript-estree within eslint-plugin. +This is because it's an indirect dependency. +We don't want people to import it, instead we want them to import from the utils package. +*/ + +export default createRule({ + name: 'no-typescript-estree-import', + meta: { + type: 'problem', + docs: { + description: `Enforces that eslint-plugin rules don't require anything from ${TSESTREE_NAME}`, + category: 'Possible Errors', + recommended: 'error', + }, + fixable: 'code', + schema: [], + messages: { + dontImportTSEStree: [ + `Don't import from ${TSESTREE_NAME}. Everything you need should be available in ${UTILS_NAME}.`, + `${TSESTREE_NAME} is an indirect dependency of this package, and thus should not be used directly.`, + ].join('\n'), + }, + }, + defaultOptions: [], + create(context) { + return { + ImportDeclaration(node): void { + if ( + typeof node.source.value === 'string' && + node.source.value.startsWith(TSESTREE_NAME) + ) { + context.report({ + node, + messageId: 'dontImportTSEStree', + fix(fixer) { + return fixer.replaceTextRange( + [node.source.range[0] + 1, node.source.range[1] - 1], + UTILS_NAME, + ); + }, + }); + } + }, + }; + }, +}); diff --git a/packages/eslint-plugin-internal/src/util/createRule.ts b/packages/eslint-plugin-internal/src/util/createRule.ts new file mode 100644 index 000000000000..24c630d52450 --- /dev/null +++ b/packages/eslint-plugin-internal/src/util/createRule.ts @@ -0,0 +1,11 @@ +import { ESLintUtils } from '@typescript-eslint/experimental-utils'; + +// note - cannot migrate this to an import statement because it will make TSC copy the package.json to the dist folder +const version = require('../../package.json').version; + +const createRule = ESLintUtils.RuleCreator( + name => + `https://github.com/typescript-eslint/typescript-eslint/blob/v${version}/packages/eslint-plugin-internal/src/rules/${name}.ts`, +); + +export { createRule }; diff --git a/packages/eslint-plugin-internal/src/util/index.ts b/packages/eslint-plugin-internal/src/util/index.ts new file mode 100644 index 000000000000..cd13da0f5cd3 --- /dev/null +++ b/packages/eslint-plugin-internal/src/util/index.ts @@ -0,0 +1 @@ +export * from './createRule'; diff --git a/packages/eslint-plugin-internal/tests/RuleTester.ts b/packages/eslint-plugin-internal/tests/RuleTester.ts new file mode 100644 index 000000000000..daef7ec9a8be --- /dev/null +++ b/packages/eslint-plugin-internal/tests/RuleTester.ts @@ -0,0 +1,22 @@ +import { TSESLint, ESLintUtils } from '@typescript-eslint/experimental-utils'; + +const { batchedSingleLineTests } = ESLintUtils; + +const parser = '@typescript-eslint/parser'; + +type RuleTesterConfig = Omit & { + parser: typeof parser; +}; +class RuleTester extends TSESLint.RuleTester { + // as of eslint 6 you have to provide an absolute path to the parser + // but that's not as clean to type, this saves us trying to manually enforce + // that contributors require.resolve everything + constructor(options: RuleTesterConfig) { + super({ + ...options, + parser: require.resolve(options.parser), + }); + } +} + +export { RuleTester, batchedSingleLineTests }; diff --git a/packages/eslint-plugin-internal/tests/rules/no-typescript-default-import.test.ts b/packages/eslint-plugin-internal/tests/rules/no-typescript-default-import.test.ts new file mode 100644 index 000000000000..3c8db9e66510 --- /dev/null +++ b/packages/eslint-plugin-internal/tests/rules/no-typescript-default-import.test.ts @@ -0,0 +1,45 @@ +import rule from '../../src/rules/no-typescript-default-import'; +import { RuleTester, batchedSingleLineTests } from '../RuleTester'; + +const ruleTester = new RuleTester({ + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + }, +}); + +ruleTester.run('no-typescript-default-import', rule, { + valid: [ + "import { foo } from 'typescript';", + "import ts from 'nottypescript';", + "import * as foo from 'typescript';", + 'import ts = foo;', + "import ts = require('nottypescript');", + ], + invalid: batchedSingleLineTests({ + code: ` +import ts from 'typescript'; +import ts, { SyntaxKind } from 'typescript'; +import ts = require('typescript'); + `, + output: ` +import * as ts from 'typescript'; +import ts, { SyntaxKind } from 'typescript'; +import * as ts from 'typescript'; + `, + errors: [ + { + messageId: 'noTSDefaultImport', + line: 2, + }, + { + messageId: 'noTSDefaultImport', + line: 3, + }, + { + messageId: 'noTSDefaultImport', + line: 4, + }, + ], + }), +}); diff --git a/packages/eslint-plugin-internal/tests/rules/no-typescript-estree.test.ts b/packages/eslint-plugin-internal/tests/rules/no-typescript-estree.test.ts new file mode 100644 index 000000000000..a76e03b7c1d5 --- /dev/null +++ b/packages/eslint-plugin-internal/tests/rules/no-typescript-estree.test.ts @@ -0,0 +1,43 @@ +import rule from '../../src/rules/no-typescript-estree-import'; +import { RuleTester, batchedSingleLineTests } from '../RuleTester'; + +const ruleTester = new RuleTester({ + parser: '@typescript-eslint/parser', + parserOptions: { + sourceType: 'module', + }, +}); + +ruleTester.run('no-typescript-estree-import', rule, { + valid: [ + 'import { foo } from "@typescript-eslint/experimental-utils";', + 'import foo from "@typescript-eslint/experimental-utils";', + 'import * as foo from "@typescript-eslint/experimental-utils";', + ], + invalid: batchedSingleLineTests({ + code: ` +import { foo } from "@typescript-eslint/typescript-estree"; +import foo from "@typescript-eslint/typescript-estree"; +import * as foo from "@typescript-eslint/typescript-estree"; + `, + output: ` +import { foo } from "@typescript-eslint/experimental-utils"; +import foo from "@typescript-eslint/experimental-utils"; +import * as foo from "@typescript-eslint/experimental-utils"; + `, + errors: [ + { + messageId: 'dontImportTSEStree', + line: 2, + }, + { + messageId: 'dontImportTSEStree', + line: 3, + }, + { + messageId: 'dontImportTSEStree', + line: 4, + }, + ], + }), +}); diff --git a/packages/eslint-plugin-internal/tsconfig.build.json b/packages/eslint-plugin-internal/tsconfig.build.json new file mode 100644 index 000000000000..b40961d2d9a1 --- /dev/null +++ b/packages/eslint-plugin-internal/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + // specifically disable declarations for the plugin + "declaration": false, + "declarationMap": false, + "outDir": "./dist", + "rootDir": "./src", + "resolveJsonModule": true + }, + "include": ["src", "typings"], + "references": [{ "path": "../experimental-utils/tsconfig.build.json" }] +} diff --git a/packages/eslint-plugin-internal/tsconfig.json b/packages/eslint-plugin-internal/tsconfig.json new file mode 100644 index 000000000000..6fddcebe2ae5 --- /dev/null +++ b/packages/eslint-plugin-internal/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "composite": false, + "rootDir": "." + }, + "include": ["src", "typings", "tests"] +} diff --git a/packages/eslint-plugin/src/rules/await-thenable.ts b/packages/eslint-plugin/src/rules/await-thenable.ts index 94dc75cf78d7..f5b06b683f46 100644 --- a/packages/eslint-plugin/src/rules/await-thenable.ts +++ b/packages/eslint-plugin/src/rules/await-thenable.ts @@ -1,5 +1,5 @@ import * as tsutils from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; diff --git a/packages/eslint-plugin/src/rules/no-for-in-array.ts b/packages/eslint-plugin/src/rules/no-for-in-array.ts index db15d310457c..b93665069c71 100644 --- a/packages/eslint-plugin/src/rules/no-for-in-array.ts +++ b/packages/eslint-plugin/src/rules/no-for-in-array.ts @@ -1,4 +1,4 @@ -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; export default util.createRule({ diff --git a/packages/eslint-plugin/src/rules/no-misused-promises.ts b/packages/eslint-plugin/src/rules/no-misused-promises.ts index 50d6cf9201a5..5326129780cf 100644 --- a/packages/eslint-plugin/src/rules/no-misused-promises.ts +++ b/packages/eslint-plugin/src/rules/no-misused-promises.ts @@ -1,6 +1,6 @@ import { TSESLint, TSESTree } from '@typescript-eslint/experimental-utils'; import * as tsutils from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts index 5c884f4506ca..ba77f30e1f9f 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts @@ -3,7 +3,7 @@ import { AST_NODE_TYPES, AST_TOKEN_TYPES, } from '@typescript-eslint/experimental-utils'; -import ts, { TypeFlags } from 'typescript'; +import * as ts from 'typescript'; import { isTypeFlagSet, unionTypeParts, @@ -139,13 +139,15 @@ export default createRule({ unionTypeParts(type).some(part => isTypeFlagSet( part, - TypeFlags.Any | TypeFlags.Unknown | ts.TypeFlags.TypeParameter, + ts.TypeFlags.Any | + ts.TypeFlags.Unknown | + ts.TypeFlags.TypeParameter, ), ) ) { return; } - const messageId = isTypeFlagSet(type, TypeFlags.Never) + const messageId = isTypeFlagSet(type, ts.TypeFlags.Never) ? 'never' : !isPossiblyTruthy(type) ? 'alwaysFalsy' @@ -161,10 +163,10 @@ export default createRule({ function checkNodeForNullish(node: TSESTree.Node): void { const type = getNodeType(node); // Conditional is always necessary if it involves `any` or `unknown` - if (isTypeFlagSet(type, TypeFlags.Any | TypeFlags.Unknown)) { + if (isTypeFlagSet(type, ts.TypeFlags.Any | ts.TypeFlags.Unknown)) { return; } - const messageId = isTypeFlagSet(type, TypeFlags.Never) + const messageId = isTypeFlagSet(type, ts.TypeFlags.Never) ? 'never' : !isPossiblyNullish(type) ? 'neverNullish' diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts b/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts index dbf07b46848d..f489fd3c3318 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts @@ -2,7 +2,7 @@ import { AST_NODE_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as tsutils from 'tsutils'; import * as util from '../util'; diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts index c5c439c7bd0f..3ccca4f74a04 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-arguments.ts @@ -1,6 +1,6 @@ import { TSESTree } from '@typescript-eslint/experimental-utils'; import * as tsutils from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; import { findFirstResult } from '../util'; diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts b/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts index 29f98bdedf00..542e937f5307 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-type-assertion.ts @@ -10,7 +10,7 @@ import { isTypeFlagSet, isVariableDeclaration, } from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; type Options = [ diff --git a/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts b/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts index 1f75e1f026f0..359397efdc73 100644 --- a/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts +++ b/packages/eslint-plugin/src/rules/no-unused-vars-experimental.ts @@ -1,7 +1,7 @@ /* eslint-disable no-fallthrough */ import { TSESTree } from '@typescript-eslint/experimental-utils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; export type Options = [ diff --git a/packages/eslint-plugin/src/rules/prefer-includes.ts b/packages/eslint-plugin/src/rules/prefer-includes.ts index 9577420fb9e1..0cd54d6c7869 100644 --- a/packages/eslint-plugin/src/rules/prefer-includes.ts +++ b/packages/eslint-plugin/src/rules/prefer-includes.ts @@ -4,7 +4,7 @@ import { } from '@typescript-eslint/experimental-utils'; import { getStaticValue } from 'eslint-utils'; import { AST as RegExpAST, parseRegExpLiteral } from 'regexpp'; -import ts from 'typescript'; +import * as ts from 'typescript'; import { createRule, getParserServices } from '../util'; export default createRule({ diff --git a/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts b/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts index e0beb74c79c6..805f17d4f60c 100644 --- a/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts +++ b/packages/eslint-plugin/src/rules/prefer-nullish-coalescing.ts @@ -4,7 +4,7 @@ import { TSESLint, TSESTree, } from '@typescript-eslint/experimental-utils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; export type Options = [ diff --git a/packages/eslint-plugin/src/rules/prefer-readonly.ts b/packages/eslint-plugin/src/rules/prefer-readonly.ts index 4620d89cde4a..d2aa135b99f4 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly.ts @@ -1,5 +1,5 @@ import * as tsutils from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; import { typeIsOrHasBaseType } from '../util'; import { diff --git a/packages/eslint-plugin/src/rules/require-array-sort-compare.ts b/packages/eslint-plugin/src/rules/require-array-sort-compare.ts index 1d220702e04b..580b36f591d6 100644 --- a/packages/eslint-plugin/src/rules/require-array-sort-compare.ts +++ b/packages/eslint-plugin/src/rules/require-array-sort-compare.ts @@ -1,5 +1,5 @@ import { TSESTree } from '@typescript-eslint/experimental-utils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; export default util.createRule({ diff --git a/packages/eslint-plugin/src/rules/require-await.ts b/packages/eslint-plugin/src/rules/require-await.ts index 4db47f9e075b..53c43e7a6b93 100644 --- a/packages/eslint-plugin/src/rules/require-await.ts +++ b/packages/eslint-plugin/src/rules/require-await.ts @@ -4,7 +4,7 @@ import { } from '@typescript-eslint/experimental-utils'; import baseRule from 'eslint/lib/rules/require-await'; import * as tsutils from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; type Options = util.InferOptionsTypeFromRule; diff --git a/packages/eslint-plugin/src/rules/restrict-plus-operands.ts b/packages/eslint-plugin/src/rules/restrict-plus-operands.ts index c41587a169ac..f07e624eeb23 100644 --- a/packages/eslint-plugin/src/rules/restrict-plus-operands.ts +++ b/packages/eslint-plugin/src/rules/restrict-plus-operands.ts @@ -1,5 +1,5 @@ import { TSESTree } from '@typescript-eslint/experimental-utils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; type Options = [ diff --git a/packages/eslint-plugin/src/rules/restrict-template-expressions.ts b/packages/eslint-plugin/src/rules/restrict-template-expressions.ts index 199664036c99..efedc786b512 100644 --- a/packages/eslint-plugin/src/rules/restrict-template-expressions.ts +++ b/packages/eslint-plugin/src/rules/restrict-template-expressions.ts @@ -2,7 +2,7 @@ import { TSESTree, AST_NODE_TYPES, } from '@typescript-eslint/experimental-utils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; type Options = [ diff --git a/packages/eslint-plugin/src/rules/return-await.ts b/packages/eslint-plugin/src/rules/return-await.ts index 6594007651cc..762d697fdbb5 100644 --- a/packages/eslint-plugin/src/rules/return-await.ts +++ b/packages/eslint-plugin/src/rules/return-await.ts @@ -3,7 +3,7 @@ import { TSESTree, } from '@typescript-eslint/experimental-utils'; import * as tsutils from 'tsutils'; -import ts, { SyntaxKind } from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; export default util.createRule({ @@ -59,7 +59,7 @@ export default util.createRule({ ): void { let child: ts.Node; - const isAwait = expression.kind === SyntaxKind.AwaitExpression; + const isAwait = expression.kind === ts.SyntaxKind.AwaitExpression; if (isAwait) { child = expression.getChildAt(1); diff --git a/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts b/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts index 1b0d0de9462c..e33b9c8a39e6 100644 --- a/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts +++ b/packages/eslint-plugin/src/rules/strict-boolean-expressions.ts @@ -2,7 +2,7 @@ import { TSESTree, AST_NODE_TYPES, } from '@typescript-eslint/experimental-utils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as tsutils from 'tsutils'; import * as util from '../util'; diff --git a/packages/eslint-plugin/src/rules/unbound-method.ts b/packages/eslint-plugin/src/rules/unbound-method.ts index 16ee4787760b..ac4dd6b28de3 100644 --- a/packages/eslint-plugin/src/rules/unbound-method.ts +++ b/packages/eslint-plugin/src/rules/unbound-method.ts @@ -3,7 +3,7 @@ import { TSESTree, } from '@typescript-eslint/experimental-utils'; import * as tsutils from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; import * as util from '../util'; //------------------------------------------------------------------------------ diff --git a/packages/eslint-plugin/src/util/types.ts b/packages/eslint-plugin/src/util/types.ts index 6a3644acbb54..e53bfb355314 100644 --- a/packages/eslint-plugin/src/util/types.ts +++ b/packages/eslint-plugin/src/util/types.ts @@ -3,7 +3,7 @@ import { isUnionOrIntersectionType, unionTypeParts, } from 'tsutils'; -import ts from 'typescript'; +import * as ts from 'typescript'; /** * @param type Type being checked by name. diff --git a/packages/experimental-utils/package.json b/packages/experimental-utils/package.json index 279e8d06bca2..8cd63e5bfef1 100644 --- a/packages/experimental-utils/package.json +++ b/packages/experimental-utils/package.json @@ -26,7 +26,6 @@ }, "license": "MIT", "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "build": "tsc -b tsconfig.build.json", "clean": "tsc -b tsconfig.build.json --clean", diff --git a/packages/typescript-estree/src/convert-comments.ts b/packages/typescript-estree/src/convert-comments.ts index a82d9941dbd3..753e82f7b558 100644 --- a/packages/typescript-estree/src/convert-comments.ts +++ b/packages/typescript-estree/src/convert-comments.ts @@ -1,4 +1,4 @@ -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { forEachComment } from 'tsutils/util/util'; import { getLocFor } from './node-utils'; import { TSESTree } from './ts-estree'; diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index af48546d7f8d..f65ac54867aa 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -1,6 +1,6 @@ // There's lots of funny stuff due to the typing of ts.Node /* eslint-disable @typescript-eslint/no-explicit-any */ -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { canContainDirective, createError, diff --git a/packages/typescript-estree/src/create-program/WatchCompilerHostOfConfigFile.ts b/packages/typescript-estree/src/create-program/WatchCompilerHostOfConfigFile.ts index 7fb4663b985c..471a6d6b6fe6 100644 --- a/packages/typescript-estree/src/create-program/WatchCompilerHostOfConfigFile.ts +++ b/packages/typescript-estree/src/create-program/WatchCompilerHostOfConfigFile.ts @@ -2,7 +2,7 @@ // They have been trimmed down to only include the relevant bits // We use some special internal TS apis to help us do our parsing flexibly -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; // https://github.com/microsoft/TypeScript/blob/b84e65db4ea5c39dbaa2ccd6594efe4653318251/src/compiler/watchUtilities.ts#L6-L18 interface DirectoryStructureHost { diff --git a/packages/typescript-estree/src/create-program/createDefaultProgram.ts b/packages/typescript-estree/src/create-program/createDefaultProgram.ts index 383d10bd43d3..11a6638d711c 100644 --- a/packages/typescript-estree/src/create-program/createDefaultProgram.ts +++ b/packages/typescript-estree/src/create-program/createDefaultProgram.ts @@ -1,6 +1,6 @@ import debug from 'debug'; import path from 'path'; -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { Extra } from '../parser-options'; import { getTsconfigPath, diff --git a/packages/typescript-estree/src/create-program/createIsolatedProgram.ts b/packages/typescript-estree/src/create-program/createIsolatedProgram.ts index 296aee2e5ba0..c6c74b8c5ab9 100644 --- a/packages/typescript-estree/src/create-program/createIsolatedProgram.ts +++ b/packages/typescript-estree/src/create-program/createIsolatedProgram.ts @@ -1,5 +1,5 @@ import debug from 'debug'; -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { Extra } from '../parser-options'; import { ASTAndProgram, diff --git a/packages/typescript-estree/src/create-program/createSourceFile.ts b/packages/typescript-estree/src/create-program/createSourceFile.ts index d1ab5f98d21a..70820c1d2172 100644 --- a/packages/typescript-estree/src/create-program/createSourceFile.ts +++ b/packages/typescript-estree/src/create-program/createSourceFile.ts @@ -1,5 +1,5 @@ import debug from 'debug'; -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { Extra } from '../parser-options'; import { getScriptKind } from './shared'; diff --git a/packages/typescript-estree/src/create-program/createWatchProgram.ts b/packages/typescript-estree/src/create-program/createWatchProgram.ts index 73dc8ec426e6..72b5535c5783 100644 --- a/packages/typescript-estree/src/create-program/createWatchProgram.ts +++ b/packages/typescript-estree/src/create-program/createWatchProgram.ts @@ -1,6 +1,6 @@ import debug from 'debug'; import fs from 'fs'; -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { Extra } from '../parser-options'; import { WatchCompilerHostOfConfigFile } from './WatchCompilerHostOfConfigFile'; import { diff --git a/packages/typescript-estree/src/create-program/shared.ts b/packages/typescript-estree/src/create-program/shared.ts index 1ba44449867d..b828478073e2 100644 --- a/packages/typescript-estree/src/create-program/shared.ts +++ b/packages/typescript-estree/src/create-program/shared.ts @@ -1,5 +1,5 @@ import path from 'path'; -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { Extra } from '../parser-options'; interface ASTAndProgram { diff --git a/packages/typescript-estree/src/node-utils.ts b/packages/typescript-estree/src/node-utils.ts index f9abf8cca233..1995bbf57c56 100644 --- a/packages/typescript-estree/src/node-utils.ts +++ b/packages/typescript-estree/src/node-utils.ts @@ -1,5 +1,5 @@ import unescape from 'lodash.unescape'; -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree } from './ts-estree'; const SyntaxKind = ts.SyntaxKind; diff --git a/packages/typescript-estree/src/parser.ts b/packages/typescript-estree/src/parser.ts index 27a10024dc8b..882249b6bdd5 100644 --- a/packages/typescript-estree/src/parser.ts +++ b/packages/typescript-estree/src/parser.ts @@ -1,5 +1,5 @@ import semver from 'semver'; -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; import { sync as globSync } from 'glob'; import isGlob from 'is-glob'; import { astConverter } from './ast-converter'; diff --git a/packages/typescript-estree/src/semantic-or-syntactic-errors.ts b/packages/typescript-estree/src/semantic-or-syntactic-errors.ts index d2b61efc856d..f8a6e5be4671 100644 --- a/packages/typescript-estree/src/semantic-or-syntactic-errors.ts +++ b/packages/typescript-estree/src/semantic-or-syntactic-errors.ts @@ -1,4 +1,4 @@ -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; interface SemanticOrSyntacticError extends ts.Diagnostic { message: string; diff --git a/packages/typescript-estree/src/ts-estree/ts-nodes.ts b/packages/typescript-estree/src/ts-estree/ts-nodes.ts index fbf10048157e..eb99af207807 100644 --- a/packages/typescript-estree/src/ts-estree/ts-nodes.ts +++ b/packages/typescript-estree/src/ts-estree/ts-nodes.ts @@ -1,4 +1,4 @@ -import * as ts from 'typescript'; // leave this as * as ts so people using util package don't need syntheticDefaultImports +import * as ts from 'typescript'; export type TSNode = ts.Node & ( diff --git a/packages/typescript-estree/tests/lib/convert.ts b/packages/typescript-estree/tests/lib/convert.ts index 71158dfb8256..e4217be7d222 100644 --- a/packages/typescript-estree/tests/lib/convert.ts +++ b/packages/typescript-estree/tests/lib/convert.ts @@ -1,7 +1,7 @@ // deeplyCopy is private internal /* eslint-disable @typescript-eslint/no-explicit-any */ import { Converter } from '../../src/convert'; -import ts from 'typescript'; +import * as ts from 'typescript'; describe('convert', () => { function convertCode(code: string): ts.SourceFile { diff --git a/packages/typescript-estree/tests/lib/semanticInfo.ts b/packages/typescript-estree/tests/lib/semanticInfo.ts index 05e65137db43..3a99890c401f 100644 --- a/packages/typescript-estree/tests/lib/semanticInfo.ts +++ b/packages/typescript-estree/tests/lib/semanticInfo.ts @@ -1,7 +1,7 @@ import { readFileSync } from 'fs'; import glob from 'glob'; import { extname, join, resolve } from 'path'; -import ts from 'typescript'; +import * as ts from 'typescript'; import { TSESTreeOptions } from '../../src/parser-options'; import { createSnapshotTestBlock, diff --git a/yarn.lock b/yarn.lock index d32b5a041415..154b6b2e23ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7949,9 +7949,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@*, "typescript@>=3.2.1 <3.8.0", typescript@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" - integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== + version "3.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" + integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== uglify-js@^3.1.4: version "3.6.0" pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy