UNPKG

@massalabs/eslint-config

Version:

Shareable Config of ESLint for MassaLabs

277 lines (232 loc) 8.56 kB
module.exports = { root: true, parser: '@typescript-eslint/parser', plugins: [ '@typescript-eslint/eslint-plugin', 'eslint-plugin-tsdoc', 'jsdoc', 'json', ], ignorePatterns: [ '**/docs/**', '**/dist/**', '**/build/**', '**/as-pect.config.js', ], extends: [ 'eslint:recommended', 'plugin:json/recommended', 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', 'google', 'prettier', ], parserOptions: { ecmaVersion: 2020, sourceType: 'module', ecmaFeatures: {}, }, env: { node: true, }, // === General rules ========================================================= rules: { // allow non uppercase first letter for classes. (needed for as-bignum) 'new-cap': ['error', { newIsCap: false }], 'max-len': ['error', 120], // Omitted semicolons are hugely popular, yet within the compiler it makes // sense to be better safe than sorry. semi: 'error', // Our code bases uses 2 spaces for indentation, and we enforce it here so // files don't mix spaces, tabs or different indentation levels. indent: [ 'error', 2, { SwitchCase: 1, VariableDeclarator: 'first', offsetTernaryExpressions: true, ignoredNodes: [ // FIXME: something's odd here 'ConditionalExpression > *', 'ConditionalExpression > * > *', 'ConditionalExpression > * > * > *', ], }, ], // This is mostly visual style, making comments look uniform. 'spaced-comment': [ 'error', 'always', { markers: ['/'], // triple-slash exceptions: ['/'], // all slashes }, ], // This tends to be annoying as it encourages developers to make everything // that is never reassigned a 'const', sometimes semantically incorrect so, // typically leading to huge diffs in follow-up PRs modifying affected code. 'prefer-const': 'off', // It is perfectly fine to declare top-level variables with `var`, yet this // rule doesn't provide configuration options that would help. 'no-var': 'off', // Quite often, dealing with multiple related cases at once or otherwise // falling through is exactly the point of using a switch. 'no-fallthrough': 'off', // Typical false-positives here are `do { ... } while (true)` statements or // similar, but the only option provided here is not checking any loops. 'no-constant-condition': ['error', { checkLoops: false }], // Functions are nested in blocks occasionally, and there haven't been any // problems with this so far, so turning the check off. 'no-inner-declarations': 'off', // Quite common in scenarios where an iteration starts at `current = this`. '@typescript-eslint/no-this-alias': 'off', // Disabled here, but enabled again for JavaScript files. 'no-unused-vars': 'off', // Disabled here, but enabled again for TypeScript files. '@typescript-eslint/no-unused-vars': 'off', // Too problematic because of AssemblyScript methods like __pin and __unpin. 'no-underscore-dangle': ['off'], // Allow us to use 0xffffffffffffffff for edge case tests '@typescript-eslint/no-loss-of-precision': 'warn', // disable deprecated rules 'valid-jsdoc': 'off', 'require-jsdoc': 'off', // console rules 'no-console': 'error', 'no-debugger': 'error', }, overrides: [ // === JavaScript rules ==================================================== // jsdoc rules { files: ['**/*.js'], rules: { 'tsdoc/syntax': 'off', 'no-unused-vars': 'warn', }, extends: ['plugin:jsdoc/recommended'], overrides: [ { files: ['**/*.test.{js,ts,tsx}', '**/*.stories.{js,ts,tsx}'], rules: { 'no-console': 'off', }, }, ], }, // === TypeScript rules ==================================================== // tsdoc rules { files: ['**/*.ts'], rules: { 'tsdoc/syntax': 'error', }, }, { files: ['**/assembly/**/*.ts'], rules: { // Enforcing to remove function parameters on stubs makes code less // maintainable, so we instead allow unused function parameters. '@typescript-eslint/no-unused-vars': [ 'warn', { vars: 'local', argsIgnorePattern: '^_|^[A-Z](?:From|To)?$', // ignore type params args: 'all', ignoreRestSiblings: false, }, ], // Namespaces are quite useful in AssemblyScript '@typescript-eslint/no-namespace': 'off', // There is actually codegen difference here '@typescript-eslint/no-array-constructor': 'off', // Sometimes it can't be avoided to add a @ts-ignore '@typescript-eslint/ban-ts-comment': 'off', // Utilized to achieve portability in some cases '@typescript-eslint/no-non-null-assertion': 'off', // Type conversions require an explicit cast in AssemblyScript. '@typescript-eslint/no-unnecessary-type-assertion': 'off', }, }, // === Jest unit test rules =========================================================== { files: ['**/*.test.{js,ts,tsx}'], rules: { 'no-console': 'off', }, }, // === Storybook rules =========================================================== { files: ['**/*.stories.{js,ts,tsx}'], rules: { 'no-console': 'off', }, }, // === Compiler rules (extends AssemblyScript rules) ======================= { files: ['**/assembly/**/*.ts'], rules: { // There is an actual codegen difference here - TODO: revisit 'no-cond-assign': 'off', // Not all types can be omitted in AS yet - TODO: revisit '@typescript-eslint/no-inferrable-types': 'off', // Used rarely to reference internals that are not user-visible '@typescript-eslint/triple-slash-reference': 'off', // The compiler has its own `Function` class for example 'no-shadow-restricted-names': 'off', '@typescript-eslint/ban-types': 'off', // Different behavior in AssemblyScript. // https://www.assemblyscript.org/basics.html#triple-equals eqeqeq: 'off', 'new-cap': ['error', { capIsNewExceptions: ['ERROR'] }], }, }, // === Standard Library rules (extends AssemblyScript rules) =============== { files: ['**/assembly/**/*.ts'], rules: { // We are implementing with --noLib, so we shadow all the time 'no-shadow-restricted-names': 'off', // Similarly, sometimes we need the return type to be String, not string '@typescript-eslint/ban-types': 'off', }, }, // === Standard Definition rules (extends TypeScript rules) ================ { files: ['**/assembly/**/*.d.ts'], rules: { // Often required to achieve compatibility with TypeScript '@typescript-eslint/no-explicit-any': 'off', // Interfaces can be stubs here, i.e. not yet fully implemented '@typescript-eslint/no-empty-interface': 'off', // Definitions make use of `object` to model rather unusual constraints '@typescript-eslint/ban-types': 'off', }, }, // === Test rules (extends TypeScript rules) =============================== { files: ['**/assembly/__tests__/**/*.ts'], rules: { // Tests typically include unusual code patterns on purpose. This is // very likely not an extensive list, but covers what's there so far. 'no-empty': 'off', 'no-cond-assign': 'off', 'no-compare-neg-zero': 'off', 'no-inner-declarations': 'off', 'no-constant-condition': 'off', 'use-isnan': 'off', '@typescript-eslint/no-namespace': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-extra-semi': 'off', '@typescript-eslint/no-inferrable-types': 'off', '@typescript-eslint/ban-types': 'off', '@typescript-eslint/triple-slash-reference': 'off', '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/no-extra-non-null-assertion': 'off', '@typescript-eslint/no-empty-interface': 'off', }, }, ], };