eslint-config-airbe
Version:
A shared eslint config to apply eslint fastly
256 lines (248 loc) • 6.93 kB
JavaScript
// src/utils.ts
var isPlainObject = (obj) => {
return Object.prototype.toString.call(obj) === "[object Object]";
};
// src/configs/js.ts
import eslint from "@eslint/js";
function getJsConfig(jsConfig) {
if (jsConfig) {
const jsRules = {
"prefer-template": "warn",
"no-def": "off",
eqeqeq: ["error", "always"],
curly: ["error", "multi", "consistent"],
"default-case": "warn",
"default-case-last": "warn",
"no-await-in-loop": "warn",
"no-console": "warn",
"no-use-before-define": "error",
"no-eval": "error"
};
if (isPlainObject(jsConfig))
Object.assign(jsRules, jsConfig);
return [eslint.configs.recommended, { rules: jsRules }];
}
return [];
}
// src/configs/ts.ts
import tseslint from "typescript-eslint";
function getTsConfig(tsConfig) {
if (tsConfig) {
const tsRules = {
"@typescript-eslint/prefer-nullish-coalescing": "off",
"@typescript-eslint/no-unsafe-member-access": "off",
"@typescript-eslint/no-unsafe-call": "off",
"@typescript-eslint/no-unsafe-assignment": "off",
"@typescript-eslint/no-unsafe-argument": "off",
"@typescript-eslint/no-unsafe-return": "warn",
"@typescript-eslint/no-unused-vars": "warn",
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unnecessary-type-assertion": "warn",
"@typescript-eslint/dot-notation": "warn"
};
if (isPlainObject(tsConfig))
Object.assign(tsRules, tsConfig);
return [...tseslint.configs.recommendedTypeChecked, ...tseslint.configs.stylisticTypeChecked, {
languageOptions: {
parserOptions: {
parser: tseslint.parser,
projectService: true
}
},
rules: tsRules
}];
}
return [];
}
// src/configs/vue.ts
import pluginVue from "eslint-plugin-vue";
import vueParser from "vue-eslint-parser";
import tseslint2 from "typescript-eslint";
function getVueConfig(vueConfig) {
if (vueConfig) {
const vueRules = {
"vue/multi-word-component-names": "off",
"vue/no-duplicate-attributes": ["warn", {
allowCoexistClass: true,
allowCoexistStyle: true
}],
"vue/no-parsing-error": ["error", {
"duplicate-attribute": false
}],
"vue/html-indent": ["error", 2],
"vue/max-attributes-per-line": ["error", {
singleline: {
max: 1
},
multiline: {
max: 1
}
}],
"vue/first-attribute-linebreak": ["error", {
singleline: "beside",
multiline: "below"
}],
"vue/component-name-in-template-casing": ["error", "PascalCase", { registeredComponentsOnly: false }],
"vue/attribute-hyphenation": "error",
"vue/no-multiple-objects-in-class": "error",
"vue/no-useless-mustaches": "error",
"vue/no-useless-v-bind": "error",
"vue/padding-line-between-blocks": "error",
"vue/prefer-true-attribute-shorthand": "error",
"vue/prefer-separate-static-class": "error",
"vue/valid-v-slot": ["error", {
allowModifiers: true
}]
};
if (isPlainObject(vueConfig))
Object.assign(vueRules, vueConfig);
return [
...pluginVue.configs["flat/recommended"],
{
languageOptions: {
parser: vueParser,
parserOptions: {
parser: tseslint2.parser,
projectService: true,
ecmaFeatures: {
jsx: true
}
}
}
},
{
rules: vueRules
}
];
}
return [];
}
// src/configs/stylistic.ts
import stylisticEslint from "@stylistic/eslint-plugin";
function getStylisticConfig(stylisticConfig) {
if (stylisticConfig) {
const stylisticRules = {
"@stylistic/no-trailing-spaces": ["error", { skipBlankLines: true }]
};
if (isPlainObject(stylisticConfig))
Object.assign(stylisticRules, stylisticConfig);
return [
stylisticEslint.configs.customize({
quoteProps: "as-needed"
}),
{
rules: stylisticRules
}
];
}
return [];
}
// src/configs/import.ts
import eslintImportX from "eslint-plugin-import-x";
function getImportConfig(importConfig) {
if (importConfig) {
const importRules = {
"import-x/no-absolute-path": "error",
"import-x/no-unused-modules": "warn",
"import-x/first": "warn",
"import-x/newline-after-import": "warn"
};
if (isPlainObject(importConfig))
Object.assign(importRules, importConfig);
return [
eslintImportX.configs.typescript,
{
plugins: {
"import-x": eslintImportX
},
settings: {
"import-x/resolver": {
typescript: true
}
},
rules: importRules
}
];
}
return [];
}
// src/configs/unusedImports.ts
import unusedImports from "eslint-plugin-unused-imports";
function getUnusedImportsConfig(unusedImportsConfig, useTpeScriptEslint) {
if (unusedImportsConfig) {
const unusedImportsRules = {
"no-unused-vars": "off",
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"warn",
{
vars: "all",
varsIgnorePattern: "^_",
args: "after-used",
argsIgnorePattern: "^_"
}
]
};
if (useTpeScriptEslint && (unusedImportsConfig === true || unusedImportsConfig["unused-imports/no-unused-vars"] !== "off"))
Object.assign(unusedImportsRules, { "@typescript-eslint/no-unused-vars": "off" });
if (isPlainObject(unusedImportsConfig))
Object.assign(unusedImportsRules, unusedImportsConfig);
return [
{
plugins: {
"unused-imports": unusedImports
},
rules: unusedImportsRules
}
];
}
return [];
}
// src/index.ts
var defineConfig = (config, ...customFlatConfigs) => {
const {
js,
ts,
vue,
stylistic,
importX,
unusedImports: unusedImports2,
ignores,
globals
} = config;
const eslintConfig = [
...getJsConfig(js),
...getTsConfig(ts),
...getVueConfig(vue),
...getStylisticConfig(stylistic),
...getImportConfig(importX),
...getUnusedImportsConfig(unusedImports2)
];
if (Array.isArray(ignores))
eslintConfig.push({
ignores
});
if (isPlainObject(globals))
eslintConfig.push({
languageOptions: {
globals
}
});
eslintConfig.push({
files: ["*.json"],
rules: {
"no-invalid-meta": "off",
"@stylistic/quotes": ["error", "double"],
"@stylistic/quote-props": ["error", "always"],
"@stylistic/comma-dangle": "off",
"@typescript-eslint/no-unused-expressions": "off"
}
});
if (Array.isArray(customFlatConfigs))
eslintConfig.push(...customFlatConfigs);
return eslintConfig;
};
var src_default = defineConfig;
export {
src_default as default
};