From 21f21f9ef256a5f6aa5758acdb50c95a9af968bb Mon Sep 17 00:00:00 2001 From: Andy Holmes Date: Wed, 2 Aug 2023 16:44:52 -0700 Subject: [PATCH] test: migrate to GJS' & GNOME Shell's ESLint configuration Use a top-level `.eslintrc.yml` file that includes GJS's ESLint configuration (actually GNOME Shell's copy) with GNOME Shell's configuration as an override. --- .eslintrc.yml | 312 +++++++++++++++++++++++++++++++++- src/extension.js | 4 +- src/notification.js | 2 +- src/remote.js | 4 +- src/session.js | 2 +- src/status.js | 4 +- tests/lint/eslintrc-extra.yml | 5 - tests/lint/eslintrc-gjs.yml | 265 ----------------------------- tests/lint/eslintrc-shell.yml | 18 -- 9 files changed, 314 insertions(+), 302 deletions(-) delete mode 100644 tests/lint/eslintrc-extra.yml delete mode 100644 tests/lint/eslintrc-gjs.yml delete mode 100644 tests/lint/eslintrc-shell.yml diff --git a/.eslintrc.yml b/.eslintrc.yml index 1a94149..15dde2b 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,7 +1,307 @@ -# SPDX-License-Identifier: CC0-1.0 -# SPDX-FileCopyrightText: No rights reserved +--- +# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later +# SPDX-FileCopyrightText: 2018 Claudio André +env: + es2021: true +extends: 'eslint:recommended' +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 + # Waiting for this to have matured a bit in eslint + # camelcase: + # - error + # - properties: never + # allow: [^vfunc_, ^on_, _instance_init] + 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 + - multi-or-nest + - consistent + 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' + jsdoc/check-alignment: error + jsdoc/check-param-names: error + jsdoc/check-tag-names: error + jsdoc/check-types: error + jsdoc/implements-on-classes: error + jsdoc/tag-lines: + - error + - any + - startLines: 1 + jsdoc/require-jsdoc: error + jsdoc/require-param: error + jsdoc/require-param-description: error + jsdoc/require-param-name: error + jsdoc/require-param-type: error + key-spacing: + - error + - beforeColon: false + afterColon: true + keyword-spacing: + - error + - before: true + after: true + linebreak-style: + - error + - unix + lines-between-class-members: + - error + - always + - exceptAfterSingleLine: true + 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 + - single + - 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 + console: readonly + setTimeout: readonly + setInterval: readonly + clearTimeout: readonly + clearInterval: readonly +parserOptions: + ecmaVersion: 2022 + +overrides: + # GNOME Shell's `.eslintrc-shell.yml` + - files: src/** + rules: + camelcase: + - error + - properties: never + allow: [^vfunc_, ^on_] + consistent-return: error + eqeqeq: + - error + - smart + key-spacing: + - error + - mode: minimum + beforeColon: false + afterColon: true + prefer-arrow-callback: error + jsdoc/require-param-description: off + globals: + global: readonly + _: readonly + C_: readonly + N_: readonly + ngettext: readonly + + - files: src/** + globals: + _: off + C_: off + N_: off + ngettext: off -extends: - - ./tests/lint/eslintrc-extra.yml - - ./tests/lint/eslintrc-gjs.yml - - ./tests/lint/eslintrc-shell.yml diff --git a/src/extension.js b/src/extension.js index 8f401e6..596f338 100644 --- a/src/extension.js +++ b/src/extension.js @@ -3,7 +3,7 @@ /* exported init */ -const { Gio } = imports.gi; +const {Gio} = imports.gi; const ExtensionUtils = imports.misc.extensionUtils; const ExtensionMeta = ExtensionUtils.getCurrentExtension(); @@ -57,7 +57,7 @@ class Extension { /** */ -function init(meta) { +function init() { ExtensionUtils.initTranslations(); return new Extension(); diff --git a/src/notification.js b/src/notification.js index 95866fa..db4dec1 100644 --- a/src/notification.js +++ b/src/notification.js @@ -3,7 +3,7 @@ /* exported patchNotificationSources, unpatchNotificationSources */ -const { Gio, GLib, GObject, St } = imports.gi; +const {Gio, GLib, GObject, St} = imports.gi; const Main = imports.ui.main; const MessageTray = imports.ui.messageTray; diff --git a/src/remote.js b/src/remote.js index eecbe5c..d2c7ff5 100644 --- a/src/remote.js +++ b/src/remote.js @@ -3,7 +3,7 @@ /* exported Service, Device, DeviceState */ -const { Gio, GLib, GObject } = imports.gi; +const {Gio, GLib, GObject} = imports.gi; const APPLICATION_ID = 'ca.andyholmes.Valent'; const APPLICATION_PATH = '/ca/andyholmes/Valent'; @@ -233,7 +233,7 @@ var Service = GObject.registerClass({ this._deviceInitCallback.bind(this)); } - _onInterfacesRemoved(objectPath, interfaces) { + _onInterfacesRemoved(objectPath, _interfaces) { const position = this._items.findIndex( item => item.g_object_path === objectPath); diff --git a/src/session.js b/src/session.js index 387f1b5..403e650 100644 --- a/src/session.js +++ b/src/session.js @@ -3,7 +3,7 @@ /* exported enable, disable */ -const { ScreenShield } = imports.ui.screenShield; +const {ScreenShield} = imports.ui.screenShield; // Overridden methods const _deactivate = ScreenShield.prototype.deactivate; diff --git a/src/status.js b/src/status.js index 64a22c6..7ccba0d 100644 --- a/src/status.js +++ b/src/status.js @@ -3,7 +3,7 @@ /* exported Indicator */ -const { Clutter, Gio, GLib, GObject, Pango, Shell, St } = imports.gi; +const {Clutter, Gio, GLib, GObject, Pango, Shell, St} = imports.gi; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; @@ -199,7 +199,7 @@ const DeviceMenuItem = GObject.registerClass({ this.add_child(this._label); this.label_actor = this._label; - this._battery = new DeviceBattery({ visible: false }); + this._battery = new DeviceBattery({visible: false}); this.add_child(this._battery); this.bind_property('device', this._battery, 'device', diff --git a/tests/lint/eslintrc-extra.yml b/tests/lint/eslintrc-extra.yml deleted file mode 100644 index 694fb16..0000000 --- a/tests/lint/eslintrc-extra.yml +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-License-Identifier: CC0-1.0 -# SPDX-FileCopyrightText: No rights reserved - -globals: - global: readonly diff --git a/tests/lint/eslintrc-gjs.yml b/tests/lint/eslintrc-gjs.yml deleted file mode 100644 index 092642d..0000000 --- a/tests/lint/eslintrc-gjs.yml +++ /dev/null @@ -1,265 +0,0 @@ ---- -# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later -# SPDX-FileCopyrightText: 2018 Claudio André -env: - es2021: true -extends: 'eslint:recommended' -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 - # Waiting for this to have matured a bit in eslint - # camelcase: - # - error - # - properties: never - # allow: [^vfunc_, ^on_, _instance_init] - 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 - - multi-or-nest - - consistent - 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' - jsdoc/check-alignment: error - jsdoc/check-param-names: error - jsdoc/check-tag-names: error - jsdoc/check-types: error - jsdoc/implements-on-classes: error - jsdoc/newline-after-description: error - jsdoc/require-jsdoc: error - jsdoc/require-param: error - jsdoc/require-param-description: error - jsdoc/require-param-name: error - jsdoc/require-param-type: error - key-spacing: - - error - - beforeColon: false - afterColon: true - keyword-spacing: - - error - - before: true - after: true - linebreak-style: - - error - - unix - lines-between-class-members: - - error - - always - - exceptAfterSingleLine: true - 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: 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 - - single - - 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 - console: readonly - setTimeout: readonly - setInterval: readonly - clearTimeout: readonly - clearInterval: readonly -parserOptions: - ecmaVersion: 2022 - diff --git a/tests/lint/eslintrc-shell.yml b/tests/lint/eslintrc-shell.yml deleted file mode 100644 index 68d70bc..0000000 --- a/tests/lint/eslintrc-shell.yml +++ /dev/null @@ -1,18 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later -# SPDX-FileCopyrightText: 2019 Florian Müllner - -rules: - camelcase: - - error - - properties: never - allow: [^vfunc_, ^on_] - consistent-return: error - key-spacing: - - error - - mode: minimum - beforeColon: false - afterColon: true - object-curly-spacing: - - error - - always - prefer-arrow-callback: error