UNPKG

@hashgraph/solo

Version:

An opinionated CLI tool to deploy and manage private Hedera Networks.

228 lines (225 loc) 7.33 kB
// SPDX-License-Identifier: Apache-2.0 import globals from 'globals'; import eslintJs from '@eslint/js'; import nodePlugin from 'eslint-plugin-n'; import eslintConfigPrettier from 'eslint-config-prettier'; import eslintPluginPrettier from 'eslint-plugin-prettier'; import tsEslint from 'typescript-eslint'; import headers from 'eslint-plugin-headers'; import tsdoc from 'eslint-plugin-tsdoc'; import unusedImports from 'eslint-plugin-unused-imports'; import eslintPluginUnicorn from 'eslint-plugin-unicorn'; export default [ eslintJs.configs.recommended, nodePlugin.configs['flat/recommended'], eslintConfigPrettier, ...tsEslint.configs.recommended.map(config => ({ ...config, files: ['**/*.ts', '**/*.tsx'], })), eslintPluginUnicorn.configs.recommended, { ignores: [ '.git/**/*', // Git files '.github/**/*', // GitHub files '.idea/**/*', // IDE files 'coverage/**/*', // Coverage files 'docs/**/*', // Documentation files 'examples/**/*', // Example files 'dist/**/*', // Distribution files 'node_modules/**/*', // Node modules 'coverage/**/*', // Coverage files '**/*.*js', // JavaScript files ], }, { // Rules for all files not excluded languageOptions: { globals: { ...globals.mocha, ...globals.node, }, parserOptions: { projectService: true, tsconfigRootDir: import.meta.dirname, }, ecmaVersion: 'latest', sourceType: 'module', }, plugins: { n: nodePlugin, prettier: eslintPluginPrettier, headers: headers, tsdoc: tsdoc, 'unused-imports': unusedImports, '@typescript-eslint': tsEslint.plugin, }, rules: { 'headers/header-format': [ 'error', { source: 'string', content: 'SPDX-License-Identifier: Apache-2.0', style: 'line', trailingNewlines: 2, }, ], 'prettier/prettier': 'error', 'block-scoped-var': 'error', eqeqeq: 'error', 'no-var': 'error', 'prefer-const': 'error', 'eol-last': 'error', 'prefer-arrow-callback': 'error', 'no-trailing-spaces': 'error', quotes: ['warn', 'single', {avoidEscape: true}], 'no-restricted-properties': [ 'error', { object: 'describe', property: 'only', }, { object: 'it', property: 'only', }, ], 'n/no-missing-import': 'off', 'n/no-empty-function': 'off', 'n/no-unsupported-features/es-syntax': 'off', 'n/no-missing-require': 'off', 'n/hashbang': [ 'error', { additionalExecutables: ['solo.ts'], }, ], 'n/no-unpublished-import': [ 'error', { allowModules: [ 'globals', '@eslint/js', 'eslint-plugin-n', 'eslint-config-prettier', 'eslint-plugin-prettier', 'typescript-eslint', 'eslint-plugin-headers', 'eslint-plugin-tsdoc', 'eslint-plugin-unused-imports', ], convertPath: [ { include: ['src/**'], replace: ['^src/(.+)$', 'dist/$1'], }, ], }, ], 'no-dupe-class-members': 'off', 'require-atomic-updates': 'off', 'n/no-unsupported-features/node-builtins': [ 'error', { ignores: ['fs.cpSync', 'CryptoKey', 'fetch'], }, ], 'no-prototype-builtins': 'off', '@typescript-eslint/ban-ts-comment': 'warn', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-use-before-define': 'off', '@typescript-eslint/no-warning-comments': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/explicit-function-return-type': [ 'warn', { allowExpressions: false, allowTypedFunctionExpressions: false, allowHigherOrderFunctions: false, }, ], '@typescript-eslint/typedef': [ 'warn', { variableDeclaration: true, parameter: true, propertyDeclaration: true, memberVariableDeclaration: true, }, ], '@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/ban-types': 'off', '@typescript-eslint/camelcase': 'off', '@typescript-eslint/consistent-type-imports': [ // optional: assists in reducing circular dependencies 'error', { fixStyle: 'inline-type-imports', }, ], '@typescript-eslint/no-explicit-any': 'warn', // TODO remove (771 errors) '@typescript-eslint/no-this-alias': [ 'error', { allowedNames: ['self'], // TODO remove (59 errors) }, ], '@typescript-eslint/no-unused-vars': 'warn', // TODO remove (83 errors) 'n/no-process-exit': 'warn', // TODO remove (38 errors) // Enforce `import {type X} from 'path';` over `import type {X} from 'path';`, // but allow `import type * as <name> from 'path';` 'no-restricted-syntax': [ 'error', { selector: "ImportDeclaration[importKind='type'] ImportSpecifier", message: "Use `import {type X} from 'path';` instead of `import type {X} from 'path';`.", }, ], '@typescript-eslint/explicit-member-accessibility': 'warn', 'unused-imports/no-unused-imports': 'error', 'unused-imports/no-unused-vars': [ 'warn', { vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_', }, ], 'no-invalid-this': ['off', {}], '@typescript-eslint/no-unused-expressions': 'off', 'curly': ['error', 'all'], 'unicorn/filename-case': [ 'error', { case: 'kebabCase', // Optional: Ensure this rule only applies to TypeScript files ignore: ['.*\\.d\\.ts$'], // Ignore TypeScript declaration files if needed }, ], 'unicorn/prefer-spread': 'warn', // TODO error 'unicorn/no-null': 'warn', // TODO error 'unicorn/text-encoding-identifier-case': 'warn', // TODO error 'unicorn/catch-error-name': 'warn', // TODO error 'unicorn/no-this-assignment': 'warn', // TODO error 'unicorn/consistent-function-scoping': 'warn', // TODO error 'unicorn/error-message': 'warn', // TODO error 'unicorn/import-style': 'warn', // TODO error 'unicorn/prefer-optional-catch-binding': 'warn', // TODO error 'unicorn/prefer-string-slice': 'warn', // TODO error 'unicorn/no-await-expression-member': 'warn', // TODO error 'unicorn/no-array-push-push': 'warn', // TODO error 'unicorn/prefer-ternary': 'warn', // TODO error 'unicorn/prefer-logical-operator-over-ternary': 'warn', // TODO error }, }, { // include certain rules for source ts files (everything except test files) ignores: ['test/**/*.ts'], rules: { 'no-invalid-this': ['error', {}], '@typescript-eslint/no-unused-expressions': 'error', }, }, ];