From 4c8d7a2e3b573568a256ffd43f03cf6583ffd7b0 Mon Sep 17 00:00:00 2001 From: Ute Weiss Date: Fri, 18 Jun 2021 13:24:32 +0200 Subject: [PATCH 1/8] fix: fix eslint run command, make eslint rules stricter, do not prettier the dist folder Signed-off-by: Ute Weiss --- .eslintrc.js | 171 ++++++++++++++++++++++++++++++- .prettierignore | 1 + package.json | 4 +- test/connect.integration.spec.ts | 2 +- tsconfig.json | 1 + 5 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 .prettierignore diff --git a/.eslintrc.js b/.eslintrc.js index 708332e5..55097724 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,16 +9,181 @@ module.exports = { project: 'tsconfig.eslint.json', sourceType: 'module', }, + plugins: ['eslint-plugin-import', 'eslint-plugin-jsdoc', 'eslint-plugin-prefer-arrow', '@typescript-eslint'], rules: { - 'comma-dangle': ['error', 'always-multiline'], 'jest/expect-expect': [ 'error', { - assertFunctionNames: ['expect*', 'verify'], + assertFunctionNames: ['expect*', 'verify*'], }, ], + '@typescript-eslint/adjacent-overload-signatures': 'error', + '@typescript-eslint/array-type': [ + 'error', + { + default: 'array', + }, + ], + '@typescript-eslint/dot-notation': 'error', + '@typescript-eslint/member-delimiter-style': [ + 'error', + { + multiline: { + delimiter: 'semi', + requireLast: true, + }, + singleline: { + delimiter: 'semi', + requireLast: false, + }, + }, + ], + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'default', + format: ['camelCase'], + leadingUnderscore: 'allow', + trailingUnderscore: 'forbid', + }, + { + selector: 'variable', + format: ['camelCase', 'UPPER_CASE'], + leadingUnderscore: 'allow', + trailingUnderscore: 'forbid', + }, + { + selector: 'enumMember', + format: ['camelCase', 'UPPER_CASE'], + }, + { + selector: 'typeLike', + format: ['PascalCase'], + }, + ], + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-for-in-array': 'error', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-parameter-properties': 'off', + '@typescript-eslint/no-this-alias': 'error', + '@typescript-eslint/no-unnecessary-qualifier': 'error', + '@typescript-eslint/no-unnecessary-type-arguments': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-unused-expressions': 'error', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-for-of': 'error', + '@typescript-eslint/prefer-function-type': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + '@typescript-eslint/prefer-readonly': 'error', + '@typescript-eslint/promise-function-async': 'error', + '@typescript-eslint/quotes': 'off', + '@typescript-eslint/restrict-plus-operands': 'error', + '@typescript-eslint/no-unnecessary-condition': 'error', + '@typescript-eslint/semi': ['off', null], + '@typescript-eslint/strict-boolean-expressions': [ + 'error', + { + allowNullableObject: true, + allowNullableBoolean: false, + allowNullableString: false, + }, + ], + '@typescript-eslint/triple-slash-reference': [ + 'error', + { + path: 'always', + types: 'prefer-import', + lib: 'always', + }, + ], + '@typescript-eslint/type-annotation-spacing': 'error', + '@typescript-eslint/unified-signatures': 'error', + 'arrow-parens': ['error', 'always'], + 'brace-style': ['off', 'off'], + 'comma-dangle': 'off', + complexity: 'off', + 'constructor-super': 'error', + 'eol-last': 'off', + eqeqeq: ['error', 'smart'], + 'guard-for-in': 'error', + 'id-blacklist': [ + 'error', + 'any', + 'Number', + 'number', + 'String', + 'string', + 'Boolean', + 'boolean', + 'Undefined', + 'undefined', + ], + 'id-match': 'error', + 'import/no-deprecated': 'error', + 'import/no-extraneous-dependencies': 'off', + 'import/no-internal-modules': 'off', + 'import/order': 'off', + 'jsdoc/check-alignment': 'error', + 'jsdoc/check-indentation': 'error', + 'jsdoc/newline-after-description': 'error', + 'linebreak-style': 'off', + 'max-classes-per-file': 'off', + 'max-len': 'off', + 'new-parens': 'off', + 'newline-per-chained-call': 'off', + 'no-bitwise': 'error', + 'no-caller': 'error', + 'no-cond-assign': 'error', + 'no-console': 'error', + 'no-debugger': 'error', + 'no-duplicate-case': 'error', + 'no-duplicate-imports': 'error', + 'no-empty': 'error', + 'no-eval': 'error', + 'no-extra-bind': 'error', + 'no-extra-semi': 'off', + 'no-fallthrough': 'off', + 'no-invalid-this': 'off', + 'no-irregular-whitespace': 'off', + 'no-multiple-empty-lines': 'off', + 'no-new-func': 'error', + 'no-new-wrappers': 'error', + 'no-redeclare': 'error', + 'no-return-await': 'error', + 'no-sequences': 'error', + 'no-sparse-arrays': 'error', + 'no-template-curly-in-string': 'error', + 'no-throw-literal': 'error', + 'no-trailing-spaces': 'off', + 'no-undef-init': 'error', + 'no-unsafe-finally': 'error', + 'no-unused-labels': 'error', + 'no-var': 'error', + 'no-void': 'error', + 'object-shorthand': 'error', + 'one-var': ['error', 'never'], 'prefer-const': 'error', - '@typescript-eslint/strict-boolean-expressions': 'off', + 'quote-props': 'off', + radix: 'error', + 'react/jsx-curly-spacing': 'off', + 'react/jsx-equals-spacing': 'off', + 'react/jsx-wrap-multilines': 'off', + 'space-before-function-paren': 'off', + 'space-in-parens': ['off', 'never'], + 'spaced-comment': [ + 'error', + 'always', + { + markers: ['/'], + }, + ], + 'use-isnan': 'error', + 'valid-typeof': 'off', }, ignorePatterns: ['dist', 'tsconfig.json', 'tsconfig.eslint.json'], }; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..53c37a16 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/package.json b/package.json index 0abd3e76..d76bf3b2 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "test": "jest --detectOpenHandles --forceExit", "test:unit": "npm run test \"^((?!\\.integration\\.).)*$\"", "test:integration": "npm run test integration", - "lint": "prettier --check \"**/*.{ts,tsx}\" --ignore-path \".gitignore\" && eslint .", - "format": "prettier --write \"**/*.{ts,tsx}\" --ignore-path \".gitignore\" && eslint . --fix" + "lint": "prettier --check \"**/*.ts\" && eslint \"**/*.{ts,js,json}\"", + "format": "prettier --write \"**/*.ts\" && eslint \"**/*.{ts,js,json}\"" }, "dependencies": { "human-interval": "2.0.1", diff --git a/test/connect.integration.spec.ts b/test/connect.integration.spec.ts index 18e7e5df..9aa8516a 100644 --- a/test/connect.integration.spec.ts +++ b/test/connect.integration.spec.ts @@ -11,7 +11,7 @@ describe('connect', () => { url = await mongo.getUri(); }); - afterAll(async () => await mongo.stop()); + afterAll(async () => mongo.stop()); it('connects mongo', async () => { await connect({ url }); diff --git a/tsconfig.json b/tsconfig.json index e8ffc83e..b0e7fa7c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,7 @@ "moduleResolution": "node", "noFallthroughCasesInSwitch": true, "noImplicitReturns": true, + "noUncheckedIndexedAccess": true, "noUnusedLocals": true, "noUnusedParameters": true, "outDir": "dist", From 97b203893ec8e853f2f14ce2a6d023bc4eecd463 Mon Sep 17 00:00:00 2001 From: Ute Weiss Date: Fri, 27 Aug 2021 09:26:15 +0200 Subject: [PATCH 2/8] fix: ignore some files when linting Signed-off-by: Ute Weiss --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index 55097724..e16c79d8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -185,5 +185,5 @@ module.exports = { 'use-isnan': 'error', 'valid-typeof': 'off', }, - ignorePatterns: ['dist', 'tsconfig.json', 'tsconfig.eslint.json'], + ignorePatterns: ['dist', 'tsconfig.json', 'tsconfig.eslint.json', 'package.json', 'package-lock.json', 'ort'], }; From 26f45ca36221e5a0763649ecdcd0d677a3f8db46 Mon Sep 17 00:00:00 2001 From: Ute Weiss Date: Fri, 27 Aug 2021 09:36:54 +0200 Subject: [PATCH 3/8] fix: fix all eslint errors Signed-off-by: Ute Weiss --- .eslintrc.js | 4 +- package-lock.json | 817 +++++++++--------- src/executor/JobExecutor.ts | 2 +- src/index.ts | 2 +- src/job/MomoJob.ts | 2 +- src/job/MomoJobBuilder.ts | 6 +- src/job/findLatest.ts | 4 +- src/job/validate.ts | 12 +- src/logging/LogEmitter.ts | 1 + src/logging/error/MomoError.ts | 2 +- src/repository/JobRepository.ts | 17 +- src/schedule/Schedule.ts | 8 +- src/scheduler/JobScheduler.ts | 15 +- src/scheduler/calculateDelay.ts | 4 +- test/job/check.spec.ts | 2 +- test/job/clear.integration.spec.ts | 4 +- test/job/findLatest.spec.ts | 2 +- test/job/validate.spec.ts | 12 +- .../ExecutionsRepository.integration.spec.ts | 6 +- .../JobRepository.integration.spec.ts | 12 +- .../MongoScheduleBuilder.integration.spec.ts | 18 +- test/schedule/Schedule.integration.spec.ts | 6 +- test/schedule/SchedulePing.spec.ts | 2 +- test/schedule/momo.integration.spec.ts | 67 +- test/scheduler/JobScheduler.spec.ts | 6 +- tsconfig.json | 1 + 26 files changed, 512 insertions(+), 522 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e16c79d8..7bff4c53 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -83,7 +83,7 @@ module.exports = { '@typescript-eslint/promise-function-async': 'error', '@typescript-eslint/quotes': 'off', '@typescript-eslint/restrict-plus-operands': 'error', - '@typescript-eslint/no-unnecessary-condition': 'error', + '@typescript-eslint/no-unnecessary-condition': ['error', {}], '@typescript-eslint/semi': ['off', null], '@typescript-eslint/strict-boolean-expressions': [ 'error', @@ -107,7 +107,7 @@ module.exports = { 'brace-style': ['off', 'off'], 'comma-dangle': 'off', complexity: 'off', - 'constructor-super': 'error', + 'constructor-super': 'off', 'eol-last': 'off', eqeqeq: ['error', 'smart'], 'guard-for-in': 'error', diff --git a/package-lock.json b/package-lock.json index f5a3c5e2..cfd63551 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,26 +14,26 @@ } }, "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", "dev": true }, "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -51,6 +51,15 @@ "@babel/highlight": "^7.14.5" } }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -66,12 +75,12 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", "dev": true, "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.15.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -85,12 +94,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.5", + "@babel/compat-data": "^7.15.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" @@ -134,12 +143,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.0" } }, "@babel/helper-module-imports": { @@ -152,19 +161,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" } }, "@babel/helper-optimise-call-expression": { @@ -183,24 +192,24 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.15.0", "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" } }, "@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.14.8" } }, "@babel/helper-split-export-declaration": { @@ -213,9 +222,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", "dev": true }, "@babel/helper-validator-option": { @@ -225,14 +234,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", + "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", "dev": true, "requires": { "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" } }, "@babel/highlight": { @@ -299,9 +308,9 @@ } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", + "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -444,18 +453,18 @@ } }, "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", + "@babel/generator": "^7.15.0", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -478,12 +487,12 @@ } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -494,20 +503,34 @@ "dev": true }, "@es-joy/jsdoccomment": { - "version": "0.9.0-alpha.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz", - "integrity": "sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA==", + "version": "0.9.0-alpha.6", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.6.tgz", + "integrity": "sha512-/eTjMezCcNne3VvKGle3kgz14PeOb7sQAX/OsV6a4jCmjzWgrAlQuISLcqgqUlI97BFWCNz7E0U9YyRm3ucyOA==", "dev": true, "requires": { - "comment-parser": "1.1.6-beta.0", + "comment-parser": "1.1.6-beta.3", "esquery": "^1.4.0", "jsdoc-type-pratt-parser": "1.0.4" + }, + "dependencies": { + "comment-parser": { + "version": "1.1.6-beta.3", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.6-beta.3.tgz", + "integrity": "sha512-LkPpVUx533rkxrkgphwWo0u6A3Vn9/fa8biHo2mrL6NUKPL6ubnF1P7NTm/M9i/rUvQ/mDxVqOVlmqy5uNUmVw==", + "dev": true + }, + "jsdoc-type-pratt-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", + "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "dev": true + } } }, "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -1022,9 +1045,9 @@ "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", @@ -1079,9 +1102,9 @@ "dev": true }, "@tsconfig/node16": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", - "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, "@types/babel__core": { @@ -1126,9 +1149,9 @@ } }, "@types/bson": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.4.tgz", - "integrity": "sha512-awqorHvQS0DqxkHQ/FxcPX9E+H7Du51Qw/2F+5TBMSaE3G0hm+8D3eXJ6MAzFw75nE8V7xF0QvzUSdxIjJb/GA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", "dev": true, "requires": { "@types/node": "*" @@ -1184,9 +1207,15 @@ } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/lodash": { @@ -1202,9 +1231,9 @@ "dev": true }, "@types/mdast": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.6.tgz", - "integrity": "sha512-1a/QZGYe7cavCvv4OwByerPbCoIwSL3XHH+ajE4SlqWXqwSeGTMbML5we5PpYV2uLmpKPTGOacmcMt5R+w2l0w==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "dev": true, "requires": { "@types/unist": "*" @@ -1263,12 +1292,12 @@ "dev": true }, "@types/sonic-boom": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@types/sonic-boom/-/sonic-boom-0.7.0.tgz", - "integrity": "sha512-AfqR0fZMoUXUNwusgXKxcE9DPlHNDHQp6nKYUd4PSRpLobF5CCevSpyTEBcVZreqaWKCnGBr9KI1fHMTttoB7A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/sonic-boom/-/sonic-boom-2.1.1.tgz", + "integrity": "sha512-CiKn+8CDgtBspfAVPwC8PXCMPhqeL7pFS4aWuj+WJnHLZlu4OGPctdZ6Mob43jRe0kkd7Ztb2Hcu9kzB+b7ZFw==", "dev": true, "requires": { - "@types/node": "*" + "sonic-boom": "*" } }, "@types/stack-utils": { @@ -1323,86 +1352,20 @@ "regexpp": "^3.1.0", "semver": "^7.3.5", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.3.tgz", - "integrity": "sha512-zZYl9TnrxwEPi3FbyeX0ZnE8Hp7j3OCR+ELoUfbwGHGxWnHg9+OqSmkw2MoCVpZksPCZYpQzC559Ee9pJNHTQw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.3", - "@typescript-eslint/types": "4.28.3", - "@typescript-eslint/typescript-estree": "4.28.3", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.3.tgz", - "integrity": "sha512-/8lMisZ5NGIzGtJB+QizQ5eX4Xd8uxedFfMBXOKuJGP0oaBBVEMbJVddQKDXyyB0bPlmt8i6bHV89KbwOelJiQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.3", - "@typescript-eslint/visitor-keys": "4.28.3" - } - }, - "@typescript-eslint/types": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.3.tgz", - "integrity": "sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.3.tgz", - "integrity": "sha512-YAb1JED41kJsqCQt1NcnX5ZdTA93vKFCMP4lQYG6CFxd0VzDJcKttRlMrlG+1qiWAw8+zowmHU1H0OzjWJzR2w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.3", - "@typescript-eslint/visitor-keys": "4.28.3", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz", - "integrity": "sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.3", - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } } }, "@typescript-eslint/experimental-utils": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.2.tgz", - "integrity": "sha512-mV9pmET4C2y2WlyHmD+Iun8SAEqkLahHGBkGqDVslHkmoj3VnxnGP4ANlwuxxfq1BsKdl/MPieDbohCEQgKrwA==", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.3.tgz", + "integrity": "sha512-zZYl9TnrxwEPi3FbyeX0ZnE8Hp7j3OCR+ELoUfbwGHGxWnHg9+OqSmkw2MoCVpZksPCZYpQzC559Ee9pJNHTQw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.14.2", - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/typescript-estree": "4.14.2", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.3", + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/typescript-estree": "4.28.3", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { @@ -1415,90 +1378,46 @@ "@typescript-eslint/types": "4.28.3", "@typescript-eslint/typescript-estree": "4.28.3", "debug": "^4.3.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.3.tgz", - "integrity": "sha512-/8lMisZ5NGIzGtJB+QizQ5eX4Xd8uxedFfMBXOKuJGP0oaBBVEMbJVddQKDXyyB0bPlmt8i6bHV89KbwOelJiQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.3", - "@typescript-eslint/visitor-keys": "4.28.3" - } - }, - "@typescript-eslint/types": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.3.tgz", - "integrity": "sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.3.tgz", - "integrity": "sha512-YAb1JED41kJsqCQt1NcnX5ZdTA93vKFCMP4lQYG6CFxd0VzDJcKttRlMrlG+1qiWAw8+zowmHU1H0OzjWJzR2w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.3", - "@typescript-eslint/visitor-keys": "4.28.3", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz", - "integrity": "sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.3", - "eslint-visitor-keys": "^2.0.0" - } - } } }, "@typescript-eslint/scope-manager": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.2.tgz", - "integrity": "sha512-cuV9wMrzKm6yIuV48aTPfIeqErt5xceTheAgk70N1V4/2Ecj+fhl34iro/vIssJlb7XtzcaD07hWk7Jk0nKghg==", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.3.tgz", + "integrity": "sha512-/8lMisZ5NGIzGtJB+QizQ5eX4Xd8uxedFfMBXOKuJGP0oaBBVEMbJVddQKDXyyB0bPlmt8i6bHV89KbwOelJiQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/visitor-keys": "4.14.2" + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/visitor-keys": "4.28.3" } }, "@typescript-eslint/types": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.2.tgz", - "integrity": "sha512-LltxawRW6wXy4Gck6ZKlBD05tCHQUj4KLn4iR69IyRiDHX3d3NCAhO+ix5OR2Q+q9bjCrHE/HKt+riZkd1At8Q==", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.3.tgz", + "integrity": "sha512-kQFaEsQBQVtA9VGVyciyTbIg7S3WoKHNuOp/UF5RG40900KtGqfoiETWD/v0lzRXc+euVE9NXmfer9dLkUJrkA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.2.tgz", - "integrity": "sha512-ESiFl8afXxt1dNj8ENEZT12p+jl9PqRur+Y19m0Z/SPikGL6rqq4e7Me60SU9a2M28uz48/8yct97VQYaGl0Vg==", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.3.tgz", + "integrity": "sha512-YAb1JED41kJsqCQt1NcnX5ZdTA93vKFCMP4lQYG6CFxd0VzDJcKttRlMrlG+1qiWAw8+zowmHU1H0OzjWJzR2w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/visitor-keys": "4.14.2", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.28.3", + "@typescript-eslint/visitor-keys": "4.28.3", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" } }, "@typescript-eslint/visitor-keys": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.2.tgz", - "integrity": "sha512-KBB+xLBxnBdTENs/rUgeUKO0UkPBRs2vD09oMRRIkj5BEN8PX1ToXV532desXfpQnZsYTyLLviS7JrPhdL154w==", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.3.tgz", + "integrity": "sha512-ri1OzcLnk1HH4gORmr1dllxDzzrN6goUIz/P4MHFV0YZJDCADPR3RvYNp0PW2SetKTThar6wlbFTL00hV2Q+fg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.14.2", + "@typescript-eslint/types": "4.28.3", "eslint-visitor-keys": "^2.0.0" } }, @@ -1673,9 +1592,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -1831,16 +1750,16 @@ "dev": true }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.16.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", + "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001251", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.811", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.75" } }, "bs-logger": { @@ -1882,9 +1801,9 @@ "dev": true }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "call-bind": { @@ -1910,15 +1829,15 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001245", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", - "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==", + "version": "1.0.30001252", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", + "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", "dev": true }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2009,9 +1928,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", "dev": true }, "combined-stream": { @@ -2114,9 +2033,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" } @@ -2161,9 +2080,9 @@ "dev": true }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "detect-newline": { "version": "3.1.0", @@ -2224,9 +2143,9 @@ "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" }, "electron-to-chromium": { - "version": "1.3.778", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.778.tgz", - "integrity": "sha512-Lw04qJaPtWdq0d7qKHJTgkam+FhFi3hm/scf1EyqJWdjO3ZIGUJhNmZJRXWb7yb/bRYXQyVGSpa9RqVpjjWMQw==", + "version": "1.3.820", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.820.tgz", + "integrity": "sha512-5cFwDmo2yzEA9hn55KZ9+cX/b6DSFvpKz8Hb2fiDmriXWB+DBoXKXmncQwNRFBBTlUdsvPHCoy594OoMLAO0Tg==", "dev": true }, "emittery": { @@ -2268,9 +2187,9 @@ } }, "es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -2279,11 +2198,12 @@ "get-intrinsic": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", "is-regex": "^1.1.3", "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -2426,6 +2346,23 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -2441,36 +2378,30 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, "eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "dev": true, "requires": { "debug": "^3.2.7", @@ -2561,17 +2492,6 @@ "regextras": "^0.8.0", "semver": "^7.3.5", "spdx-expression-parse": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } } }, "eslint-plugin-markdown": { @@ -2609,20 +2529,12 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { @@ -2787,17 +2699,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -2825,9 +2736,9 @@ "dev": true }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -2852,9 +2763,9 @@ } }, "figlet": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", - "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", + "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==" }, "file-entry-cache": { "version": "6.0.1", @@ -2971,9 +2882,9 @@ "dev": true }, "flatted": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.1.tgz", - "integrity": "sha512-OMQjaErSFHmHqZe+PSidH5n8j3O0F2DdnVh8JB4j4eUQ2k6KvB0qGfrKIhapvez5JerBbmWkaLYUYWISaESoXg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "form-data": { @@ -3080,18 +2991,18 @@ } }, "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -3103,9 +3014,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "has": { @@ -3149,6 +3060,15 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -3330,6 +3250,17 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", @@ -3353,24 +3284,28 @@ "dev": true }, "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } }, "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-ci": { @@ -3383,19 +3318,22 @@ } }, "is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-decimal": { "version": "1.0.4", @@ -3448,10 +3386,13 @@ "dev": true }, "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-potential-custom-element-name": { "version": "1.0.1", @@ -3460,26 +3401,29 @@ "dev": true }, "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "has-tostringtag": "^1.0.0" } }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-symbol": { "version": "1.0.4", @@ -4814,15 +4758,15 @@ } }, "jsdoc-type-pratt-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", - "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==", "dev": true }, "jsdom": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", - "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "requires": { "abab": "^2.0.5", @@ -4850,7 +4794,7 @@ "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", - "ws": "^7.4.5", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "dependencies": { @@ -4893,12 +4837,12 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.0" } }, "kleur": { @@ -5078,18 +5022,18 @@ } }, "mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", "dev": true }, "mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dev": true, "requires": { - "mime-db": "1.48.0" + "mime-db": "1.49.0" } }, "mimic-fn": { @@ -5141,9 +5085,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -5180,9 +5124,9 @@ "dev": true }, "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -5218,19 +5162,10 @@ "tslib": "^2.3.0" }, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } @@ -5248,9 +5183,9 @@ "dev": true }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "version": "1.1.75", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", + "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", "dev": true }, "normalize-package-data": { @@ -5357,9 +5292,12 @@ } }, "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.7.tgz", + "integrity": "sha512-cIeRZocXsZnZYn+SevbtSqNlLbeoS4mLzuNn4fvXRMDRNhTGg0sxuKXl0FnZCtnew85LorNxIbZp5OeliILhMw==", + "requires": { + "require-at": "^1.0.6" + } }, "optionator": { "version": "0.9.1", @@ -5522,6 +5460,18 @@ "pino-std-serializers": "^3.1.0", "quick-format-unescaped": "^4.0.3", "sonic-boom": "^1.0.2" + }, + "dependencies": { + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "dev": true, + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + } } }, "pino-std-serializers": { @@ -5711,6 +5661,11 @@ "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", "dev": true }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5846,6 +5801,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -5876,13 +5842,12 @@ } }, "sonic-boom": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", - "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.1.0.tgz", + "integrity": "sha512-x2j9LXx27EDlyZEC32gBM+scNVMdPutU7FIKV2BOTKCnPrp7bY5BsplCMQ4shYYR3IhDSIrEXoqb6GlS+z7KyQ==", "dev": true, "requires": { - "atomic-sleep": "^1.0.0", - "flatstr": "^1.0.12" + "atomic-sleep": "^1.0.0" } }, "source-map": { @@ -5937,9 +5902,9 @@ } }, "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, "sprintf-js": { @@ -6255,6 +6220,17 @@ "mkdirp": "1.x", "semver": "7.x", "yargs-parser": "20.x" + }, + "dependencies": { + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } } }, "ts-mockito": { @@ -6285,12 +6261,13 @@ } }, "tsconfig-paths": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", - "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", "dev": true, "requires": { - "json5": "^2.2.0", + "@types/json5": "^0.0.29", + "json5": "^1.0.1", "minimist": "^1.2.0", "strip-bom": "^3.0.0" } @@ -6673,9 +6650,9 @@ } }, "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yauzl": { "version": "2.10.0", diff --git a/src/executor/JobExecutor.ts b/src/executor/JobExecutor.ts index 8dd5aaad..8e8696a6 100644 --- a/src/executor/JobExecutor.ts +++ b/src/executor/JobExecutor.ts @@ -70,7 +70,7 @@ export class JobExecutor { const data = await this.handler(); result = { status: ExecutionStatus.finished, - handlerResult: data !== undefined ? data : 'finished', + handlerResult: data ?? 'finished', }; } catch (e) { this.logger.error('job failed', MomoErrorType.executeJob, { name: jobEntity.name }, e); diff --git a/src/index.ts b/src/index.ts index 893f1db1..48a5f173 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ export { MongoSchedule } from './schedule/MongoSchedule'; export { connect, MomoConnectionOptions } from './connect'; -export { MomoError } from './logging/error/MomoError'; +export { momoError } from './logging/error/MomoError'; export { MomoErrorType } from './logging/error/MomoErrorType'; export { MomoEvent, MomoErrorEvent, MomoEventData } from './logging/MomoEvents'; export { MomoJob } from './job/MomoJob'; diff --git a/src/job/MomoJob.ts b/src/job/MomoJob.ts index e6b120a2..69f2f6ee 100644 --- a/src/job/MomoJob.ts +++ b/src/job/MomoJob.ts @@ -1,4 +1,4 @@ -export type Handler = () => Promise | string | void; +export type Handler = () => Promise | string | undefined | void; export interface MomoJob { immediate?: boolean; diff --git a/src/job/MomoJobBuilder.ts b/src/job/MomoJobBuilder.ts index e2b5781b..6066ce25 100644 --- a/src/job/MomoJobBuilder.ts +++ b/src/job/MomoJobBuilder.ts @@ -34,15 +34,15 @@ export class MomoJobBuilder { } build(): MomoJob { - if (!this.momoJob.name) { + if (this.momoJob.name === undefined) { throw Error('Error: Job must have a specified name'); } - if (!this.momoJob.interval) { + if (this.momoJob.interval === undefined) { throw Error('Error: Job must have a specified interval'); } - if (!this.momoJob.handler) { + if (this.momoJob.handler === undefined) { throw Error('Error: Job must have a specified handler'); } diff --git a/src/job/findLatest.ts b/src/job/findLatest.ts index bde0b878..30803e31 100644 --- a/src/job/findLatest.ts +++ b/src/job/findLatest.ts @@ -3,9 +3,9 @@ import { JobEntity } from '../repository/JobEntity'; function compareLastFinished(left: JobEntity, right: JobEntity): JobEntity { const r = right.executionInfo?.lastFinished; - if (!r) return left; + if (r === undefined) return left; const l = left.executionInfo?.lastFinished; - if (!l) return right; + if (l === undefined) return right; return DateTime.fromISO(r).toMillis() > DateTime.fromISO(l).toMillis() ? right : left; } diff --git a/src/job/validate.ts b/src/job/validate.ts index 99b6220f..0944d730 100644 --- a/src/job/validate.ts +++ b/src/job/validate.ts @@ -1,12 +1,12 @@ import humanInterval from 'human-interval'; import { Job } from './Job'; -import { MomoError } from '../logging/error/MomoError'; +import { momoError } from '../logging/error/MomoError'; import { MomoErrorType } from '../logging/error/MomoErrorType'; import { Logger } from '../logging/Logger'; export function validate({ name, interval, concurrency, maxRunning }: Job, logger?: Logger): boolean { if (maxRunning < 0) { - logger?.error('job cannot be defined', MomoErrorType.defineJob, { name, maxRunning }, MomoError.invalidMaxRunning); + logger?.error('job cannot be defined', MomoErrorType.defineJob, { name, maxRunning }, momoError.invalidMaxRunning); return false; } @@ -15,7 +15,7 @@ export function validate({ name, interval, concurrency, maxRunning }: Job, logge 'job cannot be defined', MomoErrorType.defineJob, { name, concurrency }, - MomoError.invalidConcurrency + momoError.invalidConcurrency ); return false; } @@ -25,14 +25,14 @@ export function validate({ name, interval, concurrency, maxRunning }: Job, logge 'job cannot be defined', MomoErrorType.defineJob, { name, concurrency, maxRunning }, - MomoError.invalidConcurrency + momoError.invalidConcurrency ); return false; } const parsedInterval = humanInterval(interval); - if (!parsedInterval || isNaN(parsedInterval) || parsedInterval <= 0) { - logger?.error('job cannot be defined', MomoErrorType.defineJob, { name, interval }, MomoError.nonParsableInterval); + if (parsedInterval === undefined || isNaN(parsedInterval) || parsedInterval <= 0) { + logger?.error('job cannot be defined', MomoErrorType.defineJob, { name, interval }, momoError.nonParsableInterval); return false; } diff --git a/src/logging/LogEmitter.ts b/src/logging/LogEmitter.ts index ad96378c..645f7df9 100644 --- a/src/logging/LogEmitter.ts +++ b/src/logging/LogEmitter.ts @@ -1,5 +1,6 @@ import EventEmitter from 'events'; import TypedEmitter from 'typed-emitter'; + import { MomoEvents } from './MomoEvents'; import { debug, error, Logger } from './Logger'; diff --git a/src/logging/error/MomoError.ts b/src/logging/error/MomoError.ts index 3e50d966..0a06ef61 100644 --- a/src/logging/error/MomoError.ts +++ b/src/logging/error/MomoError.ts @@ -1,4 +1,4 @@ -export const MomoError = { +export const momoError = { nonParsableInterval: new Error('non-parsable job interval'), invalidConcurrency: new Error('concurrency must be at least 1'), invalidMaxRunning: new Error('maxRunning must be at least 0'), diff --git a/src/repository/JobRepository.ts b/src/repository/JobRepository.ts index 1c592a5c..6c17a897 100644 --- a/src/repository/JobRepository.ts +++ b/src/repository/JobRepository.ts @@ -6,28 +6,27 @@ export class JobRepository extends MongoRepository { async updateJob(name: string, update: Partial): Promise { const savedJobs = await this.find({ name }); - if (savedJobs.length === 0) { + if (savedJobs[0] === undefined) { return; } - const updatedJob = merge(savedJobs, update); + const updatedJob = merge(savedJobs[0], update); await this.save(updatedJob); } } -function merge(savedJobs: JobEntity[], { interval, concurrency, maxRunning, executionInfo }: Partial) { - const updatedJob = savedJobs[0]; +function merge(savedJob: JobEntity, { interval, concurrency, maxRunning, executionInfo }: Partial) { if (interval !== undefined) { - updatedJob.interval = interval; + savedJob.interval = interval; } if (concurrency !== undefined) { - updatedJob.concurrency = concurrency; + savedJob.concurrency = concurrency; } if (maxRunning !== undefined) { - updatedJob.maxRunning = maxRunning; + savedJob.maxRunning = maxRunning; } if (executionInfo !== undefined) { - updatedJob.executionInfo = executionInfo; + savedJob.executionInfo = executionInfo; } - return updatedJob; + return savedJob; } diff --git a/src/schedule/Schedule.ts b/src/schedule/Schedule.ts index 96f1b00b..db7f35f8 100644 --- a/src/schedule/Schedule.ts +++ b/src/schedule/Schedule.ts @@ -29,7 +29,7 @@ export class Schedule extends LogEmitter { * Returns 0 if no job with this name is scheduled. */ public getUnexpectedErrorCount(name?: string): number { - if (name) { + if (name !== undefined) { return this.jobSchedulers[name]?.getUnexpectedErrorCount() ?? 0; } return sum(Object.values(this.jobSchedulers).map((jobScheduler) => jobScheduler.getUnexpectedErrorCount())); @@ -87,7 +87,7 @@ export class Schedule extends LogEmitter { */ public async start(): Promise { this.logger.debug('start all jobs', { count: this.count() }); - await Promise.all(Object.values(this.jobSchedulers).map((jobScheduler) => jobScheduler.start())); + await Promise.all(Object.values(this.jobSchedulers).map(async (jobScheduler) => jobScheduler.start())); } /** @@ -134,7 +134,7 @@ export class Schedule extends LogEmitter { public async stop(): Promise { this.logger.debug('stop all jobs', { count: this.count() }); try { - await Promise.all(Object.values(this.jobSchedulers).map((jobScheduler) => jobScheduler.stop())); + await Promise.all(Object.values(this.jobSchedulers).map(async (jobScheduler) => jobScheduler.stop())); } catch (error) { this.logger.error('message failed to stop jobs', MomoErrorType.stopJob, { count: this.count() }, error); } @@ -199,7 +199,7 @@ export class Schedule extends LogEmitter { */ public async list(): Promise { return ( - await Promise.all(Object.values(this.jobSchedulers).map((jobScheduler) => jobScheduler.getJobDescription())) + await Promise.all(Object.values(this.jobSchedulers).map(async (jobScheduler) => jobScheduler.getJobDescription())) ).filter((jobDescription): jobDescription is MomoJobDescription => jobDescription !== undefined); } diff --git a/src/scheduler/JobScheduler.ts b/src/scheduler/JobScheduler.ts index 20766357..d96e8178 100644 --- a/src/scheduler/JobScheduler.ts +++ b/src/scheduler/JobScheduler.ts @@ -5,7 +5,7 @@ import { Job } from '../job/Job'; import { JobExecutor } from '../executor/JobExecutor'; import { setIntervalWithDelay, TimeoutHandle } from './setIntervalWithDelay'; import { calculateDelay } from './calculateDelay'; -import { MomoError } from '../logging/error/MomoError'; +import { momoError } from '../logging/error/MomoError'; import { MomoErrorType } from '../logging/error/MomoErrorType'; import { getExecutionsRepository, getJobRepository } from '../repository/getRepository'; import { Logger } from '../logging/Logger'; @@ -46,7 +46,7 @@ export class JobScheduler { 'get job description - job not found', MomoErrorType.scheduleJob, { name: this.jobName }, - MomoError.jobNotFound + momoError.jobNotFound ); return; } @@ -66,14 +66,14 @@ export class JobScheduler { 'cannot schedule job', MomoErrorType.scheduleJob, { name: this.jobName }, - MomoError.jobNotFound + momoError.jobNotFound ); return; } const interval = humanInterval(jobEntity.interval); - if (!interval || isNaN(interval)) { - throw MomoError.nonParsableInterval; + if (interval === undefined || isNaN(interval)) { + throw momoError.nonParsableInterval; } this.interval = jobEntity.interval; @@ -107,7 +107,7 @@ export class JobScheduler { 'job not found, skip execution', MomoErrorType.executeJob, { name: this.jobName }, - MomoError.jobNotFound + momoError.jobNotFound ); return { status: ExecutionStatus.notFound, @@ -131,7 +131,7 @@ export class JobScheduler { 'job not found, skip execution', MomoErrorType.executeJob, { name: this.jobName }, - MomoError.jobNotFound + momoError.jobNotFound ); return; } @@ -144,6 +144,7 @@ export class JobScheduler { this.logger.debug('execute job', { name: this.jobName, times: numToExecute }); for (let i = 0; i < numToExecute; i++) { + // eslint-disable-next-line no-void void this.jobExecutor.execute(jobEntity).catch((e) => { this.handleUnexpectedError(e); }); diff --git a/src/scheduler/calculateDelay.ts b/src/scheduler/calculateDelay.ts index 53a75b5e..480466a1 100644 --- a/src/scheduler/calculateDelay.ts +++ b/src/scheduler/calculateDelay.ts @@ -4,7 +4,7 @@ import { max } from 'lodash'; export function calculateDelay(millisecondsInterval: number, immediate: boolean, job: JobEntity): number { const nextStart = calculateNextStart(millisecondsInterval, job); - if (!nextStart) { + if (nextStart === undefined) { return immediate ? 0 : millisecondsInterval; } @@ -13,6 +13,6 @@ export function calculateDelay(millisecondsInterval: number, immediate: boolean, function calculateNextStart(interval: number, job: JobEntity): number | undefined { const lastStarted = job.executionInfo?.lastStarted; - const lastStartedDateTime = lastStarted ? DateTime.fromISO(lastStarted) : undefined; + const lastStartedDateTime = lastStarted !== undefined ? DateTime.fromISO(lastStarted) : undefined; return lastStartedDateTime?.plus({ milliseconds: interval }).toMillis(); } diff --git a/test/job/check.spec.ts b/test/job/check.spec.ts index e400e022..07dfa277 100644 --- a/test/job/check.spec.ts +++ b/test/job/check.spec.ts @@ -26,7 +26,7 @@ describe('check', () => { }); it('returns nothing if job not found', async () => { - mockRepositories().jobRepository; + mockRepositories(); expect(await check(name)).toBeUndefined(); }); diff --git a/test/job/clear.integration.spec.ts b/test/job/clear.integration.spec.ts index 8e8dae2a..464c137d 100644 --- a/test/job/clear.integration.spec.ts +++ b/test/job/clear.integration.spec.ts @@ -11,11 +11,11 @@ describe('clear', () => { beforeAll(async () => { mongo = await MongoMemoryServer.create(); - await connect({ url: await mongo.getUri() }); + await connect({ url: mongo.getUri() }); jobRepository = getJobRepository(); }); - beforeEach(async () => await jobRepository.delete({})); + beforeEach(async () => jobRepository.delete({})); afterAll(async () => { await disconnect(); diff --git a/test/job/findLatest.spec.ts b/test/job/findLatest.spec.ts index c1836ffb..b84ad1fc 100644 --- a/test/job/findLatest.spec.ts +++ b/test/job/findLatest.spec.ts @@ -6,7 +6,7 @@ import { ExecutionInfo } from '../../src'; function createJob(lastFinished?: number) { const job = JobEntity.from({ name: 'test' } as Job); - if (lastFinished) { + if (lastFinished !== undefined) { job.executionInfo = { lastFinished: DateTime.fromMillis(lastFinished).toISO() } as ExecutionInfo; } return job; diff --git a/test/job/validate.spec.ts b/test/job/validate.spec.ts index 3e0689dc..47989911 100644 --- a/test/job/validate.spec.ts +++ b/test/job/validate.spec.ts @@ -2,7 +2,7 @@ import { validate } from '../../src/job/validate'; import { withDefaults } from '../../src/job/withDefaults'; import { Job } from '../../src/job/Job'; import { Logger } from '../../src/logging/Logger'; -import { MomoError, MomoErrorType } from '../../src'; +import { momoError, MomoErrorType } from '../../src'; describe('validate', () => { const logger: Logger = { @@ -26,7 +26,7 @@ describe('validate', () => { 'job cannot be defined', MomoErrorType.defineJob, { name: job.name, interval: job.interval }, - MomoError.nonParsableInterval + momoError.nonParsableInterval ); }); @@ -39,7 +39,7 @@ describe('validate', () => { 'job cannot be defined', MomoErrorType.defineJob, { name: job.name, interval: job.interval }, - MomoError.nonParsableInterval + momoError.nonParsableInterval ); }); @@ -52,7 +52,7 @@ describe('validate', () => { 'job cannot be defined', MomoErrorType.defineJob, { name: job.name, maxRunning: -1 }, - MomoError.invalidMaxRunning + momoError.invalidMaxRunning ); }); @@ -65,7 +65,7 @@ describe('validate', () => { 'job cannot be defined', MomoErrorType.defineJob, { name: job.name, concurrency: job.concurrency }, - MomoError.invalidConcurrency + momoError.invalidConcurrency ); }); @@ -84,7 +84,7 @@ describe('validate', () => { 'job cannot be defined', MomoErrorType.defineJob, { name: job.name, concurrency: job.concurrency, maxRunning: job.maxRunning }, - MomoError.invalidConcurrency + momoError.invalidConcurrency ); }); }); diff --git a/test/repository/ExecutionsRepository.integration.spec.ts b/test/repository/ExecutionsRepository.integration.spec.ts index 41853896..27cdc936 100644 --- a/test/repository/ExecutionsRepository.integration.spec.ts +++ b/test/repository/ExecutionsRepository.integration.spec.ts @@ -16,11 +16,11 @@ describe('ExecutionsRepository', () => { ExecutionsRepository.deadScheduleThreshold = 1000; mongo = await MongoMemoryServer.create(); - await connect({ url: await mongo.getUri() }); + await connect({ url: mongo.getUri() }); executionsRepository = getExecutionsRepository(); }); - beforeEach(async () => await executionsRepository.clear()); + beforeEach(async () => executionsRepository.clear()); afterAll(async () => { await disconnect(); @@ -34,7 +34,7 @@ describe('ExecutionsRepository', () => { const entities = await executionsRepository.find({}); expect(entities).toHaveLength(1); - expect(entities[0].scheduleId).toEqual(scheduleId); + expect(entities[0]?.scheduleId).toEqual(scheduleId); }); }); diff --git a/test/repository/JobRepository.integration.spec.ts b/test/repository/JobRepository.integration.spec.ts index d94f5964..004ba548 100644 --- a/test/repository/JobRepository.integration.spec.ts +++ b/test/repository/JobRepository.integration.spec.ts @@ -17,11 +17,11 @@ describe('JobRepository', () => { beforeAll(async () => { mongo = await MongoMemoryServer.create(); - await connect({ url: await mongo.getUri() }); + await connect({ url: mongo.getUri() }); jobRepository = getJobRepository(); }); - beforeEach(async () => await jobRepository.delete({})); + beforeEach(async () => jobRepository.delete({})); afterAll(async () => { await disconnect(); @@ -40,8 +40,8 @@ describe('JobRepository', () => { await jobRepository.updateJob(job.name, { interval: 'new interval' }); - const [{ executionInfo }] = await jobRepository.find({ name: job.name }); - expect(executionInfo).toEqual(savedJob.executionInfo); + const jobs = await jobRepository.find({ name: job.name }); + expect(jobs[0]?.executionInfo).toEqual(savedJob.executionInfo); }); it('can update maxRunning to 0', async () => { @@ -50,8 +50,8 @@ describe('JobRepository', () => { await jobRepository.updateJob(job.name, { maxRunning: 0 }); - const [{ maxRunning }] = await jobRepository.find({ name: job.name }); - expect(maxRunning).toBe(0); + const jobs = await jobRepository.find({ name: job.name }); + expect(jobs[0]?.maxRunning).toBe(0); }); }); }); diff --git a/test/schedule/MongoScheduleBuilder.integration.spec.ts b/test/schedule/MongoScheduleBuilder.integration.spec.ts index 03afde42..9c483155 100644 --- a/test/schedule/MongoScheduleBuilder.integration.spec.ts +++ b/test/schedule/MongoScheduleBuilder.integration.spec.ts @@ -27,7 +27,7 @@ describe('MongoScheduleBuilder', () => { beforeAll(async () => { mongo = await MongoMemoryServer.create(); - connectionOptions = { url: await mongo.getUri() }; + connectionOptions = { url: mongo.getUri() }; }); afterEach(async () => { @@ -50,8 +50,8 @@ describe('MongoScheduleBuilder', () => { const jobList = await mongoSchedule.list(); expect(jobList).toHaveLength(1); - expect(jobList[0].name).toEqual(job1.name); - expect(jobList[0].interval).toEqual(job1.interval); + expect(jobList[0]?.name).toEqual(job1.name); + expect(jobList[0]?.interval).toEqual(job1.interval); }); it('can build with multiple jobs and a connection', async () => { @@ -64,12 +64,12 @@ describe('MongoScheduleBuilder', () => { const jobList = await mongoSchedule.list(); expect(jobList).toHaveLength(3); - expect(jobList[0].name).toEqual(job1.name); - expect(jobList[0].interval).toEqual(job1.interval); - expect(jobList[1].name).toEqual(job2.name); - expect(jobList[1].interval).toEqual(job2.interval); - expect(jobList[2].name).toEqual(job3.name); - expect(jobList[2].interval).toEqual(job3.interval); + expect(jobList[0]?.name).toEqual(job1.name); + expect(jobList[0]?.interval).toEqual(job1.interval); + expect(jobList[1]?.name).toEqual(job2.name); + expect(jobList[1]?.interval).toEqual(job2.interval); + expect(jobList[2]?.name).toEqual(job3.name); + expect(jobList[2]?.interval).toEqual(job3.interval); }); }); diff --git a/test/schedule/Schedule.integration.spec.ts b/test/schedule/Schedule.integration.spec.ts index d052e2e8..9c56251b 100644 --- a/test/schedule/Schedule.integration.spec.ts +++ b/test/schedule/Schedule.integration.spec.ts @@ -20,7 +20,7 @@ describe('Schedule', () => { beforeAll(async () => { mongo = await MongoMemoryServer.create(); - mongoSchedule = await MongoSchedule.connect({ url: await mongo.getUri() }); + mongoSchedule = await MongoSchedule.connect({ url: mongo.getUri() }); jobRepository = getJobRepository(); initLoggingForTests(mongoSchedule); @@ -96,7 +96,7 @@ describe('Schedule', () => { const jobs = await mongoSchedule.list(); expect(jobs).toHaveLength(1); - expect(jobs[0].name).toEqual(jobToKeep.name); + expect(jobs[0]?.name).toEqual(jobToKeep.name); const jobEntities = await jobRepository.find({}); expect(jobEntities).toHaveLength(2); @@ -122,6 +122,6 @@ describe('Schedule', () => { const jobEntities = await jobRepository.find({}); expect(jobEntities).toHaveLength(1); - expect(jobEntities[0].name).toEqual(jobToKeep.name); + expect(jobEntities[0]?.name).toEqual(jobToKeep.name); }); }); diff --git a/test/schedule/SchedulePing.spec.ts b/test/schedule/SchedulePing.spec.ts index ae8d5021..21fd3f8a 100644 --- a/test/schedule/SchedulePing.spec.ts +++ b/test/schedule/SchedulePing.spec.ts @@ -26,6 +26,6 @@ describe('SchedulePing', () => { await sleep(SchedulePing.interval); verify(executionsRepository.ping(scheduleId)).once(); - verify(executionsRepository.delete(deepEqual({ scheduleId: scheduleId }))).once(); + verify(executionsRepository.delete(deepEqual({ scheduleId }))).once(); }); }); diff --git a/test/schedule/momo.integration.spec.ts b/test/schedule/momo.integration.spec.ts index 6e70092d..c80ec024 100644 --- a/test/schedule/momo.integration.spec.ts +++ b/test/schedule/momo.integration.spec.ts @@ -2,7 +2,7 @@ import { DateTime } from 'luxon'; import { MongoMemoryServer } from 'mongodb-memory-server'; import { v4 as uuid } from 'uuid'; -import { clear, ExecutionStatus, MomoError, MomoErrorEvent, MomoErrorType, MomoJob, MongoSchedule } from '../../src'; +import { clear, ExecutionStatus, momoError, MomoErrorEvent, MomoErrorType, MomoJob, MongoSchedule } from '../../src'; import { JobRepository } from '../../src/repository/JobRepository'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; import { getExecutionsRepository, getJobRepository } from '../../src/repository/getRepository'; @@ -30,7 +30,7 @@ describe('Momo', () => { beforeAll(async () => { mongo = await MongoMemoryServer.create(); - mongoSchedule = await MongoSchedule.connect({ url: await mongo.getUri() }); + mongoSchedule = await MongoSchedule.connect({ url: mongo.getUri() }); jobRepository = getJobRepository(); executionsRepository = getExecutionsRepository(); @@ -119,8 +119,8 @@ describe('Momo', () => { await sleep(500); await mongoSchedule.define(job); - const [{ executionInfo }] = await jobRepository.find({ name: job.name }); - expect(executionInfo).toEqual(jobEntity.executionInfo); + const jobs = await jobRepository.find({ name: job.name }); + expect(jobs[0]?.executionInfo).toEqual(jobEntity.executionInfo); await mongoSchedule.start(); @@ -130,19 +130,21 @@ describe('Momo', () => { it('saves executionInfo in mongo', async () => { await mongoSchedule.define(job); - const [{ executionInfo: info1 }] = await jobRepository.find({ name: job.name }); - expect(info1).toBeUndefined(); + const jobs1 = await jobRepository.find({ name: job.name }); + expect(jobs1[0]!.executionInfo).toBeUndefined(); await mongoSchedule.start(); await waitFor(() => expect(jobHandler.count).toBe(1)); - const [{ executionInfo: info2 }] = await jobRepository.find({ name: job.name }); - expect(info2).toBeDefined(); - if (!info2) throw new Error('should be defined'); - expect(DateTime.fromISO(info2.lastFinished).toMillis()).toBeGreaterThan( - DateTime.fromISO(info2.lastStarted).toMillis() + const jobs2 = await jobRepository.find({ name: job.name }); + + const executionInfo = jobs2[0]?.executionInfo; + expect(executionInfo).toBeDefined(); + + expect(DateTime.fromISO(executionInfo!.lastFinished).toMillis()).toBeGreaterThan( + DateTime.fromISO(executionInfo!.lastStarted).toMillis() ); - expect(info2?.lastResult).toEqual({ status: ExecutionStatus.finished, handlerResult: jobHandler.result }); + expect(executionInfo!.lastResult).toEqual({ status: ExecutionStatus.finished, handlerResult: jobHandler.result }); }); it('updates and reports failing job in mongo', async () => { @@ -153,11 +155,13 @@ describe('Momo', () => { await waitFor(() => expect(jobHandler.count).toBe(1)); const executionInfo = await waitFor(async () => { - const [{ executionInfo }] = await jobRepository.find({ name: job.name }); + const jobs = await jobRepository.find({ name: job.name }); + const executionInfo = jobs[0]?.executionInfo; expect(executionInfo?.lastFinished).toBeDefined(); - return executionInfo; + return executionInfo!; }, 100); - expect(executionInfo?.lastResult).toEqual({ status: ExecutionStatus.failed, handlerResult: jobHandler.message }); + + expect(executionInfo.lastResult).toEqual({ status: ExecutionStatus.failed, handlerResult: jobHandler.message }); expect(receivedError).toEqual({ message: 'job failed', type: MomoErrorType.executeJob, @@ -173,15 +177,21 @@ describe('Momo', () => { await waitFor(() => expect(jobHandler.count).toBe(1)); await waitFor(async () => { - const [{ executionInfo: info1 }] = await jobRepository.find({ name: job.name }); - expect(info1?.lastResult).toEqual({ status: ExecutionStatus.failed, handlerResult: jobHandler.message }); + const jobs = await jobRepository.find({ name: job.name }); + expect(jobs[0]?.executionInfo?.lastResult).toEqual({ + status: ExecutionStatus.failed, + handlerResult: jobHandler.message, + }); }, 100); jobHandler.failJob = false; await waitFor(() => expect(jobHandler.count).toBe(2)); await waitFor(async () => { - const [{ executionInfo: info2 }] = await jobRepository.find({ name: job.name }); - expect(info2?.lastResult).toEqual({ status: ExecutionStatus.finished, handlerResult: jobHandler.result }); + const jobs = await jobRepository.find({ name: job.name }); + expect(jobs[0]?.executionInfo?.lastResult).toEqual({ + status: ExecutionStatus.finished, + handlerResult: jobHandler.result, + }); }, 100); }); @@ -239,9 +249,9 @@ describe('Momo', () => { ); await waitFor(async () => { - const [updatedJob] = await mongoSchedule.list(); - expect(updatedJob.concurrency).toEqual(updatedConcurrency); - expect(updatedJob.maxRunning).toEqual(updatedMaxRunning); + const updatedJobs = await mongoSchedule.list(); + expect(updatedJobs[0]?.concurrency).toEqual(updatedConcurrency); + expect(updatedJobs[0]?.maxRunning).toEqual(updatedMaxRunning); }); await sleep(1100); @@ -258,7 +268,8 @@ describe('Momo', () => { await waitFor(() => expect(jobHandler.count).toBe(1)); - const [{ interval, schedulerStatus }] = await mongoSchedule.list(); + const updatedJobs = await mongoSchedule.list(); + const { interval, schedulerStatus } = updatedJobs[0]!; expect(interval).toEqual(updatedInterval); expect(schedulerStatus?.interval).toBe(job.interval); expect(schedulerStatus?.running).toBeGreaterThanOrEqual(0); @@ -355,7 +366,7 @@ describe('Momo', () => { const jobs = await jobRepository.find(); expect(jobs).toHaveLength(1); - expect(jobs[0].name).toEqual(job2.name); + expect(jobs[0]?.name).toEqual(job2.name); }); it('does not fail when trying to remove a non existent job', async () => { @@ -465,9 +476,9 @@ describe('Momo', () => { await waitFor(() => expect(jobHandler.count).toBe(1), jobHandler.duration + 1000); const { executionInfo } = await waitFor(async () => { - const savedJob = (await jobRepository.find({ name: job.name }))[0]; - expect(savedJob.executionInfo?.lastFinished).toBeDefined(); - return savedJob; + const savedJobs = await jobRepository.find({ name: job.name }); + expect(savedJobs[0]?.executionInfo?.lastFinished).toBeDefined(); + return savedJobs[0]!; }); expect(executionInfo).toBeDefined(); @@ -565,7 +576,7 @@ describe('Momo', () => { message: 'job not found, skip execution', type: MomoErrorType.executeJob, data: { name: job.name }, - error: MomoError.jobNotFound, + error: momoError.jobNotFound, }); }); }); diff --git a/test/scheduler/JobScheduler.spec.ts b/test/scheduler/JobScheduler.spec.ts index 980e5def..1097f9ab 100644 --- a/test/scheduler/JobScheduler.spec.ts +++ b/test/scheduler/JobScheduler.spec.ts @@ -6,7 +6,7 @@ import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository' import { Job } from '../../src/job/Job'; import { JobExecutor } from '../../src/executor/JobExecutor'; import { JobEntity } from '../../src/repository/JobEntity'; -import { MomoError, MomoErrorType } from '../../src'; +import { momoError, MomoErrorType } from '../../src'; import { mockRepositories } from '../utils/mockRepositories'; import { loggerForTests } from '../utils/logging'; import { createJobEntity } from '../utils/createJobEntity'; @@ -124,7 +124,7 @@ describe('JobScheduler', () => { it('throws on non-parsable interval', async () => { createJob({ interval: 'not an interval' }); - await expect(async () => jobScheduler.start()).rejects.toThrow(MomoError.nonParsableInterval); + await expect(async () => jobScheduler.start()).rejects.toThrow(momoError.nonParsableInterval); }); it('reports error when job was removed before scheduling', async () => { @@ -137,7 +137,7 @@ describe('JobScheduler', () => { 'cannot schedule job', MomoErrorType.scheduleJob, { name: job.name }, - MomoError.jobNotFound + momoError.jobNotFound ); }); diff --git a/tsconfig.json b/tsconfig.json index b0e7fa7c..36098505 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,7 @@ "resolveJsonModule": true, "sourceMap": true, "strict": true, + "strictNullChecks": true, "target": "es6", "types": [ "jest", From db6a47d8b3f3c3fee0337d6bdcd037b7494fd2bf Mon Sep 17 00:00:00 2001 From: Ute Weiss Date: Fri, 27 Aug 2021 09:51:39 +0200 Subject: [PATCH 4/8] fix: split lint and test in ci pipeline, lint only for recent node versions Signed-off-by: Ute Weiss --- .github/workflows/ci.yml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 42ee19cf..752eda16 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,12 +20,12 @@ jobs: - run: npm install - run: npm run build - lint-and-test: + lint: runs-on: ubuntu-latest strategy: matrix: - node: [10, 12, 14, 16] + node: [14, 16] steps: - name: Checkout the repository @@ -36,5 +36,21 @@ jobs: node-version: ${{ matrix.node }} - run: npm install - run: npm run lint + + test: + runs-on: ubuntu-latest + + strategy: + matrix: + node: [10, 12, 14, 16] + + steps: + - name: Checkout the repository + uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node }} + - run: npm install - run: npm run test - run: npm run test:integration From c64d9979e449cafdb82c8a470af2d688cfd70551 Mon Sep 17 00:00:00 2001 From: Ute Weiss Date: Fri, 27 Aug 2021 10:27:51 +0200 Subject: [PATCH 5/8] fix: enforce sorted imports with eslint Signed-off-by: Ute Weiss --- .eslintrc.js | 19 ++++++++++++++++--- package-lock.json | 6 ++++++ package.json | 3 ++- src/connect.ts | 5 +++-- src/executor/JobExecutor.ts | 6 +++--- src/isConnected.ts | 1 + src/job/Job.ts | 2 +- src/job/clear.ts | 2 +- src/job/define.ts | 2 +- src/job/findLatest.ts | 1 + src/job/keepLatest.ts | 4 ++-- src/job/validate.ts | 5 +++-- src/job/withDefaults.ts | 2 +- src/logging/LogEmitter.ts | 2 +- src/logging/Logger.ts | 3 ++- src/repository/JobEntity.ts | 3 ++- src/repository/JobRepository.ts | 1 + src/repository/getRepository.ts | 3 ++- src/schedule/MongoSchedule.ts | 3 ++- src/schedule/MongoScheduleBuilder.ts | 2 +- src/schedule/Schedule.ts | 13 +++++++------ src/scheduler/JobScheduler.ts | 16 ++++++++-------- src/scheduler/calculateDelay.ts | 3 ++- test/connect.integration.spec.ts | 1 + test/executor/JobExecutor.spec.ts | 10 +++++----- test/isConnected.spec.ts | 2 +- test/job/check.spec.ts | 4 ++-- test/job/clear.integration.spec.ts | 5 +++-- test/job/define.spec.ts | 11 ++++++----- test/job/findLatest.spec.ts | 7 ++++--- test/job/keepLatest.spec.ts | 6 +++--- test/job/list.spec.ts | 2 +- test/job/validate.spec.ts | 6 +++--- .../ExecutionsRepository.integration.spec.ts | 2 +- .../JobRepository.integration.spec.ts | 3 ++- test/schedule/MongoSchedule.spec.ts | 2 +- .../MongoScheduleBuilder.integration.spec.ts | 2 +- test/schedule/Schedule.integration.spec.ts | 6 +++--- test/schedule/Schedule.spec.ts | 6 +++--- test/schedule/SchedulePing.spec.ts | 4 ++-- test/schedule/momo.integration.spec.ts | 8 ++++---- test/scheduler/JobScheduler.spec.ts | 12 ++++++------ test/scheduler/calculateDelay.spec.ts | 5 +++-- test/utils/createJobEntity.ts | 2 +- test/utils/logging.ts | 5 +++-- test/utils/mockRepositories.ts | 5 +++-- 46 files changed, 131 insertions(+), 92 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 7bff4c53..8cf012ef 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,7 +9,13 @@ module.exports = { project: 'tsconfig.eslint.json', sourceType: 'module', }, - plugins: ['eslint-plugin-import', 'eslint-plugin-jsdoc', 'eslint-plugin-prefer-arrow', '@typescript-eslint'], + plugins: [ + 'eslint-plugin-import', + 'eslint-plugin-jsdoc', + 'eslint-plugin-prefer-arrow', + 'sort-imports-es6-autofix', + '@typescript-eslint', + ], rules: { 'jest/expect-expect': [ 'error', @@ -17,6 +23,7 @@ module.exports = { assertFunctionNames: ['expect*', 'verify*'], }, ], + 'sort-imports-es6-autofix/sort-imports-es6': 'error', '@typescript-eslint/adjacent-overload-signatures': 'error', '@typescript-eslint/array-type': [ 'error', @@ -83,7 +90,7 @@ module.exports = { '@typescript-eslint/promise-function-async': 'error', '@typescript-eslint/quotes': 'off', '@typescript-eslint/restrict-plus-operands': 'error', - '@typescript-eslint/no-unnecessary-condition': ['error', {}], + '@typescript-eslint/no-unnecessary-condition': 'error', '@typescript-eslint/semi': ['off', null], '@typescript-eslint/strict-boolean-expressions': [ 'error', @@ -127,7 +134,12 @@ module.exports = { 'import/no-deprecated': 'error', 'import/no-extraneous-dependencies': 'off', 'import/no-internal-modules': 'off', - 'import/order': 'off', + 'import/order': [ + 'error', + { + groups: ['builtin', 'external', 'object'], + }, + ], 'jsdoc/check-alignment': 'error', 'jsdoc/check-indentation': 'error', 'jsdoc/newline-after-description': 'error', @@ -173,6 +185,7 @@ module.exports = { 'react/jsx-curly-spacing': 'off', 'react/jsx-equals-spacing': 'off', 'react/jsx-wrap-multilines': 'off', + 'sort-imports': ['error', { allowSeparatedGroups: true, ignoreDeclarationSort: true }], 'space-before-function-paren': 'off', 'space-in-parens': ['off', 'never'], 'spaced-comment': [ diff --git a/package-lock.json b/package-lock.json index cfd63551..bac5a71b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2518,6 +2518,12 @@ "prettier-linter-helpers": "^1.0.0" } }, + "eslint-plugin-sort-imports-es6-autofix": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sort-imports-es6-autofix/-/eslint-plugin-sort-imports-es6-autofix-0.6.0.tgz", + "integrity": "sha512-2NVaBGF9NN+727Fyq+jJYihdIeegjXeUUrZED9Q8FVB8MsV3YQEyXG96GVnXqWt0pmn7xfCZOZf3uKnIhBrfeQ==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", diff --git a/package.json b/package.json index d76bf3b2..279cc672 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test:unit": "npm run test \"^((?!\\.integration\\.).)*$\"", "test:integration": "npm run test integration", "lint": "prettier --check \"**/*.ts\" && eslint \"**/*.{ts,js,json}\"", - "format": "prettier --write \"**/*.ts\" && eslint \"**/*.{ts,js,json}\"" + "format": "prettier --write \"**/*.ts\" && eslint \"**/*.{ts,js,json}\" --fix" }, "dependencies": { "human-interval": "2.0.1", @@ -48,6 +48,7 @@ "eslint-plugin-markdown": "2.2.0", "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-prettier": "3.4.0", + "eslint-plugin-sort-imports-es6-autofix": "^0.6.0", "jest": "27.0.6", "mongodb-memory-server": "7.2.1", "pino": "6.12.0", diff --git a/src/connect.ts b/src/connect.ts index c4984239..3b750861 100644 --- a/src/connect.ts +++ b/src/connect.ts @@ -1,8 +1,9 @@ import { Connection, createConnection, getConnection } from 'typeorm'; -import { JobEntity } from './repository/JobEntity'; -import { JobRepository } from './repository/JobRepository'; + import { ExecutionsEntity } from './repository/ExecutionsEntity'; import { ExecutionsRepository } from './repository/ExecutionsRepository'; +import { JobEntity } from './repository/JobEntity'; +import { JobRepository } from './repository/JobRepository'; import { isConnected } from './isConnected'; export const connectionName = 'momo'; diff --git a/src/executor/JobExecutor.ts b/src/executor/JobExecutor.ts index 8e8696a6..78cdc00d 100644 --- a/src/executor/JobExecutor.ts +++ b/src/executor/JobExecutor.ts @@ -1,11 +1,11 @@ import { DateTime } from 'luxon'; +import { ExecutionStatus, JobResult } from '../job/ExecutionInfo'; +import { Handler } from '../job/MomoJob'; import { JobEntity } from '../repository/JobEntity'; +import { Logger } from '../logging/Logger'; import { MomoErrorType } from '../logging/error/MomoErrorType'; -import { ExecutionStatus, JobResult } from '../job/ExecutionInfo'; import { getExecutionsRepository, getJobRepository } from '../repository/getRepository'; -import { Logger } from '../logging/Logger'; -import { Handler } from '../job/MomoJob'; export class JobExecutor { private stopped = false; diff --git a/src/isConnected.ts b/src/isConnected.ts index 923cbc3c..2961c774 100644 --- a/src/isConnected.ts +++ b/src/isConnected.ts @@ -1,4 +1,5 @@ import { getConnection } from 'typeorm'; + import { connectionName } from './connect'; /** diff --git a/src/job/Job.ts b/src/job/Job.ts index 9c2763f6..cab44c53 100644 --- a/src/job/Job.ts +++ b/src/job/Job.ts @@ -1,5 +1,5 @@ -import { Handler } from './MomoJob'; import { ExecutionInfo } from './ExecutionInfo'; +import { Handler } from './MomoJob'; export type MomoJobStatus = JobDefinition & { executionInfo?: ExecutionInfo }; diff --git a/src/job/clear.ts b/src/job/clear.ts index 2693771e..17c87741 100644 --- a/src/job/clear.ts +++ b/src/job/clear.ts @@ -1,5 +1,5 @@ -import { isConnected } from '../index'; import { getJobRepository } from '../repository/getRepository'; +import { isConnected } from '../index'; /** * Removes all jobs from the database. diff --git a/src/job/define.ts b/src/job/define.ts index 856803e1..7f0779da 100644 --- a/src/job/define.ts +++ b/src/job/define.ts @@ -1,8 +1,8 @@ import { Job } from './Job'; import { JobEntity } from '../repository/JobEntity'; +import { Logger } from '../logging/Logger'; import { getJobRepository } from '../repository/getRepository'; import { keepLatest } from './keepLatest'; -import { Logger } from '../logging/Logger'; export async function define(job: Job, logger?: Logger): Promise { const { name, interval, concurrency, maxRunning } = job; diff --git a/src/job/findLatest.ts b/src/job/findLatest.ts index 30803e31..f865122a 100644 --- a/src/job/findLatest.ts +++ b/src/job/findLatest.ts @@ -1,4 +1,5 @@ import { DateTime } from 'luxon'; + import { JobEntity } from '../repository/JobEntity'; function compareLastFinished(left: JobEntity, right: JobEntity): JobEntity { diff --git a/src/job/keepLatest.ts b/src/job/keepLatest.ts index 7ca225ee..a9e5a7e1 100644 --- a/src/job/keepLatest.ts +++ b/src/job/keepLatest.ts @@ -1,7 +1,7 @@ import { JobEntity } from '../repository/JobEntity'; -import { getJobRepository } from '../repository/getRepository'; -import { findLatest } from './findLatest'; import { Logger } from '../logging/Logger'; +import { findLatest } from './findLatest'; +import { getJobRepository } from '../repository/getRepository'; export async function keepLatest(name: string, logger?: Logger): Promise { const jobRepository = getJobRepository(); diff --git a/src/job/validate.ts b/src/job/validate.ts index 0944d730..1f3c3851 100644 --- a/src/job/validate.ts +++ b/src/job/validate.ts @@ -1,8 +1,9 @@ import humanInterval from 'human-interval'; + import { Job } from './Job'; -import { momoError } from '../logging/error/MomoError'; -import { MomoErrorType } from '../logging/error/MomoErrorType'; import { Logger } from '../logging/Logger'; +import { MomoErrorType } from '../logging/error/MomoErrorType'; +import { momoError } from '../logging/error/MomoError'; export function validate({ name, interval, concurrency, maxRunning }: Job, logger?: Logger): boolean { if (maxRunning < 0) { diff --git a/src/job/withDefaults.ts b/src/job/withDefaults.ts index 0c0b9953..483344b4 100644 --- a/src/job/withDefaults.ts +++ b/src/job/withDefaults.ts @@ -1,5 +1,5 @@ -import { MomoJob } from './MomoJob'; import { Job } from './Job'; +import { MomoJob } from './MomoJob'; export function withDefaults(job: MomoJob): Job { return { immediate: false, concurrency: 1, maxRunning: 0, ...job }; diff --git a/src/logging/LogEmitter.ts b/src/logging/LogEmitter.ts index 645f7df9..5f82c69a 100644 --- a/src/logging/LogEmitter.ts +++ b/src/logging/LogEmitter.ts @@ -1,8 +1,8 @@ import EventEmitter from 'events'; import TypedEmitter from 'typed-emitter'; +import { Logger, debug, error } from './Logger'; import { MomoEvents } from './MomoEvents'; -import { debug, error, Logger } from './Logger'; export class LogEmitter extends (EventEmitter as new () => TypedEmitter) { protected readonly logger: Logger; diff --git a/src/logging/Logger.ts b/src/logging/Logger.ts index 8f1d16e3..ec83b8c3 100644 --- a/src/logging/Logger.ts +++ b/src/logging/Logger.ts @@ -1,6 +1,7 @@ import TypedEmitter from 'typed-emitter'; -import { MomoEventData, MomoEvents } from './MomoEvents'; + import { MomoErrorType } from './error/MomoErrorType'; +import { MomoEventData, MomoEvents } from './MomoEvents'; export interface Logger { debug: (message: string, data?: MomoEventData) => void; diff --git a/src/repository/JobEntity.ts b/src/repository/JobEntity.ts index 56be56bb..f7a022ad 100644 --- a/src/repository/JobEntity.ts +++ b/src/repository/JobEntity.ts @@ -1,6 +1,7 @@ import { Column, Entity, Index, ObjectID, ObjectIdColumn } from 'typeorm'; -import { Job } from '../job/Job'; + import { ExecutionInfo } from '../job/ExecutionInfo'; +import { Job } from '../job/Job'; @Entity({ name: 'jobs' }) export class JobEntity { diff --git a/src/repository/JobRepository.ts b/src/repository/JobRepository.ts index 6c17a897..ebb42c6c 100644 --- a/src/repository/JobRepository.ts +++ b/src/repository/JobRepository.ts @@ -1,4 +1,5 @@ import { EntityRepository, MongoRepository } from 'typeorm'; + import { JobEntity } from './JobEntity'; @EntityRepository(JobEntity) diff --git a/src/repository/getRepository.ts b/src/repository/getRepository.ts index 4f24c6f9..353f05ad 100644 --- a/src/repository/getRepository.ts +++ b/src/repository/getRepository.ts @@ -1,7 +1,8 @@ import { getConnection } from 'typeorm'; -import { connectionName } from '../connect'; + import { ExecutionsRepository } from './ExecutionsRepository'; import { JobRepository } from './JobRepository'; +import { connectionName } from '../connect'; export function getJobRepository(): JobRepository { return getConnection(connectionName).getCustomRepository(JobRepository); diff --git a/src/schedule/MongoSchedule.ts b/src/schedule/MongoSchedule.ts index d095dfa5..7c733640 100644 --- a/src/schedule/MongoSchedule.ts +++ b/src/schedule/MongoSchedule.ts @@ -1,7 +1,8 @@ import { v4 as uuid } from 'uuid'; + +import { MomoConnectionOptions, connect, disconnect } from '../connect'; import { Schedule } from './Schedule'; import { SchedulePing } from './SchedulePing'; -import { connect, disconnect, MomoConnectionOptions } from '../connect'; import { getExecutionsRepository } from '../repository/getRepository'; export class MongoSchedule extends Schedule { diff --git a/src/schedule/MongoScheduleBuilder.ts b/src/schedule/MongoScheduleBuilder.ts index 90246ecb..81383305 100644 --- a/src/schedule/MongoScheduleBuilder.ts +++ b/src/schedule/MongoScheduleBuilder.ts @@ -1,5 +1,5 @@ -import { MomoJob } from '../job/MomoJob'; import { MomoConnectionOptions } from '../connect'; +import { MomoJob } from '../job/MomoJob'; import { MongoSchedule } from './MongoSchedule'; export class MongoScheduleBuilder { diff --git a/src/schedule/Schedule.ts b/src/schedule/Schedule.ts index db7f35f8..70bdf71b 100644 --- a/src/schedule/Schedule.ts +++ b/src/schedule/Schedule.ts @@ -1,14 +1,15 @@ import { sum } from 'lodash'; + +import { ExecutionStatus, JobResult } from '../job/ExecutionInfo'; import { JobScheduler } from '../scheduler/JobScheduler'; +import { LogEmitter } from '../logging/LogEmitter'; +import { MomoErrorType } from '../logging/error/MomoErrorType'; import { MomoJob } from '../job/MomoJob'; -import { withDefaults } from '../job/withDefaults'; -import { validate } from '../job/validate'; +import { MomoJobDescription } from '../job/MomoJobDescription'; import { define } from '../job/define'; -import { LogEmitter } from '../logging/LogEmitter'; import { getJobRepository } from '../repository/getRepository'; -import { ExecutionStatus, JobResult } from '../job/ExecutionInfo'; -import { MomoJobDescription } from '../job/MomoJobDescription'; -import { MomoErrorType } from '../logging/error/MomoErrorType'; +import { validate } from '../job/validate'; +import { withDefaults } from '../job/withDefaults'; export class Schedule extends LogEmitter { private jobSchedulers: { [name: string]: JobScheduler } = {}; diff --git a/src/scheduler/JobScheduler.ts b/src/scheduler/JobScheduler.ts index d96e8178..2e92b78d 100644 --- a/src/scheduler/JobScheduler.ts +++ b/src/scheduler/JobScheduler.ts @@ -1,17 +1,17 @@ -import humanInterval from 'human-interval'; +import { DateTime } from 'luxon'; import { min } from 'lodash'; +import humanInterval from 'human-interval'; +import { ExecutionStatus, JobResult } from '../job/ExecutionInfo'; import { Job } from '../job/Job'; import { JobExecutor } from '../executor/JobExecutor'; -import { setIntervalWithDelay, TimeoutHandle } from './setIntervalWithDelay'; -import { calculateDelay } from './calculateDelay'; -import { momoError } from '../logging/error/MomoError'; +import { Logger } from '../logging/Logger'; import { MomoErrorType } from '../logging/error/MomoErrorType'; +import { MomoJobDescription, jobDescriptionFromEntity } from '../job/MomoJobDescription'; +import { TimeoutHandle, setIntervalWithDelay } from './setIntervalWithDelay'; +import { calculateDelay } from './calculateDelay'; import { getExecutionsRepository, getJobRepository } from '../repository/getRepository'; -import { Logger } from '../logging/Logger'; -import { ExecutionStatus, JobResult } from '../job/ExecutionInfo'; -import { DateTime } from 'luxon'; -import { jobDescriptionFromEntity, MomoJobDescription } from '../job/MomoJobDescription'; +import { momoError } from '../logging/error/MomoError'; export class JobScheduler { private jobHandle?: TimeoutHandle; diff --git a/src/scheduler/calculateDelay.ts b/src/scheduler/calculateDelay.ts index 480466a1..6f1f1c84 100644 --- a/src/scheduler/calculateDelay.ts +++ b/src/scheduler/calculateDelay.ts @@ -1,7 +1,8 @@ -import { JobEntity } from '../repository/JobEntity'; import { DateTime } from 'luxon'; import { max } from 'lodash'; +import { JobEntity } from '../repository/JobEntity'; + export function calculateDelay(millisecondsInterval: number, immediate: boolean, job: JobEntity): number { const nextStart = calculateNextStart(millisecondsInterval, job); if (nextStart === undefined) { diff --git a/test/connect.integration.spec.ts b/test/connect.integration.spec.ts index 9aa8516a..3d7d0d04 100644 --- a/test/connect.integration.spec.ts +++ b/test/connect.integration.spec.ts @@ -1,4 +1,5 @@ import { MongoMemoryServer } from 'mongodb-memory-server'; + import { connect, disconnect } from '../src/connect'; import { isConnected } from '../src'; diff --git a/test/executor/JobExecutor.spec.ts b/test/executor/JobExecutor.spec.ts index c9b86b4d..29b47e5c 100644 --- a/test/executor/JobExecutor.spec.ts +++ b/test/executor/JobExecutor.spec.ts @@ -1,13 +1,13 @@ import { anything, capture, verify, when } from 'ts-mockito'; -import { JobExecutor } from '../../src/executor/JobExecutor'; -import { JobEntity } from '../../src/repository/JobEntity'; -import { JobRepository } from '../../src/repository/JobRepository'; +import { ExecutionStatus, MomoErrorType } from '../../src'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; import { Job } from '../../src/job/Job'; -import { ExecutionStatus, MomoErrorType } from '../../src'; -import { mockRepositories } from '../utils/mockRepositories'; +import { JobEntity } from '../../src/repository/JobEntity'; +import { JobExecutor } from '../../src/executor/JobExecutor'; +import { JobRepository } from '../../src/repository/JobRepository'; import { loggerForTests } from '../utils/logging'; +import { mockRepositories } from '../utils/mockRepositories'; describe('JobExecutor', () => { const scheduleId = '123'; diff --git a/test/isConnected.spec.ts b/test/isConnected.spec.ts index f87540d5..d9e03bc4 100644 --- a/test/isConnected.spec.ts +++ b/test/isConnected.spec.ts @@ -1,5 +1,5 @@ -import { mockRepositories } from './utils/mockRepositories'; import { isConnected } from '../src'; +import { mockRepositories } from './utils/mockRepositories'; describe('isConnected', () => { beforeEach(() => jest.restoreAllMocks()); diff --git a/test/job/check.spec.ts b/test/job/check.spec.ts index 07dfa277..b4972e34 100644 --- a/test/job/check.spec.ts +++ b/test/job/check.spec.ts @@ -1,9 +1,9 @@ import { DateTime } from 'luxon'; import { deepEqual, when } from 'ts-mockito'; -import { mockRepositories } from '../utils/mockRepositories'; -import { check, ExecutionInfo, ExecutionStatus } from '../../src'; +import { ExecutionInfo, ExecutionStatus, check } from '../../src'; import { JobEntity } from '../../src/repository/JobEntity'; +import { mockRepositories } from '../utils/mockRepositories'; describe('check', () => { const name = 'test'; diff --git a/test/job/clear.integration.spec.ts b/test/job/clear.integration.spec.ts index 464c137d..101bd405 100644 --- a/test/job/clear.integration.spec.ts +++ b/test/job/clear.integration.spec.ts @@ -1,9 +1,10 @@ -import { clear } from '../../src'; import { MongoMemoryServer } from 'mongodb-memory-server'; + import { JobRepository } from '../../src/repository/JobRepository'; +import { clear } from '../../src'; import { connect, disconnect } from '../../src/connect'; -import { getJobRepository } from '../../src/repository/getRepository'; import { createJobEntity } from '../utils/createJobEntity'; +import { getJobRepository } from '../../src/repository/getRepository'; describe('clear', () => { let mongo: MongoMemoryServer; diff --git a/test/job/define.spec.ts b/test/job/define.spec.ts index 01b1f50a..0a026b42 100644 --- a/test/job/define.spec.ts +++ b/test/job/define.spec.ts @@ -1,10 +1,11 @@ -import { mockRepositories } from '../utils/mockRepositories'; -import { JobRepository } from '../../src/repository/JobRepository'; -import { deepEqual, verify, when } from 'ts-mockito'; -import { define } from '../../src/job/define'; -import { createJobEntity } from '../utils/createJobEntity'; import { DateTime } from 'luxon'; +import { deepEqual, verify, when } from 'ts-mockito'; + import { ExecutionInfo } from '../../src'; +import { JobRepository } from '../../src/repository/JobRepository'; +import { createJobEntity } from '../utils/createJobEntity'; +import { define } from '../../src/job/define'; +import { mockRepositories } from '../utils/mockRepositories'; import { withDefaults } from '../../src/job/withDefaults'; describe('define', () => { diff --git a/test/job/findLatest.spec.ts b/test/job/findLatest.spec.ts index b84ad1fc..d6e3ad96 100644 --- a/test/job/findLatest.spec.ts +++ b/test/job/findLatest.spec.ts @@ -1,8 +1,9 @@ import { DateTime } from 'luxon'; -import { findLatest } from '../../src/job/findLatest'; -import { JobEntity } from '../../src/repository/JobEntity'; -import { Job } from '../../src/job/Job'; + import { ExecutionInfo } from '../../src'; +import { Job } from '../../src/job/Job'; +import { JobEntity } from '../../src/repository/JobEntity'; +import { findLatest } from '../../src/job/findLatest'; function createJob(lastFinished?: number) { const job = JobEntity.from({ name: 'test' } as Job); diff --git a/test/job/keepLatest.spec.ts b/test/job/keepLatest.spec.ts index bf2bbefe..25abb795 100644 --- a/test/job/keepLatest.spec.ts +++ b/test/job/keepLatest.spec.ts @@ -1,11 +1,11 @@ import { DateTime } from 'luxon'; import { anything, capture, deepEqual, verify, when } from 'ts-mockito'; +import { ExecutionInfo } from '../../src'; +import { Job } from '../../src/job/Job'; +import { JobEntity } from '../../src/repository/JobEntity'; import { JobRepository } from '../../src/repository/JobRepository'; import { keepLatest } from '../../src/job/keepLatest'; -import { JobEntity } from '../../src/repository/JobEntity'; -import { Job } from '../../src/job/Job'; -import { ExecutionInfo } from '../../src'; import { mockRepositories } from '../utils/mockRepositories'; describe('keepLatest', () => { diff --git a/test/job/list.spec.ts b/test/job/list.spec.ts index 4ee9945c..1ec7b07c 100644 --- a/test/job/list.spec.ts +++ b/test/job/list.spec.ts @@ -1,7 +1,7 @@ import { when } from 'ts-mockito'; -import { mockRepositories } from '../utils/mockRepositories'; import { ExecutionInfo, list } from '../../src'; +import { mockRepositories } from '../utils/mockRepositories'; describe('list', () => { afterEach(() => jest.resetAllMocks()); diff --git a/test/job/validate.spec.ts b/test/job/validate.spec.ts index 47989911..d9e59490 100644 --- a/test/job/validate.spec.ts +++ b/test/job/validate.spec.ts @@ -1,8 +1,8 @@ -import { validate } from '../../src/job/validate'; -import { withDefaults } from '../../src/job/withDefaults'; import { Job } from '../../src/job/Job'; import { Logger } from '../../src/logging/Logger'; -import { momoError, MomoErrorType } from '../../src'; +import { MomoErrorType, momoError } from '../../src'; +import { validate } from '../../src/job/validate'; +import { withDefaults } from '../../src/job/withDefaults'; describe('validate', () => { const logger: Logger = { diff --git a/test/repository/ExecutionsRepository.integration.spec.ts b/test/repository/ExecutionsRepository.integration.spec.ts index 27cdc936..4d66eac2 100644 --- a/test/repository/ExecutionsRepository.integration.spec.ts +++ b/test/repository/ExecutionsRepository.integration.spec.ts @@ -1,7 +1,7 @@ import { MongoMemoryServer } from 'mongodb-memory-server'; -import { connect, disconnect } from '../../src/connect'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; +import { connect, disconnect } from '../../src/connect'; import { getExecutionsRepository } from '../../src/repository/getRepository'; import { sleep } from '../utils/sleep'; diff --git a/test/repository/JobRepository.integration.spec.ts b/test/repository/JobRepository.integration.spec.ts index 004ba548..ad8cd638 100644 --- a/test/repository/JobRepository.integration.spec.ts +++ b/test/repository/JobRepository.integration.spec.ts @@ -1,9 +1,10 @@ import { DateTime } from 'luxon'; import { MongoMemoryServer } from 'mongodb-memory-server'; + import { ExecutionStatus, MomoJob } from '../../src'; +import { JobRepository } from '../../src/repository/JobRepository'; import { connect, disconnect } from '../../src/connect'; import { createJobEntity } from '../utils/createJobEntity'; -import { JobRepository } from '../../src/repository/JobRepository'; import { getJobRepository } from '../../src/repository/getRepository'; describe('JobRepository', () => { diff --git a/test/schedule/MongoSchedule.spec.ts b/test/schedule/MongoSchedule.spec.ts index 36eb2234..e8604e3f 100644 --- a/test/schedule/MongoSchedule.spec.ts +++ b/test/schedule/MongoSchedule.spec.ts @@ -1,7 +1,7 @@ import { anyString, capture, deepEqual, verify } from 'ts-mockito'; -import { MongoSchedule } from '../../src'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; +import { MongoSchedule } from '../../src'; import { mockRepositories } from '../utils/mockRepositories'; describe('MongoSchedule', () => { diff --git a/test/schedule/MongoScheduleBuilder.integration.spec.ts b/test/schedule/MongoScheduleBuilder.integration.spec.ts index 9c483155..33838c41 100644 --- a/test/schedule/MongoScheduleBuilder.integration.spec.ts +++ b/test/schedule/MongoScheduleBuilder.integration.spec.ts @@ -1,6 +1,6 @@ import { MongoMemoryServer } from 'mongodb-memory-server'; -import { clear, MomoConnectionOptions, MomoJob, MongoSchedule } from '../../src'; +import { MomoConnectionOptions, MomoJob, MongoSchedule, clear } from '../../src'; import { MongoScheduleBuilder } from '../../src/schedule/MongoScheduleBuilder'; describe('MongoScheduleBuilder', () => { diff --git a/test/schedule/Schedule.integration.spec.ts b/test/schedule/Schedule.integration.spec.ts index 9c56251b..ba07cb08 100644 --- a/test/schedule/Schedule.integration.spec.ts +++ b/test/schedule/Schedule.integration.spec.ts @@ -1,11 +1,11 @@ import { MongoMemoryServer } from 'mongodb-memory-server'; -import { clear, MomoJob, MongoSchedule } from '../../src'; +import { JobEntity } from '../../src/repository/JobEntity'; import { JobRepository } from '../../src/repository/JobRepository'; +import { MomoJob, MongoSchedule, clear } from '../../src'; import { getJobRepository } from '../../src/repository/getRepository'; -import { JobEntity } from '../../src/repository/JobEntity'; -import { withDefaults } from '../../src/job/withDefaults'; import { initLoggingForTests } from '../utils/logging'; +import { withDefaults } from '../../src/job/withDefaults'; describe('Schedule', () => { const job: MomoJob = { diff --git a/test/schedule/Schedule.spec.ts b/test/schedule/Schedule.spec.ts index c3a63ce0..6e7febda 100644 --- a/test/schedule/Schedule.spec.ts +++ b/test/schedule/Schedule.spec.ts @@ -2,12 +2,12 @@ import { anyString, deepEqual, verify, when } from 'ts-mockito'; import { ExecutionStatus, MomoEvent, MomoJob, MongoSchedule } from '../../src'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; -import { JobRepository } from '../../src/repository/JobRepository'; -import { JobEntity } from '../../src/repository/JobEntity'; import { Job } from '../../src/job/Job'; +import { JobEntity } from '../../src/repository/JobEntity'; +import { JobRepository } from '../../src/repository/JobRepository'; +import { createJobEntity } from '../utils/createJobEntity'; import { initLoggingForTests } from '../utils/logging'; import { mockRepositories } from '../utils/mockRepositories'; -import { createJobEntity } from '../utils/createJobEntity'; describe('Schedule', () => { const job: MomoJob = { diff --git a/test/schedule/SchedulePing.spec.ts b/test/schedule/SchedulePing.spec.ts index 21fd3f8a..61f325d6 100644 --- a/test/schedule/SchedulePing.spec.ts +++ b/test/schedule/SchedulePing.spec.ts @@ -1,9 +1,9 @@ import { deepEqual, verify } from 'ts-mockito'; -import { SchedulePing } from '../../src/schedule/SchedulePing'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; -import { sleep } from '../utils/sleep'; +import { SchedulePing } from '../../src/schedule/SchedulePing'; import { mockRepositories } from '../utils/mockRepositories'; +import { sleep } from '../utils/sleep'; describe('SchedulePing', () => { const scheduleId = '123'; diff --git a/test/schedule/momo.integration.spec.ts b/test/schedule/momo.integration.spec.ts index c80ec024..68fd15f4 100644 --- a/test/schedule/momo.integration.spec.ts +++ b/test/schedule/momo.integration.spec.ts @@ -2,14 +2,14 @@ import { DateTime } from 'luxon'; import { MongoMemoryServer } from 'mongodb-memory-server'; import { v4 as uuid } from 'uuid'; -import { clear, ExecutionStatus, momoError, MomoErrorEvent, MomoErrorType, MomoJob, MongoSchedule } from '../../src'; -import { JobRepository } from '../../src/repository/JobRepository'; +import { ExecutionStatus, MomoErrorEvent, MomoErrorType, MomoJob, MongoSchedule, clear, momoError } from '../../src'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; +import { JobRepository } from '../../src/repository/JobRepository'; +import { createJobEntity } from '../utils/createJobEntity'; import { getExecutionsRepository, getJobRepository } from '../../src/repository/getRepository'; +import { initLoggingForTests } from '../utils/logging'; import { sleep } from '../utils/sleep'; import { waitFor } from '../utils/waitFor'; -import { initLoggingForTests } from '../utils/logging'; -import { createJobEntity } from '../utils/createJobEntity'; interface TestJobHandler { handler: () => Promise; diff --git a/test/scheduler/JobScheduler.spec.ts b/test/scheduler/JobScheduler.spec.ts index 1097f9ab..c680368f 100644 --- a/test/scheduler/JobScheduler.spec.ts +++ b/test/scheduler/JobScheduler.spec.ts @@ -1,15 +1,15 @@ import { anything, deepEqual, instance, mock, verify, when } from 'ts-mockito'; -import { JobScheduler } from '../../src/scheduler/JobScheduler'; -import { JobRepository } from '../../src/repository/JobRepository'; import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; import { Job } from '../../src/job/Job'; -import { JobExecutor } from '../../src/executor/JobExecutor'; import { JobEntity } from '../../src/repository/JobEntity'; -import { momoError, MomoErrorType } from '../../src'; -import { mockRepositories } from '../utils/mockRepositories'; -import { loggerForTests } from '../utils/logging'; +import { JobExecutor } from '../../src/executor/JobExecutor'; +import { JobRepository } from '../../src/repository/JobRepository'; +import { JobScheduler } from '../../src/scheduler/JobScheduler'; +import { MomoErrorType, momoError } from '../../src'; import { createJobEntity } from '../utils/createJobEntity'; +import { loggerForTests } from '../utils/logging'; +import { mockRepositories } from '../utils/mockRepositories'; import { sleep } from '../utils/sleep'; describe('JobScheduler', () => { diff --git a/test/scheduler/calculateDelay.spec.ts b/test/scheduler/calculateDelay.spec.ts index 816d2e01..83ac8880 100644 --- a/test/scheduler/calculateDelay.spec.ts +++ b/test/scheduler/calculateDelay.spec.ts @@ -1,9 +1,10 @@ import { Clock, install } from '@sinonjs/fake-timers'; import { DateTime } from 'luxon'; + +import { ExecutionInfo } from '../../src'; +import { Job } from '../../src/job/Job'; import { JobEntity } from '../../src/repository/JobEntity'; import { calculateDelay } from '../../src/scheduler/calculateDelay'; -import { Job } from '../../src/job/Job'; -import { ExecutionInfo } from '../../src'; describe('calculateDelay', () => { let job: JobEntity; diff --git a/test/utils/createJobEntity.ts b/test/utils/createJobEntity.ts index 3ab99b93..2530cce7 100644 --- a/test/utils/createJobEntity.ts +++ b/test/utils/createJobEntity.ts @@ -1,5 +1,5 @@ -import { MomoJob } from '../../src'; import { JobEntity } from '../../src/repository/JobEntity'; +import { MomoJob } from '../../src'; import { withDefaults } from '../../src/job/withDefaults'; export function createJobEntity(job: MomoJob): JobEntity { diff --git a/test/utils/logging.ts b/test/utils/logging.ts index e85ddc35..eea1c922 100644 --- a/test/utils/logging.ts +++ b/test/utils/logging.ts @@ -1,8 +1,9 @@ -import TypedEmitter from 'typed-emitter'; import Pino from 'pino'; -import { MomoEventData, MomoEvents } from '../../src/logging/MomoEvents'; +import TypedEmitter from 'typed-emitter'; + import { Logger } from '../../src/logging/Logger'; import { MomoErrorType } from '../../src'; +import { MomoEventData, MomoEvents } from '../../src/logging/MomoEvents'; const logger = Pino(); const errorLogger = Pino({ level: 'error' }); diff --git a/test/utils/mockRepositories.ts b/test/utils/mockRepositories.ts index 89da9364..32a4a4a0 100644 --- a/test/utils/mockRepositories.ts +++ b/test/utils/mockRepositories.ts @@ -1,8 +1,9 @@ -import { instance, mock } from 'ts-mockito'; import * as typeorm from 'typeorm'; import { Connection, MongoRepository } from 'typeorm'; -import { JobRepository } from '../../src/repository/JobRepository'; +import { instance, mock } from 'ts-mockito'; + import { ExecutionsRepository } from '../../src/repository/ExecutionsRepository'; +import { JobRepository } from '../../src/repository/JobRepository'; export function mockRepositories(): { jobRepository: JobRepository; executionsRepository: ExecutionsRepository } { const jobRepository = mock(JobRepository); From 6b2b47e73507837b6f5338788f76ba1e96e04d09 Mon Sep 17 00:00:00 2001 From: Ute Weiss Date: Fri, 18 Jun 2021 13:24:32 +0200 Subject: [PATCH 6/8] fix: clean up eslint config Signed-off-by: Ute Weiss --- .eslintrc.js | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 8cf012ef..93cbd959 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,29 +1,19 @@ module.exports = { - env: { - es6: true, - node: true, - }, - extends: ['plugin:prettier/recommended', 'plugin:jest/recommended'], + env: { es6: true, node: true }, + extends: ['plugin:jest/recommended', 'plugin:prettier/recommended'], parser: '@typescript-eslint/parser', parserOptions: { project: 'tsconfig.eslint.json', sourceType: 'module', }, plugins: [ + '@typescript-eslint', 'eslint-plugin-import', 'eslint-plugin-jsdoc', 'eslint-plugin-prefer-arrow', 'sort-imports-es6-autofix', - '@typescript-eslint', ], rules: { - 'jest/expect-expect': [ - 'error', - { - assertFunctionNames: ['expect*', 'verify*'], - }, - ], - 'sort-imports-es6-autofix/sort-imports-es6': 'error', '@typescript-eslint/adjacent-overload-signatures': 'error', '@typescript-eslint/array-type': [ 'error', @@ -77,6 +67,7 @@ module.exports = { '@typescript-eslint/no-namespace': 'error', '@typescript-eslint/no-parameter-properties': 'off', '@typescript-eslint/no-this-alias': 'error', + '@typescript-eslint/no-unnecessary-condition': 'error', '@typescript-eslint/no-unnecessary-qualifier': 'error', '@typescript-eslint/no-unnecessary-type-arguments': 'error', '@typescript-eslint/no-unnecessary-type-assertion': 'error', @@ -90,7 +81,6 @@ module.exports = { '@typescript-eslint/promise-function-async': 'error', '@typescript-eslint/quotes': 'off', '@typescript-eslint/restrict-plus-operands': 'error', - '@typescript-eslint/no-unnecessary-condition': 'error', '@typescript-eslint/semi': ['off', null], '@typescript-eslint/strict-boolean-expressions': [ 'error', @@ -140,6 +130,12 @@ module.exports = { groups: ['builtin', 'external', 'object'], }, ], + 'jest/expect-expect': [ + 'error', + { + assertFunctionNames: ['expect*', 'verify*'], + }, + ], 'jsdoc/check-alignment': 'error', 'jsdoc/check-indentation': 'error', 'jsdoc/newline-after-description': 'error', @@ -186,6 +182,7 @@ module.exports = { 'react/jsx-equals-spacing': 'off', 'react/jsx-wrap-multilines': 'off', 'sort-imports': ['error', { allowSeparatedGroups: true, ignoreDeclarationSort: true }], + 'sort-imports-es6-autofix/sort-imports-es6': 'error', 'space-before-function-paren': 'off', 'space-in-parens': ['off', 'never'], 'spaced-comment': [ From 3f2b97a926718a24640e19d0381a3656135c158e Mon Sep 17 00:00:00 2001 From: Ute Weiss Date: Fri, 27 Aug 2021 11:43:11 +0200 Subject: [PATCH 7/8] fix: fix npm format script, make eslint stricter Signed-off-by: Ute Weiss --- .eslintrc.js | 43 +++++++++++++++++++++++++------------------ package.json | 4 ++-- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 93cbd959..fd95b4ba 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -79,9 +79,9 @@ module.exports = { '@typescript-eslint/prefer-namespace-keyword': 'error', '@typescript-eslint/prefer-readonly': 'error', '@typescript-eslint/promise-function-async': 'error', - '@typescript-eslint/quotes': 'off', + '@typescript-eslint/quotes': ['error', 'single', { avoidEscape: true, allowTemplateLiterals: true }], '@typescript-eslint/restrict-plus-operands': 'error', - '@typescript-eslint/semi': ['off', null], + '@typescript-eslint/semi': 'error', '@typescript-eslint/strict-boolean-expressions': [ 'error', { @@ -101,11 +101,11 @@ module.exports = { '@typescript-eslint/type-annotation-spacing': 'error', '@typescript-eslint/unified-signatures': 'error', 'arrow-parens': ['error', 'always'], - 'brace-style': ['off', 'off'], - 'comma-dangle': 'off', + 'brace-style': 'error', + 'comma-dangle': ['error', 'always-multiline'], complexity: 'off', 'constructor-super': 'off', - 'eol-last': 'off', + 'eol-last': 'error', eqeqeq: ['error', 'smart'], 'guard-for-in': 'error', 'id-blacklist': [ @@ -121,9 +121,11 @@ module.exports = { 'undefined', ], 'id-match': 'error', + 'import/no-cycle': 'error', 'import/no-deprecated': 'error', 'import/no-extraneous-dependencies': 'off', - 'import/no-internal-modules': 'off', + 'import/no-internal-modules': ['error', { allow: ['**/*', '**/src/*'] }], + 'import/no-restricted-paths': ['error', { zones: [{ target: './src', from: './test' }] }], 'import/order': [ 'error', { @@ -139,7 +141,7 @@ module.exports = { 'jsdoc/check-alignment': 'error', 'jsdoc/check-indentation': 'error', 'jsdoc/newline-after-description': 'error', - 'linebreak-style': 'off', + 'linebreak-style': 'error', 'max-classes-per-file': 'off', 'max-len': 'off', 'new-parens': 'off', @@ -154,11 +156,11 @@ module.exports = { 'no-empty': 'error', 'no-eval': 'error', 'no-extra-bind': 'error', - 'no-extra-semi': 'off', - 'no-fallthrough': 'off', + 'no-extra-semi': 'error', + 'no-fallthrough': 'error', 'no-invalid-this': 'off', - 'no-irregular-whitespace': 'off', - 'no-multiple-empty-lines': 'off', + 'no-irregular-whitespace': 'error', + 'no-multiple-empty-lines': 'error', 'no-new-func': 'error', 'no-new-wrappers': 'error', 'no-redeclare': 'error', @@ -167,7 +169,7 @@ module.exports = { 'no-sparse-arrays': 'error', 'no-template-curly-in-string': 'error', 'no-throw-literal': 'error', - 'no-trailing-spaces': 'off', + 'no-trailing-spaces': 'error', 'no-undef-init': 'error', 'no-unsafe-finally': 'error', 'no-unused-labels': 'error', @@ -176,15 +178,13 @@ module.exports = { 'object-shorthand': 'error', 'one-var': ['error', 'never'], 'prefer-const': 'error', - 'quote-props': 'off', + 'quote-props': ['error', 'as-needed'], radix: 'error', - 'react/jsx-curly-spacing': 'off', - 'react/jsx-equals-spacing': 'off', - 'react/jsx-wrap-multilines': 'off', + semi: 'off', // use @typescript-eslint/semi instead 'sort-imports': ['error', { allowSeparatedGroups: true, ignoreDeclarationSort: true }], 'sort-imports-es6-autofix/sort-imports-es6': 'error', 'space-before-function-paren': 'off', - 'space-in-parens': ['off', 'never'], + 'space-in-parens': ['error', 'never'], 'spaced-comment': [ 'error', 'always', @@ -193,7 +193,14 @@ module.exports = { }, ], 'use-isnan': 'error', - 'valid-typeof': 'off', + 'valid-typeof': 'error', }, ignorePatterns: ['dist', 'tsconfig.json', 'tsconfig.eslint.json', 'package.json', 'package-lock.json', 'ort'], + settings: { + 'import/resolver': { + node: { + extensions: ['.ts'], + }, + }, + }, }; diff --git a/package.json b/package.json index 279cc672..d2236a9a 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "test": "jest --detectOpenHandles --forceExit", "test:unit": "npm run test \"^((?!\\.integration\\.).)*$\"", "test:integration": "npm run test integration", - "lint": "prettier --check \"**/*.ts\" && eslint \"**/*.{ts,js,json}\"", - "format": "prettier --write \"**/*.ts\" && eslint \"**/*.{ts,js,json}\" --fix" + "lint": "prettier --check \"**/*.ts\" && eslint --ext .ts,.js,.json .", + "format": "prettier --write \"**/*.ts\" && eslint --fix --ext .ts,.js,.json ." }, "dependencies": { "human-interval": "2.0.1", From 11e4ff9929bf6017611c5d7ee2c3208826d133a6 Mon Sep 17 00:00:00 2001 From: Yani Kolev Date: Fri, 27 Aug 2021 14:34:17 +0200 Subject: [PATCH 8/8] MOMO-14: Added explicit return type to eslint Signed-off-by: Yani Kolev --- .eslintrc.js | 10 ++++++++++ src/logging/Logger.ts | 4 ++-- src/repository/ExecutionsRepository.ts | 2 +- src/repository/JobRepository.ts | 5 ++++- test/job/findLatest.spec.ts | 2 +- test/utils/logging.ts | 2 +- 6 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index fd95b4ba..6e63aa01 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -98,6 +98,16 @@ module.exports = { lib: 'always', }, ], + '@typescript-eslint/explicit-function-return-type': [ + 'error', + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: true, + allowDirectConstAssertionInArrowFunctions: false, + allowConciseArrowFunctionExpressionsStartingWithVoid: false, + }, + ], '@typescript-eslint/type-annotation-spacing': 'error', '@typescript-eslint/unified-signatures': 'error', 'arrow-parens': ['error', 'always'], diff --git a/src/logging/Logger.ts b/src/logging/Logger.ts index ec83b8c3..97172a51 100644 --- a/src/logging/Logger.ts +++ b/src/logging/Logger.ts @@ -8,7 +8,7 @@ export interface Logger { error: (message: string, type: MomoErrorType, data?: MomoEventData, error?: Error) => void; } -export function debug(this: TypedEmitter, message: string, data?: MomoEventData) { +export function debug(this: TypedEmitter, message: string, data?: MomoEventData): void { this.emit('debug', { message, data }); } @@ -18,6 +18,6 @@ export function error( type: MomoErrorType, data?: MomoEventData, error?: Error -) { +): void { this.emit('error', { message, type, data, error }); } diff --git a/src/repository/ExecutionsRepository.ts b/src/repository/ExecutionsRepository.ts index 75ce63e9..94c4ad34 100644 --- a/src/repository/ExecutionsRepository.ts +++ b/src/repository/ExecutionsRepository.ts @@ -12,7 +12,7 @@ export class ExecutionsRepository extends MongoRepository { await this.save(new ExecutionsEntity(scheduleId, DateTime.now().toMillis(), {})); } - async removeJob(scheduleId: string, name: string) { + async removeJob(scheduleId: string, name: string): Promise { const executionsEntity = await this.findOne({ scheduleId }); if (executionsEntity === undefined) { throw new Error(`executionsEntity not found for scheduleId=${scheduleId}`); diff --git a/src/repository/JobRepository.ts b/src/repository/JobRepository.ts index ebb42c6c..e542cfe7 100644 --- a/src/repository/JobRepository.ts +++ b/src/repository/JobRepository.ts @@ -16,7 +16,10 @@ export class JobRepository extends MongoRepository { } } -function merge(savedJob: JobEntity, { interval, concurrency, maxRunning, executionInfo }: Partial) { +function merge( + savedJob: JobEntity, + { interval, concurrency, maxRunning, executionInfo }: Partial +): JobEntity { if (interval !== undefined) { savedJob.interval = interval; } diff --git a/test/job/findLatest.spec.ts b/test/job/findLatest.spec.ts index d6e3ad96..337cef3a 100644 --- a/test/job/findLatest.spec.ts +++ b/test/job/findLatest.spec.ts @@ -5,7 +5,7 @@ import { Job } from '../../src/job/Job'; import { JobEntity } from '../../src/repository/JobEntity'; import { findLatest } from '../../src/job/findLatest'; -function createJob(lastFinished?: number) { +function createJob(lastFinished?: number): JobEntity { const job = JobEntity.from({ name: 'test' } as Job); if (lastFinished !== undefined) { job.executionInfo = { lastFinished: DateTime.fromMillis(lastFinished).toISO() } as ExecutionInfo; diff --git a/test/utils/logging.ts b/test/utils/logging.ts index eea1c922..a0cab799 100644 --- a/test/utils/logging.ts +++ b/test/utils/logging.ts @@ -8,7 +8,7 @@ import { MomoEventData, MomoEvents } from '../../src/logging/MomoEvents'; const logger = Pino(); const errorLogger = Pino({ level: 'error' }); -export function initLoggingForTests(eventEmitter: TypedEmitter) { +export function initLoggingForTests(eventEmitter: TypedEmitter): void { eventEmitter.on('debug', (event) => { logger.info(event); });