From 552bf55846e88edf61557eb2c1981843b6dbeca6 Mon Sep 17 00:00:00 2001 From: Connie-Wild Date: Fri, 29 Dec 2017 23:01:03 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=E8=A3=81=E5=AE=9A=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E3=81=AB=E5=AF=BE=E3=81=99=E3=82=8B=E8=A3=81?= =?UTF-8?q?=E5=AE=9A=E6=95=B0=E9=87=8F=E3=81=AE=E5=89=B2=E5=90=88=E3=81=AB?= =?UTF-8?q?=E5=88=B6=E9=99=90=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 700 +++++++++++++++++++++++++++++++--------- src/LimitCheckerImpl.ts | 28 ++ src/config_default.json | 1 + src/stringResources.ts | 2 + src/types.ts | 1 + 5 files changed, 584 insertions(+), 148 deletions(-) diff --git a/package-lock.json b/package-lock.json index fffa3d30..eca7de26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,30 @@ { "name": "r2", - "version": "2.0.0", + "version": "2.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@bitr/castable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bitr/castable/-/castable-1.0.2.tgz", + "integrity": "sha512-i9u9lM3WOuNp/oxbbeZElYBRVRMc7d8H+BI9xR7nJUY5f+iQs+FRGtMW4Wg8f6aQVqvCpTJQlwTUaNHevgyraQ==", + "requires": { + "reflect-metadata": "0.1.10" + } + }, + "@types/chalk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz", + "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==", + "requires": { + "chalk": "2.3.0" + } + }, + "@types/decimal.js": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/decimal.js/-/decimal.js-0.0.31.tgz", + "integrity": "sha512-kas6johEWZrKwj8n6DYXi3dhOPfO9GcMIzNZlTuIBXTcJjyz+92mD3l93E4wi8w5Gb+KXxYw1pq39gRKKmpkdQ==" + }, "@types/i18next": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/@types/i18next/-/i18next-8.4.2.tgz", @@ -52,6 +73,23 @@ "@types/node": "8.0.53" } }, + "@types/pino": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@types/pino/-/pino-4.7.0.tgz", + "integrity": "sha512-aPHbxwzPb6xjT6nXEQevAZPvxM7niraWxFcxxk15ZMXJkYZVaQbTePMP/Yucu1diQADfGQJEGxhVvTxESQFCfA==", + "requires": { + "@types/node": "8.0.53" + } + }, + "@types/split2": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/split2/-/split2-2.1.6.tgz", + "integrity": "sha512-ddaFSOMuy2Rp97l6q/LEteQygvTQJuEZ+SRhxFKR0uXGsdbFDqX/QF2xoGcOqLQ8XV91v01SnAv2vpgihNgW/Q==", + "dev": true, + "requires": { + "@types/node": "8.0.53" + } + }, "@types/uuid": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", @@ -127,7 +165,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, "requires": { "color-convert": "1.9.0" }, @@ -136,7 +173,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -192,6 +228,27 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -231,7 +288,8 @@ "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true }, "asynckit": { "version": "0.4.0", @@ -591,6 +649,24 @@ "dev": true, "optional": true }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -623,7 +699,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", @@ -669,51 +744,16 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "color": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/color/-/color-0.8.0.tgz", - "integrity": "sha1-iQwHw/1OZJU3Y4kRz2keVFi2/KU=", - "requires": { - "color-convert": "0.5.3", - "color-string": "0.3.0" - } - }, - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" - }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "1.1.3" - } - }, - "colornames": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-0.0.2.tgz", - "integrity": "sha1-2BH9bIT1kClJmorEQ2ICk1uSvjE=" - }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "colorspace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.0.1.tgz", - "integrity": "sha1-yZx5btMRKLmHalLh7l7gOkpxl0k=", - "requires": { - "color": "0.8.0", - "text-hex": "0.0.0" - } + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true }, "combined-stream": { "version": "1.0.5", @@ -724,6 +764,12 @@ "delayed-stream": "1.0.0" } }, + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -751,8 +797,75 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "coveralls": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz", + "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", + "dev": true, + "requires": { + "js-yaml": "3.10.0", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.83.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "cp-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-3.2.0.tgz", + "integrity": "sha1-b4NhYlRiTwrViqSqjQdvAmvn4Yg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "nested-error-stacks": "1.0.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "readable-stream": "2.3.3" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "cpy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-4.0.1.tgz", + "integrity": "sha1-tnJn66LzlgugalphrJQDNCKDNCQ=", + "dev": true, + "requires": { + "cp-file": "3.2.0", + "globby": "4.1.0", + "meow": "3.7.0", + "nested-error-stacks": "1.0.2", + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "cpy-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-1.0.1.tgz", + "integrity": "sha1-Z/taSi3sKMqKv/N13kuecfanVhw=", + "dev": true, + "requires": { + "cpy": "4.0.1", + "meow": "3.7.0" + } }, "cross-spawn": { "version": "5.1.0", @@ -800,6 +913,15 @@ "cssom": "0.3.2" } }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -829,6 +951,11 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decimal.js": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-7.5.1.tgz", + "integrity": "sha512-1K5Y6MykxQYfHBcFfAj2uBaLmwreq4MsjsvrlgcEOvg+X82IeeXlIVIVkBMiypksu+yo9vcYP6lfU3qTedofSQ==" + }, "deep-eql": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", @@ -882,16 +1009,6 @@ "repeating": "2.0.1" } }, - "diagnostics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.0.tgz", - "integrity": "sha1-4QkJALSVI+hSe+IPCBJ1IF8q42o=", - "requires": { - "colorspace": "1.0.1", - "enabled": "1.0.2", - "kuler": "0.0.0" - } - }, "diff": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", @@ -941,14 +1058,6 @@ "safe-buffer": "5.1.1" } }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.3" - } - }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", @@ -957,10 +1066,13 @@ "iconv-lite": "0.4.19" } }, - "env-variable": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.3.tgz", - "integrity": "sha1-uGwWQb5WECZ9UG8YBx6nbXBwl8s=" + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "requires": { + "once": "1.4.0" + } }, "errno": { "version": "0.1.4", @@ -983,8 +1095,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "1.9.0", @@ -1108,6 +1219,11 @@ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", "dev": true }, + "fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + }, "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", @@ -1120,6 +1236,11 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-1.2.1.tgz", + "integrity": "sha512-g2UqeO0yyYjTSpiH4zJQk+IycRxyYRABjSf+TpmeMOn9uByzFIoX0y/HnweCFhKb+uuPwjIvqXuK/LTteEBhow==" + }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", @@ -1191,6 +1312,11 @@ } } }, + "flatstr": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.5.tgz", + "integrity": "sha1-W0UbCMvUji6sVKK74L9GFlqhS+M=" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1246,6 +1372,12 @@ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -1300,6 +1432,41 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", + "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "6.0.4", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -1363,8 +1530,7 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "hawk": { "version": "6.0.2", @@ -1394,6 +1560,15 @@ "os-tmpdir": "1.0.2" } }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -1436,6 +1611,15 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1449,8 +1633,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "invariant": { "version": "2.2.2", @@ -1597,8 +1780,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -1618,7 +1800,8 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "istanbul-api": { "version": "1.2.1", @@ -2202,14 +2385,6 @@ "is-buffer": "1.1.6" } }, - "kuler": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-0.0.0.tgz", - "integrity": "sha1-tmu0a5NOVQ9Z2BiEjgq7pPf1VTw=", - "requires": { - "colornames": "0.0.2" - } - }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -2226,6 +2401,12 @@ "invert-kv": "1.0.0" } }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -2313,14 +2494,11 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "logform": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-1.2.1.tgz", - "integrity": "sha1-5wfvez86nxbCSK5X8dAVB0/Ga/U=", - "requires": { - "colors": "1.1.2", - "date-fns": "1.29.0" - } + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true }, "longest": { "version": "1.0.1", @@ -2337,6 +2515,16 @@ "js-tokens": "3.0.2" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", @@ -2347,6 +2535,12 @@ "yallist": "2.1.2" } }, + "make-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.2.tgz", + "integrity": "sha512-l9ra35l5VWLF24y75Tg8XgfGLX0ueRhph118WKM6H5denx4bB5QF59+4UAm9oJ2qsPQZas/CQUDdtDdfvYHBdQ==", + "dev": true + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -2356,6 +2550,12 @@ "tmpl": "1.0.4" } }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", @@ -2365,6 +2565,32 @@ "mimic-fn": "1.1.0" } }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "merge": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", @@ -2448,6 +2674,15 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "nested-error-stacks": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz", + "integrity": "sha1-GfYZWRUZ8JZ2mlupqG5u7sgjw88=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, "nock": { "version": "9.0.25", "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.25.tgz", @@ -2560,16 +2795,10 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1.0.2" } }, - "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" - }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -2673,6 +2902,12 @@ "error-ex": "1.3.1" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, "parse5": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", @@ -2749,6 +2984,20 @@ "pinkie": "2.0.4" } }, + "pino": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-4.10.2.tgz", + "integrity": "sha512-hNNDgOju2UvK4iKqXR3ZwEutoOujBRN9jfQgty/X4B3q1QOqpWqvmVn+GT/a20o8Jw5Wd7VkGJAdgFQg55a+mw==", + "requires": { + "chalk": "2.3.0", + "fast-json-parse": "1.0.3", + "fast-safe-stringify": "1.2.1", + "flatstr": "1.0.5", + "pump": "1.0.3", + "quick-format-unescaped": "1.1.1", + "split2": "2.2.0" + } + }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -2794,6 +3043,11 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, "propagate": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", @@ -2812,6 +3066,15 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -2824,6 +3087,14 @@ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true }, + "quick-format-unescaped": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-1.1.1.tgz", + "integrity": "sha1-53VV7z5m4QXUA54T73kgEoT+6RY=", + "requires": { + "fast-safe-stringify": "1.2.1" + } + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -2907,6 +3178,30 @@ } } }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, "reflect-metadata": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", @@ -3145,6 +3440,14 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "2.0.3" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3167,11 +3470,6 @@ "tweetnacl": "0.14.5" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, "string-length": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", @@ -3200,6 +3498,14 @@ } } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -3238,11 +3544,25 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, "requires": { "has-flag": "2.0.0" } @@ -3266,17 +3586,21 @@ "require-main-filename": "1.0.1" } }, - "text-hex": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-0.0.0.tgz", - "integrity": "sha1-V4+8haapJjbkLdF7QdAhjM6esrM=" - }, "throat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -3304,17 +3628,18 @@ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", "dev": true }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "triple-beam": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.1.0.tgz", - "integrity": "sha1-KsOHyMS9BL0mxh34kaYHn4WS/hA=" - }, "ts-jest": { "version": "21.1.4", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-21.1.4.tgz", @@ -3418,6 +3743,50 @@ } } }, + "ts-node": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz", + "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.3.0", + "diff": "3.4.0", + "make-error": "1.3.2", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18", + "tsconfig": "6.0.0", + "v8flags": "3.0.1", + "yn": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "requires": { + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "tslib": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", @@ -3425,20 +3794,22 @@ "dev": true }, "tslint": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.1.0.tgz", - "integrity": "sha1-UaR7rutYlW/NYXvSzwDi7w7qLtk=", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", + "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", "dev": true, "requires": { "babel-code-frame": "6.26.0", - "colors": "1.1.2", + "builtin-modules": "1.1.1", + "chalk": "2.3.0", + "commander": "2.12.2", "diff": "3.4.0", - "findup-sync": "0.3.0", "glob": "7.1.2", - "optimist": "0.6.1", + "minimatch": "3.0.4", "resolve": "1.5.0", "semver": "5.4.1", - "tsutils": "1.9.1" + "tslib": "1.8.0", + "tsutils": "2.12.1" }, "dependencies": { "resolve": { @@ -3449,12 +3820,6 @@ "requires": { "path-parse": "1.0.5" } - }, - "tsutils": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", - "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", - "dev": true } } }, @@ -3556,6 +3921,12 @@ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", "dev": true }, + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -3596,11 +3967,25 @@ "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", "dev": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, + "v8flags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", + "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", @@ -3629,6 +4014,40 @@ "dev": true, "requires": { "tslint": "5.1.0" + }, + "dependencies": { + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "tslint": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.1.0.tgz", + "integrity": "sha1-UaR7rutYlW/NYXvSzwDi7w7qLtk=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "colors": "1.1.2", + "diff": "3.4.0", + "findup-sync": "0.3.0", + "glob": "7.1.2", + "optimist": "0.6.1", + "resolve": "1.5.0", + "semver": "5.4.1", + "tsutils": "1.9.1" + } + }, + "tsutils": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", + "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "dev": true + } } }, "walker": { @@ -3721,26 +4140,6 @@ "dev": true, "optional": true }, - "winston": { - "version": "3.0.0-rc1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.0.0-rc1.tgz", - "integrity": "sha512-aNtKirnK2UEe5v56SK0TIEr5ylyYdXyjAaIJXZTk21UlNx7FQclTkVU2T1ZzMtdDM+Rk2b7vrI/e/4n8U84XaQ==", - "requires": { - "async": "1.5.2", - "diagnostics": "1.1.0", - "isstream": "0.1.2", - "logform": "1.2.1", - "one-time": "0.0.4", - "stack-trace": "0.0.10", - "triple-beam": "1.1.0", - "winston-transport": "3.0.1" - } - }, - "winston-transport": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-3.0.1.tgz", - "integrity": "sha1-gAixXu9WYMT7P6CU1YzL0IUoxY0=" - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -3792,8 +4191,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.3.0", @@ -3961,6 +4359,12 @@ "dev": true } } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/src/LimitCheckerImpl.ts b/src/LimitCheckerImpl.ts index d909cd5e..6ca86557 100644 --- a/src/LimitCheckerImpl.ts +++ b/src/LimitCheckerImpl.ts @@ -25,6 +25,7 @@ export default class LimitCheckerImpl implements LimitChecker { new InvertedSpreadLimit(spreadAnalysisResult), new MinTargetProfitLimit(configStore, spreadAnalysisResult), new MaxTargetProfitLimit(configStore, spreadAnalysisResult), + new MaxTargetVolumeLimit(configStore, spreadAnalysisResult), new DemoModeLimit(configStore) ]; } @@ -132,6 +133,33 @@ class MaxTargetProfitLimit implements LimitChecker { } } +class MaxTargetVolumeLimit implements LimitChecker { + private readonly log = getLogger('MaxTargetVolumeLimit'); + + constructor(private readonly configStore: ConfigStore, private readonly spreadAnalysisResult: SpreadAnalysisResult) {} + + check() { + const success = this.isVolumeSmallerThanLimit(); + if (success) { + return { success, reason: '' }; + } + const reason = 'Too large Volume'; + this.log.info(t`TargetVolumeIsLargerThanMaxTargetVolumePercent`); + return { success, reason }; + } + + private isVolumeSmallerThanLimit(): boolean { + const { config } = this.configStore; + const { availableVolume, targetVolume } = this.spreadAnalysisResult; + const maxTargetVolume = _.min([ + config.maxTargetVolumePercent !== undefined + ? _.round(config.maxTargetVolumePercent / 100 * availableVolume) + : Number.MAX_SAFE_INTEGER + ]) as number; + return targetVolume <= maxTargetVolume; + } +} + class DemoModeLimit implements LimitChecker { private readonly log = getLogger('DemoModeLimit'); diff --git a/src/config_default.json b/src/config_default.json index 3b53cca0..7187b4e9 100644 --- a/src/config_default.json +++ b/src/config_default.json @@ -7,6 +7,7 @@ "minTargetProfit": 10, "minTargetProfitPercent": 0.0, "minExitTargetProfit": -5, + "maxTargetVolumePercent": 20.0, "iterationInterval": 3000, "positionRefreshInterval": 5000, "sleepAfterSend": 5000, diff --git a/src/stringResources.ts b/src/stringResources.ts index cc7ea787..70ed9d3c 100644 --- a/src/stringResources.ts +++ b/src/stringResources.ts @@ -3,6 +3,7 @@ export const en = { AtLeastTwoBrokersMustBeEnabled: 'At least two brokers must be enabled.', AvailableVolume: 'Available volume', TargetVolumeIsSmallerThanMinSize: 'Target volume is smaller than min size.', + TargetVolumeIsLargerThanMaxTargetVolumePercent: 'Target volume is larger than max target volume percent.', BestAsk: 'Best ask', BestBid: 'Best bid', BothLegsAreSuccessfullyFilled: '>>Both legs are successfully filled.', @@ -57,6 +58,7 @@ export const ja = { AtLeastTwoBrokersMustBeEnabled: '少なくとも2つの取引所を有効にする必要があります。', AvailableVolume: '裁定可能数量', TargetVolumeIsSmallerThanMinSize: '裁定機会なし。目標数量 < 最小数量設定', + TargetVolumeIsLargerThanMaxTargetVolumePercent: '裁定機会なし。目標数量 > 裁定可能数量に対する割合', BestAsk: 'ベストアスク', BestBid: 'ベストビッド', BothLegsAreSuccessfullyFilled: '>>両方のオーダーの約定完了。', diff --git a/src/types.ts b/src/types.ts index a1183200..afc5fb71 100644 --- a/src/types.ts +++ b/src/types.ts @@ -198,6 +198,7 @@ export class ConfigRoot extends Castable { @cast minExitTargetProfitPercent: number; @cast maxTargetProfit: number; @cast maxTargetProfitPercent: number; + @cast maxTargetVolumePercent: number; @cast iterationInterval: number; @cast positionRefreshInterval: number; @cast sleepAfterSend: number; From 27c8e73cfba21bab9d0aec59729c0ba93e1bd9c1 Mon Sep 17 00:00:00 2001 From: Connie-Wild Date: Fri, 29 Dec 2017 23:30:21 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E8=A3=81=E5=AE=9A=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E3=81=AB=E5=AF=BE=E3=81=99=E3=82=8B=E8=A3=81?= =?UTF-8?q?=E5=AE=9A=E6=95=B0=E9=87=8F=E3=81=AE=E5=89=B2=E5=90=88=E3=81=AB?= =?UTF-8?q?=E5=88=B6=E9=99=90=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/LimitCheckerImpl.ts | 6 +----- src/config_default.json | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/LimitCheckerImpl.ts b/src/LimitCheckerImpl.ts index 6ca86557..7d8ac6d0 100644 --- a/src/LimitCheckerImpl.ts +++ b/src/LimitCheckerImpl.ts @@ -151,11 +151,7 @@ class MaxTargetVolumeLimit implements LimitChecker { private isVolumeSmallerThanLimit(): boolean { const { config } = this.configStore; const { availableVolume, targetVolume } = this.spreadAnalysisResult; - const maxTargetVolume = _.min([ - config.maxTargetVolumePercent !== undefined - ? _.round(config.maxTargetVolumePercent / 100 * availableVolume) - : Number.MAX_SAFE_INTEGER - ]) as number; + const maxTargetVolume = config.maxTargetVolumePercent / 100 * availableVolume; return targetVolume <= maxTargetVolume; } } diff --git a/src/config_default.json b/src/config_default.json index 7187b4e9..90df508c 100644 --- a/src/config_default.json +++ b/src/config_default.json @@ -7,7 +7,7 @@ "minTargetProfit": 10, "minTargetProfitPercent": 0.0, "minExitTargetProfit": -5, - "maxTargetVolumePercent": 20.0, + "maxTargetVolumePercent": 50.0, "iterationInterval": 3000, "positionRefreshInterval": 5000, "sleepAfterSend": 5000, From 06f1c183d2a7b9748a2b250e442df653dde337e3 Mon Sep 17 00:00:00 2001 From: Connie-Wild Date: Sat, 30 Dec 2017 00:42:15 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=E8=A3=81=E5=AE=9A=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=95=B0=E9=87=8F=E3=81=AB=E5=AF=BE=E3=81=99=E3=82=8B=E8=A3=81?= =?UTF-8?q?=E5=AE=9A=E6=95=B0=E9=87=8F=E3=81=AE=E5=89=B2=E5=90=88=E3=81=AB?= =?UTF-8?q?=E5=88=B6=E9=99=90=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/LimitCheckerImpl.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/LimitCheckerImpl.ts b/src/LimitCheckerImpl.ts index 7d8ac6d0..c9ad8479 100644 --- a/src/LimitCheckerImpl.ts +++ b/src/LimitCheckerImpl.ts @@ -151,7 +151,11 @@ class MaxTargetVolumeLimit implements LimitChecker { private isVolumeSmallerThanLimit(): boolean { const { config } = this.configStore; const { availableVolume, targetVolume } = this.spreadAnalysisResult; - const maxTargetVolume = config.maxTargetVolumePercent / 100 * availableVolume; + const maxTargetVolume = _.min([ + config.maxTargetVolumePercent !== undefined + ? config.maxTargetVolumePercent / 100 * availableVolume + : Number.MAX_SAFE_INTEGER + ]) as number; return targetVolume <= maxTargetVolume; } } From 849d720eecda45dc31e6763c57b1345b6b1ca857 Mon Sep 17 00:00:00 2001 From: Connie-Wild Date: Sat, 30 Dec 2017 02:28:26 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E3=82=AF=E3=83=AD=E3=83=BC=E3=82=BA?= =?UTF-8?q?=E6=99=82=E3=81=AB=E3=82=82=E8=A3=81=E5=AE=9A=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E3=81=AE=E5=89=B2=E5=90=88=E5=88=B6=E9=99=90=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/LimitCheckerImpl.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/LimitCheckerImpl.ts b/src/LimitCheckerImpl.ts index c9ad8479..1914d9e3 100644 --- a/src/LimitCheckerImpl.ts +++ b/src/LimitCheckerImpl.ts @@ -17,6 +17,7 @@ export default class LimitCheckerImpl implements LimitChecker { this.limits = [ new MaxNetExposureLimit(configStore, positionService), new MaxTargetProfitLimit(configStore, spreadAnalysisResult), + new MaxTargetVolumeLimit(configStore, spreadAnalysisResult), new DemoModeLimit(configStore) ]; } else { From 278af3c64fb74b71a0a5888ba1156446a9903b8e Mon Sep 17 00:00:00 2001 From: bitrinjani Date: Sat, 30 Dec 2017 08:19:09 +0900 Subject: [PATCH 5/5] add unit test for MaxTargetVolumeLimit --- src/__tests__/LimitCheckerImpl.test.ts | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/__tests__/LimitCheckerImpl.test.ts diff --git a/src/__tests__/LimitCheckerImpl.test.ts b/src/__tests__/LimitCheckerImpl.test.ts new file mode 100644 index 00000000..b601fad8 --- /dev/null +++ b/src/__tests__/LimitCheckerImpl.test.ts @@ -0,0 +1,38 @@ +import LimitCheckerImpl from '../LimitCheckerImpl'; +import { options } from '../logger'; +options.enabled = false; + +describe('LimitCheckerImpl', () => { + test('MaxTargetVolumeLimit - violate', () => { + const config = { maxTargetVolumePercent: 50 }; + const ps = {}; + const analysisResult = { availableVolume: 1.0, targetVolume: 0.7 }; + const checker = new LimitCheckerImpl({ config }, ps, analysisResult, analysisResult, false); + checker.limits = checker.limits.filter(limit => limit.constructor.name === 'MaxTargetVolumeLimit'); + const result = checker.check(); + expect(result.success).toBe(false); + expect(result.reason).toBe('Too large Volume'); + }); + + test('MaxTargetVolumeLimit - pass', () => { + const config = { maxTargetVolumePercent: 50 }; + const ps = {}; + const analysisResult = { availableVolume: 1.0, targetVolume: 0.3 }; + const checker = new LimitCheckerImpl({ config }, ps, analysisResult, analysisResult, false); + checker.limits = checker.limits.filter(limit => limit.constructor.name === 'MaxTargetVolumeLimit'); + const result = checker.check(); + expect(result.success).toBe(true); + expect(result.reason).toBe(''); + }); + + test('MaxTargetVolumeLimit - undefined', () => { + const config = { maxTargetVolumePercent: undefined }; + const ps = {}; + const analysisResult = { availableVolume: 1.0, targetVolume: 0.3 }; + const checker = new LimitCheckerImpl({ config }, ps, analysisResult, analysisResult, false); + checker.limits = checker.limits.filter(limit => limit.constructor.name === 'MaxTargetVolumeLimit'); + const result = checker.check(); + expect(result.success).toBe(true); + expect(result.reason).toBe(''); + }); +});