From 376c6442f9bec6d3c9d97c6d282836fc10e8f5dd Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Thu, 25 Jun 2026 19:43:46 -0500 Subject: [PATCH] build: add the GJS ESLint flat config and lint script --- .gitignore | 5 ++ eslint.config.js | 149 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 14 +++++ 3 files changed, 168 insertions(+) create mode 100644 eslint.config.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore index f9bf371..19d78b0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,11 @@ strata@edu4rdshl.dev/bin/ # External reference code (not part of this project) external_sources/ +# Node / lint tooling +node_modules/ +package-lock.json +*.shell-extension.zip + # Editor / OS .vscode/ .idea/ diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..566aa62 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: CC0-1.0 +// SPDX-FileCopyrightText: No rights reserved + +import js from '@eslint/js'; + +export default [ + js.configs.recommended, + { + languageOptions: { + globals: { + ARGV: 'readonly', + Debugger: 'readonly', + GIRepositoryGType: 'readonly', + globalThis: 'readonly', + imports: 'readonly', + Intl: 'readonly', + log: 'readonly', + logError: 'readonly', + pkg: 'readonly', + print: 'readonly', + printerr: 'readonly', + window: 'readonly', + TextEncoder: 'readonly', + TextDecoder: 'readonly', + console: 'readonly', + setTimeout: 'readonly', + setInterval: 'readonly', + clearTimeout: 'readonly', + clearInterval: 'readonly', + // GNOME Shell Only + global: 'readonly', + _: 'readonly', + C_: 'readonly', + N_: 'readonly', + ngettext: 'readonly', + }, + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + }, + rules: { + // See: https://eslint.org/docs/latest/rules/#possible-problems + 'array-callback-return': 'error', + 'no-await-in-loop': 'error', + 'no-constant-binary-expression': 'error', + 'no-constructor-return': 'error', + 'no-new-native-nonconstructor': 'error', + 'no-promise-executor-return': 'error', + 'no-self-compare': 'error', + 'no-template-curly-in-string': 'error', + 'no-unmodified-loop-condition': 'error', + 'no-unreachable-loop': 'error', + 'no-unused-private-class-members': 'error', + 'no-use-before-define': [ + 'error', + { + functions: false, + classes: true, + variables: true, + allowNamedExports: true, + }, + ], + // See: https://eslint.org/docs/latest/rules/#suggestions + 'block-scoped-var': 'error', + 'complexity': 'warn', + 'consistent-return': 'error', + 'default-param-last': 'error', + 'eqeqeq': 'error', + 'no-array-constructor': 'error', + 'no-caller': 'error', + 'no-extend-native': 'error', + 'no-extra-bind': 'error', + 'no-extra-label': 'error', + 'no-iterator': 'error', + 'no-label-var': 'error', + 'no-loop-func': 'error', + 'no-multi-assign': 'warn', + 'no-new-object': 'error', + 'no-new-wrappers': 'error', + 'no-proto': 'error', + 'no-shadow': 'warn', + 'no-unused-vars': [ + 'error', + { + varsIgnorePattern: '^_', + argsIgnorePattern: '^_', + }, + ], + 'no-var': 'warn', + 'unicode-bom': 'error', + // GJS Restrictions + 'no-restricted-globals': [ + 'error', + { + name: 'Debugger', + message: 'Internal use only', + }, + { + name: 'GIRepositoryGType', + message: 'Internal use only', + }, + { + name: 'log', + message: 'Use console.log()', + }, + { + name: 'logError', + message: 'Use console.warn() or console.error()', + }, + ], + '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"] CallExpression[arguments.length<=1][callee.object.type="Super"][callee.property.name="_init"]', + message: 'Use constructor() and super()', + }, + ], + }, + }, +]; diff --git a/package.json b/package.json new file mode 100644 index 0000000..70aaf85 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "strata-extension", + "version": "0.9.0", + "description": "Lint tooling for the Strata GNOME Shell extension", + "private": true, + "type": "module", + "scripts": { + "lint": "eslint 'strata@edu4rdshl.dev'" + }, + "devDependencies": { + "@eslint/js": "^10.0.0", + "eslint": "^10.0.0" + } +}