From d6e0762d1b49150713c5c4f0c95c8710ad487be5 Mon Sep 17 00:00:00 2001 From: Florian Müllner Date: Sep 05 2019 22:30:28 +0000 Subject: [PATCH 1/5] cleanup: Use object shorthand where possible ES6 allows to omit property names where they match the name of the assigned variable, which makes code less redundant and thus cleaner. We will soon enforce that in our eslint rules, so make sure we use the shorthand wherever possible. https://pagure.io/background-logo-extension/pull-request/19 --- diff --git a/prefs.js b/prefs.js index dbff639..b87ed9d 100644 --- a/prefs.js +++ b/prefs.js @@ -39,7 +39,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { let fileChooser = new Gtk.FileChooserButton({ title: 'Select an Image', - filter: filter + filter, }); fileChooser.set_filename(this._settings.get_string('logo-file')); fileChooser.connect('file-set', () => { From 83bb9caf3281e9b395c5b79fc3c8e5eb2ee2b21c Mon Sep 17 00:00:00 2001 From: Florian Müllner Date: Sep 05 2019 22:30:28 +0000 Subject: [PATCH 2/5] cleanup: Use consistent brace style of blocks Our coding style has always been to avoid braces when all blocks are single-lines. Make sure we apply that style consistently. https://pagure.io/background-logo-extension/pull-request/19 --- diff --git a/extension.js b/extension.js index 1cdc2d9..e83f749 100644 --- a/extension.js +++ b/extension.js @@ -229,12 +229,13 @@ var BackgroundLogo = GObject.registerClass({ _backgroundDestroyed() { this._bgDestroyedId = 0; - if (this._bgManager._backgroundSource) // background swapped + if (this._bgManager._backgroundSource) { // background swapped this._bgDestroyedId = this._bgManager.backgroundActor.connect('destroy', this._backgroundDestroyed.bind(this)); - else // bgManager destroyed + } else { // bgManager destroyed this.destroy(); + } } _onDestroy() { diff --git a/prefs.js b/prefs.js index b87ed9d..1314b6c 100644 --- a/prefs.js +++ b/prefs.js @@ -84,10 +84,11 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { widget.margin_end = margin; widget.hexpand = true; - if (!this._sizeGroup) + if (!this._sizeGroup) { this._sizeGroup = new Gtk.SizeGroup({ mode: Gtk.SizeGroupMode.VERTICAL }); + } this._sizeGroup.add_widget(widget); this.attach(new Gtk.Label({ From 91381b61cb82183a6979903bf627e51694e418e1 Mon Sep 17 00:00:00 2001 From: Florian Müllner Date: Sep 05 2019 22:30:28 +0000 Subject: [PATCH 3/5] cleanup: Always use type-safe comparisons The type coercion performed by the regular == and != operators can have surprising results. It is therefore considered good practice to use the type-safe === and !== variants instead. https://pagure.io/background-logo-extension/pull-request/19 --- diff --git a/extension.js b/extension.js index e83f749..215cde6 100644 --- a/extension.js +++ b/extension.js @@ -168,7 +168,7 @@ var BackgroundLogo = GObject.registerClass({ } _updateScale() { - if (this._icon == null || this._icon.width == 0) + if (!this._icon || this._icon.width === 0) return; let size = this._settings.get_double('logo-size'); diff --git a/prefs.js b/prefs.js index 1314b6c..cbcc11c 100644 --- a/prefs.js +++ b/prefs.js @@ -21,8 +21,8 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { this._settings = ExtensionUtils.getSettings(); this._settings.connect('changed', (settings, key) => { - if (key == 'logo-file' || - key == 'logo-size') + if (key === 'logo-file' || + key === 'logo-size') this._logo = null; this._preview.queue_draw(); }); @@ -102,7 +102,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { _createAdjustment(key, step) { let schemaKey = this._settings.settings_schema.get_key(key); let [type, variant] = schemaKey.get_range().deep_unpack(); - if (type != 'range') + if (type !== 'range') throw new Error('Invalid key type "%s" for adjustment'.format(type)); let [lower, upper] = variant.deep_unpack(); let adj = new Gtk.Adjustment({ From 41e8af7899410d34b6acd216905cd7f8df680daf Mon Sep 17 00:00:00 2001 From: Florian Müllner Date: Sep 05 2019 22:30:28 +0000 Subject: [PATCH 4/5] cleanup: Require "dangling" commas Since ES5, trailing commas in arrays and object literals are valid. We generally haven't used them so far, but they are actually a good idea, as they make additions and removals in diffs much cleaner. https://pagure.io/background-logo-extension/pull-request/19 --- diff --git a/extension.js b/extension.js index 215cde6..540e182 100644 --- a/extension.js +++ b/extension.js @@ -89,7 +89,7 @@ var BackgroundLogo = GObject.registerClass({ super._init({ layout_manager: new Clutter.BinLayout(), - opacity: 0 + opacity: 0, }); bgManager._container.add_actor(this); @@ -100,7 +100,7 @@ var BackgroundLogo = GObject.registerClass({ let constraint = new Layout.MonitorConstraint({ index: this._monitorIndex, - work_area: true + work_area: true, }); this.add_constraint(constraint); diff --git a/prefs.js b/prefs.js index cbcc11c..9b2546e 100644 --- a/prefs.js +++ b/prefs.js @@ -14,7 +14,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { halign: Gtk.Align.CENTER, margin: 24, column_spacing: 12, - row_spacing: 6 + row_spacing: 6, }); this.connect('screen-changed', this._onScreenChanged.bind(this)); @@ -29,7 +29,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { this._preview = new Gtk.DrawingArea({ halign: Gtk.Align.CENTER, - margin_bottom: 18 + margin_bottom: 18, }); this._preview.connect('draw', this._drawPreview.bind(this)); this.attach(this._preview, 0, 0, 2, 1); @@ -70,7 +70,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { this._addRow(5, 'Opacity', scale); let checkWidget = new Gtk.CheckButton({ - label: 'Show for all backgrounds' + label: 'Show for all backgrounds', }); this._settings.bind('logo-always-visible', checkWidget, 'active', @@ -86,7 +86,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { if (!this._sizeGroup) { this._sizeGroup = new Gtk.SizeGroup({ - mode: Gtk.SizeGroupMode.VERTICAL + mode: Gtk.SizeGroupMode.VERTICAL, }); } this._sizeGroup.add_widget(widget); @@ -94,7 +94,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { this.attach(new Gtk.Label({ label, xalign: 1.0, - margin_start: margin + margin_start: margin, }), 0, row, 1, 1); this.attach(widget, 1, row, 1, 1); } @@ -109,7 +109,7 @@ class BackgroundLogoPrefsWidget extends Gtk.Grid { lower, upper, step_increment: step, - page_increment: 10 * step + page_increment: 10 * step, }); this._settings.bind(key, adj, 'value', Gio.SettingsBindFlags.DEFAULT); return adj; From e3abacc507dd310aace4090192f188698a4da129 Mon Sep 17 00:00:00 2001 From: Florian Müllner Date: Sep 05 2019 22:30:28 +0000 Subject: [PATCH 5/5] lint: Sync configuration with gjs gjs updated its eslint configuration to a much more complete and thorough set. https://pagure.io/background-logo-extension/pull-request/19 --- diff --git a/.eslintrc.json b/.eslintrc.json index 30afb59..f923d31 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,6 @@ { "extends": [ - "./lint/eslintrc-gjs.json", - "./lint/eslintrc-shell.json" + "./lint/eslintrc-gjs.yml", + "./lint/eslintrc-shell.yml" ] } diff --git a/lint/eslintrc-gjs.json b/lint/eslintrc-gjs.json deleted file mode 100644 index 51964a0..0000000 --- a/lint/eslintrc-gjs.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "env": { - "es6": true - }, - "extends": "eslint:recommended", - "rules": { - "array-bracket-newline": [ - "error", - "consistent" - ], - "array-bracket-spacing": [ - "error", - "never" - ], - "arrow-spacing": "error", - "brace-style": "error", - "comma-spacing": [ - "error", - { - "before": false, - "after": 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" - ], - "no-empty": [ - "error", - { - "allowEmptyCatch": true - } - ], - "no-implicit-coercion": [ - "error", - { - "allow": ["!!"] - } - ], - "no-restricted-properties": [ - "error", - { - "object": "Lang", - "property": "bind", - "message": "Use arrow notation or Function.prototype.bind()" - }, - { - "object": "Lang", - "property": "Class", - "message": "Use ES6 classes" - } - ], - "nonblock-statement-body-position": [ - "error", - "below" - ], - "object-curly-newline": [ - "error", - { - "consistent": true - } - ], - "object-curly-spacing": [ - "error", - "always" - ], - "prefer-template": "error", - "quotes": [ - "error", - "single", - { - "avoidEscape": true - } - ], - "semi": [ - "error", - "always" - ], - "semi-spacing": [ - "error", - { - "before": false, - "after": true - } - ], - "space-before-blocks": "error", - "space-infix-ops": [ - "error", - { - "int32Hint": false - } - ] - }, - "globals": { - "ARGV": false, - "Debugger": false, - "GIRepositoryGType": false, - "imports": false, - "Intl": false, - "log": false, - "logError": false, - "print": false, - "printerr": false, - "window": false - }, - "parserOptions": { - "ecmaVersion": 2017 - } -} diff --git a/lint/eslintrc-gjs.yml b/lint/eslintrc-gjs.yml new file mode 100644 index 0000000..53d5fbd --- /dev/null +++ b/lint/eslintrc-gjs.yml @@ -0,0 +1,228 @@ +--- +env: + es6: true +extends: 'eslint:recommended' +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 + - always-multiline + 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' + 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 + 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-properties: + - error + - object: Lang + property: bind + message: Use arrow notation or Function.prototype.bind() + - object: Lang + property: Class + message: Use ES6 classes + - object: imports + property: mainloop + message: Use GLib main loops and timeouts + 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 + 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 + object-curly-spacing: error + object-shorthand: error + operator-assignment: error + operator-linebreak: error + # 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 + valid-jsdoc: + - error + - requireReturn: false + wrap-iife: + - error + - inside + yield-star-spacing: error + yoda: error +globals: + ARGV: readonly + Debugger: readonly + GIRepositoryGType: readonly + imports: readonly + Intl: readonly + log: readonly + logError: readonly + print: readonly + printerr: readonly + window: readonly +parserOptions: + ecmaVersion: 2017 diff --git a/lint/eslintrc-shell.json b/lint/eslintrc-shell.json deleted file mode 100644 index fc6f581..0000000 --- a/lint/eslintrc-shell.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "rules": { - "camelcase": [ - "error", - { - "properties": "never", - "allow": ["^vfunc_"] - } - ], - "no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "_$" - } - ], - "object-curly-spacing": [ - "error", - "always" - ], - "prefer-arrow-callback": "error" - }, - "globals": { - "global": false, - "_": false, - "C_": false, - "N_": false, - "ngettext": false - } -} diff --git a/lint/eslintrc-shell.yml b/lint/eslintrc-shell.yml new file mode 100644 index 0000000..2291532 --- /dev/null +++ b/lint/eslintrc-shell.yml @@ -0,0 +1,11 @@ +rules: + camelcase: + - error + - properties: never + allow: [^vfunc_, ^on_] + object-curly-spacing: + - error + - always + prefer-arrow-callback: error +globals: + global: readonly