diff --git a/.eslintrc.js b/.eslintrc.js index fc4df69..2df8b35 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,7 +20,7 @@ module.exports = { "@typescript-eslint/prefer-interface": ["off"], "import/no-extraneous-dependencies": [ "error", - { devDependencies: ["**/*.test.ts"] } + { devDependencies: ["test/**/*.ts"] } ], "@typescript-eslint/no-floating-promises": ["error"], "no-use-before-define": ["error", "nofunc"], diff --git a/.travis.yml b/.travis.yml index 9af7e5c..86b5acd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,13 @@ node_js: - 12 - 10 cache: npm -sudo: required +branches: + except: + - no-engines services: - docker env: - matrix: + jobs: - POSTGRES_Skip=0 POSTGRES_Host=localhost POSTGRES_Port=5432 POSTGRES_Username=test POSTGRES_Password=test POSTGRES_Database=test POSTGRES_SSL=0 MYSQL_Skip=0 MYSQL_Host=localhost MYSQL_Port=3306 MYSQL_Username=root MYSQL_Password=admin @@ -45,7 +47,5 @@ script: after_success: - codecov after_failure: -- docker ps -- docker-compose logs -dd: - secure: lONUbDz2a1LWId+Z2tTaxajK7MilX/XbQ875FYD6EE09DQ0xcoPdq2/KW5/pxuN1tz4QzTG7izMwra3XWtkBySxqFwJDUOibsgYVgn+EMMuPWNMNnQgXqTTmHbtbm1L1aSMHu4bCu4cJkJBX6503R0Kv4Hbdr2LFnSUI/9KqrevA1cVyksN71BlNBdRtvnHInwB5wNNvGULSLT+DR6qGytLGjq4ZF+pW7dH3A1LNGfDY4ivGPHt9eAWGHcVuESmudO1ADmf6XTZAJVdKqDy5eJguK48XyAqRmTc1vBxDJmCNDaU/mV6fkUoEkCjn9XfG5nJLOKviycc1j/OCuuWuqojmTlRInPGV8GDT8lNivwqLBMzvKoKgSQQROEVus4xzo64M808dFbUS30et3++O589X/7P9Wjmt+6HawcEsSq5TQfEutyB+tM9OwedTkB5Fwwmymuqx23zCAJ2orP7WoIG/ApmnKu6LmpoM340UxxSGkurztQP1OqFrf4u8kDVp9/xzqnd7qSfEd8iKvvb1bOykWGxx6dhyThCdSNyT5GQL3aub3LV6g0UB37lbhB+BVSrOAhN0r1cIWT2wr2mRxwoepObmrcNQ+AOUUXE/RcONsiEQr+STsEIjJb7bTANljRYMKpiPdsAdhvDaUZRyu8KBArTCDPotanzwQFERcw8= + - docker-compose logs + - docker ps diff --git a/CHANGELOG.md b/CHANGELOG.md index 70d553b..1651db3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.4.1 + +* Fixed model generation on oracle database (#252) +* New option to define line ending character (#241) +* Fixed model generation for two table with same name, different schema on mssql (#246) +* Proper naming strategy typings (#249) +* Release version without installed db drivers + ## 0.4.0 ### BREAKING CHANGES diff --git a/README.md b/README.md index 24f0c87..146257e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ Supported db engines: ## Installation +### Versions +Typeorm-model-generator comes with preinstalled driver for each supported db(except for oracle). However if you want to use it as a dev-dependency you may want to install your db driver manually to reduce dependency footprint, reduce time spent in the CI. In such case you can use version without preinstalled db drivers - `npm i typeorm-model-generator@no-engines`. ### Global module To install module globally simply type `npm i -g typeorm-model-generator` in your console. ### Npx way diff --git a/package-lock.json b/package-lock.json index 62567af..3b4e60b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "typeorm-model-generator", - "version": "0.4.0", + "version": "0.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -175,12 +175,12 @@ "dev": true }, "@babel/runtime": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", - "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", + "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { @@ -302,32 +302,6 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, "@samverschueren/stream-to-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", @@ -338,41 +312,42 @@ } }, "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz", + "integrity": "sha512-atR1J/jRXvQAb47gfzSK8zavXy7BcpnYq21ALon0U99etu99vsir0trzIO3wpeLtW+LLVY6X7EkfVTbjGSH8Ww==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", "dev": true, "requires": { "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "@sinonjs/samsam": "^5.0.2" } }, "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", + "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", "dev": true, "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" - }, - "dependencies": { - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - } + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, "@sinonjs/text-encoding": { @@ -388,15 +363,15 @@ "dev": true }, "@types/array.prototype.flatmap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/array.prototype.flatmap/-/array.prototype.flatmap-1.2.0.tgz", - "integrity": "sha512-sMRMigmTCA1EVX46F0jPhSFo51uFNo83GkeYlp7r4xKkXwfjkDpTm13vB9Tba4Ey+0rUXX3QjSWHAIwSb3qzrA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/array.prototype.flatmap/-/array.prototype.flatmap-1.2.1.tgz", + "integrity": "sha512-AtzC715z/5InlwWFzlxzdoV3Wovzbd3+60uWgDHdI0N+S6XiHU+syXHMhJQIYH1sv/xrrGVsLvMTSEBxmm6qlA==", "dev": true }, "@types/chai": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.7.tgz", - "integrity": "sha512-luq8meHGYwvky0O7u0eQZdA7B4Wd9owUCqvbw2m3XCrCU8mplYOujMBbvyS547AxJkC+pGnd0Cm15eNxEUNU8g==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", + "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", "dev": true }, "@types/chai-as-promised": { @@ -423,9 +398,9 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/eslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-6.1.3.tgz", - "integrity": "sha512-llYf1QNZaDweXtA7uY6JczcwHmFwJL9TpK3E6sY0B18l6ulDT6VWNMAdEjYccFHiDfxLPxffd8QmSDV4QUUspA==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-6.1.8.tgz", + "integrity": "sha512-CJBhm9pYdUS8cFVbXACWlLxZWFBTQMiM0eI6RYxng3u9oQ9gHdQ5PN89DHPrK4RISRzX62nRsteUlbBgEIdSug==", "dev": true, "requires": { "@types/estree": "*", @@ -439,37 +414,20 @@ "dev": true }, "@types/estree": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.41.tgz", - "integrity": "sha512-rIAmXyJlqw4KEBO7+u9gxZZSQHaCNnIzYrnNmYVpgfJhxTqO0brCX0SYpqUTkVI5mwwUwzmtspLBGBKroMeynA==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.42.tgz", + "integrity": "sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ==", "dev": true }, "@types/fs-extra": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.1.tgz", - "integrity": "sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", "dev": true, "requires": { "@types/node": "*" } }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, "@types/handlebars": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", @@ -490,21 +448,15 @@ } }, "@types/json-schema": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", - "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", "dev": true }, "@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", "dev": true }, "@types/mssql": { @@ -518,35 +470,27 @@ } }, "@types/mysql": { - "version": "2.15.8", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.8.tgz", - "integrity": "sha512-l0TUdg6KDEaLO75/yjdjksobJDRWv8iZlpRfv/WW1lQZCQDKdTDnKCkeH10oapzP/JTuKiTy6Cvq/sm/0GgcUw==", + "version": "2.15.9", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.9.tgz", + "integrity": "sha512-rB3w3/YEV11oIoL56iP4OPt6uLkcuu6oIqbUy8T2bSm/ZUYN0fvyyzzrZBDNYL//zRStdmSsUPZDtHXjdR1hTA==", "dev": true, "requires": { "@types/node": "*" } }, "@types/node": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.4.tgz", - "integrity": "sha512-Lue/mlp2egZJoHXZr4LndxDAd7i/7SQYhV0EjWfb/a4/OZ6tuVwMCVPiwkU5nsEipxEf7hmkSU7Em5VQ8P5NGA==" + "version": "13.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.3.tgz", + "integrity": "sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA==" }, "@types/oracledb": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-4.1.1.tgz", - "integrity": "sha512-Vjk5RLENuQKzgqjoIyGH9wZCGOxc4r4j2nh7jKo32+yJ4zwwPiKp808YZh0iRPgXOZeqFVaQYHB0xpEFuV4lug==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-4.2.0.tgz", + "integrity": "sha512-1wG9cvpByyOCxyQXYSnoBdqzojFuFfBhuAl6X59ikSm0Du9i5iQoL6W0loByvMymWQDBl6U8F2xGi4xuaAmsKg==", "dev": true, "requires": { "@types/node": "*", "dotenv": "^8.2.0" - }, - "dependencies": { - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - } } }, "@types/parse-json": { @@ -556,9 +500,9 @@ "dev": true }, "@types/pg": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.1.tgz", - "integrity": "sha512-gQgg4bLuykokypx4O1fwEzl5e6UjjyaBtN3znn5zhm0YB9BnKyHDw+e4cQY9rAPzpdM2qpJbn9TNzUazbmTsdw==", + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.14.3.tgz", + "integrity": "sha512-go5zddQ1FrUQHeBvqPzQ1svKo4KKucSwvqLsvwc/EIuQ9sxDA21b68xc/RwhzAK5pPCnez8NrkYatFIGdJBVvA==", "dev": true, "requires": { "@types/node": "*", @@ -578,9 +522,9 @@ "dev": true }, "@types/prettier": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.0.tgz", - "integrity": "sha512-gDE8JJEygpay7IjA/u3JiIURvwZW08f0cZSZLAzFoX/ZmeqvS0Sqv+97aKuHpNsalAMMhwPe+iAS6fQbfmbt7A==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", "dev": true }, "@types/readable-stream": { @@ -593,9 +537,9 @@ } }, "@types/sinon": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.1.tgz", - "integrity": "sha512-EZQUP3hSZQyTQRfiLqelC9NMWd1kqLcmQE0dMiklxBkgi84T+cHOhnKpgk4NnOWpGX863yE6+IaGnOXUNFqDnQ==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.2.tgz", + "integrity": "sha512-T+m89VdXj/eidZyejvmoP9jivXgBDdkOSBVQjU9kF349NEx10QdPNGxHeZUaj1IlJ32/ewdyXJjnJxyxJroYwg==", "dev": true }, "@types/sqlite3": { @@ -634,67 +578,78 @@ } }, "@types/yargs": { - "version": "13.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", - "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.15.0.tgz", - "integrity": "sha512-XRJFznI5v4K1WvIrWmjFjBAdQWaUTz4xJEdqR7+wAFsv6Q9dP3mOlE6BMNT3pdlp9eF1+bC5m5LZTmLMqffCVw==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.25.0.tgz", + "integrity": "sha512-W2YyMtjmlrOjtXc+FtTelVs9OhuR6OlYc4XKIslJ8PUJOqgYYAPRJhAqkYRQo3G4sjvG8jSodsNycEn4W2gHUw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "2.15.0", - "eslint-utils": "^1.4.3", + "@typescript-eslint/experimental-utils": "2.25.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "tsutils": "^3.17.1" } }, "@typescript-eslint/experimental-utils": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.15.0.tgz", - "integrity": "sha512-Qkxu5zndY5hqlcQkmA88gfLvqQulMpX/TN91XC7OuXsRf4XG5xLGie0sbpX97o/oeccjeZYRMipIsjKk/tjDHA==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.25.0.tgz", + "integrity": "sha512-0IZ4ZR5QkFYbaJk+8eJ2kYeA+1tzOE1sBjbwwtSV85oNWYUBep+EyhlZ7DLUCyhMUGuJpcCCFL0fDtYAP1zMZw==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.15.0", - "eslint-scope": "^5.0.0" + "@typescript-eslint/typescript-estree": "2.25.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } } }, "@typescript-eslint/parser": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.15.0.tgz", - "integrity": "sha512-6iSgQsqAYTaHw59t0tdjzZJluRAjswdGltzKEdLtcJOxR2UVTPHYvZRqkAVGCkaMVb6Fpa60NnuozNCvsSpA9g==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.25.0.tgz", + "integrity": "sha512-mccBLaBSpNVgp191CP5W+8U1crTyXsRziWliCqzj02kpxdjKMvFHGJbK33NroquH3zB/gZ8H511HEsJBa2fNEg==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.15.0", - "@typescript-eslint/typescript-estree": "2.15.0", + "@typescript-eslint/experimental-utils": "2.25.0", + "@typescript-eslint/typescript-estree": "2.25.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.15.0.tgz", - "integrity": "sha512-L6Pog+w3VZzXkAdyqA0VlwybF8WcwZX+mufso86CMxSdWmcizJ38lgBdpqTbc9bo92iyi0rOvmATKiwl+amjxg==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.25.0.tgz", + "integrity": "sha512-VUksmx5lDxSi6GfmwSK7SSoIKSw9anukWWNitQPqt58LuYrKalzsgeuignbqnB+rK/xxGlSsCy8lYnwFfB6YJg==", "dev": true, "requires": { "debug": "^4.1.1", "eslint-visitor-keys": "^1.1.0", "glob": "^7.1.6", "is-glob": "^4.0.1", - "lodash.unescape": "4.0.1", + "lodash": "^4.17.15", "semver": "^6.3.0", "tsutils": "^3.17.1" }, @@ -722,10 +677,10 @@ "path-is-absolute": "^1.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } @@ -736,9 +691,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-jsx": { @@ -892,9 +847,9 @@ } }, "arg": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", - "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { @@ -911,66 +866,17 @@ "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", "dev": true }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, "array-includes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.0.tgz", - "integrity": "sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", - "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, "array.prototype.flat": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", @@ -979,44 +885,6 @@ "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", - "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } } }, "array.prototype.flatmap": { @@ -1094,15 +962,20 @@ "dev": true }, "async": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", - "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1114,12 +987,11 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" + "follow-redirects": "1.5.10" } }, "balanced-match": { @@ -1141,9 +1013,9 @@ } }, "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" }, "binary-extensions": { "version": "2.0.0", @@ -1160,9 +1032,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1196,9 +1068,9 @@ "dev": true }, "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" @@ -1232,32 +1104,6 @@ "write-file-atomic": "^3.0.0" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1617,7 +1463,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "optional": true }, "commondir": { "version": "1.0.1", @@ -1625,15 +1471,21 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "confusing-browser-globals": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz", - "integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", "dev": true }, "console-control-strings": { @@ -1679,31 +1531,22 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" }, "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true } } @@ -1808,32 +1651,9 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", "dev": true, "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - } + "object-keys": "^1.0.12" } }, "delayed-stream": { @@ -1862,23 +1682,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1957,23 +1760,71 @@ } }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -2076,33 +1927,33 @@ } }, "eslint-config-airbnb-base": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.0.0.tgz", - "integrity": "sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", + "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", "dev": true, "requires": { - "confusing-browser-globals": "^1.0.7", + "confusing-browser-globals": "^1.0.9", "object.assign": "^4.1.0", - "object.entries": "^1.1.0" + "object.entries": "^1.1.1" } }, "eslint-config-prettier": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.9.0.tgz", - "integrity": "sha512-k4E14HBtcLv0uqThaI6I/n1LEqROp8XaPu6SO9Z32u5NlGRC07Enu1Bh2KEFw4FNHbekH8yzbIU9kUGxbiGmCA==", + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", + "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", "dev": true, "requires": { "get-stdin": "^6.0.0" } }, "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", "dev": true, "requires": { "debug": "^2.6.9", - "resolve": "^1.5.0" + "resolve": "^1.13.1" }, "dependencies": { "debug": { @@ -2123,9 +1974,9 @@ } }, "eslint-module-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.0.tgz", - "integrity": "sha512-kCo8pZaNz2dsAW7nCUjuVoI11EBXXpIzfNxmaoLhXoRDOnqXLC4iSGVRdZPhOitfbdEfMEfKOiENaK6wDPZEGw==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", "dev": true, "requires": { "debug": "^2.6.9", @@ -2150,9 +2001,9 @@ } }, "eslint-plugin-import": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz", - "integrity": "sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", "dev": true, "requires": { "array-includes": "^3.0.3", @@ -2188,64 +2039,11 @@ "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } } } }, @@ -2320,6 +2118,67 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2345,19 +2204,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, - "fast-glob": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", - "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2" - } - }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -2369,19 +2215,10 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", - "dev": true, - "requires": { - "reusify": "^1.0.0" - } - }, "figlet": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.2.4.tgz", - "integrity": "sha512-mv8YA9RruB4C5QawPaD29rEVx3N97ZTyNrE4DAfbhuo6tpcMdKnPVo8MlyT3RP5uPcg5M14bEJBq7kjFf4kAWg==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.3.0.tgz", + "integrity": "sha512-f7A8aOJAfyehLJ7lQ6rEA8WJw7kOk3lfWRi5piSjkzbK5YkI5sqO8eiLHz1ehO+DM0QYB85i8VfA6XIGUbU1dg==" }, "figures": { "version": "1.7.0", @@ -2468,11 +2305,21 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" } }, "flat": { @@ -2610,19 +2457,20 @@ "dev": true }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" }, "dependencies": { "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" } } }, @@ -2649,7 +2497,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "functional-red-black-tree": { "version": "1.0.1", @@ -2728,6 +2577,15 @@ "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2764,30 +2622,6 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - } - } - }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", @@ -2800,9 +2634,9 @@ "dev": true }, "handlebars": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", - "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", + "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", @@ -2828,6 +2662,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -2855,7 +2690,8 @@ "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true }, "has-unicode": { "version": "2.0.1", @@ -2909,17 +2745,14 @@ } }, "highlight.js": { - "version": "9.17.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.17.1.tgz", - "integrity": "sha512-TA2/doAur5Ol8+iM3Ov7qy3jYcr/QiJ2eDTdRF4dfbjG7AaaB99J5G+zSl11ljbl6cIcahgPY6SKb3sC3EJ0fw==", - "requires": { - "handlebars": "^4.5.3" - } + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", + "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==" }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "html-escaper": { @@ -2987,16 +2820,23 @@ } } }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, "husky": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.0.1.tgz", - "integrity": "sha512-x2wzNz3mra5rSYBPb9w59Bg3d5HnJZ+DBAALbMl/1K15Yv8zhcAxhrS792nMyjkxLsoPZtNpmnX+RqLtIKxpDQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.3.tgz", + "integrity": "sha512-VxTsSTRwYveKXN4SaH1/FefRJYCtx+wx04sSVcOpD7N2zjoHxa+cEJ07Qg5NmV3HAK+IRKOyNVpi2YBIVccIfQ==", "dev": true, "requires": { "chalk": "^3.0.0", "ci-info": "^2.0.0", + "compare-versions": "^3.5.1", "cosmiconfig": "^6.0.0", - "get-stdin": "^7.0.0", + "find-versions": "^3.2.0", "opencollective-postinstall": "^2.0.2", "pkg-dir": "^4.2.0", "please-upgrade-node": "^3.2.0", @@ -3062,12 +2902,6 @@ "path-exists": "^4.0.0" } }, - "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3110,6 +2944,12 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -3199,31 +3039,31 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", - "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" } }, "ansi-regex": { @@ -3231,6 +3071,24 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3239,19 +3097,37 @@ "restore-cursor": "^3.1.0" } }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3287,22 +3163,23 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -3324,22 +3201,19 @@ "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-extglob": { @@ -3383,18 +3257,6 @@ "symbol-observable": "^1.1.0" } }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", @@ -3404,6 +3266,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, "requires": { "has": "^1.0.1" } @@ -3415,15 +3278,22 @@ "dev": true }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, "requires": { "has-symbols": "^1.0.0" } @@ -3633,9 +3503,9 @@ } }, "jsbi": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.1.tgz", - "integrity": "sha512-+HQESPaV0mRiH614z4JPVPAftcRC2p53x92lySPzUzFwJbJTMpzHz8OYUkcXPN3fOcHUe0NdVcHnCtX/1+eCrA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.2.tgz", + "integrity": "sha512-5nDXo1X9QVaXK/Cpb5VECV9ss1QPbjUuk1qSruHB1PK/g39Sd414K4nci99ElFDZv0vzxDEnKn3o49/Tn9Yagw==" }, "jsbn": { "version": "0.1.1", @@ -3685,19 +3555,20 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, "jsprim": { @@ -3712,9 +3583,9 @@ } }, "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, "jwa": { @@ -3753,38 +3624,67 @@ "dev": true }, "lint-staged": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.5.0.tgz", - "integrity": "sha512-nawMob9cb/G1J98nb8v3VC/E8rcX1rryUYXVZ69aT9kde6YWX+uvNOEHY5yf2gcWcTJGiD0kqXmCnS3oD75GIA==", + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.0.9.tgz", + "integrity": "sha512-NKJHYgRa8oI9c4Ic42ZtF2XA6Ps7lFbXwg3q0ZEP0r55Tw3YWykCW1RzW6vu+QIGqbsy7DxndvKu93Wtr5vPQw==", "dev": true, "requires": { - "chalk": "^2.4.2", - "commander": "^2.20.0", - "cosmiconfig": "^5.2.1", + "chalk": "^3.0.0", + "commander": "^4.0.1", + "cosmiconfig": "^6.0.0", "debug": "^4.1.1", "dedent": "^0.7.0", - "del": "^5.0.0", - "execa": "^2.0.3", + "execa": "^3.4.0", "listr": "^0.14.3", "log-symbols": "^3.0.0", "micromatch": "^4.0.2", "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.1.1", - "string-argv": "^0.3.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", "stringify-object": "^3.3.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -3794,81 +3694,19 @@ "ms": "^2.1.1" } }, - "execa": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", - "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^3.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.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==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "npm-run-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", - "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "path-key": "^3.0.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" + "has-flag": "^4.0.0" } } } @@ -3890,6 +3728,12 @@ "rxjs": "^6.3.3" }, "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, "p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -4000,12 +3844,36 @@ } } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, "requires": { - "p-locate": "^3.0.0", + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, @@ -4021,10 +3889,10 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, "log-symbols": { @@ -4047,12 +3915,6 @@ "wrap-ansi": "^3.0.1" } }, - "lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true - }, "lower-case": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", @@ -4086,9 +3948,9 @@ } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "merge-stream": { @@ -4097,12 +3959,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -4184,9 +4040,9 @@ } }, "mocha": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.0.tgz", - "integrity": "sha512-CirsOPbO3jU86YKjjMzFLcXIb5YiGLUrjrXFHoJ3e2z9vWiaZVCZQ2+gtRGMPWF+nFhN6AWwLM/juzAQ6KRkbA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz", + "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", "dev": true, "requires": { "ansi-colors": "3.2.3", @@ -4200,9 +4056,9 @@ "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", - "log-symbols": "2.2.0", + "log-symbols": "3.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", + "mkdirp": "0.5.3", "ms": "2.1.1", "node-environment-flags": "1.0.6", "object.assign": "4.1.0", @@ -4210,11 +4066,20 @@ "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", - "yargs": "13.3.0", - "yargs-parser": "13.1.1", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", "yargs-unparser": "1.6.0" }, "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -4229,13 +4094,38 @@ "path-is-absolute": "^1.0.0" } }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "chalk": "^2.0.1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" } }, "string-width": { @@ -4274,9 +4164,9 @@ } }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -4288,17 +4178,7 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "yargs-parser": "^13.1.2" } } } @@ -4309,9 +4189,9 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "mssql": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/mssql/-/mssql-6.0.1.tgz", - "integrity": "sha512-7oPhbQjotFJBgMPlzLmPwWlnrryxrDltjCNCD9BK7Df7TA9wc6Mb/0Bcx04NJyHCMAhw8C/iWjbJoeDyUfRNUA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mssql/-/mssql-6.2.0.tgz", + "integrity": "sha512-C1WcvpiyGGoNyA+rNae/87V4O47S1P75zqmITutxzamocccY8BsZA+cljXJvpnYbbGlmMB5eoSaVUSqR9NyLCg==", "requires": { "debug": "^4", "tarn": "^1.1.5", @@ -4334,16 +4214,30 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "mysql": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz", - "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", "requires": { - "bignumber.js": "7.2.1", - "readable-stream": "2.3.6", + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", "safe-buffer": "5.1.2", "sqlstring": "2.3.1" }, "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4405,27 +4299,16 @@ "dev": true }, "nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", + "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", "dev": true, "requires": { - "@sinonjs/formatio": "^3.2.1", + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^5.0.1", "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - } } }, "no-case": { @@ -4530,14 +4413,11 @@ "validate-npm-package-license": "^3.0.1" }, "dependencies": { - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -4569,6 +4449,23 @@ "npm-bundled": "^1.0.1" } }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + }, + "dependencies": { + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + } + } + }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -4696,17 +4593,20 @@ "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", @@ -4715,13 +4615,13 @@ } }, "object.entries": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", - "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" } @@ -4730,44 +4630,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", - "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" - } } }, "object.values": { @@ -4780,44 +4646,6 @@ "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", - "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - } } }, "once": { @@ -4884,6 +4712,12 @@ "os-tmpdir": "^1.0.0" } }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", @@ -4893,11 +4727,29 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "p-map": { @@ -4962,13 +4814,15 @@ "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=" }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, "parse5": { @@ -5056,10 +4910,13 @@ } }, "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } }, "pathval": { "version": "1.1.0", @@ -5073,18 +4930,25 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pg": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.17.0.tgz", - "integrity": "sha512-70Q4ZzIdPgwMPb3zUIzAUwigNJ4v5vsWdMED6OzXMfOECeYTvTm7iSC3FpKizu/R1BHL8Do3bLs6ltGfOTAnqg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz", + "integrity": "sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "0.1.3", "pg-packet-stream": "^1.1.0", - "pg-pool": "^2.0.9", + "pg-pool": "^2.0.10", "pg-types": "^2.1.0", "pgpass": "1.x", "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + } } }, "pg-connection-string": { @@ -5103,9 +4967,9 @@ "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" }, "pg-pool": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.9.tgz", - "integrity": "sha512-gNiuIEKNCT3OnudQM2kvgSnXsLkSpd6mS/fRnqs6ANtrke6j8OY5l9mnAryf1kgwJMWLg0C1N1cYTZG1xmEYHQ==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz", + "integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==" }, "pg-types": { "version": "2.2.0", @@ -5128,9 +4992,15 @@ } }, "picomatch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", - "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pkg-dir": { @@ -5140,51 +5010,6 @@ "dev": true, "requires": { "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } } }, "please-upgrade-node": { @@ -5231,9 +5056,14 @@ "dev": true }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "process-on-spawn": { "version": "1.0.0", @@ -5287,9 +5117,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "strip-json-comments": { "version": "2.0.1", @@ -5307,44 +5137,16 @@ "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", "path-type": "^2.0.0" - }, - "dependencies": { - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "readable-stream": { @@ -5383,9 +5185,9 @@ "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", "dev": true }, "regexpp": { @@ -5489,35 +5291,23 @@ } } }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "requires": { "is-promise": "^2.1.0" } }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", @@ -5543,9 +5333,10 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", - "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "semver-compare": { "version": "1.0.0", @@ -5553,6 +5344,12 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, "sentence-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.3.tgz", @@ -5575,6 +5372,15 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -5596,24 +5402,47 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.1.tgz", + "integrity": "sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg==", "dev": true, "requires": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.3", - "diff": "^3.5.0", - "lolex": "^4.2.0", - "nise": "^1.5.2", - "supports-color": "^5.5.0" + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.0.3", + "diff": "^4.0.2", + "nise": "^4.0.1", + "supports-color": "^7.1.0" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "sinon-chai": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.4.0.tgz", - "integrity": "sha512-BpVxsjEkGi6XPbDXrgWUe7Cb1ZzIfxKUbu/MmH5RoUnS7AXpKo3aIYIyQUg0FMvlUL05aPt7VZuAdaeQhEnWxg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.5.0.tgz", + "integrity": "sha512-IifbusYiQBpUxxFJkR3wTU68xzBN0+bxCScEaKMjBvAQERg6FnTTc1F17rseLb1tjmkJ23730AXpFI0c47FgAg==", "dev": true }, "slash": { @@ -5716,9 +5545,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split": { @@ -5803,6 +5632,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -5812,6 +5642,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -5953,12 +5784,12 @@ "integrity": "sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g==" }, "tedious": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-6.6.2.tgz", - "integrity": "sha512-0Yziuys2h66dVlqMPJpNFciQ/N2VrgwY8o8TXyj4OZBaxrvqRPeMuTKZZVBFTGOjt/J15fR0fX0HBnCHjm7QWA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-6.7.0.tgz", + "integrity": "sha512-8qr7+sB0h4SZVQBRWUgHmYuOEflAOl2eihvxk0fVNvpvGJV4V5UC/YmSvebyfgyfwWcPO22/AnSbYVZZqf9wuQ==", "requires": { "@azure/ms-rest-nodeauth": "2.0.2", - "@types/node": "^12.7.11", + "@types/node": "^12.12.17", "@types/readable-stream": "^2.3.5", "bl": "^3.0.0", "depd": "^2.0.0", @@ -5971,22 +5802,22 @@ }, "dependencies": { "@types/node": { - "version": "12.12.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.24.tgz", - "integrity": "sha512-1Ciqv9pqwVtW6FsIUKSZNB82E5Cu1I2bBTj1xuIHXLe/1zYLl3956Nbhg2MzSYHVfl9/rmanjbQIb7LibfCnug==" + "version": "12.12.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.30.tgz", + "integrity": "sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==" }, "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", + "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6091,22 +5922,22 @@ } }, "ts-node": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.5.4.tgz", - "integrity": "sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.1.tgz", + "integrity": "sha512-10DE9ONho06QORKAaCBpPiFCdW+tZJuY/84tyypGtl6r+/C7Asq0dhqbRZURuUlLQtZxxDvT8eoj8cGW0ha6Bg==", "dev": true, "requires": { "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "yn": "3.1.1" }, "dependencies": { "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "yn": { @@ -6164,6 +5995,11 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -6174,9 +6010,9 @@ } }, "typeorm": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.22.tgz", - "integrity": "sha512-mDEnMtzRwX4zMYbyzM9xDn7jvGs8hfQ2ymOBq36Zxq1RVM642numwlRbr4W8dU7ZYx8CQUE9rmk+sU0baHD9Rw==", + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.24.tgz", + "integrity": "sha512-L9tQv6nNLRyh+gex/qc8/CyLs8u0kXKqk1OjYGF13k/KOg6N2oibwkuGgv0FuoTGYx2ta2NmqvuMUAMrHIY5ew==", "requires": { "app-root-path": "^3.0.0", "buffer": "^5.1.0", @@ -6188,6 +6024,7 @@ "js-yaml": "^3.13.1", "mkdirp": "^0.5.1", "reflect-metadata": "^0.1.13", + "sha.js": "^2.4.11", "tslib": "^1.9.0", "xml2js": "^0.4.17", "yargonaut": "^1.1.2", @@ -6207,6 +6044,31 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -6218,9 +6080,9 @@ } }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -6231,13 +6093,13 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -6246,37 +6108,30 @@ } }, "typescript": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz", - "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==" + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true }, "uglify-js": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.2.tgz", - "integrity": "sha512-uhRwZcANNWVLrxLfNFEdltoPNhECUR3lc+UdJoG9CBpMcSnKyWA94tc3eAujB1GcMY5Uwq8ZMp4qWpxWYDQmaA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", + "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", "optional": true, "requires": { "commander": "~2.20.3", "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "optional": true - } } }, "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==" }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" }, "upper-case": { "version": "2.0.1", @@ -6327,15 +6182,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -6454,12 +6300,11 @@ } }, "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "requires": { "sax": ">=0.6.0", - "util.promisify": "~1.0.0", "xmlbuilder": "~11.0.0" } }, @@ -6469,9 +6314,9 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", + "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==" }, "xpath.js": { "version": "1.1.0", @@ -6494,12 +6339,12 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.2.tgz", + "integrity": "sha512-omakb0d7FjMo3R1D2EbTKVIk6dAVLRxFXdLZMEUToeAvuqgG/YuHMuQOZ5fgk+vQ8cx+cnGKwyg+8g8PNT0xQg==", "dev": true, "requires": { - "@babel/runtime": "^7.6.3" + "@babel/runtime": "^7.8.7" } }, "yargonaut": { @@ -6550,9 +6395,9 @@ } }, "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -6564,7 +6409,7 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" + "yargs-parser": "^18.1.1" }, "dependencies": { "ansi-regex": { @@ -6673,9 +6518,9 @@ } }, "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -6683,6 +6528,16 @@ } } }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", @@ -6694,12 +6549,40 @@ "yargs": "^13.3.0" }, "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -6712,9 +6595,9 @@ } }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -6726,25 +6609,16 @@ "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "yargs-parser": "^13.1.2" } } } }, "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", + "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==", + "dev": true } } } diff --git a/package.json b/package.json index 0cde93f..d61b666 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typeorm-model-generator", - "version": "0.4.0", + "version": "0.4.1", "description": "Generates models for TypeORM from existing databases.", "bin": "bin/typeorm-model-generator", "main": "./dist/src/library.js", @@ -27,44 +27,42 @@ "homepage": "https://github.com/Kononnable/typeorm-model-generator#readme", "dependencies": { "change-case": "^4.1.1", - "fs-extra": "^8.1.0", - "handlebars": "^4.5.3", - "inquirer": "^7.0.3", - "mssql": "^6.0.1", - "mysql": "^2.17.1", - "pg": "^7.17.0", + "fs-extra": "^9.0.0", + "handlebars": "^4.7.3", + "inquirer": "^7.1.0", + "mssql": "^6.2.0", + "mysql": "^2.18.1", + "pg": "^7.18.2", "pluralize": "^8.0.0", - "prettier": "^1.19.1", + "prettier": "^2.0.2", "reflect-metadata": "^0.1.13", "sqlite3": "^4.1.1", - "typeorm": "^0.2.22", - "typescript": "^3.7.4", - "yargs": "^15.1.0", - "yn": "^3.1.1" + "typeorm": "^0.2.24", + "yargs": "^15.3.1" }, "devDependencies": { - "@types/array.prototype.flatmap": "^1.2.0", - "@types/chai": "^4.2.7", + "@types/array.prototype.flatmap": "^1.2.1", + "@types/chai": "^4.2.11", "@types/chai-as-promised": "^7.1.2", "@types/chai-subset": "^1.3.3", - "@types/eslint": "^6.1.3", - "@types/fs-extra": "^8.0.1", + "@types/eslint": "^6.1.8", + "@types/fs-extra": "^8.1.0", "@types/handlebars": "^4.1.0", "@types/inquirer": "^6.5.0", - "@types/mocha": "^5.2.7", + "@types/mocha": "^7.0.2", "@types/mssql": "^6.0.0", - "@types/mysql": "^2.15.8", - "@types/node": "^13.1.4", - "@types/oracledb": "^4.1.1", - "@types/pg": "^7.14.1", + "@types/mysql": "^2.15.9", + "@types/node": "^13.9.3", + "@types/oracledb": "^4.2.0", + "@types/pg": "^7.14.3", "@types/pluralize": "0.0.29", - "@types/prettier": "^1.19.0", - "@types/sinon": "^7.5.1", + "@types/prettier": "^1.19.1", + "@types/sinon": "^7.5.2", "@types/sqlite3": "^3.1.6", - "@types/yargs": "^13.0.4", - "@typescript-eslint/eslint-plugin": "^2.15.0", - "@typescript-eslint/parser": "^2.15.0", - "@typescript-eslint/typescript-estree": "^2.15.0", + "@types/yargs": "^15.0.4", + "@typescript-eslint/eslint-plugin": "^2.25.0", + "@typescript-eslint/parser": "^2.25.0", + "@typescript-eslint/typescript-estree": "^2.25.0", "array.prototype.flatmap": "^1.2.3", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", @@ -72,18 +70,20 @@ "codecov": "^3.6.1", "dotenv": "^8.2.0", "eslint": "^6.8.0", - "eslint-config-airbnb-base": "^14.0.0", - "eslint-config-prettier": "^6.9.0", - "eslint-plugin-import": "^2.19.1", - "husky": "^4.0.1", - "lint-staged": "^9.5.0", - "mocha": "^7.0.0", + "eslint-config-airbnb-base": "^14.1.0", + "eslint-config-prettier": "^6.10.1", + "eslint-plugin-import": "^2.20.1", + "husky": "^4.2.3", + "lint-staged": "^10.0.9", + "mocha": "^7.1.1", "ncp": "^2.0.0", "nyc": "^15.0.0", - "rimraf": "^3.0.0", - "sinon": "^7.5.0", - "sinon-chai": "^3.4.0", - "ts-node": "^8.5.4" + "rimraf": "^3.0.2", + "sinon": "^9.0.1", + "sinon-chai": "^3.5.0", + "ts-node": "^8.8.1", + "typescript": "^3.8.3", + "yn": "^4.0.0" }, "husky": { "hooks": { diff --git a/src/IConnectionOptions.ts b/src/IConnectionOptions.ts index 5aef82d..b3299e3 100644 --- a/src/IConnectionOptions.ts +++ b/src/IConnectionOptions.ts @@ -29,7 +29,7 @@ export function getDefaultConnectionOptions(): IConnectionOptions { databaseType: undefined as any, schemaName: "", ssl: false, - skipTables: [] + skipTables: [], }; return connectionOptions; } diff --git a/src/IGenerationOptions.ts b/src/IGenerationOptions.ts index 684494d..13bb2d8 100644 --- a/src/IGenerationOptions.ts +++ b/src/IGenerationOptions.ts @@ -27,7 +27,7 @@ export default interface IGenerationOptions { export const eolConverter = { LF: "\n", - CRLF: "\r\n" + CRLF: "\r\n", }; export function getDefaultGenerationOptions(): IGenerationOptions { @@ -48,7 +48,7 @@ export function getDefaultGenerationOptions(): IGenerationOptions { strictMode: "none", skipSchema: false, indexFile: false, - exportType: "named" + exportType: "named", }; return generationOptions; } diff --git a/src/ModelCustomization.ts b/src/ModelCustomization.ts index befd219..5973f02 100644 --- a/src/ModelCustomization.ts +++ b/src/ModelCustomization.ts @@ -15,7 +15,7 @@ export default function modelCustomizationPhase( columnName: NamingStrategy.columnName, entityName: NamingStrategy.entityName, relationIdName: NamingStrategy.relationIdName, - relationName: NamingStrategy.relationName + relationName: NamingStrategy.relationName, }; if ( generationOptions.customNamingStrategyPath && @@ -87,19 +87,19 @@ export default function modelCustomizationPhase( function removeIndicesGeneratedByTypeorm(dbModel: Entity[]): Entity[] { // TODO: Support typeorm CustomNamingStrategy const namingStrategy = new DefaultNamingStrategy(); - dbModel.forEach(entity => { + dbModel.forEach((entity) => { entity.indices = entity.indices.filter( - v => + (v) => !( v.name.startsWith(`sqlite_autoindex_`) || (v.primary && v.name === "PRIMARY") ) ); const primaryColumns = entity.columns - .filter(v => v.primary) - .map(v => v.tscName); + .filter((v) => v.primary) + .map((v) => v.tscName); entity.indices = entity.indices.filter( - v => + (v) => !( v.primary && v.name === @@ -110,9 +110,9 @@ function removeIndicesGeneratedByTypeorm(dbModel: Entity[]): Entity[] { ) ); entity.relations - .filter(v => v.joinColumnOptions) - .forEach(rel => { - const columnNames = rel.joinColumnOptions!.map(v => v.name); + .filter((v) => v.joinColumnOptions) + .forEach((rel) => { + const columnNames = rel.joinColumnOptions!.map((v) => v.name); const idxName = namingStrategy.relationConstraintName( entity.tscName, columnNames @@ -122,20 +122,20 @@ function removeIndicesGeneratedByTypeorm(dbModel: Entity[]): Entity[] { columnNames ); entity.indices = entity.indices.filter( - v => v.name !== idxName && v.name !== fkName + (v) => v.name !== idxName && v.name !== fkName ); }); }); return dbModel; } function removeColumnsInRelation(dbModel: Entity[]): Entity[] { - dbModel.forEach(entity => { + dbModel.forEach((entity) => { entity.columns = entity.columns.filter( - col => + (col) => !col.isUsedInRelationAsOwner || col.isUsedInRelationAsReferenced || - entity.indices.some(idx => - idx.columns.some(v => v === col.tscName) + entity.indices.some((idx) => + idx.columns.some((v) => v === col.tscName) ) || col.primary ); @@ -149,8 +149,8 @@ function removeColumnDefaultProperties( if (!defaultValues) { return dbModel; } - dbModel.forEach(entity => { - entity.columns.forEach(column => { + dbModel.forEach((entity) => { + entity.columns.forEach((column) => { const defVal = defaultValues[column.tscType]; if (defVal) { if ( @@ -185,11 +185,11 @@ function removeColumnDefaultProperties( } function findFileImports(dbModel: Entity[]) { - dbModel.forEach(entity => { - entity.relations.forEach(relation => { + dbModel.forEach((entity) => { + entity.relations.forEach((relation) => { if ( relation.relatedTable !== entity.tscName && - !entity.fileImports.some(v => v === relation.relatedTable) + !entity.fileImports.some((v) => v === relation.relatedTable) ) { entity.fileImports.push(relation.relatedTable); } @@ -203,8 +203,8 @@ function addImportsAndGenerationOptions( generationOptions: IGenerationOptions ): Entity[] { dbModel = findFileImports(dbModel); - dbModel.forEach(entity => { - entity.relations.forEach(relation => { + dbModel.forEach((entity) => { + entity.relations.forEach((relation) => { if (generationOptions.lazy) { if (!relation.relationOptions) { relation.relationOptions = {}; @@ -237,11 +237,11 @@ function applyNamingStrategy( return retVal; function changeRelationIdNames(model: Entity[]): Entity[] { - model.forEach(entity => { - entity.relationIds.forEach(relationId => { + model.forEach((entity) => { + entity.relationIds.forEach((relationId) => { const oldName = relationId.fieldName; const relation = entity.relations.find( - v => v.fieldName === relationId.relationField + (v) => v.fieldName === relationId.relationField )!; let newName = namingStrategy.relationIdName( relationId, @@ -253,8 +253,8 @@ function applyNamingStrategy( entity, oldName ); - entity.indices.forEach(index => { - index.columns = index.columns.map(column2 => + entity.indices.forEach((index) => { + index.columns = index.columns.map((column2) => column2 === oldName ? newName : column2 ); }); @@ -266,8 +266,8 @@ function applyNamingStrategy( } function changeRelationNames(model: Entity[]): Entity[] { - model.forEach(entity => { - entity.relations.forEach(relation => { + model.forEach((entity) => { + entity.relations.forEach((relation) => { const oldName = relation.fieldName; let newName = namingStrategy.relationName(relation, entity); newName = TomgUtils.findNameForNewField( @@ -277,15 +277,15 @@ function applyNamingStrategy( ); const relatedEntity = model.find( - v => v.tscName === relation.relatedTable + (v) => v.tscName === relation.relatedTable )!; const relation2 = relatedEntity.relations.find( - v => v.fieldName === relation.relatedField + (v) => v.fieldName === relation.relatedField )!; entity.relationIds - .filter(v => v.relationField === oldName) - .forEach(v => { + .filter((v) => v.relationField === oldName) + .forEach((v) => { v.relationField = newName; }); @@ -293,8 +293,8 @@ function applyNamingStrategy( relation2.relatedField = newName; if (relation.relationOptions) { - entity.indices.forEach(ind => { - ind.columns.map(column2 => + entity.indices.forEach((ind) => { + ind.columns.map((column2) => column2 === oldName ? newName : column2 ); }); @@ -305,8 +305,8 @@ function applyNamingStrategy( } function changeColumnNames(model: Entity[]): Entity[] { - model.forEach(entity => { - entity.columns.forEach(column => { + model.forEach((entity) => { + entity.columns.forEach((column) => { const oldName = column.tscName; let newName = namingStrategy.columnName(column.tscName, column); newName = TomgUtils.findNameForNewField( @@ -314,8 +314,8 @@ function applyNamingStrategy( entity, oldName ); - entity.indices.forEach(index => { - index.columns = index.columns.map(column2 => + entity.indices.forEach((index) => { + index.columns = index.columns.map((column2) => column2 === oldName ? newName : column2 ); }); @@ -326,10 +326,10 @@ function applyNamingStrategy( return model; } function changeEntityNames(entities: Entity[]): Entity[] { - entities.forEach(entity => { + entities.forEach((entity) => { const newName = namingStrategy.entityName(entity.tscName, entity); - entities.forEach(entity2 => { - entity2.relations.forEach(relation => { + entities.forEach((entity2) => { + entity2.relations.forEach((relation) => { if (relation.relatedTable === entity.tscName) { relation.relatedTable = newName; } diff --git a/src/ModelGeneration.ts b/src/ModelGeneration.ts index af573e9..7709ff5 100644 --- a/src/ModelGeneration.ts +++ b/src/ModelGeneration.ts @@ -9,6 +9,11 @@ import IGenerationOptions, { eolConverter } from "./IGenerationOptions"; import { Entity } from "./models/Entity"; import { Relation } from "./models/Relation"; +const prettierOptions: Prettier.Options = { + parser: "typescript", + endOfLine: "auto", +}; + export default function modelGenerationPhase( connectionOptions: IConnectionOptions, generationOptions: IGenerationOptions, @@ -47,9 +52,9 @@ function generateModels( ); const entityTemplate = fs.readFileSync(entityTemplatePath, "UTF-8"); const entityCompliedTemplate = Handlebars.compile(entityTemplate, { - noEscape: true + noEscape: true, }); - databaseModel.forEach(element => { + databaseModel.forEach((element) => { let casedFileName = ""; switch (generationOptions.convertCaseFile) { case "camel": @@ -80,12 +85,20 @@ function generateModels( ) : rendered ); - const formatted = Prettier.format(withImportStatements, { - parser: "typescript" - }); + let formatted = ""; + try { + formatted = Prettier.format(withImportStatements, prettierOptions); + } catch (error) { + console.error( + "There were some problems with model generation for table: ", + element.sqlName + ); + console.error(error); + formatted = withImportStatements; + } fs.writeFileSync(resultFilePath, formatted, { encoding: "UTF-8", - flag: "w" + flag: "w", }); }); } @@ -98,12 +111,10 @@ function createIndexFile( const templatePath = path.resolve(__dirname, "templates", "index.mst"); const template = fs.readFileSync(templatePath, "UTF-8"); const compliedTemplate = Handlebars.compile(template, { - noEscape: true + noEscape: true, }); const rendered = compliedTemplate({ entities: databaseModel }); - const formatted = Prettier.format(rendered, { - parser: "typescript" - }); + const formatted = Prettier.format(rendered, prettierOptions); let fileName = "index"; switch (generationOptions.convertCaseFile) { case "camel": @@ -120,7 +131,7 @@ function createIndexFile( const resultFilePath = path.resolve(entitiesPath, `${fileName}.ts`); fs.writeFileSync(resultFilePath, formatted, { encoding: "UTF-8", - flag: "w" + flag: "w", }); } @@ -132,7 +143,7 @@ function removeUnusedImports(rendered: string) { .split(","); const restOfEntityDefinition = rendered.substring(closeBracketIndex); const distinctImports = imports.filter( - v => + (v) => restOfEntityDefinition.indexOf(`@${v}(`) !== -1 || (v === "BaseEntity" && restOfEntityDefinition.indexOf(v) !== -1) ); @@ -142,12 +153,12 @@ function removeUnusedImports(rendered: string) { } function createHandlebarsHelpers(generationOptions: IGenerationOptions): void { - Handlebars.registerHelper("json", context => { + Handlebars.registerHelper("json", (context) => { const json = JSON.stringify(context); const withoutQuotes = json.replace(/"([^(")"]+)":/g, "$1:"); return withoutQuotes.slice(1, withoutQuotes.length - 1); }); - Handlebars.registerHelper("toEntityName", str => { + Handlebars.registerHelper("toEntityName", (str) => { let retStr = ""; switch (generationOptions.convertCaseEntity) { case "camel": @@ -164,7 +175,7 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions): void { } return retStr; }); - Handlebars.registerHelper("toFileName", str => { + Handlebars.registerHelper("toFileName", (str) => { let retStr = ""; switch (generationOptions.convertCaseFile) { case "camel": @@ -189,7 +200,7 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions): void { ? `${generationOptions.propertyVisibility} ` : "" ); - Handlebars.registerHelper("toPropertyName", str => { + Handlebars.registerHelper("toPropertyName", (str) => { let retStr = ""; switch (generationOptions.convertCaseProperty) { case "camel": @@ -240,7 +251,7 @@ function createHandlebarsHelpers(generationOptions: IGenerationOptions): void { lt: (v1, v2) => v1 < v2, lte: (v1, v2) => v1 <= v2, ne: (v1, v2) => v1 !== v2, - or: (v1, v2) => v1 || v2 + or: (v1, v2) => v1 || v2, }); } @@ -248,14 +259,14 @@ function createTsConfigFile(outputPath: string): void { const templatePath = path.resolve(__dirname, "templates", "tsconfig.mst"); const template = fs.readFileSync(templatePath, "UTF-8"); const compliedTemplate = Handlebars.compile(template, { - noEscape: true + noEscape: true, }); const rendered = compliedTemplate({}); const formatted = Prettier.format(rendered, { parser: "json" }); const resultFilePath = path.resolve(outputPath, "tsconfig.json"); fs.writeFileSync(resultFilePath, formatted, { encoding: "UTF-8", - flag: "w" + flag: "w", }); } function createTypeOrmConfig( @@ -265,13 +276,13 @@ function createTypeOrmConfig( const templatePath = path.resolve(__dirname, "templates", "ormconfig.mst"); const template = fs.readFileSync(templatePath, "UTF-8"); const compliedTemplate = Handlebars.compile(template, { - noEscape: true + noEscape: true, }); const rendered = compliedTemplate(connectionOptions); const formatted = Prettier.format(rendered, { parser: "json" }); const resultFilePath = path.resolve(outputPath, "ormconfig.json"); fs.writeFileSync(resultFilePath, formatted, { encoding: "UTF-8", - flag: "w" + flag: "w", }); } diff --git a/src/Utils.ts b/src/Utils.ts index d121435..de32d35 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -33,17 +33,17 @@ export function findNameForNewField( let fieldName = _fieldName; const validNameCondition = () => (entity.columns.every( - v => + (v) => changeCase.camelCase(v.tscName) !== changeCase.camelCase(fieldName) ) && entity.relations.every( - v => + (v) => changeCase.camelCase(v.fieldName) !== changeCase.camelCase(fieldName) ) && entity.relationIds.every( - v => + (v) => changeCase.camelCase(v.fieldName) !== changeCase.camelCase(fieldName) )) || diff --git a/src/drivers/AbstractDriver.ts b/src/drivers/AbstractDriver.ts index 07a08f3..7db7feb 100644 --- a/src/drivers/AbstractDriver.ts +++ b/src/drivers/AbstractDriver.ts @@ -1,7 +1,7 @@ import { WithLengthColumnType, WithPrecisionColumnType, - WithWidthColumnType + WithWidthColumnType, } from "typeorm/driver/types/ColumnTypes"; import { JoinColumnOptions, RelationOptions } from "typeorm"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; @@ -27,7 +27,7 @@ export default abstract class AbstractDriver { "smallint", "mediumint", "int", - "bigint" + "bigint", ]; public ColumnTypesWithPrecision: WithPrecisionColumnType[] = [ @@ -48,7 +48,7 @@ export default abstract class AbstractDriver { "timestamp", "timestamp without time zone", "timestamp with time zone", - "timestamp with local time zone" + "timestamp with local time zone", ]; public ColumnTypesWithLength: WithLengthColumnType[] = [ @@ -64,7 +64,7 @@ export default abstract class AbstractDriver { "nvarchar2", "raw", "binary", - "varbinary" + "varbinary", ]; public abstract GetAllTablesQuery: ( @@ -82,42 +82,43 @@ export default abstract class AbstractDriver { public static FindManyToManyRelations(dbModel: Entity[]) { let retVal = dbModel; const manyToManyEntities = retVal.filter( - entity => + (entity) => entity.relations.length === 2 && entity.relations.every( - v => v.joinColumnOptions && v.relationType !== "ManyToMany" + (v) => + v.joinColumnOptions && v.relationType !== "ManyToMany" ) && entity.relations[0].relatedTable !== entity.relations[1].relatedTable && entity.relations[0].joinColumnOptions!.length === entity.relations[1].joinColumnOptions!.length && entity.columns.length === - entity.columns.filter(c => c.primary).length && + entity.columns.filter((c) => c.primary).length && entity.columns - .map(v => v.tscName) + .map((v) => v.tscName) .filter( - v => + (v) => !entity.relations[0] - .joinColumnOptions!.map(x => x.name) - .some(jc => jc === v) && + .joinColumnOptions!.map((x) => x.name) + .some((jc) => jc === v) && !entity.relations[1] - .joinColumnOptions!.map(x => x.name) - .some(jc => jc === v) + .joinColumnOptions!.map((x) => x.name) + .some((jc) => jc === v) ).length === 0 ); - manyToManyEntities.forEach(junctionEntity => { + manyToManyEntities.forEach((junctionEntity) => { const firstEntity = dbModel.find( - v => v.tscName === junctionEntity.relations[0].relatedTable + (v) => v.tscName === junctionEntity.relations[0].relatedTable )!; const secondEntity = dbModel.find( - v => v.tscName === junctionEntity.relations[1].relatedTable + (v) => v.tscName === junctionEntity.relations[1].relatedTable )!; const firstRelation = firstEntity.relations.find( - v => v.relatedTable === junctionEntity.tscName + (v) => v.relatedTable === junctionEntity.tscName )!; const secondRelation = secondEntity.relations.find( - v => v.relatedTable === junctionEntity.tscName + (v) => v.relatedTable === junctionEntity.tscName )!; firstRelation.relationType = "ManyToMany"; @@ -143,7 +144,7 @@ export default abstract class AbstractDriver { return { referencedColumnName: v.referencedColumnName, name: junctionEntity.relations[0] - .joinColumnOptions![i].name + .joinColumnOptions![i].name, }; } ), @@ -152,10 +153,10 @@ export default abstract class AbstractDriver { return { referencedColumnName: v.referencedColumnName, name: junctionEntity.relations[1] - .joinColumnOptions![i].name + .joinColumnOptions![i].name, }; } - ) + ), }; if (junctionEntity.database) { firstRelation.joinTableOptions.database = @@ -169,7 +170,7 @@ export default abstract class AbstractDriver { secondRelation.relationOptions = undefined; firstRelation.joinColumnOptions = undefined; secondRelation.joinColumnOptions = undefined; - retVal = retVal.filter(ent => { + retVal = retVal.filter((ent) => { return ent.tscName !== junctionEntity.tscName; }); }); @@ -225,7 +226,7 @@ export default abstract class AbstractDriver { tableNames ); const ret: Entity[] = [] as Entity[]; - response.forEach(val => { + response.forEach((val) => { ret.push({ columns: [], indices: [], @@ -235,7 +236,7 @@ export default abstract class AbstractDriver { tscName: val.TABLE_NAME, database: dbNames.includes(",") ? val.DB_NAME : "", schema: val.TABLE_SCHEMA, - fileImports: [] + fileImports: [], }); }); return ret; @@ -246,9 +247,9 @@ export default abstract class AbstractDriver { entities: Entity[], generationOptions: IGenerationOptions ) { - relationsTemp.forEach(relationTmp => { + relationsTemp.forEach((relationTmp) => { const ownerEntity = entities.find( - entity => entity.tscName === relationTmp.ownerTable.tscName + (entity) => entity.tscName === relationTmp.ownerTable.tscName ); if (!ownerEntity) { TomgUtils.LogError( @@ -257,7 +258,7 @@ export default abstract class AbstractDriver { return; } const referencedEntity = entities.find( - entity => entity.tscName === relationTmp.relatedTable.tscName + (entity) => entity.tscName === relationTmp.relatedTable.tscName ); if (!referencedEntity) { TomgUtils.LogError( @@ -274,7 +275,7 @@ export default abstract class AbstractDriver { relationColumnIndex++ ) { const ownerColumn = ownerEntity.columns.find( - column => + (column) => column.tscName === relationTmp.ownerColumns[relationColumnIndex] ); @@ -285,7 +286,7 @@ export default abstract class AbstractDriver { return; } const relatedColumn = referencedEntity.columns.find( - column => + (column) => column.tscName === relationTmp.relatedColumns[relationColumnIndex] ); @@ -301,19 +302,19 @@ export default abstract class AbstractDriver { let isOneToMany: boolean; isOneToMany = false; const index = ownerEntity.indices.find( - ind => + (ind) => ind.options.unique && ind.columns.length === ownerColumns.length && - ownerColumns.every(ownerColumn => - ind.columns.some(col => col === ownerColumn.tscName) + ownerColumns.every((ownerColumn) => + ind.columns.some((col) => col === ownerColumn.tscName) ) ); isOneToMany = !index; - ownerColumns.forEach(column => { + ownerColumns.forEach((column) => { column.isUsedInRelationAsOwner = true; }); - relatedColumns.forEach(column => { + relatedColumns.forEach((column) => { column.isUsedInRelationAsReferenced = true; }); let fieldName = ""; @@ -331,7 +332,7 @@ export default abstract class AbstractDriver { const relationOptions: RelationOptions = { onDelete: relationTmp.onDelete, - onUpdate: relationTmp.onUpdate + onUpdate: relationTmp.onUpdate, }; const ownerRelation: Relation = { @@ -343,12 +344,12 @@ export default abstract class AbstractDriver { joinColumnOptions: relationTmp.ownerColumns.map((v, idx) => { const retVal: Required = { name: v, - referencedColumnName: relationTmp.relatedColumns[idx] + referencedColumnName: relationTmp.relatedColumns[idx], }; return retVal; }), relatedTable: relationTmp.relatedTable.tscName, - relationType: isOneToMany ? "ManyToOne" : "OneToOne" + relationType: isOneToMany ? "ManyToOne" : "OneToOne", }; if (JSON.stringify(relationOptions) !== "{}") { ownerRelation.relationOptions = relationOptions; @@ -357,7 +358,7 @@ export default abstract class AbstractDriver { fieldName: ownerRelation.relatedField, relatedField: ownerRelation.fieldName, relatedTable: relationTmp.ownerTable.tscName, - relationType: isOneToMany ? "OneToMany" : "OneToOne" + relationType: isOneToMany ? "OneToMany" : "OneToOne", }; ownerEntity.relations.push(ownerRelation); @@ -383,7 +384,7 @@ export default abstract class AbstractDriver { ownerEntity.relationIds.push({ fieldName: relationIdFieldName, fieldType, - relationField: ownerRelation.fieldName + relationField: ownerRelation.fieldName, }); // TODO: RelationId on ManyToMany } @@ -411,17 +412,17 @@ export default abstract class AbstractDriver { ): Promise; public static FindPrimaryColumnsFromIndexes(dbModel: Entity[]) { - dbModel.forEach(entity => { - const primaryIndex = entity.indices.find(v => v.primary); + dbModel.forEach((entity) => { + const primaryIndex = entity.indices.find((v) => v.primary); entity.columns .filter( - col => + (col) => primaryIndex && primaryIndex.columns.some( - cIndex => cIndex === col.tscName + (cIndex) => cIndex === col.tscName ) ) - .forEach(col => { + .forEach((col) => { // eslint-disable-next-line no-param-reassign col.primary = true; if ( @@ -432,7 +433,7 @@ export default abstract class AbstractDriver { } }); if ( - !entity.columns.some(v => { + !entity.columns.some((v) => { return !!v.primary; }) ) { diff --git a/src/drivers/MssqlDriver.ts b/src/drivers/MssqlDriver.ts index bc5bde6..329a848 100644 --- a/src/drivers/MssqlDriver.ts +++ b/src/drivers/MssqlDriver.ts @@ -1,4 +1,4 @@ -import * as MSSQL from "mssql"; +import type * as MSSQL from "mssql"; import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/sqlserver/SqlServerDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; @@ -13,7 +13,7 @@ import { RelationInternal } from "../models/RelationInternal"; export default class MssqlDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.SqlServerDriver({ - options: { replication: undefined } as ConnectionOptions + options: { replication: undefined } as ConnectionOptions, } as any).dataTypeDefaults; public readonly standardPort = 1433; @@ -22,14 +22,27 @@ export default class MssqlDriver extends AbstractDriver { public readonly standardUser = "sa"; + private MSSQL: typeof MSSQL; + private Connection: MSSQL.ConnectionPool; + public constructor() { + super(); + try { + // eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-unresolved + this.MSSQL = require("mssql"); + } catch (error) { + TomgUtils.LogError("", false, error); + throw error; + } + } + public GetAllTablesQuery = async ( schema: string, dbNames: string, tableNames: string[] ) => { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); const tableCondition = tableNames.length > 0 ? ` AND NOT TABLE_NAME IN ('${tableNames.join("','")}')` @@ -54,7 +67,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG schema: string, dbNames: string ): Promise { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); const response: { TABLE_NAME: string; COLUMN_NAME: string; @@ -86,18 +99,18 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG )}) order by ordinal_position`) ).recordset; - entities.forEach(ent => { + entities.forEach((ent) => { response - .filter(filterVal => { + .filter((filterVal) => { return ( filterVal.TABLE_NAME === ent.tscName && filterVal.TABLE_SCHEMA === ent.schema ); }) - .forEach(resp => { + .forEach((resp) => { const tscName = resp.COLUMN_NAME; const options: Column["options"] = { - name: resp.COLUMN_NAME + name: resp.COLUMN_NAME, }; if (resp.IS_NULLABLE === "YES") options.nullable = true; if (resp.IsUnique === 1) options.unique = true; @@ -217,7 +230,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG if ( this.ColumnTypesWithPrecision.some( - v => v === columnType + (v) => v === columnType ) ) { if (resp.NUMERIC_PRECISION !== null) { @@ -228,7 +241,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG } } if ( - this.ColumnTypesWithLength.some(v => v === columnType) + this.ColumnTypesWithLength.some((v) => v === columnType) ) { options.length = resp.CHARACTER_MAXIMUM_LENGTH > 0 @@ -241,7 +254,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG default: defaultValue, options, tscName, - tscType + tscType, }); }); }); @@ -253,7 +266,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG schema: string, dbNames: string ): Promise { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); const response: { TableName: string; TableSchema: string; @@ -263,8 +276,10 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG is_primary_key: boolean; }[] = []; await Promise.all( - dbNames.split(",").map(async dbName => { - await this.UseDB(dbName); + dbNames.split(",").map(async (dbName) => { + if (dbNames.length > 1) { + await this.UseDB(dbName); + } const resp: { TableName: string; TableSchema: string; @@ -299,25 +314,25 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG }) ); - entities.forEach(ent => { + entities.forEach((ent) => { const entityIndices = response.filter( - filterVal => + (filterVal) => filterVal.TableName === ent.tscName && filterVal.TableSchema === ent.schema ); - const indexNames = new Set(entityIndices.map(v => v.IndexName)); - indexNames.forEach(indexName => { + const indexNames = new Set(entityIndices.map((v) => v.IndexName)); + indexNames.forEach((indexName) => { const records = entityIndices.filter( - v => v.IndexName === indexName + (v) => v.IndexName === indexName ); const indexInfo: Index = { columns: [], options: {}, - name: records[0].IndexName + name: records[0].IndexName, }; if (records[0].is_primary_key) indexInfo.primary = true; if (records[0].is_unique) indexInfo.options.unique = true; - records.forEach(record => { + records.forEach((record) => { indexInfo.columns.push(record.ColumnName); }); ent.indices.push(indexInfo); @@ -333,7 +348,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG dbNames: string, generationOptions: IGenerationOptions ): Promise { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); const response: { TableWithForeignKey: string; FK_PartNo: number; @@ -345,8 +360,10 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG objectId: number; }[] = []; await Promise.all( - dbNames.split(",").map(async dbName => { - await this.UseDB(dbName); + dbNames.split(",").map(async (dbName) => { + if (dbNames.length > 1) { + await this.UseDB(dbName); + } const resp: { TableWithForeignKey: string; FK_PartNo: number; @@ -389,15 +406,15 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG }) ); const relationsTemp: RelationInternal[] = [] as RelationInternal[]; - const relationKeys = new Set(response.map(v => v.objectId)); + const relationKeys = new Set(response.map((v) => v.objectId)); - relationKeys.forEach(relationId => { - const rows = response.filter(v => v.objectId === relationId); + relationKeys.forEach((relationId) => { + const rows = response.filter((v) => v.objectId === relationId); const ownerTable = entities.find( - v => v.sqlName === rows[0].TableWithForeignKey + (v) => v.sqlName === rows[0].TableWithForeignKey ); const relatedTable = entities.find( - v => v.sqlName === rows[0].TableReferenced + (v) => v.sqlName === rows[0].TableReferenced ); if (!ownerTable || !relatedTable) { TomgUtils.LogError( @@ -410,7 +427,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG ownerColumns: [], relatedColumns: [], ownerTable, - relatedTable + relatedTable, }; switch (rows[0].onDelete) { case "NO_ACTION": @@ -432,7 +449,7 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG internal.onUpdate = rows[0].onUpdate; break; } - rows.forEach(row => { + rows.forEach((row) => { internal.ownerColumns.push(row.ForeignKeyColumn); internal.relatedColumns.push(row.ForeignKeyColumnReferenced); }); @@ -459,17 +476,17 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG database: databaseName, options: { appName: "typeorm-model-generator", - encrypt: connectionOptons.ssl + encrypt: connectionOptons.ssl, }, password: connectionOptons.password, port: connectionOptons.port, requestTimeout: 60 * 60 * 1000, server: connectionOptons.host, - user: connectionOptons.user + user: connectionOptons.user, }; const promise = new Promise((resolve, reject) => { - this.Connection = new MSSQL.ConnectionPool(config, err => { + this.Connection = new this.MSSQL.ConnectionPool(config, (err) => { if (!err) { resolve(true); } else { @@ -487,22 +504,22 @@ WHERE TABLE_TYPE='BASE TABLE' and TABLE_SCHEMA in (${schema}) AND TABLE_CATALOG } public async CreateDB(dbName: string) { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); await request.query(`CREATE DATABASE ${dbName}; `); } public async UseDB(dbName: string) { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); await request.query(`USE ${dbName}; `); } public async DropDB(dbName: string) { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); await request.query(`DROP DATABASE ${dbName}; `); } public async CheckIfDBExists(dbName: string): Promise { - const request = new MSSQL.Request(this.Connection); + const request = new this.MSSQL.Request(this.Connection); const resp = await request.query( `SELECT name FROM master.sys.databases WHERE name = N'${dbName}' ` ); diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index 32ac292..976cca4 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -1,4 +1,4 @@ -import * as MYSQL from "mysql"; +import type * as MYSQL from "mysql"; import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/mysql/MysqlDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; @@ -13,7 +13,7 @@ import IGenerationOptions from "../IGenerationOptions"; export default class MysqlDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.MysqlDriver({ - options: { replication: undefined } as ConnectionOptions + options: { replication: undefined } as ConnectionOptions, } as any).dataTypeDefaults; public readonly EngineName: string = "MySQL"; @@ -24,8 +24,21 @@ export default class MysqlDriver extends AbstractDriver { public readonly standardSchema = ""; + private MYSQL: typeof MYSQL; + private Connection: MYSQL.Connection; + public constructor() { + super(); + try { + // eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-unresolved + this.MYSQL = require("mysql"); + } catch (error) { + TomgUtils.LogError("", false, error); + throw error; + } + } + public GetAllTablesQuery = async ( schema: string, dbNames: string, @@ -65,21 +78,22 @@ export default class MysqlDriver extends AbstractDriver { IsIdentity: number; COLUMN_TYPE: string; COLUMN_KEY: string; + COLUMN_COMMENT: string; }>(`SELECT TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE, - CASE WHEN EXTRA like '%auto_increment%' THEN 1 ELSE 0 END IsIdentity, COLUMN_TYPE, COLUMN_KEY + CASE WHEN EXTRA like '%auto_increment%' THEN 1 ELSE 0 END IsIdentity, COLUMN_TYPE, COLUMN_KEY, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA IN (${MysqlDriver.escapeCommaSeparatedList( dbNames )}) order by ordinal_position`); - entities.forEach(ent => { + entities.forEach((ent) => { response - .filter(filterVal => filterVal.TABLE_NAME === ent.tscName) - .forEach(resp => { + .filter((filterVal) => filterVal.TABLE_NAME === ent.tscName) + .forEach((resp) => { const tscName = resp.COLUMN_NAME; let tscType = ""; const options: Column["options"] = { - name: resp.COLUMN_NAME + name: resp.COLUMN_NAME, }; const generated = resp.IsIdentity === 1 ? true : undefined; const defaultValue = MysqlDriver.ReturnDefaultValueFunction( @@ -89,6 +103,8 @@ export default class MysqlDriver extends AbstractDriver { let columnType = resp.DATA_TYPE; if (resp.IS_NULLABLE === "YES") options.nullable = true; if (resp.COLUMN_KEY === "UNI") options.unique = true; + if (resp.COLUMN_COMMENT) + options.comment = resp.COLUMN_COMMENT; if (resp.COLUMN_TYPE.endsWith(" unsigned")) options.unsigned = true; switch (resp.DATA_TYPE) { @@ -245,7 +261,7 @@ export default class MysqlDriver extends AbstractDriver { } if ( this.ColumnTypesWithPrecision.some( - v => v === columnType + (v) => v === columnType ) ) { if (resp.NUMERIC_PRECISION !== null) { @@ -256,7 +272,7 @@ export default class MysqlDriver extends AbstractDriver { } } if ( - this.ColumnTypesWithLength.some(v => v === columnType) + this.ColumnTypesWithLength.some((v) => v === columnType) ) { options.length = resp.CHARACTER_MAXIMUM_LENGTH > 0 @@ -265,7 +281,7 @@ export default class MysqlDriver extends AbstractDriver { } if ( this.ColumnTypesWithWidth.some( - v => v === columnType && tscType !== "boolean" + (v) => v === columnType && tscType !== "boolean" ) ) { options.width = @@ -280,7 +296,7 @@ export default class MysqlDriver extends AbstractDriver { default: defaultValue, options, tscName, - tscType + tscType, }); }); }); @@ -304,25 +320,25 @@ export default class MysqlDriver extends AbstractDriver { WHERE table_schema IN (${MysqlDriver.escapeCommaSeparatedList( dbNames )})`); - entities.forEach(ent => { + entities.forEach((ent) => { const entityIndices = response.filter( - filterVal => filterVal.TableName === ent.tscName + (filterVal) => filterVal.TableName === ent.tscName ); - const indexNames = new Set(entityIndices.map(v => v.IndexName)); - indexNames.forEach(indexName => { + const indexNames = new Set(entityIndices.map((v) => v.IndexName)); + indexNames.forEach((indexName) => { const records = entityIndices.filter( - v => v.IndexName === indexName + (v) => v.IndexName === indexName ); const indexInfo: Index = { name: indexName, columns: [], - options: {} + options: {}, }; if (records[0].is_primary_key === 1) indexInfo.primary = true; if (records[0].is_unique === 1) indexInfo.options.unique = true; - records.forEach(record => { + records.forEach((record) => { indexInfo.columns.push(record.ColumnName); }); ent.indices.push(indexInfo); @@ -366,15 +382,15 @@ export default class MysqlDriver extends AbstractDriver { AND CU.REFERENCED_TABLE_NAME IS NOT NULL; `); const relationsTemp: RelationInternal[] = [] as RelationInternal[]; - const relationKeys = new Set(response.map(v => v.object_id)); + const relationKeys = new Set(response.map((v) => v.object_id)); - relationKeys.forEach(relationId => { - const rows = response.filter(v => v.object_id === relationId); + relationKeys.forEach((relationId) => { + const rows = response.filter((v) => v.object_id === relationId); const ownerTable = entities.find( - v => v.sqlName === rows[0].TableWithForeignKey + (v) => v.sqlName === rows[0].TableWithForeignKey ); const relatedTable = entities.find( - v => v.sqlName === rows[0].TableReferenced + (v) => v.sqlName === rows[0].TableReferenced ); if (!ownerTable || !relatedTable) { @@ -388,7 +404,7 @@ export default class MysqlDriver extends AbstractDriver { ownerColumns: [], relatedColumns: [], ownerTable, - relatedTable + relatedTable, }; if (rows[0].onDelete !== "NO_ACTION") { internal.onDelete = rows[0].onDelete; @@ -396,7 +412,7 @@ export default class MysqlDriver extends AbstractDriver { if (rows[0].onUpdate !== "NO_ACTION") { internal.onUpdate = rows[0].onUpdate; } - rows.forEach(row => { + rows.forEach((row) => { internal.ownerColumns.push(row.ForeignKeyColumn); internal.relatedColumns.push(row.ForeignKeyColumnReferenced); }); @@ -413,12 +429,12 @@ export default class MysqlDriver extends AbstractDriver { public async DisconnectFromServer() { const promise = new Promise((resolve, reject) => { - this.Connection.end(err => { + this.Connection.end((err) => { if (!err) { resolve(true); } else { TomgUtils.LogError( - `Error disconnecting to ${this.EngineName} Server.`, + `Error disconnecting from ${this.EngineName} Server.`, false, err.message ); @@ -441,10 +457,10 @@ export default class MysqlDriver extends AbstractDriver { password: connectionOptons.password, port: connectionOptons.port, ssl: { - rejectUnauthorized: false + rejectUnauthorized: false, }, timeout: 60 * 60 * 1000, - user: connectionOptons.user + user: connectionOptons.user, }; } else { config = { @@ -453,14 +469,14 @@ export default class MysqlDriver extends AbstractDriver { password: connectionOptons.password, port: connectionOptons.port, timeout: 60 * 60 * 1000, - user: connectionOptons.user + user: connectionOptons.user, }; } const promise = new Promise((resolve, reject) => { - this.Connection = MYSQL.createConnection(config); + this.Connection = this.MYSQL.createConnection(config); - this.Connection.connect(err => { + this.Connection.connect((err) => { if (!err) { resolve(true); } else { @@ -499,10 +515,10 @@ export default class MysqlDriver extends AbstractDriver { const query = this.Connection.query(sql); const stream = query.stream({}); const promise = new Promise((resolve, reject) => { - stream.on("data", chunk => { + stream.on("data", (chunk) => { ret.push((chunk as unknown) as T); }); - stream.on("error", err => reject(err)); + stream.on("error", (err) => reject(err)); stream.on("end", () => resolve(true)); }); await promise; diff --git a/src/drivers/OracleDriver.ts b/src/drivers/OracleDriver.ts index 0c75678..2282887 100644 --- a/src/drivers/OracleDriver.ts +++ b/src/drivers/OracleDriver.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line import/no-extraneous-dependencies, import/no-unresolved +import type * as Oracle from "oracledb"; import * as TypeormDriver from "typeorm/driver/oracle/OracleDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; import * as TomgUtils from "../Utils"; @@ -11,7 +13,7 @@ import { RelationInternal } from "../models/RelationInternal"; export default class OracleDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.OracleDriver({ - options: undefined + options: undefined, } as any).dataTypeDefaults; public readonly standardPort = 1521; @@ -20,16 +22,16 @@ export default class OracleDriver extends AbstractDriver { public readonly standardSchema = ""; - public Oracle: any; + private Oracle: typeof Oracle; - private Connection: any /* Oracle.IConnection */; + private Connection: Oracle.Connection; public constructor() { super(); try { // eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-unresolved this.Oracle = require("oracledb"); - this.Oracle.outFormat = this.Oracle.OBJECT; + this.Oracle.outFormat = (this.Oracle as any).OBJECT; } catch (error) { TomgUtils.LogError("", false, error); throw error; @@ -45,12 +47,12 @@ export default class OracleDriver extends AbstractDriver { tableNames.length > 0 ? ` AND NOT TABLE_NAME IN ('${tableNames.join("','")}')` : ""; - const response: { - TABLE_SCHEMA: string; - TABLE_NAME: string; - DB_NAME: string; - }[] = ( - await this.Connection.execute( + const response = ( + await this.Connection.execute<{ + TABLE_SCHEMA: string; + TABLE_NAME: string; + DB_NAME: string; + }>( `SELECT NULL AS TABLE_SCHEMA, TABLE_NAME, NULL AS DB_NAME FROM all_tables WHERE owner = (select user from dual) ${tableCondition}` ) ).rows!; @@ -58,32 +60,31 @@ export default class OracleDriver extends AbstractDriver { }; public async GetCoulmnsFromEntity(entities: Entity[]): Promise { - const response: { - TABLE_NAME: string; - COLUMN_NAME: string; - DATA_DEFAULT: string; - NULLABLE: string; - DATA_TYPE: string; - DATA_LENGTH: number; - DATA_PRECISION: number; - DATA_SCALE: number; - IDENTITY_COLUMN: string; // doesn't exist in old oracle versions (#195) - IS_UNIQUE: number; - }[] = ( - await this.Connection - .execute(`SELECT utc.*, (select count(*) from USER_CONS_COLUMNS ucc + const response = ( + await this.Connection.execute<{ + TABLE_NAME: string; + COLUMN_NAME: string; + DATA_DEFAULT: string; + NULLABLE: string; + DATA_TYPE: string; + DATA_LENGTH: number; + DATA_PRECISION: number; + DATA_SCALE: number; + IDENTITY_COLUMN: string; // doesn't exist in old oracle versions (#195) + IS_UNIQUE: number; + }>(`SELECT utc.*, (select count(*) from USER_CONS_COLUMNS ucc JOIN USER_CONSTRAINTS uc ON uc.CONSTRAINT_NAME = ucc.CONSTRAINT_NAME and uc.CONSTRAINT_TYPE='U' where ucc.column_name = utc.COLUMN_NAME AND ucc.table_name = utc.TABLE_NAME) IS_UNIQUE FROM USER_TAB_COLUMNS utc`) ).rows!; - entities.forEach(ent => { + entities.forEach((ent) => { response - .filter(filterVal => filterVal.TABLE_NAME === ent.tscName) - .forEach(resp => { + .filter((filterVal) => filterVal.TABLE_NAME === ent.tscName) + .forEach((resp) => { const tscName = resp.COLUMN_NAME; const options: Column["options"] = { - name: resp.COLUMN_NAME + name: resp.COLUMN_NAME, }; if (resp.NULLABLE === "Y") options.nullable = true; if (resp.IS_UNIQUE > 0) options.unique = true; @@ -195,7 +196,7 @@ export default class OracleDriver extends AbstractDriver { } if ( this.ColumnTypesWithPrecision.some( - v => v === columnType + (v) => v === columnType ) ) { if (resp.DATA_PRECISION !== null) { @@ -206,7 +207,7 @@ export default class OracleDriver extends AbstractDriver { } } if ( - this.ColumnTypesWithLength.some(v => v === columnType) + this.ColumnTypesWithLength.some((v) => v === columnType) ) { options.length = resp.DATA_LENGTH > 0 ? resp.DATA_LENGTH : undefined; @@ -218,7 +219,7 @@ export default class OracleDriver extends AbstractDriver { default: defaultValue, options, tscName, - tscType + tscType, }); }); }); @@ -226,39 +227,38 @@ export default class OracleDriver extends AbstractDriver { } public async GetIndexesFromEntity(entities: Entity[]): Promise { - const response: { - COLUMN_NAME: string; - TABLE_NAME: string; - INDEX_NAME: string; - UNIQUENESS: string; - ISPRIMARYKEY: number; - }[] = ( - await this.Connection - .execute(`SELECT ind.TABLE_NAME, ind.INDEX_NAME, col.COLUMN_NAME,ind.UNIQUENESS, CASE WHEN uc.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END ISPRIMARYKEY + const response = ( + await this.Connection.execute<{ + COLUMN_NAME: string; + TABLE_NAME: string; + INDEX_NAME: string; + UNIQUENESS: string; + ISPRIMARYKEY: number; + }>(`SELECT ind.TABLE_NAME, ind.INDEX_NAME, col.COLUMN_NAME,ind.UNIQUENESS, CASE WHEN uc.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END ISPRIMARYKEY FROM USER_INDEXES ind JOIN USER_IND_COLUMNS col ON ind.INDEX_NAME=col.INDEX_NAME LEFT JOIN USER_CONSTRAINTS uc ON uc.INDEX_NAME = ind.INDEX_NAME ORDER BY col.INDEX_NAME ASC ,col.COLUMN_POSITION ASC`) ).rows!; - entities.forEach(ent => { + entities.forEach((ent) => { const entityIndices = response.filter( - filterVal => filterVal.TABLE_NAME === ent.tscName + (filterVal) => filterVal.TABLE_NAME === ent.tscName ); - const indexNames = new Set(entityIndices.map(v => v.INDEX_NAME)); - indexNames.forEach(indexName => { + const indexNames = new Set(entityIndices.map((v) => v.INDEX_NAME)); + indexNames.forEach((indexName) => { const records = entityIndices.filter( - v => v.INDEX_NAME === indexName + (v) => v.INDEX_NAME === indexName ); const indexInfo: Index = { columns: [], options: {}, - name: records[0].INDEX_NAME + name: records[0].INDEX_NAME, }; if (records[0].ISPRIMARYKEY === 1) indexInfo.primary = true; if (records[0].UNIQUENESS === "UNIQUE") indexInfo.options.unique = true; - records.forEach(record => { + records.forEach((record) => { indexInfo.columns.push(record.COLUMN_NAME); }); ent.indices.push(indexInfo); @@ -274,17 +274,16 @@ export default class OracleDriver extends AbstractDriver { dbNames: string, generationOptions: IGenerationOptions ): Promise { - const response: { - OWNER_TABLE_NAME: string; - OWNER_POSITION: string; - OWNER_COLUMN_NAME: string; - CHILD_TABLE_NAME: string; - CHILD_COLUMN_NAME: string; - DELETE_RULE: "RESTRICT" | "CASCADE" | "SET NULL" | "NO ACTION"; - CONSTRAINT_NAME: string; - }[] = ( - await this.Connection - .execute(`select owner.TABLE_NAME OWNER_TABLE_NAME,ownCol.POSITION OWNER_POSITION,ownCol.COLUMN_NAME OWNER_COLUMN_NAME, + const response = ( + await this.Connection.execute<{ + OWNER_TABLE_NAME: string; + OWNER_POSITION: string; + OWNER_COLUMN_NAME: string; + CHILD_TABLE_NAME: string; + CHILD_COLUMN_NAME: string; + DELETE_RULE: "RESTRICT" | "CASCADE" | "SET NULL" | "NO ACTION"; + CONSTRAINT_NAME: string; + }>(`select owner.TABLE_NAME OWNER_TABLE_NAME,ownCol.POSITION OWNER_POSITION,ownCol.COLUMN_NAME OWNER_COLUMN_NAME, child.TABLE_NAME CHILD_TABLE_NAME ,childCol.COLUMN_NAME CHILD_COLUMN_NAME, owner.DELETE_RULE, owner.CONSTRAINT_NAME @@ -296,15 +295,17 @@ export default class OracleDriver extends AbstractDriver { ).rows!; const relationsTemp: RelationInternal[] = [] as RelationInternal[]; - const relationKeys = new Set(response.map(v => v.CONSTRAINT_NAME)); + const relationKeys = new Set(response.map((v) => v.CONSTRAINT_NAME)); - relationKeys.forEach(relationId => { - const rows = response.filter(v => v.CONSTRAINT_NAME === relationId); + relationKeys.forEach((relationId) => { + const rows = response.filter( + (v) => v.CONSTRAINT_NAME === relationId + ); const ownerTable = entities.find( - v => v.sqlName === rows[0].OWNER_TABLE_NAME + (v) => v.sqlName === rows[0].OWNER_TABLE_NAME ); const relatedTable = entities.find( - v => v.sqlName === rows[0].CHILD_TABLE_NAME + (v) => v.sqlName === rows[0].CHILD_TABLE_NAME ); if (!ownerTable || !relatedTable) { @@ -318,12 +319,12 @@ export default class OracleDriver extends AbstractDriver { ownerColumns: [], relatedColumns: [], ownerTable, - relatedTable + relatedTable, }; if (rows[0].DELETE_RULE !== "NO ACTION") { internal.onDelete = rows[0].DELETE_RULE; } - rows.forEach(row => { + rows.forEach((row) => { internal.ownerColumns.push(row.OWNER_COLUMN_NAME); internal.relatedColumns.push(row.CHILD_COLUMN_NAME); }); @@ -345,21 +346,21 @@ export default class OracleDriver extends AbstractDriver { } public async ConnectToServer(connectionOptions: IConnectionOptions) { - let config: any; + let config: Oracle.ConnectionAttributes; if (connectionOptions.user === String(process.env.ORACLE_UsernameSys)) { - config /* Oracle.IConnectionAttributes */ = { + config = { connectString: `${connectionOptions.host}:${connectionOptions.port}/${connectionOptions.databaseName}`, externalAuth: connectionOptions.ssl, password: connectionOptions.password, privilege: this.Oracle.SYSDBA, - user: connectionOptions.user + user: connectionOptions.user, }; } else { - config /* Oracle.IConnectionAttributes */ = { + config = { connectString: `${connectionOptions.host}:${connectionOptions.port}/${connectionOptions.databaseName}`, externalAuth: connectionOptions.ssl, password: connectionOptions.password, - user: connectionOptions.user + user: connectionOptions.user, }; } const promise = new Promise((resolve, reject) => { @@ -400,16 +401,16 @@ export default class OracleDriver extends AbstractDriver { } public async CheckIfDBExists(dbName: string): Promise { - const x = await this.Connection.execute( + const { rows } = await this.Connection.execute( `select count(*) as CNT from dba_users where username='${dbName.toUpperCase()}'` ); - return x.rows[0][0] > 0 || x.rows[0].CNT; + return rows![0][0] > 0 || rows![0].CNT; } private static ReturnDefaultValueFunction( defVal: string | null ): string | undefined { - let defaultVal = defVal; + let defaultVal = defVal?.trim(); if (!defaultVal) { return undefined; } diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index ca26e93..a882c1b 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -1,4 +1,4 @@ -import * as PG from "pg"; +import type * as PG from "pg"; import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/postgres/PostgresDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; @@ -13,7 +13,7 @@ import { RelationInternal } from "../models/RelationInternal"; export default class PostgresDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.PostgresDriver({ - options: { replication: undefined } as ConnectionOptions + options: { replication: undefined } as ConnectionOptions, } as any).dataTypeDefaults; public readonly standardPort = 5432; @@ -22,8 +22,21 @@ export default class PostgresDriver extends AbstractDriver { public readonly standardSchema = "public"; + private PG: typeof PG; + private Connection: PG.Client; + public constructor() { + super(); + try { + // eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-unresolved + this.PG = require("pg"); + } catch (error) { + TomgUtils.LogError("", false, error); + throw error; + } + } + public GetAllTablesQuery = async ( schema: string, dbNames: string, @@ -87,13 +100,13 @@ export default class PostgresDriver extends AbstractDriver { where table_schema in (${schema}) order by ordinal_position`) ).rows; - entities.forEach(ent => { + entities.forEach((ent) => { response - .filter(filterVal => filterVal.table_name === ent.tscName) - .forEach(resp => { + .filter((filterVal) => filterVal.table_name === ent.tscName) + .forEach((resp) => { const tscName = resp.column_name; const options: Column["options"] = { - name: resp.column_name + name: resp.column_name, }; if (resp.is_nullable === "YES") options.nullable = true; if (resp.isunique === "1") options.unique = true; @@ -136,13 +149,13 @@ export default class PostgresDriver extends AbstractDriver { if (options.array) { tscType = tscType .split("|") - .map(x => `${x.replace("|", "").trim()}[]`) + .map((x) => `${x.replace("|", "").trim()}[]`) .join(" | "); } if ( this.ColumnTypesWithPrecision.some( - v => v === columnType + (v) => v === columnType ) ) { if (resp.numeric_precision !== null) { @@ -153,14 +166,16 @@ export default class PostgresDriver extends AbstractDriver { } } if ( - this.ColumnTypesWithLength.some(v => v === columnType) + this.ColumnTypesWithLength.some((v) => v === columnType) ) { options.length = resp.character_maximum_length > 0 ? resp.character_maximum_length : undefined; } - if (this.ColumnTypesWithWidth.some(v => v === columnType)) { + if ( + this.ColumnTypesWithWidth.some((v) => v === columnType) + ) { options.width = resp.character_maximum_length > 0 ? resp.character_maximum_length @@ -173,7 +188,7 @@ export default class PostgresDriver extends AbstractDriver { default: defaultValue, options, tscName, - tscType + tscType, }); }); }); @@ -194,7 +209,7 @@ export default class PostgresDriver extends AbstractDriver { tsType: "", sqlType: dataType, isArray: false, - enumValues: [] + enumValues: [], }; switch (dataType) { case "int2": @@ -449,23 +464,23 @@ export default class PostgresDriver extends AbstractDriver { AND i.oid<>0 ORDER BY c.relname,f.attname;`) ).rows; - entities.forEach(ent => { + entities.forEach((ent) => { const entityIndices = response.filter( - filterVal => filterVal.tablename === ent.tscName + (filterVal) => filterVal.tablename === ent.tscName ); - const indexNames = new Set(entityIndices.map(v => v.indexname)); - indexNames.forEach(indexName => { + const indexNames = new Set(entityIndices.map((v) => v.indexname)); + indexNames.forEach((indexName) => { const records = entityIndices.filter( - v => v.indexname === indexName + (v) => v.indexname === indexName ); const indexInfo: Index = { columns: [], options: {}, - name: records[0].indexname + name: records[0].indexname, }; if (records[0].is_primary_key === 1) indexInfo.primary = true; if (records[0].is_unique === 1) indexInfo.options.unique = true; - records.forEach(record => { + records.forEach((record) => { indexInfo.columns.push(record.columnname); }); ent.indices.push(indexInfo); @@ -535,15 +550,15 @@ export default class PostgresDriver extends AbstractDriver { ).rows; const relationsTemp: RelationInternal[] = [] as RelationInternal[]; - const relationKeys = new Set(response.map(v => v.object_id)); + const relationKeys = new Set(response.map((v) => v.object_id)); - relationKeys.forEach(relationId => { - const rows = response.filter(v => v.object_id === relationId); + relationKeys.forEach((relationId) => { + const rows = response.filter((v) => v.object_id === relationId); const ownerTable = entities.find( - v => v.sqlName === rows[0].tablewithforeignkey + (v) => v.sqlName === rows[0].tablewithforeignkey ); const relatedTable = entities.find( - v => v.sqlName === rows[0].tablereferenced + (v) => v.sqlName === rows[0].tablereferenced ); if (!ownerTable || !relatedTable) { TomgUtils.LogError( @@ -556,7 +571,7 @@ export default class PostgresDriver extends AbstractDriver { ownerColumns: [], relatedColumns: [], ownerTable, - relatedTable + relatedTable, }; if (rows[0].ondelete !== "NO ACTION") { internal.onDelete = rows[0].ondelete; @@ -564,7 +579,7 @@ export default class PostgresDriver extends AbstractDriver { if (rows[0].onupdate !== "NO ACTION") { internal.onUpdate = rows[0].onupdate; } - rows.forEach(row => { + rows.forEach((row) => { internal.ownerColumns.push(row.foreignkeycolumn); internal.relatedColumns.push(row.foreignkeycolumnreferenced); }); @@ -582,12 +597,12 @@ export default class PostgresDriver extends AbstractDriver { public async DisconnectFromServer() { if (this.Connection) { const promise = new Promise((resolve, reject) => { - this.Connection.end(err => { + this.Connection.end((err) => { if (!err) { resolve(true); } else { TomgUtils.LogError( - "Error connecting to Postgres Server.", + "Error disconnecting from to Postgres Server.", false, err.message ); @@ -600,7 +615,7 @@ export default class PostgresDriver extends AbstractDriver { } public async ConnectToServer(connectionOptons: IConnectionOptions) { - this.Connection = new PG.Client({ + this.Connection = new this.PG.Client({ database: connectionOptons.databaseName, host: connectionOptons.host, password: connectionOptons.password, @@ -608,11 +623,11 @@ export default class PostgresDriver extends AbstractDriver { ssl: connectionOptons.ssl, // eslint-disable-next-line @typescript-eslint/camelcase statement_timeout: 60 * 60 * 1000, - user: connectionOptons.user + user: connectionOptons.user, }); const promise = new Promise((resolve, reject) => { - this.Connection.connect(err => { + this.Connection.connect((err) => { if (!err) { resolve(true); } else { @@ -658,7 +673,7 @@ export default class PostgresDriver extends AbstractDriver { } defaultValue = defaultValue.replace(/'::[\w ]*/, "'"); - if (["json", "jsonb"].some(x => x === dataType)) { + if (["json", "jsonb"].some((x) => x === dataType)) { return `${defaultValue.slice(1, defaultValue.length - 1)}`; } return `() => "${defaultValue}"`; diff --git a/src/drivers/SqliteDriver.ts b/src/drivers/SqliteDriver.ts index ab0d2f5..eaee1d3 100644 --- a/src/drivers/SqliteDriver.ts +++ b/src/drivers/SqliteDriver.ts @@ -1,7 +1,7 @@ import { ConnectionOptions } from "typeorm"; import * as TypeormDriver from "typeorm/driver/sqlite/SqliteDriver"; import { DataTypeDefaults } from "typeorm/driver/types/DataTypeDefaults"; -import * as sqliteLib from "sqlite3"; +import type * as sqliteLib from "sqlite3"; import * as TomgUtils from "../Utils"; import AbstractDriver from "./AbstractDriver"; import IConnectionOptions from "../IConnectionOptions"; @@ -13,7 +13,7 @@ import { RelationInternal } from "../models/RelationInternal"; export default class SqliteDriver extends AbstractDriver { public defaultValues: DataTypeDefaults = new TypeormDriver.SqliteDriver({ - options: { database: "true" } as ConnectionOptions + options: { database: "true" } as ConnectionOptions, } as any).dataTypeDefaults; public readonly standardPort = 0; @@ -22,14 +22,28 @@ export default class SqliteDriver extends AbstractDriver { public readonly standardSchema = ""; - public sqlite = sqliteLib.verbose(); + private sqliteLib: typeof sqliteLib; - public db: sqliteLib.Database; + private sqlite: sqliteLib.sqlite3; - public tablesWithGeneratedPrimaryKey: string[] = new Array(); + private db: sqliteLib.Database; + + private tablesWithGeneratedPrimaryKey: string[] = new Array(); public GetAllTablesQuery: any; + public constructor() { + super(); + try { + // eslint-disable-next-line import/no-extraneous-dependencies, global-require, import/no-unresolved + this.sqliteLib = require("sqlite3"); + this.sqlite = this.sqliteLib.verbose(); + } catch (error) { + TomgUtils.LogError("", false, error); + throw error; + } + } + public async GetAllTables( schema: string, dbNames: string, @@ -43,7 +57,7 @@ export default class SqliteDriver extends AbstractDriver { const rows = await this.ExecQuery<{ tbl_name: string; sql: string }>( `SELECT tbl_name, sql FROM "sqlite_master" WHERE "type" = 'table' AND name NOT LIKE 'sqlite_%' ${tableCondition}` ); - rows.forEach(val => { + rows.forEach((val) => { if (val.sql.includes("AUTOINCREMENT")) { this.tablesWithGeneratedPrimaryKey.push(val.tbl_name); } @@ -54,7 +68,7 @@ export default class SqliteDriver extends AbstractDriver { relationIds: [], sqlName: val.tbl_name, tscName: val.tbl_name, - fileImports: [] + fileImports: [], }); }); return ret; @@ -62,7 +76,7 @@ export default class SqliteDriver extends AbstractDriver { public async GetCoulmnsFromEntity(entities: Entity[]): Promise { await Promise.all( - entities.map(async ent => { + entities.map(async (ent) => { const response = await this.ExecQuery<{ cid: number; name: string; @@ -71,7 +85,7 @@ export default class SqliteDriver extends AbstractDriver { dflt_value: string; pk: number; }>(`PRAGMA table_info('${ent.tscName}');`); - response.forEach(resp => { + response.forEach((resp) => { const tscName = resp.name; let tscType = ""; const options: Column["options"] = { name: resp.name }; @@ -181,7 +195,7 @@ export default class SqliteDriver extends AbstractDriver { const sqlOptions = resp.type.match(/\([0-9 ,]+\)/g); if ( this.ColumnTypesWithPrecision.some( - v => v === columnType + (v) => v === columnType ) && sqlOptions ) { @@ -200,7 +214,7 @@ export default class SqliteDriver extends AbstractDriver { } if ( this.ColumnTypesWithLength.some( - v => v === columnType + (v) => v === columnType ) && sqlOptions ) { @@ -214,7 +228,7 @@ export default class SqliteDriver extends AbstractDriver { } if ( this.ColumnTypesWithWidth.some( - v => v === columnType && tscType !== "boolean" + (v) => v === columnType && tscType !== "boolean" ) && sqlOptions ) { @@ -234,7 +248,7 @@ export default class SqliteDriver extends AbstractDriver { default: defaultValue, options, tscName, - tscType + tscType, }); }); }) @@ -245,7 +259,7 @@ export default class SqliteDriver extends AbstractDriver { public async GetIndexesFromEntity(entities: Entity[]): Promise { await Promise.all( - entities.map(async ent => { + entities.map(async (ent) => { const response = await this.ExecQuery<{ seq: number; name: string; @@ -254,7 +268,7 @@ export default class SqliteDriver extends AbstractDriver { partial: number; }>(`PRAGMA index_list('${ent.tscName}');`); await Promise.all( - response.map(async resp => { + response.map(async (resp) => { const indexColumnsResponse = await this.ExecQuery<{ seqno: number; cid: number; @@ -264,11 +278,11 @@ export default class SqliteDriver extends AbstractDriver { const indexInfo: Index = { name: resp.name, columns: [], - options: {} + options: {}, }; if (resp.unique === 1) indexInfo.options.unique = true; - indexColumnsResponse.forEach(record => { + indexColumnsResponse.forEach((record) => { indexInfo.columns.push(record.name); }); if ( @@ -276,8 +290,10 @@ export default class SqliteDriver extends AbstractDriver { indexInfo.options.unique ) { ent.columns - .filter(v => v.tscName === indexInfo.columns[0]) - .forEach(v => { + .filter( + (v) => v.tscName === indexInfo.columns[0] + ) + .forEach((v) => { // eslint-disable-next-line no-param-reassign v.options.unique = true; }); @@ -299,7 +315,7 @@ export default class SqliteDriver extends AbstractDriver { ): Promise { let retVal = entities; await Promise.all( - retVal.map(async entity => { + retVal.map(async (entity) => { const response = await this.ExecQuery<{ id: number; seq: number; @@ -320,15 +336,15 @@ export default class SqliteDriver extends AbstractDriver { }>(`PRAGMA foreign_key_list('${entity.tscName}');`); const relationsTemp: RelationInternal[] = [] as RelationInternal[]; - const relationKeys = new Set(response.map(v => v.id)); + const relationKeys = new Set(response.map((v) => v.id)); - relationKeys.forEach(relationId => { - const rows = response.filter(v => v.id === relationId); + relationKeys.forEach((relationId) => { + const rows = response.filter((v) => v.id === relationId); const ownerTable = entities.find( - v => v.sqlName === entity.tscName + (v) => v.sqlName === entity.tscName ); const relatedTable = entities.find( - v => v.sqlName === rows[0].table + (v) => v.sqlName === rows[0].table ); if (!ownerTable || !relatedTable) { TomgUtils.LogError( @@ -341,7 +357,7 @@ export default class SqliteDriver extends AbstractDriver { ownerColumns: [], relatedColumns: [], ownerTable, - relatedTable + relatedTable, }; if (rows[0].on_delete !== "NO ACTION") { internal.onDelete = rows[0].on_delete; @@ -349,7 +365,7 @@ export default class SqliteDriver extends AbstractDriver { if (rows[0].on_update !== "NO ACTION") { internal.onUpdate = rows[0].on_update; } - rows.forEach(row => { + rows.forEach((row) => { internal.ownerColumns.push(row.from); internal.relatedColumns.push(row.to); }); @@ -381,7 +397,7 @@ export default class SqliteDriver extends AbstractDriver { public async UseDB(dbName: string) { const promise = new Promise((resolve, reject) => { - this.db = new this.sqlite.Database(dbName, err => { + this.db = new this.sqlite.Database(dbName, (err) => { if (err) { TomgUtils.LogError( "Error connecting to SQLite database.", diff --git a/src/index.ts b/src/index.ts index 15e34c8..573b635 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,15 +2,16 @@ import * as Yargs from "yargs"; import { createDriver, createModelFromDatabase } from "./Engine"; import * as TomgUtils from "./Utils"; import IConnectionOptions, { - getDefaultConnectionOptions + getDefaultConnectionOptions, } from "./IConnectionOptions"; import IGenerationOptions, { - getDefaultGenerationOptions + getDefaultGenerationOptions, } from "./IGenerationOptions"; import fs = require("fs-extra"); import inquirer = require("inquirer"); import path = require("path"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises CliLogic(); @@ -61,7 +62,7 @@ function makeDefaultConfigs() { const connectionOptions = getDefaultConnectionOptions(); return { generationOptions, - connectionOptions + connectionOptions, }; } function readTOMLConfig( @@ -81,7 +82,7 @@ function readTOMLConfig( let hasUnknownProperties = false; if (loadedConnectionOptions) { - Object.keys(loadedConnectionOptions).forEach(key => { + Object.keys(loadedConnectionOptions).forEach((key) => { if ( Object.prototype.hasOwnProperty.call( options.connectionOptions, @@ -96,7 +97,7 @@ function readTOMLConfig( }); } if (loadedGenerationOptions) { - Object.keys(loadedGenerationOptions).forEach(key => { + Object.keys(loadedGenerationOptions).forEach((key) => { if ( Object.prototype.hasOwnProperty.call( options.generationOptions, @@ -122,7 +123,7 @@ function readTOMLConfig( return { options, - fullConfigFile + fullConfigFile, }; } function checkYargsParameters(options: options): options { @@ -133,7 +134,7 @@ function checkYargsParameters(options: options): options { alias: "host", string: true, default: options.connectionOptions.host, - describe: "IP address/Hostname for database server" + describe: "IP address/Hostname for database server", }, d: { alias: "database", @@ -141,25 +142,25 @@ function checkYargsParameters(options: options): options { demand: true, default: options.connectionOptions.databaseName, describe: - "Database name(or path for sqlite). You can pass multiple values separated by comma." + "Database name(or path for sqlite). You can pass multiple values separated by comma.", }, u: { alias: "user", string: true, default: options.connectionOptions.user, - describe: "Username for database server" + describe: "Username for database server", }, x: { alias: "pass", string: true, default: options.connectionOptions.password, - describe: "Password for database server" + describe: "Password for database server", }, p: { number: true, alias: "port", default: options.connectionOptions.port, - describe: "Port number for database server" + describe: "Port number for database server", }, e: { alias: "engine", @@ -169,121 +170,121 @@ function checkYargsParameters(options: options): options { "mysql", "mariadb", "oracle", - "sqlite" + "sqlite", ], demand: true, default: options.connectionOptions.databaseType, - describe: "Database engine" + describe: "Database engine", }, o: { alias: "output", default: options.generationOptions.resultsPath, - describe: "Where to place generated models" + describe: "Where to place generated models", }, s: { alias: "schema", string: true, default: options.connectionOptions.schemaName, describe: - "Schema name to create model from. Only for mssql and postgres. You can pass multiple values separated by comma eg. -s scheme1,scheme2,scheme3" + "Schema name to create model from. Only for mssql and postgres. You can pass multiple values separated by comma eg. -s scheme1,scheme2,scheme3", }, ssl: { boolean: true, - default: options.connectionOptions.ssl + default: options.connectionOptions.ssl, }, noConfig: { boolean: true, default: options.generationOptions.noConfigs, - describe: `Doesn't create tsconfig.json and ormconfig.json` + describe: `Doesn't create tsconfig.json and ormconfig.json`, }, cf: { alias: "case-file", choices: ["pascal", "param", "camel", "none"], default: options.generationOptions.convertCaseFile, - describe: "Convert file names to specified case" + describe: "Convert file names to specified case", }, ce: { alias: "case-entity", choices: ["pascal", "camel", "none"], default: options.generationOptions.convertCaseEntity, - describe: "Convert class names to specified case" + describe: "Convert class names to specified case", }, cp: { alias: "case-property", choices: ["pascal", "camel", "none"], default: options.generationOptions.convertCaseProperty, - describe: "Convert property names to specified case" + describe: "Convert property names to specified case", }, eol: { choices: ["LF", "CRLF"], default: options.generationOptions.convertEol, - describe: "Force EOL to be LF or CRLF" + describe: "Force EOL to be LF or CRLF", }, pv: { alias: "property-visibility", choices: ["public", "protected", "private", "none"], default: options.generationOptions.propertyVisibility, describe: - "Defines which visibility should have the generated property" + "Defines which visibility should have the generated property", }, lazy: { boolean: true, default: options.generationOptions.lazy, - describe: "Generate lazy relations" + describe: "Generate lazy relations", }, a: { alias: "active-record", boolean: true, default: options.generationOptions.activeRecord, - describe: "Use ActiveRecord syntax for generated models" + describe: "Use ActiveRecord syntax for generated models", }, namingStrategy: { describe: "Use custom naming strategy", default: options.generationOptions.customNamingStrategyPath, - string: true + string: true, }, relationIds: { boolean: true, default: options.generationOptions.relationIds, - describe: "Generate RelationId fields" + describe: "Generate RelationId fields", }, skipSchema: { boolean: true, default: options.generationOptions.skipSchema, - describe: "Omits schema identifier in generated entities" + describe: "Omits schema identifier in generated entities", }, generateConstructor: { boolean: true, default: options.generationOptions.generateConstructor, - describe: "Generate constructor allowing partial initialization" + describe: "Generate constructor allowing partial initialization", }, disablePluralization: { boolean: true, default: !options.generationOptions.pluralizeNames, describe: - "Disable pluralization of OneToMany, ManyToMany relation names" + "Disable pluralization of OneToMany, ManyToMany relation names", }, skipTables: { string: true, default: options.connectionOptions.skipTables.join(","), describe: - "Skip schema generation for specific tables. You can pass multiple values separated by comma" + "Skip schema generation for specific tables. You can pass multiple values separated by comma", }, strictMode: { choices: ["none", "?", "!"], default: options.generationOptions.strictMode, - describe: "Mark fields as optional(?) or non-null(!)" + describe: "Mark fields as optional(?) or non-null(!)", }, index: { boolean: true, default: options.generationOptions.indexFile, - describe: "Generate index file" + describe: "Generate index file", }, defaultExport: { boolean: true, default: options.generationOptions.exportType === "default", - describe: "Generate index file" - } + describe: "Generate index file", + }, }); options.connectionOptions.databaseName = argv.d; @@ -300,7 +301,11 @@ function checkYargsParameters(options: options): options { : standardSchema; options.connectionOptions.ssl = argv.ssl; options.connectionOptions.user = argv.u || standardUser; - options.connectionOptions.skipTables = argv.skipTables.split(","); + let skipTables = argv.skipTables.split(","); + if (skipTables.length === 1 && skipTables[0] === "") { + skipTables = []; // #252 + } + options.connectionOptions.skipTables = skipTables; options.generationOptions.activeRecord = argv.a; options.generationOptions.generateConstructor = argv.generateConstructor; options.generationOptions.convertCaseEntity = argv.ce as IGenerationOptions["convertCaseEntity"]; @@ -335,13 +340,13 @@ async function useInquirer(options: options): Promise { "mysql", "mariadb", "oracle", - "sqlite" + "sqlite", ], default: options.connectionOptions.databaseType, message: "Choose database engine", name: "engine", - type: "list" - } + type: "list", + }, ]) ).engine; const driver = createDriver(options.connectionOptions.databaseType); @@ -356,7 +361,7 @@ async function useInquirer(options: options): Promise { default: options.connectionOptions.host, message: "Database address:", name: "host", - type: "input" + type: "input", }, { message: "Database port:", @@ -366,32 +371,32 @@ async function useInquirer(options: options): Promise { validate(value) { const valid = !Number.isNaN(parseInt(value, 10)); return valid || "Please enter a valid port number"; - } + }, }, { default: options.connectionOptions.ssl, message: "Use SSL:", name: "ssl", - type: "confirm" + type: "confirm", }, { message: "Database user name:", name: "login", type: "input", - default: options.connectionOptions.user + default: options.connectionOptions.user, }, { message: "Database user password:", name: "password", - type: "password" + type: "password", }, { default: options.connectionOptions.databaseName, message: "Database name: (You can pass multiple values separated by comma)", name: "dbName", - type: "input" - } + type: "input", + }, ]); if ( options.connectionOptions.databaseType === "mssql" || @@ -404,8 +409,8 @@ async function useInquirer(options: options): Promise { message: "Database schema: (You can pass multiple values separated by comma)", name: "schema", - type: "input" - } + type: "input", + }, ]) ).schema; } @@ -422,8 +427,8 @@ async function useInquirer(options: options): Promise { default: options.connectionOptions.databaseName, message: "Path to database file:", name: "dbName", - type: "input" - } + type: "input", + }, ]) ).dbName; } @@ -438,8 +443,8 @@ async function useInquirer(options: options): Promise { message: "Generate schema for tables:", choices: ["All of them", "Ignore specific tables"], name: "specyficTables", - type: "list" - } + type: "list", + }, ]) ).specyficTables; if (ignoreSpecyficTables === "Ignore specific tables") { @@ -447,7 +452,7 @@ async function useInquirer(options: options): Promise { default: options.connectionOptions.skipTables.join(","), message: "Table names(separated by comma)", name: "tableNames", - type: "input" + type: "input", }); options.connectionOptions.skipTables = tableNames.split(","); } else { @@ -460,8 +465,8 @@ async function useInquirer(options: options): Promise { default: options.generationOptions.resultsPath, message: "Path where generated models should be stored:", name: "output", - type: "input" - } + type: "input", + }, ]) ).output; const { customizeGeneration } = await inquirer.prompt([ @@ -469,8 +474,8 @@ async function useInquirer(options: options): Promise { default: false, message: "Do you want to customize generated model?", name: "customizeGeneration", - type: "confirm" - } + type: "confirm", + }, ]); if (customizeGeneration) { const defaultGenerationOptions = getDefaultGenerationOptions(); @@ -481,42 +486,42 @@ async function useInquirer(options: options): Promise { { checked: !options.generationOptions.noConfigs, name: "Generate config files", - value: "config" + value: "config", }, { name: "Generate lazy relations", value: "lazy", - checked: options.generationOptions.lazy + checked: options.generationOptions.lazy, }, { name: "Use ActiveRecord syntax for generated models", value: "activeRecord", - checked: options.generationOptions.activeRecord + checked: options.generationOptions.activeRecord, }, { name: "Use custom naming strategy", value: "namingStrategy", checked: !!options.generationOptions - .customNamingStrategyPath + .customNamingStrategyPath, }, { name: "Generate RelationId fields", value: "relationId", - checked: options.generationOptions.relationIds + checked: options.generationOptions.relationIds, }, { name: "Omits schema identifier in generated entities", value: "skipSchema", - checked: options.generationOptions.skipSchema + checked: options.generationOptions.skipSchema, }, { name: "Generate constructor allowing partial initialization", value: "constructor", checked: - options.generationOptions.generateConstructor + options.generationOptions.generateConstructor, }, { name: "Use specific naming convention", @@ -528,36 +533,36 @@ async function useInquirer(options: options): Promise { .convertCaseProperty !== defaultGenerationOptions.convertCaseProperty || options.generationOptions.convertCaseFile !== - defaultGenerationOptions.convertCaseFile + defaultGenerationOptions.convertCaseFile, }, { name: "Use specific EOL character", value: "converteol", - checked: false + checked: false, }, { name: "Pluralize OneToMany, ManyToMany relation names", value: "pluralize", - checked: options.generationOptions.pluralizeNames + checked: options.generationOptions.pluralizeNames, }, { name: "Generate index file", value: "index", - checked: options.generationOptions.indexFile + checked: options.generationOptions.indexFile, }, { name: "Prefer default exports", value: "defaultExport", checked: options.generationOptions.exportType === - "default" - } + "default", + }, ], message: "Available customizations", name: "selected", - type: "checkbox" - } + type: "checkbox", + }, ]) ).selected; @@ -569,8 +574,8 @@ async function useInquirer(options: options): Promise { "Defines which visibility should have the generated property", name: "propertyVisibility", default: options.generationOptions.propertyVisibility, - type: "list" - } + type: "list", + }, ]) ).propertyVisibility; @@ -581,8 +586,8 @@ async function useInquirer(options: options): Promise { message: "Mark fields as optional(?) or non-null(!)", name: "strictMode", default: options.generationOptions.strictMode, - type: "list" - } + type: "list", + }, ]) ).strictMode; @@ -627,8 +632,8 @@ async function useInquirer(options: options): Promise { valid || "Please enter a a valid path to custom naming strategy file" ); - } - } + }, + }, ]) ).namingStrategy; @@ -645,22 +650,22 @@ async function useInquirer(options: options): Promise { default: options.generationOptions.convertCaseFile, message: "Convert file names to specified case:", name: "fileCase", - type: "list" + type: "list", }, { choices: ["pascal", "camel", "none"], default: options.generationOptions.convertCaseEntity, message: "Convert class names to specified case:", name: "entityCase", - type: "list" + type: "list", }, { choices: ["pascal", "camel", "none"], default: options.generationOptions.convertCaseProperty, message: "Convert property names to specified case:", name: "propertyCase", - type: "list" - } + type: "list", + }, ]); options.generationOptions.convertCaseFile = namingConventions.fileCase; @@ -676,8 +681,8 @@ async function useInquirer(options: options): Promise { default: options.generationOptions.convertEol, message: "Force EOL to be:", name: "eol", - type: "list" - } + type: "list", + }, ]); options.generationOptions.convertEol = eolChoice.eol; } @@ -687,13 +692,13 @@ async function useInquirer(options: options): Promise { choices: [ "Yes, only model customization options", "Yes, with connection details", - "No" + "No", ], default: "No", message: "Save configuration to config file?", name: "saveConfig", - type: "list" - } + type: "list", + }, ]); if (saveConfig === "Yes, with connection details") { await fs.writeJson( diff --git a/src/library.ts b/src/library.ts index a7d8584..8760617 100644 --- a/src/library.ts +++ b/src/library.ts @@ -14,5 +14,5 @@ export { IConnectionOptions, IGenerationOptions, NamingStrategy, - Utils + Utils, }; diff --git a/src/models/Column.ts b/src/models/Column.ts index f62271e..cc1e1f6 100644 --- a/src/models/Column.ts +++ b/src/models/Column.ts @@ -21,5 +21,6 @@ export type Column = { unsigned?: boolean; enum?: string[]; array?: boolean; // ? + comment?: string; }; }; diff --git a/test/integration/github-issues/93/entity/Post.ts b/test/integration/github-issues/93/entity/Post.ts new file mode 100644 index 0000000..9796313 --- /dev/null +++ b/test/integration/github-issues/93/entity/Post.ts @@ -0,0 +1,22 @@ +import { + Index, + Entity, + PrimaryColumn, + Column, + OneToOne, + OneToMany, + ManyToOne, + JoinColumn +} from "typeorm"; + +@Entity("Post") +export class Post { + @Column("integer", { + primary: true, + name: "id" + }) + id: number; + + @Column({ comment: "comment" }) + body: string; +} diff --git a/test/integration/runTestsFromPath.test.ts b/test/integration/runTestsFromPath.test.ts index 9ee1a62..8fa85b2 100644 --- a/test/integration/runTestsFromPath.test.ts +++ b/test/integration/runTestsFromPath.test.ts @@ -5,7 +5,7 @@ import * as fs from "fs-extra"; import * as path from "path"; import * as chaiSubset from "chai-subset"; import * as flatMap from "array.prototype.flatmap"; -import yn from "yn"; +import * as yn from "yn"; import { CLIEngine } from "eslint"; import EntityFileToJson from "../utils/EntityFileToJson"; import { createDriver, dataCollectionPhase } from "../../src/Engine"; @@ -128,6 +128,11 @@ function runTestForMultipleDrivers( dbDriver ) ); + case "93": + return dbDrivers.filter( + dbDriver => + ["mysql", "mariadb"].includes(dbDriver) // Only db engines supported by typeorm at the time of writing + ); case "144": return dbDrivers.filter(dbDriver => ["mysql", "mariadb"].includes(dbDriver) diff --git a/test/utils/EntityFileToJson.ts b/test/utils/EntityFileToJson.ts index 443aef1..2da8ebd 100644 --- a/test/utils/EntityFileToJson.ts +++ b/test/utils/EntityFileToJson.ts @@ -29,6 +29,10 @@ class EntityIndex { public isUnique = false; } +function removeTrailingComas(input: string) { + return input.replace(/,(?=\s*?[}\]])/g, ""); +} + export default class EntityFileToJson { public static getEntityOptions(trimmedLine: string, ent: EntityJson): void { const decoratorParameters = trimmedLine.slice( @@ -50,7 +54,7 @@ export default class EntityFileToJson { badJSON[badJSON.length - 1]; } ent.entityOptions = JSON.parse( - badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + removeTrailingComas(badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) ); } } @@ -90,7 +94,7 @@ export default class EntityFileToJson { `default: $1` ); col.columnOptions = JSON.parse( - badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + removeTrailingComas(badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) ); } else if ( decoratorParameters[0] === '"' && @@ -102,8 +106,8 @@ export default class EntityFileToJson { } else { let badJSON = !primaryGeneratedColumn ? decoratorParameters.substring( - decoratorParameters.indexOf(",") + 1 - ) + decoratorParameters.indexOf(",") + 1 + ) : decoratorParameters; badJSON = badJSON.trim(); if (badJSON.lastIndexOf(",") === badJSON.length - 3) { @@ -113,7 +117,7 @@ export default class EntityFileToJson { badJSON[badJSON.length - 1]; } col.columnOptions = JSON.parse( - badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + removeTrailingComas(badJSON.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) ); } } @@ -143,9 +147,9 @@ export default class EntityFileToJson { badJSON[badJSON.length - 1]; } col.columnOptions = JSON.parse( - badJSON + removeTrailingComas(badJSON .replace(/(')/g, `"`) - .replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ') + .replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ')) ); } } @@ -411,7 +415,7 @@ export default class EntityFileToJson { if (decoratorParameters.length > 0) { const column = retVal.columns[retVal.columns.length - 1]; - const options = JSON.parse(decoratorParameters); + const options = JSON.parse(removeTrailingComas(decoratorParameters)); if (Array.isArray(options)) { column.joinOptions = options as any; } else { @@ -437,7 +441,7 @@ export default class EntityFileToJson { if (decoratorParameters.length > 0) { const column = retVal.columns[retVal.columns.length - 1]; - const options = JSON.parse(decoratorParameters); + const options = JSON.parse(removeTrailingComas(decoratorParameters)); if ( options.inverseJoinColumn && !Array.isArray(options.inverseJoinColumn)