diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..76686d1 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,22 @@ +// @ts-check + +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; + +export default [ + eslint.configs.recommended, + ...tseslint.configs.strictTypeChecked, + { ignores: ['**/*.js'] }, + { + languageOptions: { parserOptions: { projectService: true } }, + rules: { + '@typescript-eslint/no-confusing-void-expression': 'off', //prefer minimal arrow functions + '@typescript-eslint/no-floating-promises': 'off', //annimations may be fire-and-forget + '@typescript-eslint/no-misused-promises': 'off', //annimations may be fire-and-forget + '@typescript-eslint/no-non-null-assertion': 'off', //ts cannot always know value exists + '@typescript-eslint/restrict-template-expressions': 'off', //numbers in templates are natural + '@typescript-eslint/unbound-method': 'off', //safer to not use 'this' + '@typescript-eslint/use-unknown-in-catch-callback-variable': 'off', //clarity over theoretical exceptions + }, + }, + ]; diff --git a/hello-world/package.json b/hello-world/package.json index c6aa514..0246df1 100644 --- a/hello-world/package.json +++ b/hello-world/package.json @@ -30,7 +30,7 @@ "assert-deep-strict-equal": "~1.2", "fetch-json": "~3.3", "jshint": "~2.13", - "mocha": "~10.4", + "mocha": "~10.7", "server-listening": "~1.2" } } diff --git a/package.json b/package.json index 58ee2be..981d396 100644 --- a/package.json +++ b/package.json @@ -41,32 +41,13 @@ "mocha": true, "node": true }, - "eslintConfig": { - "ignorePatterns": [ - "build", - "dist", - "node_modules" - ], - "root": true, - "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "@typescript-eslint/no-non-null-assertion": "off" - } - }, "runScriptsConfig": { "clean": [ "rimraf build dist" ], "lint": [ "jshint . --exclude-path .gitignore", - "eslint --max-warnings 0 . --ext .ts" + "eslint --max-warnings 0" ], "build": [ "tsc" @@ -86,22 +67,22 @@ "jsdom": "~24.1" }, "devDependencies": { - "@eslint/js": "~9.3", + "@eslint/js": "~9.9", "@types/express": "~4.17", "@types/jsdom": "~21.1", - "@types/node": "~20.12", + "@types/node": "~22.2", "add-dist-header": "~1.4", "assert-deep-strict-equal": "~1.2", "copy-file-util": "~1.2", "copy-folder-util": "~1.1", - "eslint": "8.57.0", + "eslint": "~9.9", "fetch-json": "~3.3", "jshint": "~2.13", - "mocha": "~10.4", - "rimraf": "~5.0", - "run-scripts-util": "~1.2", - "typescript": "~5.4", - "typescript-eslint": "~7.11", + "mocha": "~10.7", + "rimraf": "~6.0", + "run-scripts-util": "~1.3", + "typescript": "~5.5", + "typescript-eslint": "~8.1", "w3c-html-validator": "~1.8" } } diff --git a/server-listening.ts b/server-listening.ts index f6ca7a6..086651a 100644 --- a/server-listening.ts +++ b/server-listening.ts @@ -55,15 +55,15 @@ const serverListening = { return new Promise(resolve => server.close(resolve)); }, jsdomOnLoad(dom: JSDOM): Promise { - const name = dom && dom.constructor && dom.constructor.name; + const name = (dom)?.constructor?.name; if (name !== 'JSDOM') - throw Error(`[server-listening] Unable to load DOM: ${name} => ${String(dom)}`); + throw new Error(`[server-listening] Unable to load DOM: ${String(dom)} => ${name}`); let done: (jsdom: JSDOM) => void; dom.window.onload = () => done(dom); return new Promise(resolve => done = resolve); }, jsdomCloseWindow(dom: JSDOM): Promise { - if (dom) + if (dom) dom.window.close(); return new Promise(resolve => resolve(dom)); }, diff --git a/spec/package.spec.js b/spec/package.spec.js index b0f9571..097ce84 100644 --- a/spec/package.spec.js +++ b/spec/package.spec.js @@ -89,7 +89,7 @@ describe('The jsdomOnLoad() function', () => { it('throws an error if the DOM is missing', () => { const callhandleDom = () => serverListening.jsdomOnLoad(null); - const exception = { message: '[server-listening] Unable to load DOM: null => null' }; + const exception = { message: '[server-listening] Unable to load DOM: null => undefined' }; assert.throws(callhandleDom, exception); });