UNPKG

@1stg/eslint-config

Version:

Personal but Shareable ESLint Configuration for all 1stG.me projects

50 lines (44 loc) 1.43 kB
// @ts-check /** @import { TSESLint } from '@typescript-eslint/utils' */ import { tryFile, tryPkg, tryRequirePkg } from '@pkgr/utils' /** @type {string | undefined} */ let configFile export const isBabelAvailable = tryPkg('@babel/eslint-parser') && tryPkg('@babel/eslint-plugin') /** @satisfies {TSESLint.FlatConfig.Config} */ export const jsBase = { name: '@1stg/js-base', files: ['**/*.{cjs,mjs,js,jsx}'], languageOptions: isBabelAvailable ? { parser: tryRequirePkg('@babel/eslint-parser'), // eslint-disable-next-line no-cond-assign, sonarjs/no-nested-assignment parserOptions: (configFile = tryFile('babel.config.js') || tryFile('.babelrc.js') || tryPkg('@1stg/babel-preset/config')) ? { babelOptions: { configFile } } : { requireConfigFile: false }, } : {}, plugins: /** @type {TSESLint.FlatConfig.Plugins} */ ( isBabelAvailable ? { '@babel': /** @type {Omit<TSESLint.FlatConfig.Plugin, 'configs'>} */ ( tryRequirePkg('@babel/eslint-plugin') ), } : {} ), rules: { camelcase: [2, { properties: 'never', ignoreDestructuring: true }], ...(isBabelAvailable && { 'new-cap': 0, 'no-invalid-this': 0, 'no-unused-expressions': 0, '@babel/new-cap': 2, '@babel/no-invalid-this': 2, '@babel/no-unused-expressions': 2, }), }, }