Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[space-infix-ops] Ignored around field initializers #1699

Closed
dandv opened this issue Mar 7, 2020 · 2 comments · Fixed by #3231
Closed

[space-infix-ops] Ignored around field initializers #1699

dandv opened this issue Mar 7, 2020 · 2 comments · Fixed by #3231
Labels
enhancement: new base rule extension New base rule extension required to handle a TS specific case package: eslint-plugin Issues related to @typescript-eslint/eslint-plugin

Comments

@dandv
Copy link
Contributor

dandv commented Mar 7, 2020

I've setup my project with the recommended settings. ESLint rules defined in .eslintrc.cjs are triggered correctly, e.g 'space-infix-ops': 'error' triggers on const first='John'. What I don't see happen is that rule triggering on field initializers, but if I understand correctly the marriage between TypeScript and ESLint, this rule should be implemented separately; however, I haven't found a relevant rule under the supported rules, so maybe one should be made and hence the title of my bug is incorrect? Apologies for the confusion.

Repro

{
  "rules": {
    'space-infix-ops': 'error'
  }
}
class Person {
  first='John'
}

Expected Result
ESLint: Operator '=' must be spaced.(space-infix-ops)

Actual Result
Only the obvious warning, 1:7 warning 'Person' is defined but never used @typescript-eslint/no-unused-vars.

Additional Info

> prg@1.0.0 lint /home/dandv/prg/ts-eslint
> eslint err.ts --debug

  eslint:cli CLI args: [ 'err.ts', '--debug' ] +0ms
  eslint:cli Running on files +2ms
  eslint:config-array-factory Loading JSON config file: /home/dandv/prg/ts-eslint/package.json +0ms
  eslint:ignore-pattern Create with: [ IgnorePattern { patterns: [ '/node_modules/*', '/bower_components/*' ], basePath: '/home/dandv/prg/ts-eslint', loose: false } ] +0ms
  eslint:ignore-pattern   processed: { basePath: '/home/dandv/prg/ts-eslint', patterns: [ '/node_modules/*', '/bower_components/*' ] } +1ms
  eslint:ignore-pattern Create with: [ IgnorePattern { patterns: [ '/node_modules/*', '/bower_components/*' ], basePath: '/home/dandv/prg/ts-eslint', loose: false } ] +0ms
  eslint:ignore-pattern   processed: { basePath: '/home/dandv/prg/ts-eslint', patterns: [ '/node_modules/*', '/bower_components/*' ] } +0ms
  eslint:file-enumerator Start to iterate files: [ 'err.ts' ] +0ms
  eslint:file-enumerator File: /home/dandv/prg/ts-eslint/err.ts +0ms
  eslint:cascading-config-array-factory Load config files for /home/dandv/prg/ts-eslint. +0ms
  eslint:cascading-config-array-factory No cache found: /home/dandv/prg/ts-eslint. +0ms
  eslint:config-array-factory Loading JS config file: /home/dandv/prg/ts-eslint/.eslintrc.cjs +3ms
  eslint:config-array-factory Config file found: /home/dandv/prg/ts-eslint/.eslintrc.cjs +1ms
  eslint:config-array-factory Loading {extends:"eslint:recommended"} relative to /home/dandv/prg/ts-eslint/.eslintrc.cjs +0ms
  eslint:config-array-factory Loading JS config file: /home/dandv/prg/ts-eslint/node_modules/eslint/conf/eslint-recommended.js +0ms
  eslint:config-array-factory Loading {extends:"plugin:@typescript-eslint/eslint-recommended"} relative to /home/dandv/prg/ts-eslint/.eslintrc.cjs +2ms
  eslint:config-array-factory Loading plugin "@typescript-eslint" from /home/dandv/prg/ts-eslint/.eslintrc.cjs +0ms
  eslint:config-array-factory Loaded: @typescript-eslint/eslint-plugin@2.22.0 (/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js) +1ms
  eslint:config-array-factory Plugin /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js loaded in: 135ms +135ms
  eslint:config-array-factory Loading {extends:"plugin:@typescript-eslint/recommended"} relative to /home/dandv/prg/ts-eslint/.eslintrc.cjs +1ms
  eslint:config-array-factory Loading plugin "@typescript-eslint" from /home/dandv/prg/ts-eslint/.eslintrc.cjs +0ms
  eslint:config-array-factory Loaded: @typescript-eslint/eslint-plugin@2.22.0 (/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js) +0ms
  eslint:config-array-factory Plugin /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js loaded in: 0ms +0ms
  eslint:config-array-factory Loading {extends:"./configs/base.json"} relative to /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js +1ms
  eslint:config-array-factory package.json was not found: Cannot find module './configs/base.json/package.json'
Require stack:
- /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js +0ms
  eslint:config-array-factory Loaded: ./configs/base.json (/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json) +0ms
  eslint:config-array-factory Loading JSON config file: /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json +0ms
  eslint:config-array-factory Loading parser "@typescript-eslint/parser" from /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json +0ms
  eslint:config-array-factory Loaded: @typescript-eslint/parser@2.22.0 (/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/parser/dist/parser.js) +0ms
  eslint:config-array-factory Loading plugin "@typescript-eslint" from /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json +23ms
  eslint:config-array-factory Loaded: @typescript-eslint/eslint-plugin@2.22.0 (/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js) +0ms
  eslint:config-array-factory Plugin /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js loaded in: 0ms +0ms
  eslint:config-array-factory Loading parser "@typescript-eslint/parser" from /home/dandv/prg/ts-eslint/.eslintrc.cjs +0ms
  eslint:config-array-factory Loaded: @typescript-eslint/parser@2.22.0 (/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/parser/dist/parser.js) +0ms
  eslint:config-array-factory Loading plugin "@typescript-eslint" from /home/dandv/prg/ts-eslint/.eslintrc.cjs +0ms
  eslint:config-array-factory Loaded: @typescript-eslint/eslint-plugin@2.22.0 (/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js) +0ms
  eslint:config-array-factory Plugin /home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js loaded in: 0ms +0ms
  eslint:cascading-config-array-factory No cache found: /home/dandv/prg. +164ms
  eslint:config-array-factory Config file not found on /home/dandv/prg +0ms
  eslint:cascading-config-array-factory No cache found: /home/dandv. +0ms
  eslint:cascading-config-array-factory Stop traversing because of considered root. +0ms
  eslint:rules Loading rule 'constructor-super' (remaining=274) +0ms
  eslint:rules Loading rule 'for-direction' (remaining=273) +1ms
  eslint:rules Loading rule 'getter-return' (remaining=272) +0ms
  eslint:rules Loading rule 'no-async-promise-executor' (remaining=271) +1ms
  eslint:rules Loading rule 'no-case-declarations' (remaining=270) +0ms
  eslint:rules Loading rule 'no-class-assign' (remaining=269) +0ms
  eslint:rules Loading rule 'no-compare-neg-zero' (remaining=268) +1ms
  eslint:rules Loading rule 'no-cond-assign' (remaining=267) +0ms
  eslint:rules Loading rule 'no-const-assign' (remaining=266) +0ms
  eslint:rules Loading rule 'no-constant-condition' (remaining=265) +1ms
  eslint:rules Loading rule 'no-control-regex' (remaining=264) +0ms
  eslint:rules Loading rule 'no-debugger' (remaining=263) +1ms
  eslint:rules Loading rule 'no-delete-var' (remaining=262) +1ms
  eslint:rules Loading rule 'no-dupe-args' (remaining=261) +0ms
  eslint:rules Loading rule 'no-dupe-class-members' (remaining=260) +0ms
  eslint:rules Loading rule 'no-dupe-keys' (remaining=259) +0ms
  eslint:rules Loading rule 'no-duplicate-case' (remaining=258) +0ms
  eslint:rules Loading rule 'no-empty' (remaining=257) +1ms
  eslint:rules Loading rule 'no-empty-character-class' (remaining=256) +0ms
  eslint:rules Loading rule 'no-empty-pattern' (remaining=255) +1ms
  eslint:rules Loading rule 'no-ex-assign' (remaining=254) +0ms
  eslint:rules Loading rule 'no-extra-boolean-cast' (remaining=253) +0ms
  eslint:rules Loading rule 'no-extra-semi' (remaining=252) +0ms
  eslint:rules Loading rule 'no-fallthrough' (remaining=251) +0ms
  eslint:rules Loading rule 'no-func-assign' (remaining=250) +1ms
  eslint:rules Loading rule 'no-global-assign' (remaining=249) +0ms
  eslint:rules Loading rule 'no-inner-declarations' (remaining=248) +1ms
  eslint:rules Loading rule 'no-invalid-regexp' (remaining=247) +1ms
  eslint:rules Loading rule 'no-irregular-whitespace' (remaining=246) +0ms
  eslint:rules Loading rule 'no-misleading-character-class' (remaining=245) +1ms
  eslint:rules Loading rule 'no-mixed-spaces-and-tabs' (remaining=244) +1ms
  eslint:rules Loading rule 'no-new-symbol' (remaining=243) +1ms
  eslint:rules Loading rule 'no-obj-calls' (remaining=242) +0ms
  eslint:rules Loading rule 'no-octal' (remaining=241) +1ms
  eslint:rules Loading rule 'no-prototype-builtins' (remaining=240) +0ms
  eslint:rules Loading rule 'no-redeclare' (remaining=239) +0ms
  eslint:rules Loading rule 'no-regex-spaces' (remaining=238) +1ms
  eslint:rules Loading rule 'no-self-assign' (remaining=237) +0ms
  eslint:rules Loading rule 'no-shadow-restricted-names' (remaining=236) +1ms
  eslint:rules Loading rule 'no-sparse-arrays' (remaining=235) +0ms
  eslint:rules Loading rule 'no-this-before-super' (remaining=234) +0ms
  eslint:rules Loading rule 'no-undef' (remaining=233) +1ms
  eslint:rules Loading rule 'no-unexpected-multiline' (remaining=232) +0ms
  eslint:rules Loading rule 'no-unreachable' (remaining=231) +0ms
  eslint:rules Loading rule 'no-unsafe-finally' (remaining=230) +1ms
  eslint:rules Loading rule 'no-unsafe-negation' (remaining=229) +0ms
  eslint:rules Loading rule 'no-unused-labels' (remaining=228) +1ms
  eslint:rules Loading rule 'no-unused-vars' (remaining=227) +0ms
  eslint:rules Loading rule 'no-useless-catch' (remaining=226) +1ms
  eslint:rules Loading rule 'no-useless-escape' (remaining=225) +1ms
  eslint:rules Loading rule 'no-with' (remaining=224) +0ms
  eslint:rules Loading rule 'require-yield' (remaining=223) +0ms
  eslint:rules Loading rule 'use-isnan' (remaining=222) +0ms
  eslint:rules Loading rule 'valid-typeof' (remaining=221) +1ms
  eslint:rules Loading rule 'camelcase' (remaining=220) +2ms
  eslint:rules Loading rule 'no-array-constructor' (remaining=219) +6ms
  eslint:rules Loading rule 'no-empty-function' (remaining=218) +1ms
  eslint:rules Loading rule 'no-use-before-define' (remaining=217) +2ms
  eslint:rules Loading rule 'no-var' (remaining=216) +4ms
  eslint:rules Loading rule 'prefer-const' (remaining=215) +0ms
  eslint:rules Loading rule 'prefer-rest-params' (remaining=214) +1ms
  eslint:rules Loading rule 'prefer-spread' (remaining=213) +0ms
  eslint:rules Loading rule 'space-infix-ops' (remaining=212) +2ms
  eslint:cascading-config-array-factory Configuration was determined: ConfigArray(7) [ { name: 'DefaultIgnorePattern', filePath: '', criteria: null, env: undefined, globals: undefined, ignorePattern: IgnorePattern { patterns: [Array], basePath: '/home/dandv/prg/ts-eslint', loose: false }, noInlineConfig: undefined, parser: undefined, parserOptions: undefined, plugins: undefined, processor: undefined, reportUnusedDisableDirectives: undefined, root: undefined, rules: undefined, settings: undefined }, { name: '.eslintrc.cjs » eslint:recommended', filePath: '/home/dandv/prg/ts-eslint/node_modules/eslint/conf/eslint-recommended.js', criteria: null, env: undefined, globals: undefined, ignorePattern: undefined, noInlineConfig: undefined, parser: undefined, parserOptions: undefined, plugins: undefined, processor: undefined, reportUnusedDisableDirectives: undefined, root: undefined, rules: { 'constructor-super': 'error', 'for-direction': 'error', 'getter-return': 'error', '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': 'error', 'no-control-regex': 'error', 'no-debugger': 'error', 'no-delete-var': 'error', 'no-dupe-args': 'error', 'no-dupe-class-members': 'error', 'no-dupe-keys': 'error', 'no-duplicate-case': 'error', 'no-empty': 'error', 'no-empty-character-class': 'error', 'no-empty-pattern': 'error', 'no-ex-assign': 'error', 'no-extra-boolean-cast': 'error', 'no-extra-semi': 'error', 'no-fallthrough': 'error', 'no-func-assign': 'error', 'no-global-assign': 'error', 'no-inner-declarations': 'error', 'no-invalid-regexp': 'error', 'no-irregular-whitespace': 'error', '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': 'error', '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-unused-vars': 'error', 'no-useless-catch': 'error', 'no-useless-escape': 'error', 'no-with': 'error', 'require-yield': 'error', 'use-isnan': 'error', 'valid-typeof': 'error' }, settings: undefined }, { name: '.eslintrc.cjs » plugin:@typescript-eslint/eslint-recommended', filePath: '/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js', criteria: null, env: undefined, globals: undefined, ignorePattern: undefined, noInlineConfig: undefined, parser: undefined, parserOptions: undefined, plugins: undefined, processor: undefined, reportUnusedDisableDirectives: undefined, root: undefined, rules: undefined, settings: undefined }, { name: '.eslintrc.cjs » plugin:@typescript-eslint/eslint-recommended#overrides[0]', filePath: '/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js', criteria: { includes: [Array], excludes: null, basePath: '/home/dandv/prg/ts-eslint' }, env: undefined, globals: undefined, ignorePattern: undefined, noInlineConfig: undefined, parser: undefined, parserOptions: undefined, plugins: undefined, processor: undefined, reportUnusedDisableDirectives: undefined, root: undefined, rules: { 'getter-return': 'off', 'no-dupe-args': 'off', 'no-dupe-keys': 'off', 'no-unreachable': 'off', 'valid-typeof': 'off', 'no-const-assign': 'off', 'no-new-symbol': 'off', 'no-this-before-super': 'off', 'no-undef': 'off', 'no-dupe-class-members': 'off', 'no-redeclare': 'off' }, settings: undefined }, { name: '.eslintrc.cjs » plugin:@typescript-eslint/recommended » ./configs/base.json', filePath: '/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json', criteria: null, env: undefined, globals: undefined, ignorePattern: undefined, noInlineConfig: undefined, parser: { error: null, filePath: '/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/parser/dist/parser.js', id: '@typescript-eslint/parser', importerName: '.eslintrc.cjs » plugin:@typescript-eslint/recommended » ./configs/base.json', importerPath: '/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/configs/base.json' }, parserOptions: { sourceType: 'module' }, plugins: { '@typescript-eslint': [Object] }, processor: undefined, reportUnusedDisableDirectives: undefined, root: undefined, rules: undefined, settings: undefined }, { name: '.eslintrc.cjs » plugin:@typescript-eslint/recommended', filePath: '/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/eslint-plugin/dist/index.js', criteria: null, env: undefined, globals: undefined, ignorePattern: undefined, noInlineConfig: undefined, parser: undefined, parserOptions: undefined, plugins: undefined, processor: undefined, reportUnusedDisableDirectives: undefined, root: undefined, rules: { '@typescript-eslint/adjacent-overload-signatures': 'error', '@typescript-eslint/ban-ts-ignore': 'error', '@typescript-eslint/ban-types': 'error', camelcase: 'off', '@typescript-eslint/camelcase': 'error', '@typescript-eslint/class-name-casing': 'error', '@typescript-eslint/consistent-type-assertions': 'error', '@typescript-eslint/explicit-function-return-type': 'warn', '@typescript-eslint/interface-name-prefix': 'error', '@typescript-eslint/member-delimiter-style': 'error', 'no-array-constructor': 'off', '@typescript-eslint/no-array-constructor': 'error', 'no-empty-function': 'off', '@typescript-eslint/no-empty-function': 'error', '@typescript-eslint/no-empty-interface': 'error', '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/no-inferrable-types': 'error', '@typescript-eslint/no-misused-new': 'error', '@typescript-eslint/no-namespace': 'error', '@typescript-eslint/no-non-null-assertion': 'warn', '@typescript-eslint/no-this-alias': 'error', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'warn', 'no-use-before-define': 'off', '@typescript-eslint/no-use-before-define': 'error', '@typescript-eslint/no-var-requires': 'error', '@typescript-eslint/prefer-namespace-keyword': 'error', '@typescript-eslint/triple-slash-reference': 'error', '@typescript-eslint/type-annotation-spacing': 'error', 'no-var': 'error', 'prefer-const': 'error', 'prefer-rest-params': 'error', 'prefer-spread': 'error' }, settings: undefined }, { name: '.eslintrc.cjs', filePath: '/home/dandv/prg/ts-eslint/.eslintrc.cjs', criteria: null, env: undefined, globals: undefined, ignorePattern: undefined, noInlineConfig: undefined, parser: { error: null, filePath: '/home/dandv/prg/ts-eslint/node_modules/@typescript-eslint/parser/dist/parser.js', id: '@typescript-eslint/parser', importerName: '.eslintrc.cjs', importerPath: '/home/dandv/prg/ts-eslint/.eslintrc.cjs' }, parserOptions: { ecmaVersion: 2019, sourceType: 'module' }, plugins: { '@typescript-eslint': [Object] }, processor: undefined, reportUnusedDisableDirectives: undefined, root: undefined, rules: { 'space-infix-ops': 'error' }, settings: undefined } ] on /home/dandv/prg/ts-eslint +42ms
  eslint:ignore-pattern Create with: [ IgnorePattern { patterns: [ '/node_modules/*', '/bower_components/*' ], basePath: '/home/dandv/prg/ts-eslint', loose: false } ] +210ms
  eslint:ignore-pattern   processed: { basePath: '/home/dandv/prg/ts-eslint', patterns: [ '/node_modules/*', '/bower_components/*' ] } +1ms
  eslint:ignore-pattern Check {
  filePath: '/home/dandv/prg/ts-eslint/err.ts',
  dot: false,
  relativePath: 'err.ts',
  result: false
} +0ms
  eslint:cli-engine Lint /home/dandv/prg/ts-eslint/err.ts +0ms
  eslint:linter Linting code for /home/dandv/prg/ts-eslint/err.ts (pass 1) +0ms
  eslint:linter Verify +0ms
  eslint:linter With ConfigArray: /home/dandv/prg/ts-eslint/err.ts +0ms
  eslint:linter Generating fixed text for /home/dandv/prg/ts-eslint/err.ts (pass 1) +30ms
  eslint:source-code-fixer Applying fixes +0ms
  eslint:source-code-fixer shouldFix parameter was false, not attempting fixes +0ms
  eslint:file-enumerator Complete iterating files: ["err.ts"] +240ms
  eslint:cli-engine Linting complete in: 241ms +30ms

/home/dandv/prg/ts-eslint/err.ts
  1:7  warning  'Person' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (0 errors, 1 warning)

Versions

package version
@typescript-eslint/eslint-plugin 2.22.0
@typescript-eslint/parser 2.22.0
TypeScript 3.8.3
ESLint 6.8.0
node 13.9.0
npm 6.3.17
@dandv dandv added package: eslint-plugin Issues related to @typescript-eslint/eslint-plugin triage Waiting for maintainers to take a look labels Mar 7, 2020
@bradzacher
Copy link
Member

Yeah, ESLint doesn't support class properties yet, because they've not progressed far enough in the spec process.

Happy to accept a PR to add an extension rule.

@bradzacher bradzacher added enhancement: new base rule extension New base rule extension required to handle a TS specific case and removed triage Waiting for maintainers to take a look labels Mar 7, 2020
@FDIM
Copy link
Contributor

FDIM commented Mar 24, 2021

I've just bumped into this inconsistency regarding assignment and would like to tackle this issue.

@bradzacher Do you agree that space-infix-ops in this repo should be updated to cover property initialization ? I think it should.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement: new base rule extension New base rule extension required to handle a TS specific case package: eslint-plugin Issues related to @typescript-eslint/eslint-plugin
Projects
None yet
3 participants