diff --git a/.eslintrc.yaml b/.eslintrc.yaml deleted file mode 100644 index 627590e..0000000 --- a/.eslintrc.yaml +++ /dev/null @@ -1,252 +0,0 @@ ---- -# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later -# -# The initial file content was copied from gnome shell extension repo and is a conbination of the linting rules under the direcory -# https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/tree/main/lint -env: - es2021: true -extends: - - eslint:recommended - - plugin:jsdoc/recommended-error -plugins: - - jsdoc -rules: - array-bracket-newline: - - error - - consistent - array-bracket-spacing: - - error - - never - array-callback-return: error - arrow-parens: - - error - - as-needed - arrow-spacing: error - block-scoped-var: error - block-spacing: error - brace-style: error - camelcase: - - error - - properties: never - allow: [^vfunc_, ^on_] - comma-dangle: - - error - - arrays: always-multiline - objects: always-multiline - functions: never - comma-spacing: - - error - - before: false - after: true - comma-style: - - error - - last - computed-property-spacing: error - curly: - - error - dot-location: - - error - - property - eol-last: error - eqeqeq: error - func-call-spacing: error - func-name-matching: error - func-style: - - error - - declaration - - allowArrowFunctions: true - indent: - - error - - 4 - - ignoredNodes: - # Allow not indenting the body of GObject.registerClass, since in the - # future it's intended to be a decorator - - 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child' - # Allow dedenting chained member expressions - MemberExpression: 'off' - key-spacing: - - error - - beforeColon: false - afterColon: true - keyword-spacing: - - error - - before: true - after: true - linebreak-style: - - error - - unix - lines-between-class-members: error - max-nested-callbacks: error - max-statements-per-line: error - new-parens: error - no-array-constructor: error - no-await-in-loop: error - no-caller: error - no-constant-condition: - - error - - checkLoops: false - no-div-regex: error - no-empty: - - error - - allowEmptyCatch: true - no-extra-bind: error - no-extra-parens: - - error - - all - - conditionalAssign: false - nestedBinaryExpressions: false - returnAssign: false - no-implicit-coercion: - - error - - allow: - - '!!' - no-invalid-this: error - no-iterator: error - no-label-var: error - no-lonely-if: error - no-loop-func: error - no-nested-ternary: error - no-new-object: error - no-new-wrappers: error - no-octal-escape: error - no-proto: error - no-prototype-builtins: 'off' - no-restricted-globals: [error, window] - no-restricted-properties: - - error - - object: imports - property: format - message: Use template strings - - object: pkg - property: initFormat - message: Use template strings - - object: Lang - property: copyProperties - message: Use Object.assign() - - object: Lang - property: bind - message: Use arrow notation or Function.prototype.bind() - - object: Lang - property: Class - message: Use ES6 classes - no-restricted-syntax: - - error - - selector: >- - MethodDefinition[key.name="_init"] > - FunctionExpression[params.length=1] > - BlockStatement[body.length=1] - CallExpression[arguments.length=1][callee.object.type="Super"][callee.property.name="_init"] > - Identifier:first-child - message: _init() that only calls super._init() is unnecessary - - selector: >- - MethodDefinition[key.name="_init"] > - FunctionExpression[params.length=0] > - BlockStatement[body.length=1] - CallExpression[arguments.length=0][callee.object.type="Super"][callee.property.name="_init"] - message: _init() that only calls super._init() is unnecessary - - selector: BinaryExpression[operator="instanceof"][right.name="Array"] - message: Use Array.isArray() - no-return-assign: error - no-return-await: error - no-self-compare: error - no-shadow: error - no-shadow-restricted-names: error - no-spaced-func: error - no-tabs: error - no-template-curly-in-string: error - no-throw-literal: error - no-trailing-spaces: error - no-undef-init: error - no-unneeded-ternary: error - no-unused-expressions: error - no-unused-vars: - - error - # Vars use a suffix _ instead of a prefix because of file-scope private vars - - varsIgnorePattern: (^unused|_$) - argsIgnorePattern: ^(unused|_) - no-useless-call: error - no-useless-computed-key: error - no-useless-concat: error - no-useless-constructor: error - no-useless-rename: error - no-useless-return: error - no-whitespace-before-property: error - no-with: error - nonblock-statement-body-position: - - error - - below - object-curly-newline: - - error - - consistent: true - multiline: true - object-curly-spacing: error - object-shorthand: error - operator-assignment: error - operator-linebreak: error - padded-blocks: - - error - - never - # These may be a bit controversial, we can try them out and enable them later - # prefer-const: error - # prefer-destructuring: error - prefer-numeric-literals: error - prefer-promise-reject-errors: error - prefer-rest-params: error - prefer-spread: error - prefer-template: error - quotes: - - error - - double - - avoidEscape: true - require-await: error - rest-spread-spacing: error - semi: - - error - - always - semi-spacing: - - error - - before: false - after: true - semi-style: error - space-before-blocks: error - space-before-function-paren: - - error - - named: never - # for `function ()` and `async () =>`, preserve space around keywords - anonymous: always - asyncArrow: always - space-in-parens: error - space-infix-ops: - - error - - int32Hint: false - space-unary-ops: error - spaced-comment: error - switch-colon-spacing: error - symbol-description: error - template-curly-spacing: error - template-tag-spacing: error - unicode-bom: error - wrap-iife: - - error - - inside - yield-star-spacing: error - yoda: error -settings: - jsdoc: - mode: typescript -globals: - ARGV: readonly - Debugger: readonly - GIRepositoryGType: readonly - globalThis: readonly - imports: readonly - Intl: readonly - log: readonly - logError: readonly - print: readonly - printerr: readonly - window: readonly - TextEncoder: readonly - TextDecoder: readonly -parserOptions: - ecmaVersion: 2022 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 80fcae1..fd4e178 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,10 +4,9 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: '18' - - run: npm init @eslint/config - - run: npm install eslint-plugin-jsdoc@latest --save-dev - - run: npx eslint *.js modules/*.js + - run: npm install + - run: npm run lint diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..91a5d09 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,264 @@ +import jsdoc from "eslint-plugin-jsdoc"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import js from "@eslint/js"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +export default [ + ...compat.extends("eslint:recommended", "plugin:jsdoc/recommended-error"), + { + languageOptions: { + globals: { + ARGV: "readonly", + Debugger: "readonly", + GIRepositoryGType: "readonly", + globalThis: "readonly", + imports: "readonly", + Intl: "readonly", + log: "readonly", + logError: "readonly", + print: "readonly", + printerr: "readonly", + window: "readonly", + TextEncoder: "readonly", + TextDecoder: "readonly", + }, + + ecmaVersion: 2022, + sourceType: "module", + }, + + settings: { + jsdoc: { + mode: "typescript", + }, + }, + + rules: { + "array-bracket-newline": ["error", "consistent"], + "array-bracket-spacing": ["error", "never"], + "array-callback-return": "error", + "arrow-parens": ["error", "as-needed"], + "arrow-spacing": "error", + "block-scoped-var": "error", + "block-spacing": "error", + "brace-style": "error", + + camelcase: ["error", { + properties: "never", + allow: ["^vfunc_", "^on_"], + }], + + "comma-dangle": ["error", { + arrays: "always-multiline", + objects: "always-multiline", + functions: "never", + }], + + "comma-spacing": ["error", { + before: false, + after: true, + }], + + "comma-style": ["error", "last"], + "computed-property-spacing": "error", + curly: ["error"], + "dot-location": ["error", "property"], + "eol-last": "error", + eqeqeq: "error", + "func-call-spacing": "error", + "func-name-matching": "error", + + "func-style": ["error", "declaration", { + allowArrowFunctions: true, + }], + + indent: ["error", 4, { + ignoredNodes: [ + "CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child", + ], + + MemberExpression: "off", + }], + + "key-spacing": ["error", { + beforeColon: false, + afterColon: true, + }], + + "keyword-spacing": ["error", { + before: true, + after: true, + }], + + "linebreak-style": ["error", "unix"], + "lines-between-class-members": "error", + "max-nested-callbacks": "error", + "max-statements-per-line": "error", + "new-parens": "error", + "no-array-constructor": "error", + "no-await-in-loop": "error", + "no-caller": "error", + + "no-constant-condition": ["error", { + checkLoops: false, + }], + + "no-div-regex": "error", + + "no-empty": ["error", { + allowEmptyCatch: true, + }], + + "no-extra-bind": "error", + + "no-extra-parens": ["error", "all", { + conditionalAssign: false, + nestedBinaryExpressions: false, + returnAssign: false, + }], + + "no-implicit-coercion": ["error", { + allow: ["!!"], + }], + + "no-invalid-this": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-lonely-if": "error", + "no-loop-func": "error", + "no-nested-ternary": "error", + "no-new-object": "error", + "no-new-wrappers": "error", + "no-octal-escape": "error", + "no-proto": "error", + "no-prototype-builtins": "off", + "no-restricted-globals": ["error", "window"], + + "no-restricted-properties": ["error", { + object: "imports", + property: "format", + message: "Use template strings", + }, { + object: "pkg", + property: "initFormat", + message: "Use template strings", + }, { + object: "Lang", + property: "copyProperties", + message: "Use Object.assign()", + }, { + object: "Lang", + property: "bind", + message: "Use arrow notation or Function.prototype.bind()", + }, { + object: "Lang", + property: "Class", + message: "Use ES6 classes", + }], + + "no-restricted-syntax": ["error", { + selector: "MethodDefinition[key.name=\"_init\"] > FunctionExpression[params.length=1] > BlockStatement[body.length=1] CallExpression[arguments.length=1][callee.object.type=\"Super\"][callee.property.name=\"_init\"] > Identifier:first-child", + message: "_init() that only calls super._init() is unnecessary", + }, { + selector: "MethodDefinition[key.name=\"_init\"] > FunctionExpression[params.length=0] > BlockStatement[body.length=1] CallExpression[arguments.length=0][callee.object.type=\"Super\"][callee.property.name=\"_init\"]", + message: "_init() that only calls super._init() is unnecessary", + }, { + selector: "BinaryExpression[operator=\"instanceof\"][right.name=\"Array\"]", + message: "Use Array.isArray()", + }], + + "no-return-assign": "error", + "no-return-await": "error", + "no-self-compare": "error", + "no-shadow": "error", + "no-shadow-restricted-names": "error", + "no-spaced-func": "error", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-undef-init": "error", + "no-unneeded-ternary": "error", + "no-unused-expressions": "error", + + "no-unused-vars": ["error", { + varsIgnorePattern: "(^unused|_$)", + argsIgnorePattern: "^(unused|_)", + }], + + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-whitespace-before-property": "error", + "no-with": "error", + "nonblock-statement-body-position": ["error", "below"], + + "object-curly-newline": ["error", { + consistent: true, + multiline: true, + }], + + "object-curly-spacing": "error", + "object-shorthand": "error", + "operator-assignment": "error", + "operator-linebreak": "error", + "padded-blocks": ["error", "never"], + "prefer-numeric-literals": "error", + "prefer-promise-reject-errors": "error", + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "error", + + quotes: ["error", "double", { + avoidEscape: true, + }], + + "require-await": "error", + "rest-spread-spacing": "error", + semi: ["error", "always"], + + "semi-spacing": ["error", { + before: false, + after: true, + }], + + "semi-style": "error", + "space-before-blocks": "error", + + "space-before-function-paren": ["error", { + named: "never", + anonymous: "always", + asyncArrow: "always", + }], + + "space-in-parens": "error", + + "space-infix-ops": ["error", { + int32Hint: false, + }], + + "space-unary-ops": "error", + "spaced-comment": "error", + "switch-colon-spacing": "error", + "symbol-description": "error", + "template-curly-spacing": "error", + "template-tag-spacing": "error", + "unicode-bom": "error", + "wrap-iife": ["error", "inside"], + "yield-star-spacing": "error", + yoda: "error", + }, + }, +]; diff --git a/package.json b/package.json index 19f7b61..eb81235 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,10 @@ "version": "0.1.0", "description": "this package.json is solely to run eslint", "scripts": { - "lint": "eslint *.js modules/*.js" + "lint": "eslint src/*.js src/modules/*.js" }, "devDependencies": { - "eslint": "^8.39.0", - "eslint-plugin-jsdoc": "^43.3.1" + "eslint": "^9.0.0", + "eslint-plugin-jsdoc": "^50.3.2" } }