diff --git a/ts-packages/mock-nym-api/.env b/ts-packages/mock-nym-api/.env new file mode 100644 index 0000000000..2b528d6467 --- /dev/null +++ b/ts-packages/mock-nym-api/.env @@ -0,0 +1 @@ +NYM_API_URL=https://validator.nymtech.net diff --git a/ts-packages/mock-nym-api/Caddyfile b/ts-packages/mock-nym-api/Caddyfile new file mode 100644 index 0000000000..097a0b9fbb --- /dev/null +++ b/ts-packages/mock-nym-api/Caddyfile @@ -0,0 +1,4 @@ +localhost:8001 { + reverse_proxy 127.0.0.1:8000 + tls internal +} diff --git a/ts-packages/mock-nym-api/README.md b/ts-packages/mock-nym-api/README.md new file mode 100644 index 0000000000..8936d8ff7b --- /dev/null +++ b/ts-packages/mock-nym-api/README.md @@ -0,0 +1,63 @@ +# NYM API mock + +This package provides a mock server that allows you to modify parts of the Nym API by: + +- modifying live responses from a running Nym API +- providing a static response + +## How to run it? + +Adjust the [.env](./.env) to use the Nym API you want to proxy. The defaults are for mainnet. + +From this directory run: + +``` +yarn +yarn start +``` + +When you modify files in `src` and `mocks` the process will be restarted automatically. + +## How can I find out what methods I can override? + +Look in the swagger docs for the Nym API, e.g. https://validator.nymtech.net/api/swagger/index.html. + +Then write a handler to override it, for example, to return custom gateways: + +```ts +app.get('/api/v1/gateways', (req, res) => { + const customGateways = JSON.parse(fs.readFileSync('./mocks/custom-gateway.json').toString()); + + // modify custom gateway + customGateways[0].gateway.sphinx_key += '-ccc'; + customGateways[0].gateway.identity_key += '-ddd'; + + res.json(customGateways); +}); +``` + +## How to get seed data? + +You can get seed data from a running Nym API with: + +``` +curl https://validator.nymtech.net/api/v1/mixnodes | jq . > mocks/mixnodes.json +``` + +If you don't have `jq` installed, you can just do `curl https://validator.nymtech.net/api/v1/mixnodes > mocks/mixnodes.json` to store the unformatted response. + +## HTTPS + +If you need HTTPS then install `caddy` (see https://caddyserver.com/ or `brew install caddy` on MacOS) and run: + +``` +yarn +yarn start:https +``` + +The API will available on `https://localhost:8001` e.g. https://localhost:8001/api/v1/mixnodes with a self-signed certificate. + +Modify the [Caddyfile](Caddyfile) to set the domain for the certificate (NB: you will need to set up the DNS and control the domain records). + +If you need the local certificate to be valid, look at https://github.com/FiloSottile/mkcert and https://dev.to/josuebustos/https-localhost-for-node-js-1p1k. + diff --git a/ts-packages/mock-nym-api/mocks/custom-gateway.json b/ts-packages/mock-nym-api/mocks/custom-gateway.json new file mode 100644 index 0000000000..f1eaf99514 --- /dev/null +++ b/ts-packages/mock-nym-api/mocks/custom-gateway.json @@ -0,0 +1,20 @@ +[ + { + "pledge_amount": { + "denom": "unym", + "amount": "100000000" + }, + "owner": "n1...", + "block_height": 5900000, + "gateway": { + "host": "127.0.0.1", + "mix_port": 1789, + "clients_port": 9000, + "location": "My local computer", + "sphinx_key": "aaa", + "identity_key": "bbb", + "version": "1.1.11" + }, + "proxy": null + } +] diff --git a/ts-packages/mock-nym-api/mocks/gateways.json b/ts-packages/mock-nym-api/mocks/gateways.json new file mode 100644 index 0000000000..ed7945bbe4 --- /dev/null +++ b/ts-packages/mock-nym-api/mocks/gateways.json @@ -0,0 +1,20 @@ +[ + { + "pledge_amount": { + "denom": "unym", + "amount": "100000000" + }, + "owner": "n1ecaqmk4ajcc80mtgpvvqf6zun7eq8k64uz6f40", + "block_height": 5908500, + "gateway": { + "host": "194.182.191.207", + "mix_port": 1789, + "clients_port": 9000, + "location": "Switzerland", + "sphinx_key": "2az9QVu6o4ZEVe72HQaxcDEdSFSxXiFvH3gWiU33Vrmn", + "identity_key": "2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh", + "version": "1.1.11" + }, + "proxy": null + } +] diff --git a/ts-packages/mock-nym-api/mocks/mixnodes.json b/ts-packages/mock-nym-api/mocks/mixnodes.json new file mode 100644 index 0000000000..9afcf3b4ac --- /dev/null +++ b/ts-packages/mock-nym-api/mocks/mixnodes.json @@ -0,0 +1,116 @@ +[ + { + "bond_information": { + "mix_id": 1, + "owner": "n1cg6lgel27zmq8yutxgnu2tdzx3hf0m8uemfpwp", + "original_pledge": { + "denom": "unym", + "amount": "164186215" + }, + "layer": 2, + "mix_node": { + "host": "116.203.115.86", + "mix_port": 1789, + "verloc_port": 1790, + "http_api_port": 8000, + "sphinx_key": "82MfLZ4NtBmuZXL45XC1x9HNwsK3HqW7iNNpd4YdgTdY", + "identity_key": "12Vbu59dESdcQEfPKvbqt3r6XAhvn5xAiLB3Ke4L42Nn", + "version": "1.1.4" + }, + "proxy": null, + "bonding_height": 2622578, + "is_unbonding": false + }, + "rewarding_details": { + "cost_params": { + "profit_margin_percent": "0.05", + "interval_operating_cost": { + "denom": "unym", + "amount": "40000000" + } + }, + "operator": "177630956.71827075154157932", + "delegates": "2002077254.831772380804187632", + "total_unit_reward": "923810.444666272288950945", + "unit_delegation": "1000000000", + "last_rewarded_epoch": 2580, + "unique_delegations": 2 + } + }, + { + "bond_information": { + "mix_id": 2, + "owner": "n1vfdtzh9vzaaxxv9n9w4ywdzle9m2pejhx0d5r7", + "original_pledge": { + "denom": "unym", + "amount": "1691956412" + }, + "layer": 1, + "mix_node": { + "host": "95.179.226.75", + "mix_port": 1789, + "verloc_port": 1790, + "http_api_port": 8000, + "sphinx_key": "HomUqYe7hyC1cBNbMUKWguLfq7aFdoxoQDyQsa2fGQa1", + "identity_key": "14Qzy15U7uA8pVwvs66MuRvABSEK5C62JaDYD18WbkN7", + "version": "1.1.10" + }, + "proxy": null, + "bonding_height": 2944467, + "is_unbonding": false + }, + "rewarding_details": { + "cost_params": { + "profit_margin_percent": "0.05", + "interval_operating_cost": { + "denom": "unym", + "amount": "500000000" + } + }, + "operator": "1774161955.223791723839539477", + "delegates": "637943739106.672292940395867727", + "total_unit_reward": "67206510.581661315274414946", + "unit_delegation": "1000000000", + "last_rewarded_epoch": 2583, + "unique_delegations": 31 + } + }, + { + "bond_information": { + "mix_id": 5, + "owner": "n1v7nrjw6pnkrdxmmuk7pjtxrzrxrtztgh33pszu", + "original_pledge": { + "denom": "unym", + "amount": "28752403445" + }, + "layer": 3, + "mix_node": { + "host": "194.163.191.29", + "mix_port": 1789, + "verloc_port": 1790, + "http_api_port": 8000, + "sphinx_key": "2BjwQw2txBofh7QvRAt3d8mUDLZHZgwTm3cuxpkngiWX", + "identity_key": "26WHDRFM5QU7whg1hnxKk4iVY7DnXyZknPcNMitX6GXp", + "version": "1.1.10" + }, + "proxy": null, + "bonding_height": 2935258, + "is_unbonding": false + }, + "rewarding_details": { + "cost_params": { + "profit_margin_percent": "0.05", + "interval_operating_cost": { + "denom": "unym", + "amount": "40000000" + } + }, + "operator": "31540882828.329440044410277309", + "delegates": "700258477245.036486032804830664", + "total_unit_reward": "73511253.913602285045142911", + "unit_delegation": "1000000000", + "last_rewarded_epoch": 2583, + "unique_delegations": 126 + } + } +] diff --git a/ts-packages/mock-nym-api/package.json b/ts-packages/mock-nym-api/package.json new file mode 100644 index 0000000000..10a5a7d3e5 --- /dev/null +++ b/ts-packages/mock-nym-api/package.json @@ -0,0 +1,49 @@ +{ + "name": "mock-nym-api", + "version": "1.0.0", + "license": "Apache-2.0", + "main": "index.js", + "type": "module", + "dependencies": { + "express": "^4.18.2", + "http-proxy-middleware": "^2.0.6", + "dotenv": "^16.0.3" + }, + "devDependencies": { + "@babel/core": "^7.17.5", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "babel-loader": "^8.2.3", + "babel-plugin-root-import": "^5.1.0", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-react": "^7.29.2", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-storybook": "^0.5.12", + "jest": "^27.1.0", + "prettier": "^2.5.1", + "rimraf": "^3.0.2", + "ts-jest": "^27.0.5", + "typescript": "^4.6.2", + "ts-node": "10", + "nodemon": "^2.0.21", + "npm-run-all": "^4.1.5" + }, + "scripts": { + "clean": "rimraf dist", + "start": "nodemon --watch src --watch mocks -e ts,json --exec 'ts-node --esm' src/index.ts", + "start:https": "run-p start run:caddy", + "run:caddy": "caddy run", + "build": "tsc --noEmit false", + "watch": "tsc --noEmit false -w", + "lint": "eslint src .storybook", + "lint:fix": "eslint src .storybook --fix" + } +} diff --git a/ts-packages/mock-nym-api/src/index.ts b/ts-packages/mock-nym-api/src/index.ts new file mode 100644 index 0000000000..89ab9ad245 --- /dev/null +++ b/ts-packages/mock-nym-api/src/index.ts @@ -0,0 +1,48 @@ +import express from 'express'; +import dotenv from 'dotenv'; +import { createProxyMiddleware } from 'http-proxy-middleware'; +import fs from 'fs'; + +dotenv.config(); + +const app = express(); +const port = process.env.PORT || 8000; + +const { NYM_API_URL } = process.env; + +if (!NYM_API_URL || NYM_API_URL.trim().length < 1) { + throw new Error('Please specify a valid NYM_API_URL in `.env` or as an environment variable'); +} + +// proxy the Nym API and only override some routes +const proxy = createProxyMiddleware(['/api/**', '/swagger/**'], { + target: NYM_API_URL, + changeOrigin: true, +}); + +/** + * Return a single custom gateway, from a static file and modify some the fields + */ +app.get('/api/v1/gateways', (req, res) => { + const customGateways = JSON.parse(fs.readFileSync('./mocks/custom-gateway.json').toString()); + + // modify custom gateway + customGateways[0].gateway.sphinx_key += '-ccc'; + customGateways[0].gateway.identity_key += '-ddd'; + + res.json(customGateways); +}); + +/** + * Returns only 3 mixnodes from a static file + */ +app.get('/api/v1/mixnodes', (req, res) => { + const customMixnodes = JSON.parse(fs.readFileSync('./mocks/mixnodes.json').toString()); + res.json(customMixnodes); +}); + +// start the Express server +app.use(proxy); +app.listen(port, () => { + console.log(`[API] Nym API mock is running at http://localhost:${port} and proxying ${NYM_API_URL}`); +}); diff --git a/ts-packages/mock-nym-api/tsconfig.json b/ts-packages/mock-nym-api/tsconfig.json new file mode 100644 index 0000000000..47d23cadec --- /dev/null +++ b/ts-packages/mock-nym-api/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist", + "noEmit": true + }, + "include": [ + "src/**/*.ts", + ], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/yarn.lock b/yarn.lock index 27522a4f8d..2fa4ae7e18 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1500,6 +1500,13 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.29.5.tgz#3fed1b3528ae8c5f1eb5d29b68755bebfd3294ee" integrity sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + "@design-systems/utils@2.12.0": version "2.12.0" resolved "https://registry.yarnpkg.com/@design-systems/utils/-/utils-2.12.0.tgz#955c108be07cb8f01532207cbfea8f848fa760c9" @@ -2043,7 +2050,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -2066,6 +2073,14 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -4647,6 +4662,26 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" @@ -5801,6 +5836,11 @@ acorn-walk@^7.1.1, acorn-walk@^7.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^6.4.1: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" @@ -5811,7 +5851,7 @@ acorn@^7.1.1, acorn@^7.4.0, acorn@^7.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.0, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn@^8.0.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -6034,6 +6074,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -7146,7 +7191,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@3.5.3, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.3: +chokidar@3.5.3, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -7860,6 +7905,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -8603,6 +8653,11 @@ diff@^3.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diff@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" @@ -9606,7 +9661,7 @@ expect@^29.0.0: jest-message-util "^29.3.1" jest-util "^29.3.1" -express@^4.17.1, express@^4.17.3: +express@^4.17.1, express@^4.17.3, express@^4.18.2: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -10947,7 +11002,7 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-middleware@^2.0.3: +http-proxy-middleware@^2.0.3, http-proxy-middleware@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -11049,6 +11104,11 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA== +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + ignore-walk@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" @@ -14318,6 +14378,22 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== +nodemon@^2.0.21: + version "2.0.21" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.21.tgz#267edff25578da91075d6aa54346ef77ecb7b302" + integrity sha512-djN/n2549DUtY33S7o1djRCd7dEm0kBnj9c7S9XVXqRUbuggN1MZH/Nqa+5RFQr63Fbefq37nFXAE9VU86yL1A== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^5.7.1" + simple-update-notifier "^1.0.7" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + nopt@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -14333,6 +14409,13 @@ nopt@^5.0.0: dependencies: abbrev "1" +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -15858,6 +15941,11 @@ psl@^1.1.28, psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -17070,6 +17158,11 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -17297,6 +17390,13 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simple-update-notifier@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -17916,7 +18016,7 @@ supports-color@8.1.1, supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -18294,6 +18394,13 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + tough-cookie@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" @@ -18397,6 +18504,25 @@ ts-mocha@^10.0.0: optionalDependencies: tsconfig-paths "^3.5.0" +ts-node@10: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + ts-node@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" @@ -18603,6 +18729,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -18985,6 +19116,11 @@ uvu@^0.5.0: kleur "^4.0.3" sade "^1.7.3" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -19751,6 +19887,11 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"