luci/eslint.config.mjs

190 lines
4.8 KiB
JavaScript

import { defineConfig, globalIgnores } from 'eslint/config';
import globals from 'globals';
import markdown from "@eslint/markdown";
import jsdoc from 'eslint-plugin-jsdoc';
import json from '@eslint/json';
import js from '@eslint/js';
console.log("loaded luci repo eslint.config.mjs");
export const jsdoc_less_relaxed_rules = {
// 0: off, 1: warn, 2: error
/* --- JSDoc correctness --- */
'jsdoc/check-alignment': 'warn',
'jsdoc/check-param-names': 'off',
'jsdoc/check-tag-names': 'warn',
'jsdoc/check-types': 'off',
'jsdoc/no-defaults': 'off',
'jsdoc/reject-any-type': 'off',
'jsdoc/require-jsdoc': 'off',
'jsdoc/require-param': 'warn',
'jsdoc/require-returns': 'warn',
'jsdoc/require-returns-check': 'off',
'jsdoc/require-returns-type': 'warn',
'jsdoc/tag-lines': 'off',
'no-shadow-restricted-names': 'off',
/* --- Style --- */
'jsdoc/require-description': 'off',
'jsdoc/require-param-description': 'off',
'jsdoc/require-returns-description': 'off',
/* --- custom classes and types --- */
'jsdoc/no-undefined-types': 'warn', // custom LuCI types
'jsdoc/valid-types': 'warn',
}
export const jsdoc_relaxed_rules = {
// 0: off, 1: warn, 2: error
/* --- JSDoc correctness --- */
'jsdoc/check-alignment': 'warn',
'jsdoc/check-param-names': 'off',
'jsdoc/check-tag-names': 'warn',
'jsdoc/check-types': 'off',
'jsdoc/no-defaults': 'off',
'jsdoc/reject-any-type': 'off',
'jsdoc/require-jsdoc': 'off',
'jsdoc/require-param': 'warn',
'jsdoc/require-returns': 'warn',
'jsdoc/require-returns-check': 'off',
'jsdoc/require-returns-type': 'warn',
'jsdoc/tag-lines': 'off',
'no-shadow-restricted-names': 'off',
/* --- Style --- */
'jsdoc/require-description': 'off',
'jsdoc/require-param-description': 'off',
'jsdoc/require-returns-description': 'off',
/* --- custom classes and types --- */
'jsdoc/no-undefined-types': 'off', // custom LuCI types
'jsdoc/valid-types': 'off',
}
export default defineConfig([
globalIgnores([
'docs',
'node_modules',
]),
// Markdown
{
files: ["**/*.md"],
plugins: {
markdown,
},
processor: "markdown/markdown",
},
// applies only to JavaScript blocks inside of Markdown files
{
files: ["**/*.md/*.js"],
rules: {
strict: "off",
},
},
// JSON files
{
files: ['**/*.json'],
ignores: ['package-lock.json'],
plugins: { json },
language: 'json/json',
extends: ['json/recommended'],
rules: {
'json/no-duplicate-keys': 'error',
},
},
// JavaScript files
{
files: ['**/*.js'],
language: '@/js',
plugins: { js },
extends: ['js/recommended'],
linterOptions:{
// silence warnings about inert // eslint-disable-next-line xxx
reportUnusedDisableDirectives: "off",
},
languageOptions: {
sourceType: 'script',
ecmaVersion: 2026, // 2015 == ECMA6
globals: {
...globals.browser,
/* LuCI runtime / cbi exports */
_: 'readonly',
N_: 'readonly',
L: 'readonly',
E: 'readonly',
TR: 'readonly',
cbi_d: 'readonly',
cbi_strings: 'readonly',
cbi_d_add: 'readonly',
cbi_d_check: 'readonly',
cbi_d_checkvalue: 'readonly',
cbi_d_update: 'readonly',
cbi_init: 'readonly',
cbi_update_table: 'readonly',
cbi_validate_form: 'readonly',
cbi_validate_field: 'readonly',
cbi_validate_named_section_add: 'readonly',
cbi_validate_reset: 'readonly',
cbi_row_swap: 'readonly',
cbi_tag_last: 'readonly',
cbi_submit: 'readonly',
cbi_dropdown_init: 'readonly',
isElem: 'readonly',
toElem: 'readonly',
matchesElem: 'readonly',
findParent: 'readonly',
sfh: 'readonly',
renderBadge: 'readonly', // found in theme templates
/* modules */
baseclass: 'readonly',
dom: 'readonly',
firewall: 'readonly',
fwtool: 'readonly',
form: 'readonly',
fs: 'readonly',
network: 'readonly',
nettools: 'readonly',
poll: 'readonly',
random: 'readonly',
request: 'readonly',
session: 'readonly',
rpc: 'readonly',
uci: 'readonly',
ui: 'readonly',
uqr: 'readonly',
validation: 'readonly',
view: 'readonly',
widgets: 'readonly',
/* dockerman */
dm2: 'readonly',
jsapi: 'readonly',
},
parserOptions: {
ecmaFeatures: {
globalReturn: true,
}
},
},
rules: { // 0: off, 1: warn, 2: error
'strict': 0,
'no-prototype-builtins': 0,
'no-empty': 0,
'no-undef': 'warn',
'no-unused-vars': ['off', { "caughtErrors": "none" }],
'no-regex-spaces': 0,
'no-control-regex': 0,
}
},
{
extends: ['jsdoc/recommended'], // run jsdoc recommended rules
files: ['modules/luci-base/**/*.js'], // ... but only on these js files
plugins: { jsdoc },
rules: {
/* use these settings when linting the checked out repo */
// ...jsdoc_less_relaxed_rules
/* ... and use these settings for the repo (less noisy) */
...jsdoc_relaxed_rules
},
}
]);