From 2a74df0332dd02ecbfc74b17e5acb916e500e74c Mon Sep 17 00:00:00 2001 From: dapplion Date: Thu, 1 Aug 2019 22:51:21 +0200 Subject: [PATCH] Editable inputs Finish editable inputs typo --- package.json | 9 +- src/App.tsx | 125 +++++++++---------------- src/InputParams.tsx | 222 +++++++++++++++++++++++++++++++++++++------- yarn.lock | 133 +++++++++++++++++++++++++- 4 files changed, 371 insertions(+), 118 deletions(-) diff --git a/package.json b/package.json index cd7c111..9492d08 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,16 @@ { "name": "augmented-tbc-design", "version": "0.1.0", + "homepage": "https://dapplion.github.io/augmented-tbc-design", "dependencies": { "@material-ui/core": "latest", + "@types/lodash": "^4.14.136", "@types/react": "latest", "@types/react-dom": "latest", + "lodash": "^4.17.15", "react": "latest", "react-dom": "latest", + "react-number-format": "^4.0.8", "react-scripts": "latest", "recharts": "^1.6.2", "typescript": "latest" @@ -15,6 +19,8 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", + "predeploy": "npm run build", + "deploy": "gh-pages -d build", "eject": "react-scripts eject" }, "browserslist": { @@ -30,6 +36,7 @@ ] }, "devDependencies": { - "@types/recharts": "^1.1.20" + "@types/recharts": "^1.1.20", + "gh-pages": "^2.0.1" } } diff --git a/src/App.tsx b/src/App.tsx index 4e379a1..54cf22f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, useMemo } from "react"; // Material UI import { createStyles, makeStyles, Theme } from "@material-ui/core/styles"; import Container from "@material-ui/core/Container"; @@ -16,6 +16,7 @@ import ResultParams from "./ResultParams"; import PriceSimulationChart from "./PriceSimulationChart"; // Utils import { getLast, getAvg, pause } from "./utils"; +import { throttle } from "lodash"; // General styles import "./app.css"; @@ -73,11 +74,24 @@ const useStyles = makeStyles((theme: Theme) => ); export default function App() { - const [d0, setD0] = useState(1e6); // Initial raise, d0 (DAI) - const [theta, setTheta] = useState(0.35); // fraction allocated to reserve (.) - const [p0, setP0] = useState(0.1); // Hatch sale Price p0 (DAI / token) - const [returnF, setReturnF] = useState(3); // Return factor (.) - const [wFee, setWFee] = useState(0.05); // friction coefficient (.) + const [curveParams, setCurveParams] = useState({ + d0: 1e6, // Initial raise, d0 (DAI) + theta: 0.35, // fraction allocated to reserve (.) + p0: 0.1, // Hatch sale Price p0 (DAI / token) + returnF: 3, // Return factor (.) + wFee: 0.05 // friction coefficient (.) + }); + + const { d0, theta, p0, returnF, wFee } = curveParams; + + /** + * Throttle the curve update to prevent the expensive chart + * to re-render too often + */ + const setCurveParamsThrottle = useMemo( + () => throttle(setCurveParams, 500), + [] + ); // Simulation results const k = returnF / (1 - theta); // Invariant power kappa (.) @@ -198,62 +212,6 @@ export default function App() { }; }, [simulationActive]); - const inputFields: { - label: string; - value: number; - setter(newValue: any): void; - min: number; - max: number; - step: number; - display(value: number): string; - }[] = [ - { - label: "Initial raise", - value: d0, - setter: setD0, - min: 0.1e6, - max: 10e6, - step: 0.1e6, - display: (n: number) => `$${+(n * 1e-6).toFixed(1)}M` - }, - { - label: "Allocation to the project", - value: theta, - setter: setTheta, - min: 0, - max: 0.9, - step: 0.01, - display: (n: number) => `${Math.round(100 * n)}%` - }, - { - label: "Initial token price", - value: p0, - setter: setP0, - min: 0.01, - max: 1, - step: 0.01, - display: (n: number) => `$${n}` - }, - { - label: "Return factor", - value: returnF, - setter: setReturnF, - min: 1, - max: 10, - step: 0.1, - display: (n: number) => `${n}x` - }, - { - label: "Withdrawl fee", - value: wFee, - setter: setWFee, - min: 0, - max: 0.1, - step: 0.001, - display: (n: number) => `${+(100 * n).toFixed(1)}%` - } - ]; - const resultFields = [ { label: `Average slippage (avg tx size ${avgTxSize} DAI)`, @@ -306,7 +264,7 @@ export default function App() { {simulationActive ? ( ) : ( - + )} @@ -315,22 +273,7 @@ export default function App() { - - Preview - - + Preview @@ -352,6 +295,30 @@ export default function App() { + + + + + + + + + + + + ); diff --git a/src/InputParams.tsx b/src/InputParams.tsx index cab8bff..f39b667 100644 --- a/src/InputParams.tsx +++ b/src/InputParams.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState, useEffect, useMemo } from "react"; import { createStyles, makeStyles, @@ -8,6 +8,11 @@ import { import Typography from "@material-ui/core/Typography"; import Slider from "@material-ui/core/Slider"; import Grid from "@material-ui/core/Grid"; +import TextField from "@material-ui/core/TextField"; +import InputLabel from "@material-ui/core/InputLabel"; +import InputAdornment from "@material-ui/core/InputAdornment"; +import NumberFormat from "react-number-format"; +import { throttle } from "lodash"; const grayColor = "#90a4ae"; const blackColor = "#141e27"; @@ -86,54 +91,201 @@ const useStyles = makeStyles((theme: Theme) => }) ); +function NumberFormatCustom(props: any) { + const { inputRef, onChange, prefix, suffix, ...other } = props; + + return ( + { + onChange({ target: { value: values.value } }); + }} + thousandSeparator + prefix={prefix} + suffix={suffix} + /> + ); +} + export default function InputParams({ - inputFields + curveParams, + setCurveParams }: { - inputFields: { + curveParams?: { + d0: number; + theta: number; + p0: number; + returnF: number; + wFee: number; + }; + setCurveParams(newCurveParams: any): void; +}) { + const [d0, setD0] = useState(1e6); // Initial raise, d0 (DAI) + const [theta, setTheta] = useState(0.35); // fraction allocated to reserve (.) + const [p0, setP0] = useState(0.1); // Hatch sale Price p0 (DAI / token) + const [returnF, setReturnF] = useState(3); // Return factor (.) + const [wFee, setWFee] = useState(0.05); // friction coefficient (.) + + function setParentCurveParams() { + setCurveParams({ d0, theta, p0, returnF, wFee }); + } + + const inputFields: { label: string; value: number; setter(newValue: any): void; min: number; max: number; step: number; - display(value: number): string; - }[]; -}) { + unit?: string; + prefix?: string; + suffix?: string; + toText?(value: number): string; + toNum?(value: string): number; + format(value: number): string; + }[] = [ + { + label: "Initial raise", + value: d0, + setter: setD0, + min: 0.1e6, + max: 10e6, + step: 0.1e6, + unit: "$M", + prefix: "$", + suffix: "M", + format: (n: number) => `$${+(n * 1e-6).toFixed(1)}M`, + toText: (n: number) => String(+(n * 1e-6).toFixed(1)), + toNum: (n: string) => Math.floor(parseFloat(n) * 1e6) + }, + { + label: "Allocation to the project", + value: theta, + setter: setTheta, + min: 0, + max: 0.9, + step: 0.01, + unit: "%", + suffix: "%", + format: (n: number) => `${Math.round(100 * n)}%`, + toText: (n: number) => String(+(n * 1e2).toFixed(0)), + toNum: (n: string) => parseFloat(n) * 1e-2 + }, + { + label: "Initial token price", + value: p0, + setter: setP0, + min: 0.01, + max: 1, + step: 0.01, + unit: "$", + prefix: "$", + format: (n: number) => `$${n}` + }, + { + label: "Return factor", + value: returnF, + setter: setReturnF, + min: 1, + max: 10, + step: 0.1, + unit: "x", + suffix: "x", + format: (n: number) => `${n}x` + }, + { + label: "Withdrawl fee", + value: wFee, + setter: setWFee, + min: 0, + max: 0.1, + step: 0.001, + unit: "%", + suffix: "%", + format: (n: number) => `${+(100 * n).toFixed(1)}%`, + toText: (n: number) => String(+(n * 1e2).toFixed(1)), + toNum: (n: string) => parseFloat(n) * 1e-2 + } + ]; + const classes = useStyles(); return (
- {inputFields.map(({ label, value, setter, min, max, step, display }) => ( - - - - {label} - - + {inputFields.map( + ({ + label, + value, + setter, + min, + max, + step, + prefix, + suffix, + format, + toText, + toNum + }) => { + function sanitizeInput(num: number = 0) { + if (isNaN(num)) num = 0; + if (num > max) num = max; + else if (num < min) num = min; + setter(num); + } - - {display(value)} - + return ( + + + + {label} + + - - setter(Number(newValue))} - min={min} - max={max} - step={step} - valueLabelFormat={value => display(value).replace("$", "")} - // marks={[ - // { value: 0, label: "0%" }, - // { value: 50, label: "50%" }, - // { value: 100, label: "100%" } - // ]} - /> - - - ))} + + {/* {display(value)} */} + { + sanitizeInput( + toNum ? toNum(e.target.value) : parseFloat(e.target.value) + ); + setParentCurveParams(); + }} + InputProps={{ + inputComponent: NumberFormatCustom, + disableUnderline: true, + inputProps: { + prefix, + suffix + } + }} + value={toText ? toText(value) : value} + /> + + + + sanitizeInput(Number(newValue))} + onChangeCommitted={setParentCurveParams} + value={value} + min={min} + max={max} + step={step} + valueLabelFormat={value => format(value).replace("$", "")} + // marks={[ + // { value: 0, label: "0%" }, + // { value: 50, label: "50%" }, + // { value: 100, label: "100%" } + // ]} + /> + + + ); + } + )}
); } diff --git a/yarn.lock b/yarn.lock index 305d2c4..e0ea911 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1380,6 +1380,11 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/lodash@^4.14.136": + version "4.14.136" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f" + integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA== + "@types/prop-types@*": version "15.7.1" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6" @@ -1922,6 +1927,13 @@ async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +async@^2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2702,7 +2714,7 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0: +commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== @@ -3607,6 +3619,11 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +email-addresses@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.0.3.tgz#fc3c6952f68da24239914e982c8a7783bc2ed96d" + integrity sha512-kUlSC06PVvvjlMRpNIl3kR1NRXLEe86VQ7N0bQeaCZb2g+InShCeHQp/JvyYNTugMnRN2NvJhHlc3q12MWbbpg== + emoji-regex@^7.0.1, emoji-regex@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -4144,6 +4161,28 @@ file-loader@3.0.1: loader-utils "^1.0.2" schema-utils "^1.0.0" +filename-reserved-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" + integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q= + +filenamify-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filenamify-url/-/filenamify-url-1.0.0.tgz#b32bd81319ef5863b73078bed50f46a4f7975f50" + integrity sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A= + dependencies: + filenamify "^1.0.0" + humanize-url "^1.0.0" + +filenamify@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" + integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU= + dependencies: + filename-reserved-regex "^1.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + filesize@3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" @@ -4429,6 +4468,20 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gh-pages@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-2.0.1.tgz#aefe47a43b8d9d2aa3130576b33fe95641e29a2f" + integrity sha512-uFlk3bukljeiWKQ2XvPfjcSi/ou7IfoDf2p+Fj672saLAr8bnOdFVqI/JSgrSgInKpCg5BksxEwGUl++dbg8Dg== + dependencies: + async "^2.6.1" + commander "^2.18.0" + email-addresses "^3.0.1" + filenamify-url "^1.0.0" + fs-extra "^7.0.0" + globby "^6.1.0" + graceful-fs "^4.1.11" + rimraf "^2.6.2" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -4807,6 +4860,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +humanize-url@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/humanize-url/-/humanize-url-1.0.1.tgz#f4ab99e0d288174ca4e1e50407c55fbae464efff" + integrity sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8= + dependencies: + normalize-url "^1.0.0" + strip-url-auth "^1.0.0" + hyphenate-style-name@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" @@ -5215,6 +5276,11 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -6200,7 +6266,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -"lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.5, lodash@~4.17.4: +"lodash@>=3.5 <5", lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -6725,6 +6791,16 @@ normalize-scroll-left@^0.2.0: resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz#9445d74275f303cc661e113329aefa492f58114c" integrity sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA== +normalize-url@^1.0.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + normalize-url@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" @@ -7946,6 +8022,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + pretty-bytes@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" @@ -8103,6 +8184,14 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -8233,6 +8322,13 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-number-format@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-4.0.8.tgz#f0a0dfbeded9a746f4d8b309926cf55d7effebb2" + integrity sha512-A7Gi4BSkdgnyY1DO98lwFvWujcyxZCOfNP6tkiOKkwMY6oFP+JTQhd/vQ9dXXs6TpyXfl1eBJdueokM7o98YTQ== + dependencies: + prop-types "^15.7.2" + react-resize-detector@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-2.3.0.tgz#57bad1ae26a28a62a2ddb678ba6ffdf8fa2b599c" @@ -8705,7 +8801,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -9073,6 +9169,13 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -9255,6 +9358,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" @@ -9356,6 +9464,18 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +strip-url-auth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-url-auth/-/strip-url-auth-1.0.1.tgz#22b0fa3a41385b33be3f331551bbb837fa0cd7ae" + integrity sha1-IrD6OkE4WzO+PzMVUbu4N/oM164= + style-loader@0.23.1: version "0.23.1" resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" @@ -9627,6 +9747,13 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"