oxc-project / oxc

⚓ A collection of JavaScript tools written in Rust.
https://oxc.rs
MIT License
12.53k stars 458 forks source link

☂️ typescript-eslint #2180

Open Boshen opened 10 months ago

Boshen commented 10 months ago

[!WARNING] This comment is maintained by CI. Do not edit this comment directly. To update comment template, see https://github.com/oxc-project/oxc/tree/main/tasks/lint_rules

This is tracking issue for @typescript-eslint/eslint-plugin.

There are 66(+ 6 deprecated) rules.

To get started, run the following command:

just new-typescript-rule <RULE_NAME>

Then register the rule in crates/oxc_linter/src/rules.rs and also declare_all_lint_rules at the bottom.

Recommended rules

✨: 34, 🚫: 0 / total: 40 | Status | Name | Docs | | :----: | :--- | :--- | | ✨ | typescript/adjacent-overload-signatures | https://typescript-eslint.io/rules/adjacent-overload-signatures | | ✨ | typescript/array-type | https://typescript-eslint.io/rules/array-type | | ✨ | typescript/ban-tslint-comment | https://typescript-eslint.io/rules/ban-tslint-comment | | | typescript/class-literal-property-style | https://typescript-eslint.io/rules/class-literal-property-style | | | typescript/consistent-generic-constructors | https://typescript-eslint.io/rules/consistent-generic-constructors | | ✨ | typescript/consistent-indexed-object-style | https://typescript-eslint.io/rules/consistent-indexed-object-style | | | typescript/consistent-type-assertions | https://typescript-eslint.io/rules/consistent-type-assertions | | ✨ | typescript/consistent-type-definitions | https://typescript-eslint.io/rules/consistent-type-definitions | | ✨ | typescript/no-array-constructor | https://typescript-eslint.io/rules/no-array-constructor | | ✨ | typescript/no-confusing-non-null-assertion | https://typescript-eslint.io/rules/no-confusing-non-null-assertion | | ✨ | typescript/no-duplicate-enum-values | https://typescript-eslint.io/rules/no-duplicate-enum-values | | ✨ | typescript/no-dynamic-delete | https://typescript-eslint.io/rules/no-dynamic-delete | | ✨ | typescript/no-empty-function | https://typescript-eslint.io/rules/no-empty-function | | ✨ | typescript/no-empty-object-type | https://typescript-eslint.io/rules/no-empty-object-type | | ✨ | typescript/no-explicit-any | https://typescript-eslint.io/rules/no-explicit-any | | ✨ | typescript/no-extra-non-null-assertion | https://typescript-eslint.io/rules/no-extra-non-null-assertion | | ✨ | typescript/no-extraneous-class | https://typescript-eslint.io/rules/no-extraneous-class | | ✨ | typescript/no-inferrable-types | https://typescript-eslint.io/rules/no-inferrable-types | | | typescript/no-invalid-void-type | https://typescript-eslint.io/rules/no-invalid-void-type | | ✨ | typescript/no-misused-new | https://typescript-eslint.io/rules/no-misused-new | | ✨ | typescript/no-namespace | https://typescript-eslint.io/rules/no-namespace | | ✨ | typescript/no-non-null-asserted-nullish-coalescing | https://typescript-eslint.io/rules/no-non-null-asserted-nullish-coalescing | | ✨ | typescript/no-non-null-asserted-optional-chain | https://typescript-eslint.io/rules/no-non-null-asserted-optional-chain | | ✨ | typescript/no-non-null-assertion | https://typescript-eslint.io/rules/no-non-null-assertion | | ✨ | typescript/no-require-imports | https://typescript-eslint.io/rules/no-require-imports | | ✨ | typescript/no-this-alias | https://typescript-eslint.io/rules/no-this-alias | | ✨ | typescript/no-unnecessary-type-constraint | https://typescript-eslint.io/rules/no-unnecessary-type-constraint | | ✨ | typescript/no-unsafe-declaration-merging | https://typescript-eslint.io/rules/no-unsafe-declaration-merging | | ✨ | typescript/no-unsafe-function-type | https://typescript-eslint.io/rules/no-unsafe-function-type | | | typescript/no-unused-expressions | https://typescript-eslint.io/rules/no-unused-expressions | | ✨ | typescript/no-unused-vars | https://typescript-eslint.io/rules/no-unused-vars | | ✨ | typescript/no-useless-constructor | https://typescript-eslint.io/rules/no-useless-constructor | | ✨ | typescript/no-wrapper-object-types | https://typescript-eslint.io/rules/no-wrapper-object-types | | ✨ | typescript/prefer-as-const | https://typescript-eslint.io/rules/prefer-as-const | | ✨ | typescript/prefer-for-of | https://typescript-eslint.io/rules/prefer-for-of | | ✨ | typescript/prefer-function-type | https://typescript-eslint.io/rules/prefer-function-type | | ✨ | typescript/prefer-literal-enum-member | https://typescript-eslint.io/rules/prefer-literal-enum-member | | ✨ | typescript/prefer-namespace-keyword | https://typescript-eslint.io/rules/prefer-namespace-keyword | | ✨ | typescript/triple-slash-reference | https://typescript-eslint.io/rules/triple-slash-reference | | | typescript/unified-signatures | https://typescript-eslint.io/rules/unified-signatures | ✨ = Implemented, 🚫 = No need to implement

Not recommended rules

✨: 11, 🚫: 0 / total: 26 | Status | Name | Docs | | :----: | :--- | :--- | | ✨ | typescript/ban-ts-comment | https://typescript-eslint.io/rules/ban-ts-comment | | | typescript/class-methods-use-this | https://typescript-eslint.io/rules/class-methods-use-this | | ✨ | typescript/consistent-type-imports | https://typescript-eslint.io/rules/consistent-type-imports | | ✨ | typescript/default-param-last | https://typescript-eslint.io/rules/default-param-last | | ✨ | typescript/explicit-function-return-type | https://typescript-eslint.io/rules/explicit-function-return-type | | | typescript/explicit-member-accessibility | https://typescript-eslint.io/rules/explicit-member-accessibility | | | typescript/explicit-module-boundary-types | https://typescript-eslint.io/rules/explicit-module-boundary-types | | | typescript/init-declarations | https://typescript-eslint.io/rules/init-declarations | | ✨ | typescript/max-params | https://typescript-eslint.io/rules/max-params | | | typescript/member-ordering | https://typescript-eslint.io/rules/member-ordering | | | typescript/method-signature-style | https://typescript-eslint.io/rules/method-signature-style | | ✨ | typescript/no-dupe-class-members | https://typescript-eslint.io/rules/no-dupe-class-members | | ✨ | typescript/no-import-type-side-effects | https://typescript-eslint.io/rules/no-import-type-side-effects | | | typescript/no-invalid-this | https://typescript-eslint.io/rules/no-invalid-this | | | typescript/no-loop-func | https://typescript-eslint.io/rules/no-loop-func | | ✨ | typescript/no-magic-numbers | https://typescript-eslint.io/rules/no-magic-numbers | | ✨ | typescript/no-redeclare | https://typescript-eslint.io/rules/no-redeclare | | | typescript/no-restricted-imports | https://typescript-eslint.io/rules/no-restricted-imports | | | typescript/no-restricted-types | https://typescript-eslint.io/rules/no-restricted-types | | | typescript/no-shadow | https://typescript-eslint.io/rules/no-shadow | | | typescript/no-unnecessary-parameter-property-assignment | https://typescript-eslint.io/rules/no-unnecessary-parameter-property-assignment | | | typescript/no-use-before-define | https://typescript-eslint.io/rules/no-use-before-define | | ✨ | typescript/no-useless-empty-export | https://typescript-eslint.io/rules/no-useless-empty-export | | | typescript/parameter-properties | https://typescript-eslint.io/rules/parameter-properties | | ✨ | typescript/prefer-enum-initializers | https://typescript-eslint.io/rules/prefer-enum-initializers | | | typescript/typedef | https://typescript-eslint.io/rules/typedef | ✨ = Implemented, 🚫 = No need to implement

Deprecated rules

✨: 4, 🚫: 0 / total: 6 | Status | Name | Docs | | :----: | :--- | :--- | | ✨ | typescript/no-empty-interface | https://typescript-eslint.io/rules/no-empty-interface | | ✨ | typescript/no-loss-of-precision | https://typescript-eslint.io/rules/no-loss-of-precision | | | typescript/no-type-alias | https://typescript-eslint.io/rules/no-type-alias | | ✨ | typescript/no-var-requires | https://typescript-eslint.io/rules/no-var-requires | | ✨ | typescript/prefer-ts-expect-error | https://typescript-eslint.io/rules/prefer-ts-expect-error | | | typescript/sort-type-constituents | https://typescript-eslint.io/rules/sort-type-constituents | ✨ = Implemented, 🚫 = No need to implement
alfaproject commented 10 months ago

Will type checking rules be considered for implementation at any point in time?

alxpsr commented 10 months ago

Have checked typescript/member-ordering: not working yet. Just for status

Version: 0.2.6

happy-turtle commented 9 months ago

I looked into typescript/no-confusing-non-null-assertion, but I am not able to run the test. The test code does not seem to be valid JavaScript? Is oxc maybe validating the test's JS code while typescript-eslint is not?

  × Cannot assign to this expression
   ╭─[no_confusing_non_null_assertion.tsx:1:2]
 1 │ (a + b!) = c;
   ·  ──────
   ╰────
Boshen commented 9 months ago

I looked into typescript/no-confusing-non-null-assertion, but I am not able to run the test. The test code does not seem to be valid JavaScript? Is oxc maybe validating the test's JS code while typescript-eslint is not?

  × Cannot assign to this expression
   ╭─[no_confusing_non_null_assertion.tsx:1:2]
 1 │ (a + b!) = c;
   ·  ──────
   ╰────

Just comment out the tests that raise an error.

todor-a commented 9 months ago

Am I missing something or is the await-thenable rule missing from the list?

Boshen commented 9 months ago

Am I missing something or is the await-thenable rule missing form the list?

It seems like we excluded all type checking rules from the recommended-type-checked list.

dsmyda-ab commented 7 months ago

@Boshen Are there plans to eventually support type checking rules?

armano2 commented 4 months ago

@Boshen Are there plans to eventually support type checking rules?

see https://github.com/oxc-project/oxc/issues/3105

TheJDen commented 4 months ago

Warning

This comment is maintained by CI. Do not edit this comment directly. To update comment template, see https://github.com/oxc-project/oxc/tree/main/tasks/lint_rules

This is tracking issue for @typescript-eslint/eslint-plugin.

There are 67(+ 24 deprecated) rules.

  • 9/39 recommended rules are remaining as TODO
  • 18/28 not recommended rules are remaining as TODO

To get started, run the following command:

just new-typescript-rule <RULE_NAME>

Then register the rule in crates/oxc_linter/src/rules.rs and also declare_all_lint_rules at the bottom.

Recommended rules

✨: 30, 🚫: 0 / total: 39 Status Name Docs ✨ typescript/adjacent-overload-signatures https://typescript-eslint.io/rules/adjacent-overload-signatures ✨ typescript/array-type https://typescript-eslint.io/rules/array-type ✨ typescript/ban-tslint-comment https://typescript-eslint.io/rules/ban-tslint-comment ✨ typescript/ban-types https://typescript-eslint.io/rules/ban-types typescript/class-literal-property-style https://typescript-eslint.io/rules/class-literal-property-style typescript/consistent-generic-constructors https://typescript-eslint.io/rules/consistent-generic-constructors ✨ typescript/consistent-indexed-object-style https://typescript-eslint.io/rules/consistent-indexed-object-style typescript/consistent-type-assertions https://typescript-eslint.io/rules/consistent-type-assertions ✨ typescript/consistent-type-definitions https://typescript-eslint.io/rules/consistent-type-definitions ✨ typescript/no-array-constructor https://typescript-eslint.io/rules/no-array-constructor ✨ typescript/no-confusing-non-null-assertion https://typescript-eslint.io/rules/no-confusing-non-null-assertion ✨ typescript/no-duplicate-enum-values https://typescript-eslint.io/rules/no-duplicate-enum-values ✨ typescript/no-dynamic-delete https://typescript-eslint.io/rules/no-dynamic-delete ✨ typescript/no-empty-function https://typescript-eslint.io/rules/no-empty-function ✨ typescript/no-empty-interface https://typescript-eslint.io/rules/no-empty-interface ✨ typescript/no-explicit-any https://typescript-eslint.io/rules/no-explicit-any ✨ typescript/no-extra-non-null-assertion https://typescript-eslint.io/rules/no-extra-non-null-assertion typescript/no-extraneous-class https://typescript-eslint.io/rules/no-extraneous-class typescript/no-inferrable-types https://typescript-eslint.io/rules/no-inferrable-types typescript/no-invalid-void-type https://typescript-eslint.io/rules/no-invalid-void-type ✨ typescript/no-loss-of-precision https://typescript-eslint.io/rules/no-loss-of-precision ✨ typescript/no-misused-new https://typescript-eslint.io/rules/no-misused-new ✨ typescript/no-namespace https://typescript-eslint.io/rules/no-namespace ✨ typescript/no-non-null-asserted-nullish-coalescing https://typescript-eslint.io/rules/no-non-null-asserted-nullish-coalescing ✨ typescript/no-non-null-asserted-optional-chain https://typescript-eslint.io/rules/no-non-null-asserted-optional-chain ✨ typescript/no-non-null-assertion https://typescript-eslint.io/rules/no-non-null-assertion ✨ typescript/no-this-alias https://typescript-eslint.io/rules/no-this-alias ✨ typescript/no-unnecessary-type-constraint https://typescript-eslint.io/rules/no-unnecessary-type-constraint ✨ typescript/no-unsafe-declaration-merging https://typescript-eslint.io/rules/no-unsafe-declaration-merging typescript/no-unused-vars https://typescript-eslint.io/rules/no-unused-vars ✨ typescript/no-useless-constructor https://typescript-eslint.io/rules/no-useless-constructor ✨ typescript/no-var-requires https://typescript-eslint.io/rules/no-var-requires ✨ typescript/prefer-as-const https://typescript-eslint.io/rules/prefer-as-const ✨ typescript/prefer-for-of https://typescript-eslint.io/rules/prefer-for-of ✨ typescript/prefer-function-type https://typescript-eslint.io/rules/prefer-function-type ✨ typescript/prefer-literal-enum-member https://typescript-eslint.io/rules/prefer-literal-enum-member typescript/prefer-namespace-keyword https://typescript-eslint.io/rules/prefer-namespace-keyword ✨ typescript/triple-slash-reference https://typescript-eslint.io/rules/triple-slash-reference typescript/unified-signatures https://typescript-eslint.io/rules/unified-signatures ✨ = Implemented, 🚫 = Not supported

Not recommended rules

✨: 10, 🚫: 0 / total: 28 Status Name Docs ✨ typescript/ban-ts-comment https://typescript-eslint.io/rules/ban-ts-comment typescript/class-methods-use-this https://typescript-eslint.io/rules/class-methods-use-this ✨ typescript/consistent-type-imports https://typescript-eslint.io/rules/consistent-type-imports ✨ typescript/default-param-last https://typescript-eslint.io/rules/default-param-last ✨ typescript/explicit-function-return-type https://typescript-eslint.io/rules/explicit-function-return-type typescript/explicit-member-accessibility https://typescript-eslint.io/rules/explicit-member-accessibility typescript/explicit-module-boundary-types https://typescript-eslint.io/rules/explicit-module-boundary-types typescript/init-declarations https://typescript-eslint.io/rules/init-declarations ✨ typescript/max-params https://typescript-eslint.io/rules/max-params typescript/member-ordering https://typescript-eslint.io/rules/member-ordering typescript/method-signature-style https://typescript-eslint.io/rules/method-signature-style ✨ typescript/no-dupe-class-members https://typescript-eslint.io/rules/no-dupe-class-members typescript/no-empty-object-type https://typescript-eslint.io/rules/no-empty-object-type ✨ typescript/no-import-type-side-effects https://typescript-eslint.io/rules/no-import-type-side-effects typescript/no-invalid-this https://typescript-eslint.io/rules/no-invalid-this typescript/no-loop-func https://typescript-eslint.io/rules/no-loop-func typescript/no-magic-numbers https://typescript-eslint.io/rules/no-magic-numbers ✨ typescript/no-redeclare https://typescript-eslint.io/rules/no-redeclare typescript/no-require-imports https://typescript-eslint.io/rules/no-require-imports typescript/no-restricted-imports https://typescript-eslint.io/rules/no-restricted-imports typescript/no-shadow https://typescript-eslint.io/rules/no-shadow typescript/no-unnecessary-parameter-property-assignment https://typescript-eslint.io/rules/no-unnecessary-parameter-property-assignment typescript/no-unused-expressions https://typescript-eslint.io/rules/no-unused-expressions typescript/no-use-before-define https://typescript-eslint.io/rules/no-use-before-define ✨ typescript/no-useless-empty-export https://typescript-eslint.io/rules/no-useless-empty-export typescript/parameter-properties https://typescript-eslint.io/rules/parameter-properties ✨ typescript/prefer-enum-initializers https://typescript-eslint.io/rules/prefer-enum-initializers typescript/typedef https://typescript-eslint.io/rules/typedef ✨ = Implemented, 🚫 = Not supported

Deprecated rules

✨: 1, 🚫: 0 / total: 24

Can we change command name here, it doesn't actually exist (it is ts instead of full typescript) @Boshen

markEHVN commented 2 weeks ago

Hi team, I ran oxlint and I caught some issues:

! The following rules do not match the currently supported rules:
  | typescript/no-dupe-class-members
  | typescript/no-useless-constructor
  | typescript/no-loss-of-precision
  | typescript/no-array-constructor
  | typescript/no-redeclare
  | typescript/no-unused-vars

But, you can see all these rules have been implemented. I am using "oxlint": "^0.11.0",

markEHVN commented 6 days ago

I did not find @typescript-eslint/naming-convention - docs. Should we add it to Not recommended rules table?

harrytran998 commented 5 days ago

Yes, the rule @typescript-eslint/naming-convention is really important for large projects, especially with projects that have multiple teams interacting. Hope this rule implement soon - Thanks oxc team

camc314 commented 3 days ago

@typescript-eslint/naming-convention requires type information unfortunatly.

I wonder whether it would be reasonable to introduce our own version of this which is slightly more limited.

something like:

https://rust-lang.github.io/api-guidelines/naming.html

For typescript it would be:

Item Convention
Classes UpperCamelCase
Interfaces UpperCamelCase, often prefixed with I (optional and project-specific, e.g., IUser)
Type Aliases UpperCamelCase
Enums UpperCamelCase
Enum Members UPPER_SNAKE_CASE
Functions camelCase
Methods camelCase
Variables camelCase
Constants SCREAMING_SNAKE_CASE
Parameters camelCase
Type Parameters UpperCamelCase
Generic Constraints UpperCamelCase
Literals Use direct values or const enums for clarity.
Properties camelCase for public/protected/private properties, #camelCase for private fields
Imports camelCase for functions/variables, UpperCamelCase for classes/types
Decorators @ camelCase
Namespaces UpperCamelCase

and i guess we could also allow customizing these conventions.

would this satisfy most of what @typescript-eslint/naming-convention does?

protoEvangelion commented 4 hours ago

no-restricted-imports is blocker for me to adopt oxlint.

markEHVN commented 4 hours ago

would this satisfy most of what @typescript-eslint/naming-convention does?

Yes, It's satisfy most of cases. I never use type-checked with naming-convention rule. 😬