From bb45c36d86a584f2eb158408de85dafbcb424e15 Mon Sep 17 00:00:00 2001 From: Rainer Killinger Date: Mon, 4 Jul 2022 15:02:09 +0200 Subject: [PATCH] refactor: move to eslint --- .eslintignore | 2 + .eslintrc.json | 3 + package-lock.json | 520 +++++++++++++++++++++++++++++------ package.json | 19 +- src/bulk.ts | 20 +- src/cli.ts | 64 +++-- src/client.ts | 53 ++-- src/connector-client.ts | 59 ++-- src/copy.ts | 9 +- src/e2e.ts | 19 +- src/errors.ts | 10 +- src/http-client-interface.ts | 7 +- src/http-client.ts | 31 +-- src/plugin-client.ts | 2 +- src/plugin.ts | 62 ++--- tslint.json | 3 - 16 files changed, 632 insertions(+), 251 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json delete mode 100644 tslint.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..3d0a9346 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +resources +openapi diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..31d47702 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "@openstapps" +} diff --git a/package-lock.json b/package-lock.json index bb4f59ab..9999f539 100644 --- a/package-lock.json +++ b/package-lock.json @@ -310,6 +310,17 @@ "@jridgewell/trace-mapping": "0.3.9" } }, + "@es-joy/jsdoccomment": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz", + "integrity": "sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==", + "dev": true, + "requires": { + "comment-parser": "1.3.1", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "~3.1.0" + } + }, "@eslint/eslintrc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", @@ -516,19 +527,17 @@ } }, "@openstapps/configuration": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@openstapps/configuration/-/configuration-0.29.1.tgz", - "integrity": "sha512-H6DNB1HrujC5LwOF17rYkXQPFaEWTaA5T3IPsfccSuKHSUhB0ry6V5OkMwmvls2nOSrbpuRpyQoM7ulwZ9X9Bw==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@openstapps/configuration/-/configuration-0.32.0.tgz", + "integrity": "sha512-tvM2xsdBoBNlsz3R6veldI45mrGbBhq9sBA+E5DI7mSHC8kP42PJvZ5t24vM3ze6LIcLXSeB5n3LhxIFHgpuHA==", "dev": true, "requires": { "@types/node": "14.18.18", "@types/semver": "7.3.9", "@types/yaml": "1.9.7", "chalk": "4.1.2", - "commander": "9.2.0", + "commander": "9.3.0", "semver": "7.3.7", - "tslint": "6.1.3", - "tslint-eslint-rules": "5.4.0", "yaml": "1.10.2" }, "dependencies": { @@ -537,12 +546,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.18.tgz", "integrity": "sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig==", "dev": true - }, - "commander": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", - "dev": true } } }, @@ -594,6 +597,79 @@ "typescript": "4.4.4" }, "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", + "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "ts-node": { "version": "10.8.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", @@ -613,14 +689,15 @@ "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" } - }, - "typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" } } }, + "@openstapps/eslint-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@openstapps/eslint-config/-/eslint-config-1.1.0.tgz", + "integrity": "sha512-yhSWgzKB5cU3kTtWdAOEO6y4PjLDBnyJc+Dpmz9Rxg97WSViOiz3Bv9BWTSl0TR56GAnFi0NI8K56RfCqjpk5w==", + "dev": true + }, "@openstapps/logger": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@openstapps/logger/-/logger-0.8.1.tgz", @@ -939,6 +1016,119 @@ "yaml": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.4.tgz", + "integrity": "sha512-xjujQISAIa4HAaos8fcMZXmqkuZqMx6icdxkI88jMM/eNe4J8AuTLYnLK+zdm0mBYLyctdFf//UE4/xFCcQzYQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.30.4", + "@typescript-eslint/type-utils": "5.30.4", + "@typescript-eslint/utils": "5.30.4", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.4.tgz", + "integrity": "sha512-/ge1HtU63wVoED4VnlU2o+FPFmi017bPYpeSrCmd8Ycsti4VSxXrmcpXXm7JpI4GT0Aa7qviabv1PEp6L5bboQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.30.4", + "@typescript-eslint/types": "5.30.4", + "@typescript-eslint/typescript-estree": "5.30.4", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.4.tgz", + "integrity": "sha512-DNzlQwGSiGefz71JwaHrpcaAX3zYkEcy8uVuan3YMKOa6qeW/y+7SaD8KIsIAruASwq6P+U4BjWBWtM2O+mwBQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.4", + "@typescript-eslint/visitor-keys": "5.30.4" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.30.4.tgz", + "integrity": "sha512-55cf1dZviwwv+unDB+mF8vZkfta5muTK6bppPvenWWCD7slZZ0DEsXUjZerqy7Rq8s3J4SXdg4rMIY8ngCtTmA==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.30.4", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.4.tgz", + "integrity": "sha512-NTEvqc+Vvu8Q6JeAKryHk2eqLKqsr2St3xhIjhOjQv5wQUBhaTuix4WOSacqj0ONWfKVU12Eug3LEAB95GBkMA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.4.tgz", + "integrity": "sha512-V4VnEs6/J9/nNizaA12IeU4SAeEYaiKr7XndLNfV5+3zZSB4hIu6EhHJixTKhvIqA+EEHgBl6re8pivBMLLO1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.4", + "@typescript-eslint/visitor-keys": "5.30.4", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.30.4.tgz", + "integrity": "sha512-a+GQrJzOUhn4WT1mUumXDyam+22Oo4c5K/jnZ+6r/4WTQF3q8e4CsC9PLHb4SnOClzOqo/5GLZWvkE1aa5UGKQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.30.4", + "@typescript-eslint/types": "5.30.4", + "@typescript-eslint/typescript-estree": "5.30.4", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.4.tgz", + "integrity": "sha512-ulKGse3mruSc8x6l8ORSc6+1ORyJzKmZeIaRTu/WpaF/jx3vHvEn5XZUKF9XaVg2710mFmTAUlLcLYLPp/Zf/Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.30.4", + "eslint-visitor-keys": "^3.3.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -1252,9 +1442,9 @@ } }, "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, "bytes": { @@ -1427,6 +1617,21 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -1482,6 +1687,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==" }, + "comment-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", + "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2016,9 +2227,10 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", - "integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz", + "integrity": "sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==", + "dev": true, "requires": { "@eslint/eslintrc": "^1.3.0", "@humanwhocodes/config-array": "^0.9.2", @@ -2061,6 +2273,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2071,12 +2284,14 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "requires": { "is-glob": "^4.0.3" } @@ -2084,7 +2299,133 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true + }, + "eslint-plugin-jsdoc": { + "version": "39.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.3.tgz", + "integrity": "sha512-K/DAjKRUNaUTf0KQhI9PvsF+Y3mGDx/j0pofXsJCQe/tmRsRweBIXR353c8nAro0lytZYEf7l0PluBpzKDiHxw==", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "~0.31.0", + "comment-parser": "1.3.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.4.0", + "semver": "^7.3.7", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-unicorn": { + "version": "43.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-43.0.0.tgz", + "integrity": "sha512-Z/6HX8yry+zAjo4jHHTAbe1rfniox7qgmCReGBfTc/CVgotfScaMCc4dtSSTHlJ+7Yix5o6LPXzwwpuGGFricg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "ci-info": "^3.3.2", + "clean-regexp": "^1.0.0", + "eslint-utils": "^3.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "safe-regex": "^2.1.1", + "semver": "^7.3.7", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -2227,6 +2568,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", @@ -2474,12 +2821,6 @@ "yargs": "^16.2.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -2915,6 +3256,15 @@ "binary-extensions": "^2.0.0" } }, + "is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "dev": true, + "requires": { + "builtin-modules": "^3.0.0" + } + }, "is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -3008,9 +3358,9 @@ "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "isexe": { @@ -3135,6 +3485,12 @@ "argparse": "^2.0.1" } }, + "jsdoc-type-pratt-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", + "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4301,6 +4657,12 @@ "resolved": "https://registry.npmjs.org/plantuml-encoder/-/plantuml-encoder-1.4.0.tgz", "integrity": "sha512-sxMwpDw/ySY1WB2CE3+IdMuEcWibJ72DDOsXLkSmEaSzwEUaYBT6DWgOfBiHGCux4q433X6+OEFWjlVqp7gL6g==" }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4325,6 +4687,21 @@ "prepend-file": "1.3.1" } }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -4594,6 +4971,12 @@ "strip-indent": "^3.0.0" } }, + "regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -4713,6 +5096,15 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, "safe-stable-stringify": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", @@ -5272,6 +5664,12 @@ "sprintf-js": "~1.0.2" } }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5363,46 +5761,11 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true - } - } - }, - "tslint-eslint-rules": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", - "dev": true, - "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "^3.0.0" - }, - "dependencies": { - "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha512-qiB/Rir6Un6Ad/TIgTRzsremsTGWzs8j7woXvp14jgq00676uBiBT5eUOi+FgRywZFVy5Us/c04ISRpZhRbS6w==", - "dev": true, - "requires": { - "esutils": "^1.1.6", - "isarray": "0.0.1" - } - }, - "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha512-RG1ZkUT7iFJG9LSHr7KDuuMSlujfeTtMNIcInURxKAxhMtwQhI3NrQhz26gZQYlsYZQKzsnwtpKrFKj9K9Qu1A==", - "dev": true - }, - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", - "dev": true }, "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -5411,9 +5774,9 @@ } }, "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -5524,10 +5887,9 @@ } }, "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" }, "uglify-js": { "version": "3.16.2", diff --git a/package.json b/package.json index f0dfd84b..aeb2a884 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@openstapps/api", "version": "0.42.0", "scripts": { - "build": "npm run tslint && npm run compile", + "build": "npm run lint && npm run compile", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0 && git add CHANGELOG.md && git commit -m 'docs: update changelog'", "check-configuration": "openstapps-configuration", "compile": "rimraf lib && tsc && prepend lib/cli.js '#!/usr/bin/env node\n'", @@ -12,7 +12,7 @@ "preversion": "npm run prepublishOnly", "push": "git push && git push origin \"v$npm_package_version\"", "test": "nyc mocha --require ts-node/register --recursive 'test/*.spec.ts'", - "tslint": "tslint -p tsconfig.json -c tslint.json 'src/**/*.ts'" + "lint": "eslint --ext .ts src/" }, "description": "Node.js library to interact with the StApps backend service", "dependencies": { @@ -42,7 +42,8 @@ }, "license": "GPL-3.0-only", "devDependencies": { - "@openstapps/configuration": "0.29.1", + "@openstapps/configuration": "0.32.0", + "@openstapps/eslint-config": "1.1.0", "@testdeck/mocha": "0.2.0", "@types/chai": "4.3.1", "@types/chai-as-promised": "7.1.5", @@ -50,20 +51,28 @@ "@types/fs-extra": "9.0.13", "@types/json-schema": "7.0.11", "@types/mocha": "9.1.1", + "@typescript-eslint/eslint-plugin": "5.30.4", + "@typescript-eslint/parser": "5.30.4", "chai": "4.3.6", "chai-as-promised": "7.1.1", "chai-spies": "1.0.0", "conventional-changelog-cli": "2.2.2", + "eslint": "8.19.0", + "eslint-config-prettier": "8.5.0", + "eslint-plugin-jsdoc": "39.3.3", + "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-unicorn": "43.0.0", "fs-extra": "10.1.0", "mocha": "10.0.0", "nock": "13.2.8", "nyc": "15.1.0", "prepend-file-cli": "1.0.6", + "prettier": "2.7.1", "rimraf": "3.0.2", "ts-node": "10.8.2", "tslint": "6.1.3", "typedoc": "0.22.15", - "typescript": "3.9.10" + "typescript": "4.4.4" }, "author": "Karl-Philipp Wulfert ", "contributors": [ @@ -76,7 +85,7 @@ "Wieland Schöbl " ], "peerDependencies": { - "@openstapps/core": "~0.66.0" + "@openstapps/core": "~0.68.0" }, "repository": { "type": "git", diff --git a/src/bulk.ts b/src/bulk.ts index e4c46171..5a1aed4c 100644 --- a/src/bulk.ts +++ b/src/bulk.ts @@ -64,9 +64,13 @@ export class Bulk { throw new BulkWithMultipleTypesError(thing); } - return this.client.invokeRoute(this.bulkAddRoute, { - UID: encodeURIComponent(this.bulkResponse.uid), - }, thing); + return this.client.invokeRoute( + this.bulkAddRoute, + { + UID: encodeURIComponent(this.bulkResponse.uid), + }, + thing, + ); } /** @@ -76,8 +80,12 @@ export class Bulk { * required in the backend so it might take a few seconds before the callback is called. */ async done(): Promise { - return this.client.invokeRoute(this.bulkDoneRoute, { - UID: this.bulkResponse.uid, - }, {}); + return this.client.invokeRoute( + this.bulkDoneRoute, + { + UID: this.bulkResponse.uid, + }, + {}, + ); } } diff --git a/src/cli.ts b/src/cli.ts index 5502f15a..3b25339a 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -16,41 +16,49 @@ import {SCThingType} from '@openstapps/core'; import {Logger} from '@openstapps/logger'; import {Command} from 'commander'; import {readFileSync} from 'fs'; -import {join} from 'path'; +import path from 'path'; import {URL} from 'url'; import waitOn from 'wait-on'; import {copy} from './copy'; +// eslint-disable-next-line unicorn/prevent-abbreviations import {e2eRun} from './e2e'; import {HttpClient} from './http-client'; -process.on('unhandledRejection', async (error) => { +process.on('unhandledRejection', async error => { await Logger.error('unhandledRejection', error); }); -const pkgJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json')) - .toString()); +// eslint-disable-next-line unicorn/prefer-module +const packageJson = JSON.parse(readFileSync(path.join(__dirname, '..', 'package.json')).toString()); const client = new HttpClient(); const commander = new Command(); const helpAndExit = (help: string) => { - // tslint:disable-next-line: no-console + // eslint-disable-next-line no-console console.log(help); process.exit(-1); }; commander .command('e2e ') - .version(pkgJson.version) - .description('Run in end to end test mode. Indexing and afterwards retrieving all test files from @openstapp/core to the backend') - .option('-s --samples [path]', 'Path to @openstapp/core test files', './node_modules/@openstapps/core/test/resources/indexable') + .version(packageJson.version) + .description( + 'Run in end to end test mode. Indexing and afterwards retrieving all test files from @openstapp/core to the backend', + ) + .option( + '-s --samples [path]', + 'Path to @openstapp/core test files', + './node_modules/@openstapps/core/test/resources/indexable', + ) .option('-w --waiton [resource]', 'wait-on resource parameter see "www.npmjs.com/wait-on"') + // eslint-disable-next-line unicorn/prevent-abbreviations .action(async (to, e2eCommand) => { let toURL = ''; // validate url try { - toURL = (new URL(to)).toString(); - } catch (err) { - await Logger.error('expected parameter to be valid url', err); + toURL = new URL(to).toString(); + } catch (error) { + await Logger.error('expected parameter to be valid url', error); helpAndExit(e2eCommand.helpInformation()); } @@ -59,13 +67,12 @@ commander Logger.info(`Waiting for availibilty of resource: ${e2eCommand.waiton}`); await waitOn({ resources: [e2eCommand.waiton], - timeout: 300000, + timeout: 300_000, }); Logger.info(`Resource became available`); } await e2eRun(client, {to: toURL, samplesLocation: e2eCommand.samples}); Logger.ok('Done'); - } catch (error) { await Logger.error(error); } @@ -73,7 +80,7 @@ commander commander .command('copy ') - .version(pkgJson.version) + .version(packageJson.version) .description('Copy data from one instance to another') .option( '-s, --bulkSource ', @@ -84,7 +91,6 @@ commander .option('-a, --appVersion ', 'The App version to use [unset by default]') .allowUnknownOption(false) .action(async (type, from, to, batchSize, copyCommand) => { - // validate type if (typeof type !== 'string') { await Logger.error('expected parameter "type" to be of type: string'); @@ -97,15 +103,15 @@ commander // validate urls try { - fromURL = (new URL(from)).toString(); - toURL = (new URL(to)).toString(); - } catch (err) { - await Logger.error('expected parameters "from" and "to" to be valid urls', err); + fromURL = new URL(from).toString(); + toURL = new URL(to).toString(); + } catch (error) { + await Logger.error('expected parameters "from" and "to" to be valid urls', error); helpAndExit(copyCommand.helpInformation()); } // validate batchSize - if (isNaN(parseInt(batchSize, 10))) { + if (Number.isNaN(Number.parseInt(batchSize, 10))) { await Logger.error('expected parameter "batchSize" to be of type: number'); helpAndExit(copyCommand.helpInformation()); } @@ -113,20 +119,20 @@ commander Logger.info(`Copying ${type} objects from ${fromURL} to ${toURL}`); copy(client, { - batchSize: parseInt(batchSize, 10), + batchSize: Number.parseInt(batchSize, 10), from: fromURL, source: copyCommand.bulkSource, to: toURL, type: type as SCThingType, version: copyCommand.appVersion, - }) - .then(() => { + }).then( + () => { Logger.ok('Done'); - }, (err) => { - throw err; - }); + }, + error => { + throw error; + }, + ); }); -commander - .parse(process.argv); - +commander.parse(process.argv); diff --git a/src/client.ts b/src/client.ts index 0b98b8a7..c7c1eb1c 100644 --- a/src/client.ts +++ b/src/client.ts @@ -38,7 +38,6 @@ import {HttpClientHeaders, HttpClientInterface} from './http-client-interface'; * StApps-API client */ export class Client { - /** * Instance of index route */ @@ -161,10 +160,7 @@ export class Client { * @param parameters Parameters for the URL fragment * @param body Body for the request */ - async invokePlugin(name: string, - parameters?: { [k: string]: string; }, - body?: SCRequests): Promise { - + async invokePlugin(name: string, parameters?: {[k: string]: string}, body?: SCRequests): Promise { if (typeof this.supportedFeatures === 'undefined') { const request: SCIndexRequest = {}; const response = await this.invokeRoute(this.indexRoute, undefined, request); @@ -191,9 +187,11 @@ export class Client { * @param parameters Parameters for the URL fragment * @param body Body for the request */ - async invokeRoute(route: SCAbstractRoute, - parameters?: { [k: string]: string; }, - body?: SCRequests): Promise { + async invokeRoute( + route: SCAbstractRoute, + parameters?: {[k: string]: string}, + body?: SCRequests, + ): Promise { // make the request const response = await this.httpClient.request({ body: body, @@ -222,18 +220,17 @@ export class Client { let preFlightNecessary = false; // gather search requests where size is not set - Object.keys(multiSearchRequest) - .forEach((key) => { - const searchRequest = multiSearchRequest[key]; + for (const key of Object.keys(multiSearchRequest)) { + const searchRequest = multiSearchRequest[key]; - if (typeof searchRequest.size === 'undefined') { - preFlightRequest[key] = { - ...searchRequest, - }; - preFlightRequest[key].size = 0; - preFlightNecessary = true; - } - }); + if (typeof searchRequest.size === 'undefined') { + preFlightRequest[key] = { + ...searchRequest, + }; + preFlightRequest[key].size = 0; + preFlightNecessary = true; + } + } let returnMultiSearchRequest = multiSearchRequest; @@ -251,14 +248,17 @@ export class Client { ); // set size for multi search requests that were in pre flight request - Object.keys(preFlightRequest) - .forEach((key) => { - returnMultiSearchRequest[key].size = preFlightResponse[key].pagination.total; - }); + for (const key of Object.keys(preFlightRequest)) { + returnMultiSearchRequest[key].size = preFlightResponse[key].pagination.total; + } } // actually invoke the route - return this.invokeRoute(this.multiSearchRoute, undefined, returnMultiSearchRequest); + return this.invokeRoute( + this.multiSearchRoute, + undefined, + returnMultiSearchRequest, + ); } /** @@ -292,7 +292,10 @@ export class Client { * @param searchRequest Last search request * @param searchResponse Search response for supplied search request */ - async searchNext(searchRequest: SCSearchRequest, searchResponse: SCSearchResponse): Promise<{ + async searchNext( + searchRequest: SCSearchRequest, + searchResponse: SCSearchResponse, + ): Promise<{ /* tslint:disable:completed-docs */ searchRequest: SCSearchRequest; searchResponse: SCSearchResponse; diff --git a/src/connector-client.ts b/src/connector-client.ts index c33906b1..d5d6d427 100644 --- a/src/connector-client.ts +++ b/src/connector-client.ts @@ -40,6 +40,7 @@ export class ConnectorClient extends Client { * The default timeout for the bulk to expire */ static readonly BULK_TIMEOUT = 3600; + /** * The limit of how many items should be indexed concurrently */ @@ -58,7 +59,7 @@ export class ConnectorClient extends Client { /** * Make a UUID from a UID and a namespace ID * - * *Note: valid namespace IDs are license plates of StApps universities. + * Note: valid namespace IDs are license plates of StApps universities. * See documentation of `NAMESPACES` for valid namespace IDs.* * * @param uid UID to make UUID from @@ -80,15 +81,13 @@ export class ConnectorClient extends Client { * @param thing Thing to remove references from */ static removeReferences(thing: THING): SCAssociatedThingWithoutReferences { - - // tslint:disable-next-line:no-any + // eslint-disable-next-line @typescript-eslint/no-explicit-any const thingWithoutReferences = clone()(thing); delete thingWithoutReferences.origin; // iterate over all properties for (const key in thingWithoutReferences) { - /* istanbul ignore if */ if (!thingWithoutReferences.hasOwnProperty(key)) { continue; @@ -111,7 +110,7 @@ export class ConnectorClient extends Client { } else { // check every item in array for (const item of property) { - if (['boolean', 'number', 'string'].indexOf(typeof item) >= 0) { + if (['boolean', 'number', 'string'].includes(typeof item)) { // skip primitives continue; } @@ -147,29 +146,29 @@ export class ConnectorClient extends Client { /** * Recursively deletes all undefined properties from an object instance * - * @param obj Object to delete undefined properties from + * @param object Object to delete undefined properties from */ - static removeUndefinedProperties(obj: object): void { + static removeUndefinedProperties(object: object): void { // return atomic data types and arrays (recursion anchor) - if (typeof obj !== 'object' || Array.isArray(obj)) { + if (typeof object !== 'object' || Array.isArray(object)) { return; } // check each key - for (const key in obj) { + for (const key in object) { /* istanbul ignore if */ - if (!obj.hasOwnProperty(key)) { + if (!object.hasOwnProperty(key)) { continue; } - const indexedObj = obj as { [k: string]: unknown; }; + const indexedObject = object as {[k: string]: unknown}; - if (typeof indexedObj[key] === 'undefined') { + if (typeof indexedObject[key] === 'undefined') { // delete undefined keyss - delete indexedObj[key]; + delete indexedObject[key]; } else { // check recursive - ConnectorClient.removeUndefinedProperties(indexedObj[key] as object); + ConnectorClient.removeUndefinedProperties(indexedObject[key] as object); } } @@ -187,18 +186,11 @@ export class ConnectorClient extends Client { * @param timeout Timeout in seconds when the bulk should expire */ async bulk(type: SCThingType, source: string, timeout?: number): Promise> { - let bulkTimeout: number; // set default value for timeout to one hour - if (typeof timeout !== 'number') { - bulkTimeout = ConnectorClient.BULK_TIMEOUT; - } else { - bulkTimeout = timeout; - } + const bulkTimeout = typeof timeout !== 'number' ? ConnectorClient.BULK_TIMEOUT : timeout; const bulkData = await this.invokeRoute(this.bulkRoute, undefined, { - expiration: moment() - .add(bulkTimeout, 'seconds') - .format(), + expiration: moment().add(bulkTimeout, 'seconds').format(), source: source, type: type, }); @@ -223,19 +215,14 @@ export class ConnectorClient extends Client { throw new EmptyBulkError(); } - let thingSource: string; // set default source if none is given - if (typeof source === 'undefined') { - thingSource = 'stapps-api'; - } else { - thingSource = source; - } + const thingSource = typeof source === 'undefined' ? 'stapps-api' : source; // request a new bulk const bulk = await this.bulk(things[0].type, thingSource, timeout); // add items to the bulk - 5 concurrently - await asyncPool(ConnectorClient.ITEM_CONCURRENT_LIMIT, things, (thing) => bulk.add(thing)); + await asyncPool(ConnectorClient.ITEM_CONCURRENT_LIMIT, things, thing => bulk.add(thing)); // close bulk await bulk.done(); @@ -247,9 +234,13 @@ export class ConnectorClient extends Client { * @param thing StAppsCore thing to update */ async update(thing: SCThings): Promise { - return this.invokeRoute(this.thingUpdateRoute, { - TYPE: encodeURIComponent(thing.type), - UID: encodeURIComponent(thing.uid), - }, thing); + return this.invokeRoute( + this.thingUpdateRoute, + { + TYPE: encodeURIComponent(thing.type), + UID: encodeURIComponent(thing.uid), + }, + thing, + ); } } diff --git a/src/copy.ts b/src/copy.ts index 827c4cab..b83b23e6 100644 --- a/src/copy.ts +++ b/src/copy.ts @@ -62,7 +62,6 @@ export interface CopyOptions { * @param options Map of options */ export async function copy(client: HttpClientInterface, options: CopyOptions): Promise { - const apiIn = new Client(client, options.from, options.version); const apiOut = new ConnectorClient(client, options.to); @@ -93,17 +92,17 @@ export async function copy(client: HttpClientInterface, options: CopyOptions): P try { ({searchRequest, searchResponse} = await apiIn.searchNext(searchRequest, searchResponse)); - await asyncPool(ConnectorClient.ITEM_CONCURRENT_LIMIT, searchResponse.data, async (item) => { + await asyncPool(ConnectorClient.ITEM_CONCURRENT_LIMIT, searchResponse.data, async item => { progressBar.increment(1); return bulk.add(item); }); - } catch (e) { - if (e instanceof OutOfRangeError) { + } catch (error) { + if (error instanceof OutOfRangeError) { outOfRange = true; } else { progressBar.stop(); - throw e; + throw error; } } } while (!outOfRange); diff --git a/src/e2e.ts b/src/e2e.ts index de99775b..1a10af3d 100644 --- a/src/e2e.ts +++ b/src/e2e.ts @@ -12,12 +12,13 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ +/* eslint-disable unicorn/prevent-abbreviations */ import {SCSearchRequest, SCThings, SCThingType} from '@openstapps/core'; import {Logger} from '@openstapps/logger'; import {deepStrictEqual} from 'assert'; import {readdir, readFile} from 'fs'; -import {join} from 'path'; +import path from 'path'; import {promisify} from 'util'; import {ConnectorClient} from './connector-client'; import {HttpClientInterface} from './http-client-interface'; @@ -79,7 +80,9 @@ async function retrieveItems(api: ConnectorClient): Promise { singleItemSearchRequest.filter!.arguments.value = uid; const searchResonse = await api.search(singleItemSearchRequest); if (searchResonse.data.length !== 1) { - throw Error(`Search for single SCThing with uid: ${uid} returned ${searchResonse.data.length} results`); + throw new Error( + `Search for single SCThing with uid: ${uid} returned ${searchResonse.data.length} results`, + ); } remoteItemMap.set(uid, searchResonse.data[0]); } @@ -92,12 +95,14 @@ function compareItems() { for (const localThing of localItemMap.values()) { /* istanbul ignore next retrieveItems will throw before*/ if (!remoteItemMap.has(localThing.uid)) { - throw Error(`Did not retrieve expected SCThing with uid: ${localThing.uid}`); + throw new Error(`Did not retrieve expected SCThing with uid: ${localThing.uid}`); } const remoteThing = remoteItemMap.get(localThing.uid); deepStrictEqual(remoteThing, localThing, `Unexpected difference between original and retrieved sample`); } - Logger.info(`All samples retrieved from the backend are the same (deep equal) as the original ones submitted`); + Logger.info( + `All samples retrieved from the backend are the same (deep equal) as the original ones submitted`, + ); } /** * Function to add all the SCThings that getItemsFromSamples() returns to the backend @@ -125,8 +130,8 @@ async function indexSamples(api: ConnectorClient, options: E2EOptions): Promise< for (const type of itemMap.keys()) { await api.index(itemMap.get(type) as SCThings[], 'stapps-core-sample-data'); } - } catch (err) { - throw err; + } catch (error) { + throw error; } } @@ -144,7 +149,7 @@ export async function getItemsFromSamples(samplesDirectory: try { const fileNames = await readDirPromised(samplesDirectory); for (const fileName of fileNames) { - const filePath = join(samplesDirectory, fileName); + const filePath = path.join(samplesDirectory, fileName); if (filePath.endsWith('.json')) { const fileContent = await readFilePromised(filePath, {encoding: 'utf8'}); const schemaObject = JSON.parse(fileContent); diff --git a/src/errors.ts b/src/errors.ts index 591f48b6..2c51add1 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -35,19 +35,19 @@ export class ApiError extends Error { * Add additional data to the output of the error */ toString(): string { - let str = super.toString(); + let string_ = super.toString(); // add additional data if (typeof this.data.additionalData !== 'undefined') { - str += `\n\n${JSON.stringify(this.data.additionalData)}`; + string_ += `\n\n${JSON.stringify(this.data.additionalData)}`; } // add "remote" stack trace if (typeof this.data.stack !== 'undefined') { - str += `\n\n${this.data.stack}`; + string_ += `\n\n${this.data.stack}`; } - return str; + return string_; } } @@ -135,7 +135,7 @@ export class CoreVersionIncompatibleError extends ApiError { /** * Error that is thrown when API and backend StAppsCore versions are incompatible */ - export class PluginNotAvailableError extends ApiError { +export class PluginNotAvailableError extends ApiError { /** * Instantiate a new error */ diff --git a/src/http-client-interface.ts b/src/http-client-interface.ts index a0a241ae..23925150 100644 --- a/src/http-client-interface.ts +++ b/src/http-client-interface.ts @@ -23,18 +23,15 @@ export interface HttpClientInterface { * * @param request Request to send */ - request( - request: HttpClientRequest, - ): Promise>; + request(request: HttpClientRequest): Promise>; } /** * A map of headers */ export interface HttpClientHeaders { - /* tslint:disable:no-any */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any [key: string]: any; - /* tslint:enable:no-any */ } /** diff --git a/src/http-client.ts b/src/http-client.ts index 6ed65d0e..3493687d 100644 --- a/src/http-client.ts +++ b/src/http-client.ts @@ -22,7 +22,8 @@ export interface RequestOptions extends Omit extends GotResponse { export class HttpClient { /** * Make a request + * * @param requestConfig Configuration of the request */ - // tslint:disable-next-line:prefer-function-over-method - async request( - requestConfig: RequestOptions, - ): Promise> { - const params: OptionsOfJSONResponseBody = { + async request(requestConfig: RequestOptions): Promise> { + const parameters: OptionsOfJSONResponseBody = { followRedirect: true, method: 'GET', responseType: 'json', }; if (typeof requestConfig.body !== 'undefined') { - params.json = requestConfig.body; + parameters.json = requestConfig.body; } if (typeof requestConfig.headers !== 'undefined') { - params.headers = requestConfig.headers; + parameters.headers = requestConfig.headers; } if (typeof requestConfig.method !== 'undefined') { - params.method = requestConfig.method; + parameters.method = requestConfig.method; } let response: Response; try { - response = await got(requestConfig.url.toString(), params); - } catch (err) { - // tslint:disable-next-line: no-any - if (typeof (err as any).response === 'undefined') { - throw err; + response = await got(requestConfig.url.toString(), parameters); + } catch (error) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (typeof (error as any).response === 'undefined') { + throw error; } // if there is a response (e.g. response with statusCode 404 etc.) provide it - // tslint:disable-next-line: no-any - response = (err as any).response as Response; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + response = (error as any).response as Response; } return response; diff --git a/src/plugin-client.ts b/src/plugin-client.ts index 26efb43a..8538f0f0 100644 --- a/src/plugin-client.ts +++ b/src/plugin-client.ts @@ -53,7 +53,7 @@ export class PluginClient extends ConnectorClient { * * **This method automatically calls [[Plugin.stop]]** * If you want to unregister your plugin for some reason, you can do so by calling this method. - * *Use with caution.* + * Use with caution.* * * @param plugin The instance of the plugin you want to register */ diff --git a/src/plugin.ts b/src/plugin.ts index b61cfb5b..8f0bddce 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -60,10 +60,12 @@ export abstract class Plugin { * The port on which the plugin will listen on */ public port: string | number | false; + /** * The schema of the request interfaces defined by the user */ public readonly requestSchema: JSONSchema7 = {}; + /** * The schema of the response interfaces defined by the user */ @@ -75,10 +77,10 @@ export abstract class Plugin { * @param value the port you want to normalize */ protected static normalizePort(value: string) { - const portNumber = parseInt(value, 10); + const portNumber = Number.parseInt(value, 10); /* istanbul ignore next */ - if (isNaN(portNumber)) { + if (Number.isNaN(portNumber)) { // named pipe /* istanbul ignore next */ return value; @@ -110,29 +112,31 @@ export abstract class Plugin { * @param responseName the name of the response schema * @param version the version. You should retrieve it from the package.json */ - constructor(port: number, - public name: string, - public url: string, - public route: string, - protected backendUrl: string, - converter: Converter, - requestName: string, - responseName: string, - version: string) { - + constructor( + port: number, + public name: string, + public url: string, + public route: string, + protected backendUrl: string, + converter: Converter, + requestName: string, + responseName: string, + version: string, + ) { this.app.use(bodyParser.json()); this.port = Plugin.normalizePort( /* istanbul ignore next */ - typeof process.env.PORT !== 'undefined' ? process.env.PORT : port.toString()); + typeof process.env.PORT !== 'undefined' ? process.env.PORT : port.toString(), + ); this.app.set('port', this.port); // setup express this.server = http.createServer(this.app); this.server.listen(this.port); /* istanbul ignore next */ - this.server.on('error', (err) => { + this.server.on('error', error => { /* istanbul ignore next */ - this.onError(err); + this.onError(error); }); this.server.on('listening', () => { this.onListening(); @@ -145,12 +149,12 @@ export abstract class Plugin { this.app.set('env', process.env.NODE_ENV); - this.app.all('*', async (req: express.Request, res: express.Response) => { + this.app.all('*', async (request: express.Request, response: express.Response) => { if (this.active) { - await this.onRouteInvoke(req, res); + await this.onRouteInvoke(request, response); } else { - res.status(http2.constants.HTTP_STATUS_NOT_FOUND); - res.send(); + response.status(http2.constants.HTTP_STATUS_NOT_FOUND); + response.send(); } }); } @@ -167,9 +171,7 @@ export abstract class Plugin { throw error; } - const bind = typeof this.port === 'string' - ? `Pipe ${this.port}` - : `Port ${this.port}`; + const bind = typeof this.port === 'string' ? `Pipe ${this.port}` : `Port ${this.port}`; // handle specific listen errors with friendly messages switch (error.code) { @@ -194,9 +196,7 @@ export abstract class Plugin { private onListening() { const addr = this.server.address(); /* istanbul ignore next */ - const bind = typeof addr === 'string' - ? `pipe ${addr}` : addr === null - ? 'null' : `port ${addr.port}`; + const bind = typeof addr === 'string' ? `pipe ${addr}` : addr === null ? 'null' : `port ${addr.port}`; Logger.ok(`Listening on ${bind}`); } @@ -205,10 +205,10 @@ export abstract class Plugin { * * Override this method for your own plugin * - * @param req An express Request from the backend - * @param res An express Response to the backend for you to send back data + * @param request An express Request from the backend + * @param response An express Response to the backend for you to send back data */ - protected abstract onRouteInvoke(req: express.Request, res: express.Response): Promise; + protected abstract onRouteInvoke(request: express.Request, response: express.Response): Promise; /** * Closes the server @@ -218,11 +218,11 @@ export abstract class Plugin { */ public async close() { return new Promise((resolve, reject) => { - this.server.close((err) => { + this.server.close(error => { /* istanbul ignore next */ - if (typeof err !== 'undefined') { + if (typeof error !== 'undefined') { /* istanbul ignore next */ - reject(err); + reject(error); } resolve(undefined); }); diff --git a/tslint.json b/tslint.json deleted file mode 100644 index f125abb0..00000000 --- a/tslint.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./node_modules/@openstapps/configuration/tslint.json" -}