Skip to content

Commit

Permalink
chore: migrate tslint to eslint (#1590)
Browse files Browse the repository at this point in the history
  • Loading branch information
tanettrimas authored and ahnpnl committed May 4, 2020
1 parent 720c854 commit 526265d
Show file tree
Hide file tree
Showing 57 changed files with 654 additions and 457 deletions.
2 changes: 2 additions & 0 deletions .eslintignore
Expand Up @@ -2,5 +2,7 @@ dist/
node_modules/
e2e/__cases__/
e2e/__workdir_synlink__/
e2e/__external-repos__/
coverage/
docs/
*.config.js
232 changes: 220 additions & 12 deletions .eslintrc.js
@@ -1,31 +1,239 @@
module.exports = {
env: {
node: true,
es6: true,
'jest/globals': true,
},
extends: 'eslint:recommended',
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
'prettier/@typescript-eslint', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
'plugin:jest/recommended',
'plugin:prettier/recommended'
],
parser: '@typescript-eslint/parser',
parserOptions: {
project: 'tsconfig.json',
ecmaVersion: 2020,
sourceType: 'module',
impliedStrict: true,
ecmaFeatures: {
jsx: true,
},
},
plugins: ['@typescript-eslint', 'jest', 'jsdoc'],
rules: {
'no-console': ['error', { allow: ['warn', 'error', 'log'] }],
indent: ['error', 2],
'linebreak-style': ['error', 'unix'],
quotes: ['error', 'single'],
semi: ['error', 'never'],
'comma-dangle': [
'prettier/prettier': 'error',
'no-unused-vars': 'off', // let typescript-eslint handle this
'no-console': 'error',
'linebreak-style': 'off',
'comma-dangle': 'off',
'constructor-super': 'error',
'for-direction': ['error'],
'getter-return': 'warn',
'no-async-promise-executor': ['error'],
'no-case-declarations': ['error'],
'no-class-assign': ['error'],
'no-compare-neg-zero': ['error'],
'no-cond-assign': 'error',
'no-const-assign': ['error'],
'no-constant-condition': ['warn'],
'no-control-regex': ['warn'],
'no-debugger': 'error',
'no-delete-var': ['error'],
'no-dupe-args': ['error'],
'no-dupe-class-members': 'warn',
'no-dupe-keys': ['error'],
'no-duplicate-case': ['error'],
'no-empty': [
'error',
{
arrays: 'always-multiline',
objects: 'always-multiline',
imports: 'always-multiline',
exports: 'always-multiline',
functions: 'never',
allowEmptyCatch: true,
},
],
'no-empty-character-class': ['error'],
'no-empty-pattern': ['error'],
'no-ex-assign': ['error'],
'no-extra-boolean-cast': ['error'],
'no-extra-semi': 'off',
'no-fallthrough': 'off',
'no-func-assign': ['error'],
'no-global-assign': ['error'],
'no-inner-declarations': ['error'],
'no-invalid-regexp': ['error'],
'no-irregular-whitespace': 'off',
'no-misleading-character-class': ['error'],
'no-mixed-spaces-and-tabs': ['error'],
'no-new-symbol': ['error'],
'no-obj-calls': ['error'],
'no-octal': ['error'],
'no-prototype-builtins': ['error'],
'no-redeclare': 'warn',
'no-regex-spaces': ['error'],
'no-self-assign': ['error'],
'no-shadow-restricted-names': ['error'],
'no-sparse-arrays': ['error'],
'no-this-before-super': ['error'],
'no-undef': ['error'],
'no-unexpected-multiline': ['error'],
'no-unreachable': ['error'],
'no-unsafe-finally': 'error',
'no-unsafe-negation': ['error'],
'no-unused-labels': 'error',
'no-useless-catch': ['error'],
'no-useless-escape': 'warn',
'no-with': ['error'],
'require-yield': ['error'],
'use-isnan': 'error',
'valid-typeof': 'off',
'@typescript-eslint/no-unused-vars': ["error", { "argsIgnorePattern": "^_" }],
'@typescript-eslint/adjacent-overload-signatures': 'error',
'@typescript-eslint/array-type': [
'warn',
{
default: 'array',
},
],
'@typescript-eslint/ban-types': [
'error',
{
types: {
Object: {
message: 'Avoid using the `Object` type. Did you mean `object`?',
},
Function: {
message: 'Avoid using the `Function` type. Prefer a specific function type, like `() => void`.',
},
Boolean: {
message: 'Avoid using the `Boolean` type. Did you mean `boolean`?',
},
Number: {
message: 'Avoid using the `Number` type. Did you mean `number`?',
},
String: {
message: 'Avoid using the `String` type. Did you mean `string`?',
},
Symbol: {
message: 'Avoid using the `Symbol` type. Did you mean `symbol`?',
},
},
},
],
'@typescript-eslint/class-name-casing': 'error',
'@typescript-eslint/prefer-regexp-exec': 'warn',
'@typescript-eslint/prefer-string-starts-ends-with': 'warn',
'@typescript-eslint/unbound-method': 'off',
'@typescript-eslint/prefer-includes': 'warn',
'@typescript-eslint/consistent-type-assertions': 'error',
'@typescript-eslint/consistent-type-definitions': 'error',
'@typescript-eslint/explicit-member-accessibility': [
'error',
{
accessibility: 'no-public',
},
],
'@typescript-eslint/interface-name-prefix': 'off',
'@typescript-eslint/member-delimiter-style': [
'error',
{
multiline: {
delimiter: 'none',
requireLast: true,
},
singleline: {
delimiter: 'semi',
requireLast: false,
},
},
],
'@typescript-eslint/require-await': 'off',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/no-empty-function': ['error', { 'allow': ['arrowFunctions']}],
'@typescript-eslint/no-empty-interface': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-for-in-array': 'error',
'@typescript-eslint/no-inferrable-types': 'error',
'@typescript-eslint/no-misused-new': 'error',
'@typescript-eslint/no-namespace': 'warn',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-parameter-properties': 'off',
'@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/prefer-for-of': 'off',
'@typescript-eslint/prefer-function-type': 'error',
'@typescript-eslint/prefer-namespace-keyword': 'error',
'@typescript-eslint/prefer-readonly': 'error',
'@typescript-eslint/triple-slash-reference': [
'error',
{
path: 'always',
types: 'prefer-import',
lib: 'always',
},
],
'@typescript-eslint/type-annotation-spacing': 'off',
'@typescript-eslint/unified-signatures': 'error',
'@typescript-eslint/no-unnecessary-type-assertion': 'warn',
'arrow-body-style': 'warn',
'arrow-parens': ['off', 'always'],
'brace-style': ['off', 'off'],
camelcase: 'warn',
'class-methods-use-this': 'warn',
complexity: 'off',
curly: ['warn', 'multi-line'],
'default-case': 'error',
'dot-notation': 'error',
'eol-last': 'off',
eqeqeq: ['error', 'smart'],
'guard-for-in': 'error',
'id-match': 'error',
'jsdoc/check-alignment': 'error',
'jsdoc/check-indentation': 'error',
'jsdoc/newline-after-description': 'warn',
'max-classes-per-file': 'off',
'max-len': 'off',
'new-parens': 'off',
'newline-per-chained-call': 'off',
'no-bitwise': 'off',
'no-caller': 'error',
'no-duplicate-imports': 'error',
'no-eval': 'error',
'no-invalid-this': 'off',
'no-multiple-empty-lines': 'off',
'no-new-wrappers': 'error',
'no-return-await': 'error',
'no-shadow': [
'off',
{
hoist: 'all',
},
],
'no-template-curly-in-string': 'error',
'no-throw-literal': 'error',
'no-trailing-spaces': 'off',
'no-undef-init': 'error',
'no-underscore-dangle': 'off',
'no-unused-expressions': 'error',
'no-var': 'error',
'object-shorthand': 'error',
'one-var': ['error', 'never'],
'prefer-const': 'warn',
'prefer-object-spread': 'error',
'prefer-template': 'error',
'quote-props': 'off',
radix: 'error',
'space-before-function-paren': 'off',
'space-in-parens': ['off', 'never'],
'spaced-comment': [
'warn',
'always',
{
markers: ['/'],
},
],
},
settings: {},
}
1 change: 0 additions & 1 deletion .npmignore
Expand Up @@ -66,7 +66,6 @@ tsconfig.json
.prettierrc
.travis.yml
tsconfig.build.json
tslint.json
.npmrc
.markdownlint.yaml
.cache
Expand Down
@@ -1,7 +1,6 @@
import { main } from './main'

test('main', () => {
// tslint:disable-next-line:no-console
const mockLog = console.log = jest.fn()

main()
Expand Down
Expand Up @@ -3,7 +3,6 @@ import { myLibraryFunction } from '../my-library'
export function main() {
const value = myLibraryFunction()

// tslint:disable-next-line:no-console
console.log(`You got foo: "${value.foo}" and bar: ${value.bar}`)
}

Expand Down
1 change: 0 additions & 1 deletion e2e/__helpers__/test-case/processed-file-io.ts
Expand Up @@ -3,7 +3,6 @@ import { Config } from '@jest/types'

import ProcessedSource from '../../../src/__helpers__/processed-source'

// tslint:disable-next-line:no-default-export
export default class ProcessedFileIo extends ProcessedSource {
constructor(
cwd: string,
Expand Down
11 changes: 4 additions & 7 deletions e2e/__helpers__/test-case/run-descriptor.ts
Expand Up @@ -6,7 +6,6 @@ import RunResult from './run-result'
import { run } from './runtime'
import { RunTestOptions, RunWithTemplateIteratorContext, RunWithTemplatesIterator, TestRunResultsMap } from './types'

// tslint:disable-next-line:no-default-export
export default class RunDescriptor {
protected _options: RunTestOptions
protected _sourcePackageJson: any
Expand Down Expand Up @@ -46,8 +45,8 @@ export default class RunDescriptor {
template: this.templateName,
})
if (logUnlessStatus != null && logUnlessStatus !== result.status) {
// tslint:disable-next-line:no-console
console.log(
// eslint-disable-next-line no-console
console.log(
'='.repeat(70),
'\n',
`Test exited with unexpected status in "${this.name}" using template "${this.templateName}" (exit code: ${result.status}):\n`,
Expand All @@ -72,17 +71,15 @@ export default class RunDescriptor {
throw new RangeError(`There must be at least one template to run the test case with.`)
}

if (!templates.every((t, i) => templates.indexOf(t, i + 1) === -1)) {
if (!templates.every((t, i) => !templates.includes(t, i + 1))) {
throw new Error(`Each template must be unique. Given ${templates.join(', ')}`)
}
return templates.reduce((map, template) => {
const desc = new RunDescriptor(this.name, {
...this._options,
template,
})
const runTest = () => {
return (map[template] = desc.run(expectedStatus))
}
const runTest = () => (map[template] = desc.run(expectedStatus))
if (iterator) {
iterator(runTest, createIteratorContext(template, expectedStatus))
} else {
Expand Down
5 changes: 1 addition & 4 deletions e2e/__helpers__/test-case/run-result.ts
Expand Up @@ -10,7 +10,6 @@ import { cacheDir } from '../../../scripts/lib/paths'
import ProcessedFileIo from './processed-file-io'
import { escapeRegex, normalizeJestOutput, stripAnsiColors } from './utils'

// tslint:disable-next-line:no-default-export
export default class RunResult {
constructor(
readonly cwd: string,
Expand Down Expand Up @@ -112,8 +111,6 @@ export default class RunResult {

return map
.sort((a, b) => ((b.from as any).length || Infinity) - ((a.from as any).length || Infinity))
.reduce((str, { from, to }) => {
return str.replace(typeof from === 'string' ? new RegExp(`${escapeRegex(from)}`, 'g') : from, to)
}, str)
.reduce((str, { from, to }) => str.replace(typeof from === 'string' ? new RegExp(`${escapeRegex(from)}`, 'g') : from, to), str)
}
}
9 changes: 4 additions & 5 deletions e2e/__helpers__/test-case/runtime.ts
Expand Up @@ -44,12 +44,12 @@ describe.skip('__eval', () => {
eval(process.env.__TS_JEST_EVAL);
`

// tslint:disable-next-line:variable-name
let __hooksSource: string
function hooksSourceWith(vars: Record<string, any>): string {
if (!__hooksSource) {
__hooksSource = readFileSync(join(__dirname, '__hooks-source__.js.hbs'), 'utf8')
}
// eslint-disable-next-line no-useless-escape
return __hooksSource.replace(/\{\{([^\}]+)\}\}/g, (_, key) => JSON.stringify(vars[key]))
}

Expand Down Expand Up @@ -122,6 +122,7 @@ export function run(name: string, options: RunTestOptions = {}): RunResult {

// write final config
// FIXME: sounds like the json fail to be encoded as an arg
// eslint-disable-next-line no-constant-condition
if (false /* enableOptimizations() */) {
cmdArgs.push('--config', JSON.stringify(finalConfig))
} else if (Object.keys(extraConfig).length !== 0) {
Expand Down Expand Up @@ -191,11 +192,9 @@ execFile(cmd, args, options)

copySync(wrkDir, srcDir, {
overwrite: false,
filter: from => {
return relative(sourceDir, from)
filter: from => relative(sourceDir, from)
.split(sep)
.includes('__snapshots__')
},
.includes('__snapshots__'),
})
})
}
Expand Down
2 changes: 1 addition & 1 deletion e2e/__helpers__/test-case/types.ts
Expand Up @@ -24,7 +24,7 @@ export interface RunWithTemplateIteratorContext {
testLabel: string
}

// tslint:disable-next-line:interface-over-type-literal

export type TestRunResultsMap<T extends string = string> = { [key in T]: RunResult }

export interface PreparedTest {
Expand Down

0 comments on commit 526265d

Please sign in to comment.