diff --git a/.angular-cli.json b/.angular-cli.json --- a/.angular-cli.json +++ b/.angular-cli.json @@ -24,7 +24,9 @@ "../node_modules/font-awesome/css/font-awesome.css", "theme.scss" ], - "scripts": [], + "scripts": [ + "../node_modules/compressorjs/dist/compressor.min.js" + ], "environmentSource": "environments/environment.ts", "environments": { "dev": "environments/environment.ts", diff --git a/package-lock.json b/package-lock.json --- a/package-lock.json +++ b/package-lock.json @@ -458,7 +458,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -472,6 +472,14 @@ "tslib": "^1.7.1" } }, + "@angular/flex-layout": { + "version": "5.0.0-beta.15", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-5.0.0-beta.15.tgz", + "integrity": "sha512-rGvvjDu0PMrsfTsNX+qcNc4EloKGXTxW8FT1tKcdIxOUMRQkvflkwAnKW2kRWNfEgDtBNt+VNP98u2w+athvZQ==", + "requires": { + "tslib": "^1.7.1" + } + }, "@angular/forms": { "version": "5.2.11", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz", @@ -535,6 +543,34 @@ "resolved": "https://registry.npmjs.org/@angular/typescript/-/typescript-2.0.0-5d0e199.tgz", "integrity": "sha1-scM7915pc9CNCzIdHW/G0uxQXRA=" }, + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, "@ngtools/json-schema": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", @@ -595,7 +631,7 @@ }, "@types/jasmine": { "version": "2.5.38", - "resolved": "http://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.38.tgz", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.38.tgz", "integrity": "sha1-pDeRJMSSHU4h3lTsdGacnps1Zxc=", "dev": true }, @@ -605,21 +641,21 @@ "integrity": "sha512-FWR7QB7EqBRq1s9BMk0ccOSOuRLfVEWYpHQYpFPaXtCoqN6dJx2ttdsdQbUxLLnAlKpYeVjveGGhQ3583TTa7g==" }, "@types/node": { - "version": "6.0.114", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz", - "integrity": "sha512-5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==", + "version": "6.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.6.tgz", + "integrity": "sha512-rFs9zCFtSHuseiNXxYxFlun8ibu+jtZPgRM+2ILCmeLiGeGLiIGxuOzD+cNyHegI1GD+da3R/cIbs9+xCLp13w==", "dev": true }, "@types/q": { "version": "0.0.32", - "resolved": "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, "@types/selenium-webdriver": { - "version": "2.53.43", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", - "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", "dev": true }, "abbrev": { @@ -629,19 +665,19 @@ "dev": true }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, "acorn-dynamic-import": { @@ -669,9 +705,9 @@ "optional": true }, "adm-zip": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", "dev": true }, "after": { @@ -690,15 +726,15 @@ } }, "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" + "uri-js": "^4.2.2" }, "dependencies": { "fast-deep-equal": { @@ -716,9 +752,9 @@ } }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, "align-text": { @@ -739,17 +775,18 @@ "dev": true }, "amqplib": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", - "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.3.tgz", + "integrity": "sha512-ZOdUhMxcF+u62rPI+hMtU1NBXSDFQ3eCJJrenamtdQ7YYwh7RZJHOIM1gonVbZ5PyVdYH4xqBPje9OYqk7fnqw==", "dev": true, "optional": true, "requires": { - "bitsyntax": "~0.0.4", - "bluebird": "^3.4.6", - "buffer-more-ints": "0.0.2", + "bitsyntax": "~0.1.0", + "bluebird": "^3.5.2", + "buffer-more-ints": "~1.0.0", "readable-stream": "1.x >=1.1.9", - "safe-buffer": "^5.0.1" + "safe-buffer": "~5.1.2", + "url-parse": "~1.4.3" }, "dependencies": { "isarray": { @@ -761,7 +798,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "optional": true, @@ -879,18 +916,18 @@ } }, "app-root-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", - "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", "dev": true }, "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "default-require-extensions": "^1.0.0" } }, "aproba": { @@ -945,9 +982,9 @@ "dev": true }, "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, "array-includes": { @@ -1007,10 +1044,13 @@ "optional": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "asn1.js": { "version": "4.10.1", @@ -1024,11 +1064,12 @@ } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -1063,25 +1104,25 @@ "dev": true }, "ast-types": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", - "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.1.tgz", + "integrity": "sha512-b+EeK0WlzrSmpMw5jktWvQGxblpWnvMrV+vOp69RLjzGiHwWV0vgq75DPKtUjppKni3yWwSW8WLGV3Ch/XIWcQ==", "dev": true, "optional": true }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-foreach": { @@ -1104,9 +1145,9 @@ "dev": true }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "autoprefixer": { @@ -1131,14 +1172,14 @@ "optional": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "axios": { "version": "0.15.3", - "resolved": "http://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", "dev": true, "optional": true, @@ -1148,7 +1189,7 @@ "dependencies": { "follow-redirects": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", "dev": true, "optional": true, @@ -1177,7 +1218,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -1395,7 +1436,6 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -1416,24 +1456,26 @@ "dev": true }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "bitsyntax": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", - "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz", + "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==", "dev": true, "optional": true, "requires": { - "buffer-more-ints": "0.0.2" + "buffer-more-ints": "~1.0.0", + "debug": "~2.6.9", + "safe-buffer": "~5.1.2" } }, "bl": { "version": "1.1.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", "dev": true, "optional": true, @@ -1450,7 +1492,7 @@ }, "readable-stream": { "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "optional": true, @@ -1473,9 +1515,9 @@ } }, "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, "block-stream": { @@ -1499,18 +1541,23 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", "dev": true }, + "blueimp-canvas-to-blob": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.14.0.tgz", + "integrity": "sha512-i6I2CiX1VR8YwUNYBo+dM8tg89ns4TTHxSpWjaDeHKcYS3yFalpLCwDaY21/EsJMufLy2tnG4j0JN5L8OVNkKQ==" + }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -1518,27 +1565,33 @@ "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } } @@ -1655,7 +1708,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -1692,7 +1745,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -1734,9 +1787,18 @@ "electron-to-chromium": "^1.3.30" } }, + "browserstack": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", + "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, "buffer": { "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -1745,10 +1807,32 @@ "isarray": "^1.0.0" } }, - "buffer-from": { + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-indexof": { @@ -1758,9 +1842,9 @@ "dev": true }, "buffer-more-ints": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", - "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==", "dev": true }, "buffer-xor": { @@ -1859,9 +1943,9 @@ } }, "cache-loader": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", - "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.5.tgz", + "integrity": "sha512-enWKEQ4kO3YreDFd7AtVRjtJBmNiqh/X9hVDReu0C4qm8gsGmySkwuWtdc+N5O+vq5FzxL1mIZc30NyXCB7o/Q==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -1903,15 +1987,15 @@ } }, "caniuse-lite": { - "version": "1.0.30000865", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", - "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==", + "version": "1.0.30000969", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000969.tgz", + "integrity": "sha512-Kus0yxkoAJgVc0bax7S4gLSlFifCa7MnSZL9p9VuS/HIKEL4seaqh28KIQAAO50cD/rJ5CiJkJFapkdDAlhFxQ==", "dev": true }, "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, "caseless": { @@ -1959,15 +2043,15 @@ } }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true }, "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, "cipher-base": { @@ -1987,9 +2071,9 @@ "dev": true }, "circular-json": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.5.tgz", - "integrity": "sha512-13YaR6kiz0kBNmIVM87Io8Hp7bWOo4r61vkEANy8iH9R9bc6avud/1FT0SBpqR1RpIQADOh/Q+yHZDA1iL6ysA==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", "dev": true }, "class-utils": { @@ -2022,20 +2106,12 @@ } }, "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "0.5.x" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "source-map": "~0.6.0" } }, "cli-boxes": { @@ -2056,9 +2132,9 @@ } }, "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, "clone-deep": { @@ -2103,12 +2179,12 @@ "dev": true }, "codelyzer": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.4.2.tgz", - "integrity": "sha512-tW796ECKMAynFtl/yyS5NRYhufbT3CEKjjMQ450kUeCcQlK7OIqD9VGRVwC3gSQSK4VaewCKCaVL0bzv9PhsLg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", "dev": true, "requires": { - "app-root-path": "^2.0.1", + "app-root-path": "^2.1.0", "css-selector-tokenizer": "^0.7.0", "cssauron": "^1.4.0", "semver-dsl": "^1.0.1", @@ -2123,9 +2199,9 @@ "dev": true }, "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true } } @@ -2141,18 +2217,18 @@ } }, "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "1.1.1" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "colors": { @@ -2171,9 +2247,9 @@ } }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -2196,12 +2272,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compare-versions": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.3.0.tgz", - "integrity": "sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ==", - "dev": true - }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -2209,9 +2279,9 @@ "dev": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "component-inherit": { @@ -2221,43 +2291,36 @@ "dev": true }, "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", "dev": true, "requires": { - "mime-db": ">= 1.34.0 < 2" - }, - "dependencies": { - "mime-db": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", - "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=", - "dev": true - } + "mime-db": ">= 1.40.0 < 2" } }, "compression": { - "version": "1.7.2", - "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", - "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { - "accepts": "~1.3.4", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.13", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.1", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", "vary": "~1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } + } + }, + "compressorjs": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/compressorjs/-/compressorjs-1.0.5.tgz", + "integrity": "sha512-QUcAxEOG/qc/BoSbmv9Y1lZrKz7uEPbMirNgT4c/S0xibRB24hz+2pkNBUs9FPvY5nKKxsELkXIono/DBwe8XQ==", + "requires": { + "blueimp-canvas-to-blob": "^3.14.0", + "is-blob": "^2.0.1" } }, "concat-map": { @@ -2293,44 +2356,21 @@ } }, "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "requires": { "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", "utils-merge": "1.0.1" - }, - "dependencies": { - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - } } }, "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, "console-browserify": { @@ -2355,10 +2395,13 @@ "dev": true }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -2367,15 +2410,18 @@ "dev": true }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", "dev": true }, "cookie-signature": { @@ -2427,9 +2473,9 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -2438,9 +2484,9 @@ } }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" }, "core-object": { "version": "3.1.5", @@ -2502,7 +2548,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -2515,7 +2561,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -2592,9 +2638,9 @@ } }, "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { "cssesc": "^0.1.0", @@ -2603,9 +2649,9 @@ } }, "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, "cssauron": { @@ -2677,11 +2723,23 @@ } }, "data-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.1.tgz", + "integrity": "sha512-OkVVLrerfAKZlW2ZZ3Ve2y65jgiWqBKsTfUIAFbn8nVbPcCZg6l6gikKlEYv0kXcmzqGm6mFq/Jf2vriuEkv8A==", "dev": true, - "optional": true + "optional": true, + "requires": { + "@types/node": "^8.0.7" + }, + "dependencies": { + "@types/node": { + "version": "8.10.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.48.tgz", + "integrity": "sha512-c35YEBTkL4rzXY2ucpSKy+UYHjUBIIkuJbWYbsGIrKLEWU5dgJMmLkkIb3qeC3O3Tpb1ZQCwecscvJTDjDjkRw==", + "dev": true, + "optional": true + } + } }, "date-format": { "version": "1.2.0", @@ -2736,30 +2794,21 @@ "optional": true }, "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "^3.0.0" - }, - "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 - } + "strip-bom": "^2.0.0" } }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "object-keys": "^1.0.12" } }, "define-property": { @@ -2928,9 +2977,9 @@ } }, "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, "di": { @@ -2947,7 +2996,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -2957,12 +3006,11 @@ } }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "arrify": "^1.0.1", "path-type": "^3.0.0" } }, @@ -2992,20 +3040,12 @@ } }, "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "utila": "~0.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } + "utila": "~0.4" } }, "dom-serialize": { @@ -3021,21 +3061,13 @@ } }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } + "domelementtype": "^1.3.0", + "entities": "^1.1.1" } }, "dom-urls": { @@ -3054,15 +3086,15 @@ "dev": true }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { "domelementtype": "1" @@ -3106,9 +3138,9 @@ "dev": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -3118,13 +3150,13 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -3140,15 +3172,15 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.52", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz", - "integrity": "sha1-0tnxJwuko7lnuDHEDvcftNmrXOA=", + "version": "1.3.135", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.135.tgz", + "integrity": "sha512-xXLNstRdVsisPF3pL3H9TVZo2XkMILfqtD6RiWIUmDK2sFX1Bjwqmd8LBp0Kuo2FgKO63JXPoEVGm8WyYdwP0Q==", "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -3202,6 +3234,12 @@ "ws": "~3.3.1" }, "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -3232,6 +3270,12 @@ "yeast": "0.1.2" }, "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -3244,15 +3288,15 @@ } }, "engine.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "~0.0.7", "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", + "blob": "0.0.5", "has-binary2": "~1.0.2" } }, @@ -3275,9 +3319,9 @@ "dev": true }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, "errno": { "version": "0.1.7", @@ -3298,38 +3342,39 @@ } }, "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "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==", "dev": true, "requires": { - "is-callable": "^1.1.1", + "is-callable": "^1.1.4", "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-symbol": "^1.0.2" } }, "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "version": "0.10.50", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", + "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", "dev": true, "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.1", - "next-tick": "1" + "next-tick": "^1.0.0" } }, "es6-iterator": { @@ -3358,9 +3403,9 @@ } }, "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", "dev": true }, "es6-promisify": { @@ -3420,9 +3465,9 @@ "dev": true }, "escodegen": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz", - "integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, "optional": true, "requires": { @@ -3455,9 +3500,9 @@ } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esrecurse": { @@ -3503,15 +3548,15 @@ } }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", "dev": true }, "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "eventsource": { @@ -3630,39 +3675,39 @@ } }, "express": { - "version": "4.16.3", - "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.0.tgz", + "integrity": "sha512-1Z7/t3Z5ZnBG252gKUPyItc4xdeaA0X934ca2ewckAsVsw9EG71i++ZHZPYnus8g/s5Bty8IMpSVEuRkmwwPRQ==", "dev": true, "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, @@ -3674,23 +3719,17 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extend-shallow": { @@ -3784,9 +3823,9 @@ "optional": true }, "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, "faye-websocket": { @@ -3800,7 +3839,7 @@ }, "file-loader": { "version": "1.1.11", - "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { @@ -3845,17 +3884,17 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, @@ -3888,34 +3927,40 @@ } }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "follow-redirects": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", - "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "dev": true, "requires": { - "debug": "^3.1.0" + "debug": "^3.2.6" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - } - } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } }, "font-awesome": { "version": "4.7.0", @@ -3937,12 +3982,6 @@ "for-in": "^1.0.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3950,14 +3989,14 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "optional": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.5", "mime-types": "^2.1.12" } }, @@ -4031,14 +4070,14 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -4059,7 +4098,7 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, @@ -4083,7 +4122,7 @@ } }, "chownr": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true @@ -4110,16 +4149,16 @@ "optional": true }, "debug": { - "version": "2.6.9", + "version": "4.1.1", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.5.1", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true @@ -4168,7 +4207,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.3", "bundled": true, "dev": true, "optional": true, @@ -4188,12 +4227,12 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", + "version": "0.4.24", "bundled": true, "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -4254,16 +4293,16 @@ "dev": true }, "minipass": { - "version": "2.2.4", + "version": "2.3.5", "bundled": true, "dev": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", + "version": "1.2.1", "bundled": true, "dev": true, "optional": true, @@ -4280,35 +4319,35 @@ } }, "ms": { - "version": "2.0.0", + "version": "2.1.1", "bundled": true, "dev": true, "optional": true }, "needle": { - "version": "2.2.0", + "version": "2.3.0", "bundled": true, "dev": true, "optional": true, "requires": { - "debug": "^2.1.2", + "debug": "^4.1.0", "iconv-lite": "^0.4.4", "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", + "version": "0.12.0", "bundled": true, "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -4325,13 +4364,13 @@ } }, "npm-bundled": { - "version": "1.0.3", + "version": "1.0.6", "bundled": true, "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", + "version": "1.4.1", "bundled": true, "dev": true, "optional": true, @@ -4406,12 +4445,12 @@ "optional": true }, "rc": { - "version": "1.2.7", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -4441,16 +4480,16 @@ } }, "rimraf": { - "version": "2.6.2", + "version": "2.6.3", "bundled": true, "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", + "version": "5.1.2", "bundled": true, "dev": true }, @@ -4467,7 +4506,7 @@ "optional": true }, "semver": { - "version": "5.5.0", + "version": "5.7.0", "bundled": true, "dev": true, "optional": true @@ -4518,17 +4557,17 @@ "optional": true }, "tar": { - "version": "4.4.1", + "version": "4.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -4539,12 +4578,12 @@ "optional": true }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { @@ -4553,16 +4592,16 @@ "dev": true }, "yallist": { - "version": "3.0.2", + "version": "3.0.3", "bundled": true, "dev": true } } }, "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4591,7 +4630,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "optional": true, @@ -4644,11 +4683,14 @@ } }, "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "is-property": "^1.0.2" + } }, "generate-object-property": { "version": "1.2.0", @@ -4679,23 +4721,54 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, "get-uri": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", - "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.3.tgz", + "integrity": "sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw==", "dev": true, "optional": true, "requires": { - "data-uri-to-buffer": "1", - "debug": "2", - "extend": "3", + "data-uri-to-buffer": "2", + "debug": "4", + "extend": "~3.0.2", "file-uri-to-path": "1", "ftp": "~0.3.10", - "readable-stream": "2" + "readable-stream": "3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "dev": true, + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "get-value": { @@ -4722,9 +4795,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4797,7 +4870,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -4815,9 +4888,9 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, "hammerjs": { @@ -4826,122 +4899,70 @@ "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "async": "^1.4.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true, "optional": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.13.tgz", + "integrity": "sha512-Lho+IJlquX6sdJgyKSJx/M9y4XbDd3ekPjD8S6HYmT5yVSwDtlSuca2w5hV4g2dIsp0Y/4orbfWxKexodmFv7w==", "dev": true, "optional": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" + "commander": "~2.20.0", + "source-map": "~0.6.1" } } } }, "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", "dev": true, "optional": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, "optional": true, "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" }, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "optional": true, "requires": { "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-stable-stringify": "^1.0.1" } } } @@ -4993,6 +5014,12 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -5070,9 +5097,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5093,9 +5120,9 @@ } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "hipchat-notifier": { @@ -5151,34 +5178,42 @@ "dev": true }, "html-minifier": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.18.tgz", - "integrity": "sha512-sczoq/9zeXiKZMj8tsQzHJE7EyjrpMHvblTLuh9o8h5923a6Ts5uQ/3YdY+xIqJYRjzHQPlrHjfjh0BtwPJG0g==", + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.16.x", - "he": "1.1.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", "param-case": "2.1.x", "relateurl": "0.2.x", "uglify-js": "3.4.x" }, "dependencies": { "commander": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, "uglify-js": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.4.tgz", - "integrity": "sha512-RiB1kNcC9RMyqwRrjXC+EjgLoXULoDnCaOnEDzUCHkBN0bHwmtF5rzDMiDWU29gu0kXCRRWwtcTAVFWRECmU2Q==", + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "requires": { - "commander": "~2.16.0", + "commander": "~2.19.0", "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } } } } @@ -5212,49 +5247,29 @@ } }, "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" }, "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true } } }, @@ -5265,21 +5280,22 @@ "dev": true }, "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", "dev": true }, "http-proxy": { @@ -5315,99 +5331,382 @@ } }, "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "httpntlm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", - "dev": true, - "requires": { - "httpreq": ">=0.4.22", - "underscore": "~1.7.0" - } - }, - "httpreq": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, "requires": { - "ms": "2.0.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "dev": true, + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "iferr": { @@ -5536,9 +5835,9 @@ } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "invariant": { @@ -5563,9 +5862,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", "dev": true }, "is-accessor-descriptor": { @@ -5592,21 +5891,17 @@ "binary-extensions": "^1.0.0" } }, + "is-blob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.0.1.tgz", + "integrity": "sha512-SmqVJYMnAeqrKLcwq6TXu1rpAg3yipVlMZIqR5u510rxoOzJGW9GQY6g+WtWkcc44pjbWAuxzZDCkbgf5e6r0Q==" + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -5614,12 +5909,12 @@ "dev": true }, "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { - "ci-info": "^1.0.0" + "ci-info": "^1.5.0" } }, "is-data-descriptor": { @@ -5734,9 +6029,9 @@ "optional": true }, "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", "dev": true, "optional": true, "requires": { @@ -5764,7 +6059,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -5825,8 +6120,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true, - "optional": true + "dev": true }, "is-redirect": { "version": "1.0.0", @@ -5856,10 +6150,13 @@ "dev": true }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "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" + } }, "is-typedarray": { "version": "1.0.0", @@ -5892,10 +6189,13 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } }, "isexe": { "version": "2.0.0", @@ -5919,20 +6219,19 @@ "dev": true }, "istanbul-api": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", - "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", "dev": true, "requires": { "async": "^2.1.4", - "compare-versions": "^3.1.0", "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-hook": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-report": "^1.1.4", - "istanbul-lib-source-maps": "^1.2.4", - "istanbul-reports": "^1.3.0", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", "js-yaml": "^3.7.0", "mkdirp": "^0.5.1", "once": "^1.4.0" @@ -5974,24 +6273,24 @@ } }, "istanbul-lib-coverage": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", - "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", "dev": true }, "istanbul-lib-hook": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz", - "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", "dev": true, "requires": { - "append-transform": "^1.0.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", - "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", "dev": true, "requires": { "babel-generator": "^6.18.0", @@ -5999,17 +6298,17 @@ "babel-traverse": "^6.18.0", "babel-types": "^6.18.0", "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-coverage": "^1.2.1", "semver": "^5.3.0" } }, "istanbul-lib-report": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", - "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-coverage": "^1.2.1", "mkdirp": "^0.5.1", "path-parse": "^1.0.5", "supports-color": "^3.1.2" @@ -6033,27 +6332,33 @@ } }, "istanbul-lib-source-maps": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", - "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", "dev": true, "requires": { "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-coverage": "^1.2.1", "mkdirp": "^0.5.1", "rimraf": "^2.6.1", "source-map": "^0.5.3" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6063,9 +6368,9 @@ } }, "istanbul-reports": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", - "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", "dev": true, "requires": { "handlebars": "^4.0.3" @@ -6112,9 +6417,9 @@ "dev": true }, "js-base64": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.6.tgz", - "integrity": "sha512-O9SR2NVICx6rCqh1qsU91QZ5IoNa+2T1ROJ0OQlfvATKGmnjsAvg3r0E5ufPZ4a95jdKTPXhFWiE/sOZ7a5Rtg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true, "optional": true }, @@ -6125,9 +6430,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -6138,8 +6443,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsesc": { "version": "1.3.0", @@ -6195,7 +6499,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, @@ -6243,62 +6547,21 @@ } }, "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.1.tgz", + "integrity": "sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw==", "dev": true, "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", + "lie": "~3.3.0", "pako": "~1.0.2", - "readable-stream": "~2.0.6" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "es6-promise": { - "version": "3.0.2", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", - "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=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" } }, "karma": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.4.tgz", - "integrity": "sha512-32yhTwoi6BZgJZhR78GwhzyFABbYG/1WwQqYgY7Vh96Demvua2jM3+FyRltIMTUH/Kd5xaQvDw2L7jTvkYFeXg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.5.tgz", + "integrity": "sha512-rECezBeY7mjzGUWhFlB7CvPHgkHJLXyUmWg+6vHCEsdWNUTnmiS6jRrIMcJEWgU2DUGZzGWG0bTRVky8fsDTOA==", "dev": true, "requires": { "bluebird": "^3.3.0", @@ -6338,6 +6601,17 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "arr-diff": { @@ -6382,24 +6656,23 @@ } }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "expand-brackets": { @@ -6610,9 +6883,9 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -6670,6 +6943,12 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true } } }, @@ -6717,18 +6996,18 @@ } }, "karma-source-map-support": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", - "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, "requires": { "source-map-support": "^0.5.5" }, "dependencies": { "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -6738,9 +7017,9 @@ } }, "killable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", - "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, "kind-of": { @@ -6792,92 +7071,6 @@ "source-map": "^0.5.3" }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6928,7 +7121,7 @@ "dependencies": { "iconv-lite": { "version": "0.4.15", - "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", "dev": true } @@ -6941,34 +7134,34 @@ "dev": true }, "license-webpack-plugin": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz", - "integrity": "sha512-NqAFodJdpBUuf1iD+Ij8hQvF0rCFKlO2KaieoQzAPhFgzLCtJnC7Z7x5gQbGNjoe++wOKAtAmwVEIBLqq2Yp1A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==", "dev": true, "requires": { "ejs": "^2.5.7" } }, "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "requires": { "immediate": "~3.0.5" } }, "linkify-it": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", - "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", + "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", "requires": { "uc.micro": "^1.0.1" } }, "load-json-file": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { @@ -6988,9 +7181,9 @@ } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -7015,9 +7208,9 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "lodash._reinterpolate": { @@ -7026,38 +7219,18 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true, - "optional": true - }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", "dev": true }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", - "dev": true, - "optional": true - }, "lodash.tail": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", @@ -7105,13 +7278,19 @@ }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, @@ -7143,7 +7322,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "optional": true, @@ -7196,7 +7375,7 @@ }, "request": { "version": "2.75.0", - "resolved": "http://registry.npmjs.org/request/-/request-2.75.0.tgz", + "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", "dev": true, "optional": true, @@ -7284,9 +7463,9 @@ "dev": true }, "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -7342,14 +7521,14 @@ } }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "optional": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } } @@ -7365,9 +7544,9 @@ } }, "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, "map-cache": { @@ -7392,9 +7571,9 @@ } }, "markdown-it": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.1.tgz", - "integrity": "sha512-CzzqSSNkFRUf9vlWvhK1awpJreMRqdCrBvZ8DIoDWTOkESMIF741UPAhuAmbyWmdiFPA6WARNhnu2M6Nrhwa+A==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", "requires": { "argparse": "^1.0.7", "entities": "~1.1.1", @@ -7423,19 +7602,20 @@ "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78=" }, "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mdurl": { @@ -7488,7 +7668,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -7544,18 +7724,18 @@ "dev": true }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -7587,7 +7767,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, @@ -7650,7 +7830,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -7694,9 +7874,9 @@ "dev": true }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true, "optional": true }, @@ -7740,15 +7920,15 @@ } }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, "netmask": { @@ -7766,21 +7946,29 @@ }, "ngx-clipboard": { "version": "10.0.0", - "resolved": "http://registry.npmjs.org/ngx-clipboard/-/ngx-clipboard-10.0.0.tgz", + "resolved": "https://registry.npmjs.org/ngx-clipboard/-/ngx-clipboard-10.0.0.tgz", "integrity": "sha1-H6y6SNsv/nLw95daUK1qvhQpNzo=", "requires": { "ngx-window-token": "0.0.4" } }, + "ngx-image-compress": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/ngx-image-compress/-/ngx-image-compress-7.2.4.tgz", + "integrity": "sha512-FKff6F4y3kj6xX/zrPCoti02jALiejH2oaTOywML7QQL0ontIPytss6NNCDkDBN9YILt1g/KKn3kR3R3utcB1A==", + "requires": { + "tslib": "^1.9.0" + } + }, "ngx-img-cropper": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/ngx-img-cropper/-/ngx-img-cropper-0.11.0.tgz", "integrity": "sha512-sVIBKJQmSGx72ONbAT2WNW+RwpsyLA4akEd1YVUNX9YZvVIOX0tdBdXCCNobBKis7uyqRJ+/O20RWRzs4RJvGA==" }, "ngx-pagination": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/ngx-pagination/-/ngx-pagination-3.1.1.tgz", - "integrity": "sha512-ORJ1ZgLEbCg83Zel9oeAZ/8onyh8wzTYVqZ3uq5QSKB6Ez6MmnR1hk+BnqVSMnDTa8fSrn6gciGC4l2FI6FI8Q==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ngx-pagination/-/ngx-pagination-3.2.1.tgz", + "integrity": "sha512-+dprQkYoiNYDZkNAe/1HX0wDFbwCTE31mC2bEQVdI7ZbjEIvGB7R3zp5QoCKgz6cPFatUj4Iw6Ukqp5zx0oT/Q==" }, "ngx-window-token": { "version": "0.0.4", @@ -7803,9 +7991,9 @@ "dev": true }, "node-gyp": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz", - "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "dev": true, "optional": true, "requires": { @@ -7816,52 +8004,67 @@ "nopt": "2 || 3", "npmlog": "0 || 1 || 2 || 3 || 4", "osenv": "0", - "request": ">=2.9.0 <2.82.0", + "request": "^2.87.0", "rimraf": "2", "semver": "~5.3.0", "tar": "^2.0.0", "which": "1" }, "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true }, "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "optional": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true, "optional": true }, "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "optional": true, "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "nopt": { @@ -7874,49 +8077,61 @@ "abbrev": "1" } }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "optional": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true, "optional": true }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true, "optional": true }, "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "optional": true, "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" + "uuid": "^3.3.2" } }, "semver": { @@ -7925,13 +8140,24 @@ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true, "optional": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "optional": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } } } }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "^1.1.1", @@ -7941,7 +8167,7 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.0", @@ -7955,7 +8181,7 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -7968,15 +8194,15 @@ } }, "node-modules-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", - "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.2.tgz", + "integrity": "sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg==", "dev": true }, "node-sass": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.2.tgz", - "integrity": "sha512-LdxoJLZutx0aQXHtWIYwJKMj+9pTjneTcLWJgzf2XbGu0q5pRNqW5QvFCEdm3mc5rJOdru/mzln5d0EZLacf6g==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", "dev": true, "optional": true, "requires": { @@ -7987,33 +8213,18 @@ "get-stdin": "^4.0.1", "glob": "^7.0.3", "in-publish": "^2.0.0", - "lodash.assign": "^4.2.0", - "lodash.clonedeep": "^4.3.2", - "lodash.mergewith": "^4.6.0", + "lodash": "^4.17.11", "meow": "^3.7.0", "mkdirp": "^0.5.1", - "nan": "^2.10.0", - "node-gyp": "^3.3.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", "npmlog": "^4.0.0", - "request": "2.87.0", + "request": "^2.88.0", "sass-graph": "^2.2.4", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -8050,14 +8261,14 @@ } }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "optional": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -8069,13 +8280,13 @@ "optional": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "optional": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, @@ -8091,6 +8302,13 @@ "sshpk": "^1.7.0" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -8098,6 +8316,13 @@ "dev": true, "optional": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -8106,32 +8331,32 @@ "optional": true }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "optional": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "supports-color": { @@ -8140,6 +8365,17 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true, "optional": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "optional": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } } } }, @@ -8159,6 +8395,13 @@ "socks": "1.1.9" }, "dependencies": { + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true, + "optional": true + }, "socks": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", @@ -8239,13 +8482,13 @@ } }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } @@ -8287,9 +8530,9 @@ } }, "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { "boolbase": "~1.0.0" @@ -8317,7 +8560,8 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -8354,9 +8598,9 @@ } }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { @@ -8419,9 +8663,9 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "once": { @@ -8476,19 +8720,13 @@ } } }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, "original": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", - "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { - "url-parse": "~1.4.0" + "url-parse": "^1.4.3" } }, "os-browserify": { @@ -8505,7 +8743,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -8575,9 +8813,9 @@ "dev": true }, "pac-proxy-agent": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", - "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz", + "integrity": "sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q==", "dev": true, "optional": true, "requires": { @@ -8588,29 +8826,25 @@ "https-proxy-agent": "^2.2.1", "pac-resolver": "^3.0.0", "raw-body": "^2.2.0", - "socks-proxy-agent": "^3.0.0" + "socks-proxy-agent": "^4.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "socks-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", - "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, - "optional": true, - "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" - } + "optional": true } } }, @@ -8641,9 +8875,9 @@ } }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", "dev": true }, "parallel-transform": { @@ -8667,16 +8901,17 @@ } }, "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { "asn1.js": "^4.0.0", "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-glob": { @@ -8719,9 +8954,9 @@ } }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascalcase": { @@ -8767,9 +9002,9 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-proxy": { @@ -8807,9 +9042,9 @@ } }, "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -8820,9 +9055,9 @@ } }, "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "dev": true, "optional": true }, @@ -8857,9 +9092,9 @@ } }, "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", "dev": true, "requires": { "async": "^1.5.2", @@ -8893,9 +9128,9 @@ }, "dependencies": { "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -8910,9 +9145,9 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -8968,9 +9203,9 @@ } }, "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "prelude-ls": { @@ -9046,15 +9281,15 @@ } }, "protractor": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.2.tgz", - "integrity": "sha512-pw4uwwiy5lHZjIguxNpkEwJJa7hVz+bJsvaTI+IbXlfn2qXwzbF8eghW/RmrZwE2sGx82I8etb8lVjQ+JrjejA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", "dev": true, "requires": { - "@types/node": "^6.0.46", "@types/q": "^0.0.32", - "@types/selenium-webdriver": "~2.53.39", + "@types/selenium-webdriver": "^3.0.0", "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", "chalk": "^1.1.3", "glob": "^7.0.3", "jasmine": "2.8.0", @@ -9064,28 +9299,10 @@ "saucelabs": "^1.5.0", "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", - "webdriver-js-extender": "^1.0.0", + "webdriver-js-extender": "2.1.0", "webdriver-manager": "^12.0.6" }, "dependencies": { - "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", - "dev": true - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -9133,13 +9350,13 @@ } }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -9164,12 +9381,12 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, @@ -9190,6 +9407,12 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -9202,6 +9425,12 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -9209,31 +9438,31 @@ "dev": true }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "supports-color": { @@ -9242,10 +9471,20 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.4.tgz", + "integrity": "sha512-aNUzdimlHSl3EotUTdE2QwP9sBUjZgWPCy8C+m1wMmF9jBDKuO/24nnpr2O25Db8dYtsjvj9drPTpSIGqRrNnQ==", "dev": true, "requires": { "adm-zip": "^0.4.9", @@ -9264,19 +9503,19 @@ } }, "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "dev": true, "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.6.0" + "ipaddr.js": "1.9.0" } }, "proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.1.tgz", - "integrity": "sha512-mAZexaz9ZxQhYPWfAjzlrloEjW+JHiBFryE4AJXFDTnaXfmH/FKqC1swTRKuEPbHWz02flQNXFOyDUF7zfEG6A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.3.tgz", + "integrity": "sha512-PXVVVuH9tiQuxQltFJVSnXWuDtNr+8aNBP6XVDDCDiUuDN8eRCm+ii4/mFWmXWEA0w8jjJSlePa4LXlM4jIzNA==", "dev": true, "optional": true, "requires": { @@ -9285,20 +9524,27 @@ "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.1", "lru-cache": "^4.1.2", - "pac-proxy-agent": "^2.0.1", + "pac-proxy-agent": "^3.0.0", "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^4.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "optional": true } } }, @@ -9321,17 +9567,24 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { @@ -9374,9 +9627,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "dev": true, "optional": true }, @@ -9393,15 +9646,15 @@ "dev": true }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -9409,214 +9662,471 @@ "math-random": "^1.0.1" }, "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "safe-buffer": "^5.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "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" } }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "kind-of": "^6.0.0" } }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "kind-of": "^6.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": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "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" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" - } - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -9640,9 +10150,9 @@ } }, "redis-commands": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", - "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", + "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==", "dev": true, "optional": true }, @@ -9654,9 +10164,9 @@ "optional": true }, "reflect-metadata": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", - "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, "regenerate": { @@ -9702,9 +10212,9 @@ } }, "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { "rc": "^1.1.6", @@ -9756,30 +10266,22 @@ "dev": true }, "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", "dev": true, "requires": { "css-select": "^1.1.0", - "dom-converter": "~0.1", - "htmlparser2": "~3.3.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", "strip-ansi": "^3.0.0", - "utila": "~0.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } + "utila": "^0.4.0" } }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -9798,60 +10300,34 @@ } }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, "optional": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", "caseless": "~0.12.0", "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "extend": "~3.0.0", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "optional": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - } + "uuid": "^3.0.0" } }, "requestretry": { @@ -9901,12 +10377,12 @@ "dev": true }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-cwd": { @@ -9946,12 +10422,12 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -9974,9 +10450,9 @@ } }, "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", "requires": { "symbol-observable": "1.0.1" } @@ -10039,14 +10515,14 @@ }, "sax": { "version": "0.5.8", - "resolved": "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", "dev": true }, "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { "ajv": "^6.1.0", @@ -10106,18 +10582,18 @@ } }, "selfsigned": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", - "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", "dev": true, "requires": { "node-forge": "0.7.5" } }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "semver-diff": { @@ -10139,18 +10615,18 @@ } }, "semver-intersect": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", - "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", "dev": true, "requires": { "semver": "^5.0.0" } }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "dev": true, "requires": { "debug": "2.6.9", @@ -10160,26 +10636,26 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", "dev": true }, "serve-index": { @@ -10195,18 +10671,38 @@ "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "serviceworker-cache-polyfill": { @@ -10257,14 +10753,14 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -10313,9 +10809,9 @@ "dev": true }, "silent-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", - "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.1.tgz", + "integrity": "sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==", "dev": true, "requires": { "debug": "^2.2.0" @@ -10338,11 +10834,10 @@ "dev": true }, "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", - "dev": true, - "optional": true + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "dev": true }, "smtp-connection": { "version": "2.12.0", @@ -10516,6 +11011,14 @@ "parseuri": "0.0.5", "socket.io-parser": "~3.1.1", "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + } } }, "socket.io-parser": { @@ -10530,6 +11033,12 @@ "isarray": "2.0.1" }, "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -10558,9 +11067,9 @@ } }, "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", "dev": true, "requires": { "debug": "^2.6.6", @@ -10583,51 +11092,29 @@ } }, "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", + "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", "dev": true, - "optional": true, "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "^1.1.5", + "smart-buffer": "4.0.2" } }, "socks-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", - "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, - "optional": true, "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" - }, - "dependencies": { - "smart-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", - "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==", - "dev": true, - "optional": true - }, - "socks": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", - "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", - "dev": true, - "optional": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" - } - } + "agent-base": "~4.2.1", + "socks": "~2.3.2" } }, "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -10672,9 +11159,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -10682,9 +11169,9 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { @@ -10698,38 +11185,81 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", "dev": true, "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", + "debug": "^4.1.0", + "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", + "debug": "^4.1.0", + "detect-node": "^2.0.4", "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "split-string": { @@ -10747,9 +11277,9 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -10802,15 +11332,15 @@ } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, "stdout-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", - "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "optional": true, "requires": { @@ -10818,9 +11348,9 @@ } }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -10828,9 +11358,9 @@ } }, "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -10869,13 +11399,19 @@ }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, @@ -10908,7 +11444,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -11088,20 +11624,20 @@ "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", "dev": true }, "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", "dev": true, "optional": true, "requires": { "block-stream": "*", - "fstream": "^1.0.2", + "fstream": "^1.0.12", "inherits": "2" } }, @@ -11116,17 +11652,17 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, @@ -11138,15 +11674,15 @@ "optional": true }, "thunky": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", "dev": true }, "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", "dev": true }, "timed-out": { @@ -11240,6 +11776,12 @@ } } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, "toposort": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", @@ -11251,6 +11793,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, + "optional": true, "requires": { "punycode": "^1.4.1" }, @@ -11259,14 +11802,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "dev": true, + "optional": true } } }, "tree-kill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", "dev": true }, "trim-newlines": { @@ -11282,29 +11826,13 @@ "dev": true }, "true-case-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", - "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "optional": true, "requires": { - "glob": "^6.0.4" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "glob": "^7.1.2" } }, "ts-node": { @@ -11335,7 +11863,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -11348,7 +11876,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -11374,7 +11902,7 @@ }, "tsickle": { "version": "0.27.5", - "resolved": "http://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz", "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==", "dev": true, "requires": { @@ -11386,14 +11914,14 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -11408,29 +11936,30 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", - "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", + "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^3.2.0", "glob": "^7.1.1", - "js-yaml": "^3.7.0", + "js-yaml": "^3.13.0", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.12.1" + "tsutils": "^2.29.0" }, "dependencies": { "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -11445,9 +11974,9 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -11456,16 +11985,16 @@ } }, "tsscmp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", - "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true, "optional": true }, "tsutils": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz", - "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -11490,8 +12019,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -11503,13 +12031,13 @@ } }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "typedarray": { @@ -11525,9 +12053,9 @@ "dev": true }, "uc.micro": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "uglify-es": { "version": "3.3.9", @@ -11546,9 +12074,9 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", - "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", "dev": true, "requires": { "cacache": "^10.0.4", @@ -11609,18 +12137,18 @@ } }, "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { "unique-slug": "^2.0.0" } }, "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -11700,9 +12228,9 @@ "dev": true }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, "update-notifier": { @@ -11803,12 +12331,12 @@ } }, "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { - "querystringify": "^2.0.0", + "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, @@ -11852,9 +12380,9 @@ } }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -11901,9 +12429,9 @@ } }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -11975,6 +12503,17 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "arr-diff": { @@ -12019,24 +12558,23 @@ } }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "expand-brackets": { @@ -12247,9 +12785,9 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -12307,6 +12845,12 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true } } }, @@ -12320,66 +12864,13 @@ } }, "webdriver-js-extender": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", - "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", "dev": true, "requires": { - "@types/selenium-webdriver": "^2.53.35", - "selenium-webdriver": "^2.53.2" - }, - "dependencies": { - "sax": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", - "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", - "dev": true - }, - "selenium-webdriver": { - "version": "2.53.3", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", - "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", - "dev": true, - "requires": { - "adm-zip": "0.4.4", - "rimraf": "^2.2.8", - "tmp": "0.0.24", - "ws": "^1.0.1", - "xml2js": "0.4.4" - } - }, - "tmp": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", - "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", - "dev": true - }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "ws": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "dev": true, - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" - } - }, - "xml2js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", - "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", - "dev": true, - "requires": { - "sax": "0.6.x", - "xmlbuilder": ">=1.0.0" - } - } + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" } }, "webpack": { @@ -12653,33 +13144,6 @@ } } }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "dev": true, - "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" - }, - "dependencies": { - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", - "dev": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "webpack-dev-middleware": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", @@ -12694,22 +13158,22 @@ } }, "webpack-dev-server": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", - "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz", + "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==", "dev": true, "requires": { "ansi-html": "0.0.7", "array-includes": "^3.0.3", "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", + "chokidar": "^2.1.2", + "compression": "^1.7.3", "connect-history-api-fallback": "^1.3.0", "debug": "^3.1.0", "del": "^3.0.0", "express": "^4.16.2", "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", + "http-proxy-middleware": "^0.19.1", "import-local": "^1.0.0", "internal-ip": "1.2.0", "ip": "^1.1.5", @@ -12718,10 +13182,10 @@ "opn": "^5.1.0", "portfinder": "^1.0.9", "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", + "serve-index": "^1.9.1", "sockjs": "0.3.19", - "sockjs-client": "1.1.4", - "spdy": "^3.4.1", + "sockjs-client": "1.1.5", + "spdy": "^4.0.0", "strip-ansi": "^3.0.0", "supports-color": "^5.1.0", "webpack-dev-middleware": "1.12.2", @@ -12736,6 +13200,17 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "arr-diff": { @@ -12786,33 +13261,40 @@ "dev": true }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "expand-brackets": { @@ -13038,9 +13520,9 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -13099,10 +13581,16 @@ "to-regex": "^3.0.2" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -13147,18 +13635,18 @@ } }, "webpack-merge": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.3.tgz", - "integrity": "sha512-zxwAIGK7nKdu5CIZL0BjTQoq3elV0t0MfB7rUC1zj668geid52abs6hN/ACwZdK6LeMS8dC9B6WmtF978zH5mg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", "dev": true, "requires": { "lodash": "^4.17.5" } }, "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { "source-list-map": "^2.0.0", @@ -13166,12 +13654,12 @@ } }, "webpack-subresource-integrity": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", - "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.2.tgz", + "integrity": "sha512-VpBtk0Ha1W0GebTzPj3Y8UqbmPDp+HqGlegRv+hS8g8/x818dw9NuEfJEOp5CF6zTPs3KF6aqknVu52Bh5h1eQ==", "dev": true, "requires": { - "webpack-core": "^0.6.8" + "webpack-sources": "^1.3.0" } }, "websocket-driver": { @@ -13221,9 +13709,9 @@ } }, "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { "string-width": "^2.1.1" @@ -13282,9 +13770,9 @@ "dev": true }, "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { "errno": "~0.1.7" @@ -13292,7 +13780,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -13307,9 +13795,9 @@ "dev": true }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -13476,9 +13964,9 @@ } }, "zone.js": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", - "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==" } } } diff --git a/package.json b/package.json --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "start": "ng serve", "build": "ng build", "test": "ng test", - "lint": "ng lint", + "lint": "tslint --project tslint.json --fix", "e2e": "ng e2e", "precache": "sw-precache --verbose --config=sw-precache-config.js" }, @@ -18,6 +18,7 @@ "@angular/common": "^5.2.11", "@angular/compiler": "^5.2.11", "@angular/core": "^5.2.11", + "@angular/flex-layout": "^5.0.0-beta.15", "@angular/forms": "^5.2.11", "@angular/http": "^5.2.11", "@angular/material": "^5.2.5", @@ -30,6 +31,7 @@ "angular2-masonry": "^0.4.0", "angular2-recaptcha": "^0.6.0", "angulartics2": "^2.4.0", + "compressorjs": "^1.0.5", "core-js": "^2.5.1", "font-awesome": "^4.7.0", "hammerjs": "^2.0.8", @@ -37,6 +39,7 @@ "markdown-it-regex": "^0.2.0", "material-design-icons": "^3.0.1", "ngx-clipboard": "^10.0.0", + "ngx-image-compress": "^7.2.4", "ngx-img-cropper": "^0.11.0", "ngx-pagination": "^3.0.3", "rxjs": "^5.5.11", diff --git a/src/app/404component/404.component.html b/src/app/404component/404.component.html --- a/src/app/404component/404.component.html +++ b/src/app/404component/404.component.html @@ -1,4 +1,4 @@ - +WildFyre

404?
diff --git a/src/app/_dialogs/avatar.dialog.component.ts b/src/app/_dialogs/avatar.dialog.component.ts deleted file mode 100644 --- a/src/app/_dialogs/avatar.dialog.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Component, ViewChild } from '@angular/core'; -import { MatDialogRef, MatSnackBar } from '@angular/material'; -import { Author } from '../_models/author'; -import { ImageCropperComponent, CropperSettings, Bounds } from 'ngx-img-cropper'; - -@Component({ - template: ` -

Change Avatar

- - - - - - -
- - -
- ` -}) -export class AvatarDialogComponent { - @ViewChild('cropper', undefined) cropper: ImageCropperComponent; - author: Author; - croppedHeight: number; - croppedWidth: number; - cropperSettings: CropperSettings; - data: any; - model: any = {}; - profilePicture: any; - - constructor( - public dialogRef: MatDialogRef, - public snackBar: MatSnackBar - ) { - this.cropperSettings = new CropperSettings(); - this.cropperSettings.width = 200; - this.cropperSettings.height = 200; - - this.cropperSettings.croppedWidth = 200; - this.cropperSettings.croppedHeight = 200; - - this.cropperSettings.canvasWidth = 200; - this.cropperSettings.canvasHeight = 200; - - this.cropperSettings.minWidth = 10; - this.cropperSettings.minHeight = 10; - - this.cropperSettings.rounded = false; - this.cropperSettings.keepAspect = true; - - this.cropperSettings.cropperDrawSettings.strokeColor = 'rgb(191, 63, 127)'; - this.cropperSettings.cropperDrawSettings.strokeWidth = 3; - - this.data = {}; - } - - cropped(bounds: Bounds) { - this.croppedHeight = bounds.bottom - bounds.top; - this.croppedWidth = bounds.right - bounds.left; - if (this.data) { - // convert the data URL to a byte string - const byteString = atob(this.data.image.split(',')[1]); - - // pull out the mime type from the data URL - const mimeString = this.data.image.split(',')[0].split(':')[1].split(';')[0]; - - // Convert to byte array - const ab = new ArrayBuffer(byteString.length); - const ia = new Uint8Array(ab); - for (let i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - - // Create a blob that looks like a file. - this.profilePicture = new Blob([ab], {'type': mimeString }); - this.profilePicture['name'] = this.author.name; - switch (this.profilePicture.type) { - case 'image/jpeg': - this.profilePicture['name'] += '.jpg'; - break; - case 'image/png': - this.profilePicture['name'] += '.png'; - break; - } - } else { - const snackBarRef = this.snackBar.open('You did not select a valid image file', 'Close', { - duration: 3000 - }); - } - } - - returnInformation(bool: boolean) { - const message = { - 'profilePicture': this.profilePicture, - 'bool': bool - }; - - this.dialogRef.close(message); - } -} diff --git a/src/app/_dialogs/bio.dialog.component.ts b/src/app/_dialogs/bio.dialog.component.ts deleted file mode 100644 --- a/src/app/_dialogs/bio.dialog.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component } from '@angular/core'; -import { MatDialogRef } from '@angular/material'; - -@Component({ - template: ` -

Change Bio

- - - -
- - -
- ` -}) -export class BioDialogComponent { - model: any = {}; - - constructor( - public dialogRef: MatDialogRef - ) { } - - returnInformation(bool: boolean) { - const message = { - 'bio': this.model.bio, - 'bool': bool - }; - - this.dialogRef.close(message); - } -} diff --git a/src/app/_dialogs/email.dialog.component.ts b/src/app/_dialogs/email.dialog.component.ts deleted file mode 100644 --- a/src/app/_dialogs/email.dialog.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component } from '@angular/core'; -import { MatDialogRef } from '@angular/material'; - -@Component({ - template: ` -

Change Email

- - - -
- - -
- ` -}) -export class EmailDialogComponent { - model: any = {}; - - constructor( - public dialogRef: MatDialogRef - ) { } - - returnInformation(bool: boolean) { - const message = { - 'email': this.model.email, - 'bool': bool - }; - - this.dialogRef.close(message); - } -} diff --git a/src/app/_dialogs/password.dialog.component.ts b/src/app/_dialogs/password.dialog.component.ts deleted file mode 100644 --- a/src/app/_dialogs/password.dialog.component.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { MatDialogRef, MatSnackBar } from '@angular/material'; -import { Subject } from 'rxjs/Subject'; -import { Account } from '../_models/account'; -import { Author } from '../_models/author'; -import { PasswordError } from '../_models/password'; -import { AuthenticationService } from '../_services/authentication.service'; -import { ProfileService } from '../_services/profile.service'; - -@Component({ - template: ` -

Change Password

-
- Passwords must contain at least 8 characters and be alphanumeric (At least 1 letter and 1 number) -
-
-
    -
  • {{err}}
  • -
-
-
-
-
    -
  • {{err}}
  • -
-
- - - -
- - - -
Password is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- - - -
Password is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- - - -
Password is required
-
-
    -
  • {{err}}
  • -
-
-
-
-
- - -
- ` -}) -export class PasswordDialogComponent implements OnDestroy { - account: Account; - author: Author; - componentDestroyed: Subject = new Subject(); - errors: PasswordError; - model: any = {}; - - constructor( - public dialogRef: MatDialogRef, - public snackBar: MatSnackBar, - private authenticationService: AuthenticationService, - private profileService: ProfileService, - ) { } - - ngOnDestroy() { - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - submitEditPassword() { - this.authenticationService.login(this.account.username, this.model.oldPassword) - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (!result.getError()) { - if (this.model.newPassword1 === this.model.newPassword2) { - this.profileService.setPassword(this.model.newPassword1) - .takeUntil(this.componentDestroyed) - .subscribe(result2 => { - if (!result2.getError()) { - this.authenticationService.login(this.account.username, this.model.newPassword1) - .takeUntil(this.componentDestroyed) - .subscribe(result3 => { - if (!result3.getError()) { - this.model.oldPassword = ''; - this.model.newPassword1 = ''; - this.model.newPassword2 = ''; - this.returnInformation(true); - } else { - this.snackBar.open('Error could not set token', 'Close'); - } - }); - } else { - this.errors = result2.getError(); - this.snackBar.open('You did not follow the requirements', 'Close'); - } - }); - - } else { - this.errors = result.getError(); - this.snackBar.open('Your new passwords do not match', 'Close'); - } - } else { - this.errors = result.getError(); - this.snackBar.open('This is not your current password', 'Close'); - } - }); - } - - returnInformation(bool: boolean) { - const message = { - 'bool': bool - }; - - this.dialogRef.close(message); - } -} diff --git a/src/app/_models/account.ts b/src/app/_models/account.ts --- a/src/app/_models/account.ts +++ b/src/app/_models/account.ts @@ -21,7 +21,7 @@ export class AccountError extends Account { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null); } diff --git a/src/app/_models/auth.ts b/src/app/_models/auth.ts --- a/src/app/_models/auth.ts +++ b/src/app/_models/auth.ts @@ -11,8 +11,8 @@ export class AuthError extends Auth { constructor( public non_field_errors?: string[], - public _username?: string[], - public _password?: string[] + public username?: string[], + public password?: string[] ) { super(); } getError(): AuthError { diff --git a/src/app/_models/author.ts b/src/app/_models/author.ts --- a/src/app/_models/author.ts +++ b/src/app/_models/author.ts @@ -25,7 +25,7 @@ export class AuthorError extends Author { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null, null, null); } diff --git a/src/app/_models/ban.ts b/src/app/_models/ban.ts --- a/src/app/_models/ban.ts +++ b/src/app/_models/ban.ts @@ -39,7 +39,7 @@ export class BanError extends Ban { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null, null, null, null, null, null, null); } diff --git a/src/app/_models/choice.ts b/src/app/_models/choice.ts --- a/src/app/_models/choice.ts +++ b/src/app/_models/choice.ts @@ -19,7 +19,7 @@ export class ChoiceError extends Choice { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null); } diff --git a/src/app/_models/comment.ts b/src/app/_models/comment.ts --- a/src/app/_models/comment.ts +++ b/src/app/_models/comment.ts @@ -1,8 +1,6 @@ import {Author} from './author'; export class Comment { - public created: Date; - static parse(obj: any) { return new Comment( obj.id, @@ -16,11 +14,13 @@ constructor( public id: number, public author: Author, - created: string, + public created: string, public text: string, public image: string ) { - this.created = new Date(created); + const options = { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }; + const time = new Date(created); + this.created = time.toLocaleDateString(undefined, options); } getError(): CommentError { diff --git a/src/app/_models/image.ts b/src/app/_models/image.ts --- a/src/app/_models/image.ts +++ b/src/app/_models/image.ts @@ -21,7 +21,7 @@ export class ImageError extends Image { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null); } diff --git a/src/app/_models/password.ts b/src/app/_models/password.ts --- a/src/app/_models/password.ts +++ b/src/app/_models/password.ts @@ -11,10 +11,10 @@ export class PasswordError extends Password { constructor( public non_field_errors?: string[], - public _text?: string[], - public _oldPassword?: string[], - public _newPassword1?: string[], - public _newPassword2?: string[] + public text?: string[], + public oldPassword?: string[], + public newPassword1?: string[], + public newPassword2?: string[] ) { super(); } getError(): PasswordError { diff --git a/src/app/_models/post.ts b/src/app/_models/post.ts --- a/src/app/_models/post.ts +++ b/src/app/_models/post.ts @@ -3,8 +3,6 @@ import { Image } from './image'; export class Post { - public created: Date; - static parse(obj: any) { return new Post( obj.id, @@ -47,14 +45,16 @@ public author: Author, public anonym: boolean, public subscribed: boolean, - created: string, + public created: string, public active: boolean, public text: string, public image: string, public additional_images: Image[], public comments: Comment[] ) { - this.created = new Date(created); + const options = { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' }; + const time = new Date(created); + this.created = time.toLocaleDateString(undefined, options); } getError(): PostError { diff --git a/src/app/_models/profile.ts b/src/app/_models/profile.ts --- a/src/app/_models/profile.ts +++ b/src/app/_models/profile.ts @@ -25,7 +25,7 @@ export class ProfileError extends Profile { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null, null, null); } diff --git a/src/app/_models/superBan.ts b/src/app/_models/superBan.ts --- a/src/app/_models/superBan.ts +++ b/src/app/_models/superBan.ts @@ -31,7 +31,7 @@ export class SuperBanError extends SuperBan { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null, null); } diff --git a/src/app/_models/superNotification.ts b/src/app/_models/superNotification.ts --- a/src/app/_models/superNotification.ts +++ b/src/app/_models/superNotification.ts @@ -31,7 +31,7 @@ export class SuperNotificationError extends SuperNotification { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null, null); } diff --git a/src/app/_models/superPost.ts b/src/app/_models/superPost.ts --- a/src/app/_models/superPost.ts +++ b/src/app/_models/superPost.ts @@ -22,10 +22,9 @@ public previous: string, public results: Post[] ) { - // Sort posts results.sort((a: Post, b: Post) => { - return b.created.getTime() - a.created.getTime(); + return new Date(b.created).getTime() - new Date(a.created).getTime(); }); } @@ -37,7 +36,7 @@ export class SuperPostError extends SuperPost { constructor( public non_field_errors?: string[], - public _text?: string[] + public text?: string[] ) { super(null, null, null, null); } diff --git a/src/app/_modules/ng2share/platforms.utils.ts b/src/app/_modules/ng2share/platforms.utils.ts --- a/src/app/_modules/ng2share/platforms.utils.ts +++ b/src/app/_modules/ng2share/platforms.utils.ts @@ -104,4 +104,4 @@ logo: 'mail', text: 'Mail', } -} +}; diff --git a/src/app/_modules/ngx-masonry/ngx-masonry-options.interface.ts b/src/app/_modules/ngx-masonry/ngx-masonry-options.interface.ts deleted file mode 100644 --- a/src/app/_modules/ngx-masonry/ngx-masonry-options.interface.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface NgxMasonryOptions { - itemSelector?: string; - columnWidth?: number | string; - gutter?: number | string; - percentPosition?: boolean; - stamp?: string; - fitWidth?: boolean; - originLeft?: boolean; - originTop?: boolean; - containerStyle?: string; - transitionDuration?: string; - resize?: boolean; - initLayout?: boolean; - horizontalOrder?: boolean; -} diff --git a/src/app/_modules/ngx-masonry/ngx-masonry.component.ts b/src/app/_modules/ngx-masonry/ngx-masonry.component.ts deleted file mode 100644 --- a/src/app/_modules/ngx-masonry/ngx-masonry.component.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { Component, OnInit, OnChanges, SimpleChanges, OnDestroy, - Input, Output, ElementRef, EventEmitter, PLATFORM_ID, Inject } from '@angular/core'; -import { isPlatformBrowser } from '@angular/common'; - -declare var require: any; -const imagesLoaded: any = undefined; -let masonryConstructor: any = undefined; - -import { NgxMasonryOptions } from './ngx-masonry-options.interface'; - -@Component({ - selector: '[ngx-masonry], ngx-masonry', - template: '', - styles: [ - ` - :host { - display: block; - } - ` - ] -}) -export class NgxMasonryComponent implements OnInit, OnChanges, OnDestroy { - public _msnry: any; - - // Inputs - @Input() public options: NgxMasonryOptions; - @Input() public useImagesLoaded: Boolean = false; - @Input() updateLayout: Boolean = false; - - // Outputs - @Output() layoutComplete: EventEmitter = new EventEmitter(); - @Output() removeComplete: EventEmitter = new EventEmitter(); - - constructor(@Inject(PLATFORM_ID) private platformId: any, private _element: ElementRef) {} - - ngOnInit() { - ///TODO: How to load imagesloaded only if this.useImagesLoaded===true? - if (this.useImagesLoaded && imagesLoaded === undefined) { - // imagesLoaded = require('imagesloaded'); - } - - if (isPlatformBrowser(this.platformId) && masonryConstructor === undefined) { - masonryConstructor = require('masonry-layout'); - } - - // Create masonry options object - if (!this.options) { - this.options = {}; - } - - // Set default itemSelector - if (!this.options.itemSelector) { - this.options.itemSelector = '[ngx-masonry-item], ngx-masonry-item'; - } - - if (isPlatformBrowser(this.platformId)) { - // Initialize Masonry - this._msnry = new masonryConstructor(this._element.nativeElement, this.options); - - // Bind to events - this._msnry.on('layoutComplete', (items: any) => { - this.layoutComplete.emit(items); - }); - this._msnry.on('removeComplete', (items: any) => { - this.removeComplete.emit(items); - }); - } - } - - ngOnChanges(changes: SimpleChanges) { - // only update layout if it's not the first change - if (changes.updateLayout) { - if (!changes.updateLayout.firstChange) { - this.layout(); - } - } - } - - ngOnDestroy() { - if (this._msnry) { - this._msnry.destroy(); - } - } - - public layout() { - setTimeout(() => { - this._msnry.layout(); - }); - } - - public reloadItems() { - setTimeout(() => { - this._msnry.reloadItems(); - }); - } - - // public add(element: HTMLElement, prepend: boolean = false) { - public add(element: HTMLElement) { - let isFirstItem = false; - - // Check if first item - if (this._msnry.items.length === 0) { - isFirstItem = true; - } - - if (this.useImagesLoaded) { - imagesLoaded(element, (instance: any) => { - this._element.nativeElement.appendChild(element); - - // Tell Masonry that a child element has been added - this._msnry.appended(element); - - // layout if first item - if (isFirstItem) { - this.layout(); - } - }); - - this._element.nativeElement.removeChild(element); - } else { - // Tell Masonry that a child element has been added - this._msnry.appended(element); - - // layout if first item - if (isFirstItem) { - this.layout(); - } - } - } - - public remove(element: HTMLElement) { - // Tell Masonry that a child element has been removed - this._msnry.remove(element); - - // Layout items - this.layout(); - } -} diff --git a/src/app/_modules/ngx-masonry/ngx-masonry.directive.ts b/src/app/_modules/ngx-masonry/ngx-masonry.directive.ts deleted file mode 100644 --- a/src/app/_modules/ngx-masonry/ngx-masonry.directive.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Directive, Inject, ElementRef, forwardRef, OnDestroy, AfterViewInit, PLATFORM_ID } from '@angular/core'; - -import { NgxMasonryComponent } from './ngx-masonry.component'; -import { isPlatformBrowser } from '@angular/common'; - -interface MutationWindow extends Window { - MutationObserver: any; - WebKitMutationObserver: any; -} - -declare var window: MutationWindow; - -@Directive({ - selector: '[ngx-masonry-item], ngx-masonry-item' -}) -export class NgxMasonryDirective implements OnDestroy, AfterViewInit { - constructor( - private _element: ElementRef, - @Inject(forwardRef(() => NgxMasonryComponent)) - private _parent: NgxMasonryComponent, - @Inject(PLATFORM_ID) private platformId: any - ) {} - - ngAfterViewInit() { - if (isPlatformBrowser(this.platformId)) { - this._parent.add(this._element.nativeElement); - this.watchForHtmlChanges(); - } - } - - ngOnDestroy() { - if (isPlatformBrowser(this.platformId)) { - this._parent.remove(this._element.nativeElement); - } - } - - /** When HTML in brick changes dinamically, observe that and change layout */ - private watchForHtmlChanges(): void { - MutationObserver = window.MutationObserver || window.WebKitMutationObserver; - - if (MutationObserver) { - /** Watch for any changes to subtree */ - const self = this; - const observer = new MutationObserver(function(mutations: any, observerFromElement: any) { - self._parent.layout(); - }); - - // define what element should be observed by the observer - // and what types of mutations trigger the callback - observer.observe(this._element.nativeElement, { - subtree: true, - childList: true - }); - } - } -} diff --git a/src/app/_modules/ngx-masonry/ngx-masonry.module.ts b/src/app/_modules/ngx-masonry/ngx-masonry.module.ts deleted file mode 100644 --- a/src/app/_modules/ngx-masonry/ngx-masonry.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -/*-- ngx-masonry --*/ -import { NgxMasonryComponent } from './ngx-masonry.component'; -import { NgxMasonryDirective } from './ngx-masonry.directive'; - -@NgModule({ - imports: [ - CommonModule - ], - exports: [ - NgxMasonryComponent, - NgxMasonryDirective - ], - declarations: [ - NgxMasonryComponent, - NgxMasonryDirective - ] -}) -export class NgxMasonryModule {} diff --git a/src/app/_pipes/marked.pipe.ts b/src/app/_pipes/marked.pipe.ts --- a/src/app/_pipes/marked.pipe.ts +++ b/src/app/_pipes/marked.pipe.ts @@ -1,7 +1,7 @@ import { Pipe, PipeTransform } from '@angular/core'; import { Comment } from '../_models/comment'; import { Post } from '../_models/post'; -import * as C from '../_models/constants' +import * as C from '../_models/constants'; import * as marked from 'markdown-it'; import markdownItRegex from 'markdown-it-regex'; @@ -32,7 +32,7 @@ name: 'customImage', regex: /(\[img: \d\])/gm, replace: (match: string) => { - const index = Number.parseInt(this.getImageMatchesByGroup(2, match, /(\[img: (\d)\])/gm)[0]); + const index = parseInt(this.getImageMatchesByGroup(2, match, /(\[img: (\d)\])/gm)[0], 10); if (post) { if (!post.additional_images[index]) { diff --git a/src/app/_services/area.service.ts b/src/app/_services/area.service.ts --- a/src/app/_services/area.service.ts +++ b/src/app/_services/area.service.ts @@ -17,6 +17,7 @@ ) { } getAreaRep(area: string): Observable { + // Get area rep from api, cache response if (this.reputation[area]) { return Observable.of(this.reputation[area]); } else { @@ -29,20 +30,43 @@ } getAreas(): Observable { - // get areas from api + // Get areas from api, cache response if (!this.areas) { - return this.httpService.GET('/areas/') - .map(response => { - const areas: Area[] = []; - for (let i = 0; i < response.length; i++) { - areas.push(Area.parse(response[i])) - } - this.areas = areas; - this.currentAreaName = this.areas[0].name; - return areas; - }); + return this.httpService.GET('/areas/') + .map(response => { + const areas: Area[] = []; + for (let i = 0; i < response.length; i++) { + areas.push(Area.parse(response[i])); + } + this.areas = areas; + return areas; + }); } else { return Observable.of(this.areas); } } + + getArea(s: string): Observable { + if (s === '_') { + return Observable.of(new Area('_', 'All Posts', 0, 0)); + } + if (!this.areas) { + return this.getAreas() + .map(areas => { + if (areas) { + for (let i = 0; i < areas.length; i++) { + if (areas[i].name === s) { + return areas[i]; + } + } + } + }); + } else { + for (let i = 0; i < this.areas.length; i++) { + if (this.areas[i].name === s) { + return Observable.of(this.areas[i]); + } + } + } + } } diff --git a/src/app/_services/authentication.service.ts b/src/app/_services/authentication.service.ts --- a/src/app/_services/authentication.service.ts +++ b/src/app/_services/authentication.service.ts @@ -35,12 +35,11 @@ return Auth.parse(response); }) .catch((error) => { - const body = JSON.parse(error._body); return Observable.of( new AuthError( - body.non_field_errors || null, - body.username || null, - body.password || null + error.error.non_field_errors, + error.error.username, + error.error.password, ) ); }); diff --git a/src/app/_services/http.service.ts b/src/app/_services/http.service.ts --- a/src/app/_services/http.service.ts +++ b/src/app/_services/http.service.ts @@ -78,6 +78,8 @@ // Handling methods private handleError(error: any): Observable { + console.error(error); + let message: string; let action = 'Close'; let onAction: Function; diff --git a/src/app/_services/post.service.ts b/src/app/_services/post.service.ts --- a/src/app/_services/post.service.ts +++ b/src/app/_services/post.service.ts @@ -57,10 +57,10 @@ this.navBarService.clearInputs.next(true); return comment; }) - .catch((err) => { + .catch((error) => { return Observable.of(new CommentError( - JSON.parse(err._body).non_field_errors, - JSON.parse(err._body).text + error.error.non_field_errors, + error.error.text )); }); } @@ -92,8 +92,8 @@ }) .catch((error) => { return Observable.of(new PostError( - JSON.parse(error._body).non_field_errors, - JSON.parse(error._body)._text + error.error.non_field_errors, + error.error._text )); }); } else if (draft && postID === null) { @@ -103,8 +103,8 @@ }) .catch((error) => { return Observable.of(new PostError( - JSON.parse(error._body).non_field_errors, - JSON.parse(error._body)._text + error.error.non_field_errors, + error.error._text )); }); } else if (draft && postID !== null) { @@ -114,8 +114,8 @@ }) .catch((error) => { return Observable.of(new PostError( - JSON.parse(error._body).non_field_errors, - JSON.parse(error._body)._text + error.error.non_field_errors, + error.error._text )); }); } else { diff --git a/src/app/_services/profile.service.ts b/src/app/_services/profile.service.ts --- a/src/app/_services/profile.service.ts +++ b/src/app/_services/profile.service.ts @@ -74,10 +74,10 @@ console.log('You leveled up some stats'); return Author.parse(response); - }).catch((err) => { + }).catch((error) => { return Observable.of(new AuthorError( - JSON.parse(err._body).non_field_errors, - JSON.parse(err._body).text + error.error.non_field_errors, + error.error.text )); }); } @@ -92,10 +92,10 @@ console.log('You have mail!'); return Account.parse(response); - }).catch((err) => { + }).catch((error) => { return Observable.of(new AccountError( - JSON.parse(err._body).non_field_errors, - JSON.parse(err._body).text + error.error.non_field_errors, + error.error.text )); }); } @@ -110,26 +110,26 @@ console.log('You have been securely encryptified'); return Account.parse(response); - }).catch((err) => { + }).catch((error) => { return Observable.of(new AccountError( - JSON.parse(err._body).non_field_errors, - JSON.parse(err._body).text + error.error.non_field_errors, + error.error.text )); }); } setProfilePicture(image: any): Observable { - const formData: FormData = new FormData(); - formData.append('avatar', image, image.name); + const formData: FormData = new FormData(); + formData.append('avatar', image, image.name); return this.httpService.PUT_IMAGE('/users/', formData) .map((response: Response) => { console.log('You looked in the mirror and got frightened'); return Profile.parse(response); - }).catch((err) => { + }).catch((error) => { return Observable.of(new ProfileError( - JSON.parse(err._body).non_field_errors, - JSON.parse(err._body).text + error.error.non_field_errors, + error.error.text )); }); } diff --git a/src/app/_services/reason.service.ts b/src/app/_services/reason.service.ts --- a/src/app/_services/reason.service.ts +++ b/src/app/_services/reason.service.ts @@ -17,7 +17,7 @@ .map(response => { const choices: Choice[] = []; for (let i = 0; i < response.length; i++) { - choices.push(Choice.parse(response[i])) + choices.push(Choice.parse(response[i])); } return choices; }); diff --git a/src/app/_services/registration.service.spec.ts b/src/app/_services/registration.service.spec.ts --- a/src/app/_services/registration.service.spec.ts +++ b/src/app/_services/registration.service.spec.ts @@ -9,25 +9,25 @@ describe('RegistrationService', () => { const recoverTransaction = { - non_field_errors: "Error", - username: "Test", - email: "test@test.com", - captcha: "jhsadbgfajh2234", + non_field_errors: 'Error', + username: 'Test', + email: 'test@test.com', + captcha: 'jhsadbgfajh2234', }; const reset = { - non_field_errors: "Error", - new_password: "password123", - token: "dfgsdfgwqe45t", - transaction: "3456345-34534-43534", - captcha: "jhsadbgfajh2234", + non_field_errors: 'Error', + new_password: 'password123', + token: 'dfgsdfgwqe45t', + transaction: '3456345-34534-43534', + captcha: 'jhsadbgfajh2234', }; const registration = { - non_field_errors: "Error", - username: "user123", - email: "test@test.com", - password: "password123", - captcha: "jhsadbgfajh2234", + non_field_errors: 'Error', + username: 'user123', + email: 'test@test.com', + password: 'password123', + captcha: 'jhsadbgfajh2234', }; let service: RegistrationService; @@ -52,12 +52,21 @@ it('Expected values from first password step', () => { spyOn(service, 'recoverPasswordStep1').and.returnValue(new Observable()); - expect(service.recoverPasswordStep1(recoverTransaction.email, recoverTransaction.username, recoverTransaction.captcha)).toEqual(new Observable()); + expect(service.recoverPasswordStep1( + recoverTransaction.email, + recoverTransaction.username, + recoverTransaction.captcha + )).toEqual(new Observable()); }); it('Expected values from second password step', () => { spyOn(service, 'recoverPasswordStep2').and.returnValue(new Observable()); - expect(service.recoverPasswordStep2(reset.new_password, reset.token, reset.transaction, reset.captcha)).toEqual(new Observable()); + expect(service.recoverPasswordStep2( + reset.new_password, + reset.token, + reset.transaction, + reset.captcha + )).toEqual(new Observable()); }); it('Expected values from recover username', () => { @@ -67,6 +76,11 @@ it('Expected values from registration', () => { spyOn(service, 'register').and.returnValue(new Observable()); - expect(service.register(registration.username, registration.email , registration.password , registration.captcha )).toEqual(new Observable()); + expect(service.register( + registration.username, + registration.email, + registration.password, + registration.captcha + )).toEqual(new Observable()); }); }); diff --git a/src/app/_services/registration.service.ts b/src/app/_services/registration.service.ts --- a/src/app/_services/registration.service.ts +++ b/src/app/_services/registration.service.ts @@ -29,9 +29,9 @@ .catch((error) => { return Observable.of( new RecoverTransactionError( - error.non_field_errors, - error.email, - error.captcha + error.error.non_field_errors, + error.error.email, + error.error.captcha ) ); }); @@ -53,11 +53,11 @@ .catch((error) => { return Observable.of( new ResetError( - error.non_field_errors, - error.new_password, - error.token, - error.transaction, - error.captcha + error.error.non_field_errors, + error.error.new_password, + error.error.token, + error.error.transaction, + error.error.captcha ) ); }); @@ -77,10 +77,10 @@ .catch((error) => { return Observable.of( new RecoverTransactionError( - error.non_field_errors, - error.username, - error.email, - error.captcha + error.error.non_field_errors, + error.error.username, + error.error.email, + error.error.captcha ) ); }); diff --git a/src/app/_shared/arealist/areaList.component.html b/src/app/_shared/arealist/areaList.component.html new file mode 100644 --- /dev/null +++ b/src/app/_shared/arealist/areaList.component.html @@ -0,0 +1,23 @@ + +
+
+
+

{{title}}

+
+
+

All Areas

+
+
+
+
+
+

{{area.displayname}}

+
+
+ add +
+
+
+
+
+
diff --git a/src/app/_shared/arealist/areaList.component.scss b/src/app/_shared/arealist/areaList.component.scss new file mode 100644 --- /dev/null +++ b/src/app/_shared/arealist/areaList.component.scss @@ -0,0 +1,68 @@ +.home { + &-area { + &-card { + width: 100%; + height: 15vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + &-add { + width: 20vw; + height: 15vw; + margin-left: 5vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + } + } + } + &-content { + &-container { + width: 100vw; + position: fixed; + top: 0; + left: 0; + } + } + &-input { + font-size: 100%; + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-container { + padding-left: 2rem; + padding-right: 2rem; + width: 100vw; + max-width: 1000px; + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 500; + font-size: 2rem; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + } + &-title { + font-size: 3rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 600; + max-width: 1000px; + } + &-comment { + &-container { + width: 100vw; + max-width: 1000px; + } + } +} diff --git a/src/app/_shared/arealist/areaList.component.ts b/src/app/_shared/arealist/areaList.component.ts new file mode 100644 --- /dev/null +++ b/src/app/_shared/arealist/areaList.component.ts @@ -0,0 +1,93 @@ +import { Component, OnInit, OnDestroy, Input } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Subject } from 'rxjs/Subject'; +import { Area } from '../../_models/area'; +import { AreaService } from '../../_services/area.service'; +import { NavBarService } from '../../_services/navBar.service'; +import { RouteService } from '../../_services/route.service'; + +enum View { + home, + posts +} + +@Component({ + templateUrl: 'areaList.component.html', + styleUrls: ['./areaList.component.scss'], + selector: 'app-area-list' +}) +export class AreaListComponent implements OnInit, OnDestroy { + @Input() public showAdd = true; + allArea = new Area('_', 'All Posts', 0, 0); + areas = new Array(new Area('', '', 0, 0)); + currentView: View = View.home; + componentDestroyed: Subject = new Subject(); + loading = true; + title = 'Home'; + path = ''; + + constructor( + private route: ActivatedRoute, + private router: Router, + private areaService: AreaService, + private navBarService: NavBarService, + private routeService: RouteService + ) { } + + ngOnInit() { + this.route.url + .subscribe(r => { + if (r[0]) { + if (r[0].path === 'posts') { + this.path = r[0].path; + this.title = 'My Posts'; + this.currentView = View.posts; + } + } + }); + + this.areaService.getAreas() + .takeUntil(this.componentDestroyed) + .subscribe(areas => { + this.areas = []; + + for (let i = 0; i < areas.length; i++) { + this.areaService.getAreaRep(areas[i].name) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + let area; + area = new Area( + areas[i].name, + areas[i].displayname, + result.reputation, + result.spread + ); + + this.areas.push(area); + this.loading = false; + }); + } + }); + } + + ngOnDestroy() { + this.componentDestroyed.next(true); + this.componentDestroyed.complete(); + } + + goto(a: Area, createPost?: boolean) { + this.navBarService.currentArea.next(a); + this.routeService.addNextRoute(this.path); + if (createPost) { + this.router.navigateByUrl(`create/${a.name}`); + } else if (this.currentView === View.home) { + this.router.navigateByUrl(`/areas/${a.name}`); + } else { + this.router.navigateByUrl(`${this.path}/${a.name}`); + } + } + + view() { + return View; + } +} diff --git a/src/app/_shared/imageUpload/imageUpload.component.html b/src/app/_shared/imageUpload/imageUpload.component.html new file mode 100644 --- /dev/null +++ b/src/app/_shared/imageUpload/imageUpload.component.html @@ -0,0 +1,23 @@ + +
+
+
+ keyboard_arrow_left +
+
+ Avatar of {{author?.name}} + Avatar of {{author?.name}} +
+
+ + +
+ + +
+ +
+
+
diff --git a/src/app/_shared/imageUpload/imageUpload.component.scss b/src/app/_shared/imageUpload/imageUpload.component.scss new file mode 100644 --- /dev/null +++ b/src/app/_shared/imageUpload/imageUpload.component.scss @@ -0,0 +1,91 @@ +.imageUpload { + &-button { + width: 100%; + font-family: 'Mukta', sans-serif; + border: 1px solid #EA6C40; + border-radius: 4px; + font-weight: 700; + position: relative; + & input[type="file"]{ + -webkit-appearance:none; + position:absolute; + top:0; + left:0; + opacity:0; + width: 100%; + height: 100%; + } + &-group { + height: 25vh; + padding-left: 3rem; + padding-right: 3rem; + background: transparent !important; + width: 100%; + } + } + &-container { + padding-left: 2rem; + padding-right: 2rem; + width: 100vw; + max-width: 1000px; + } + &-image { + height: 50vh; + max-width: 1000px; + } + &-input { + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-post { + &-group { + width: 100%; + } + &-row { + width: 100%; + flex-wrap: wrap; + + &-icons { + padding-left: 5%; + padding-right: 5%; + } + } + &-card { + width: 47.5%; + height: 15vh; + padding-left: 2%; + padding-right: 2%; + margin-bottom: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + &:nth-child(odd) { + margin-right: 5%; + } + } + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + color: #A2A2A2; + font-weight: 500; + font-size: 2rem; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + } + &-title { + font-size: 2rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 500; + max-width: 1000px; + } +} diff --git a/src/app/_shared/imageUpload/imageUpload.component.ts b/src/app/_shared/imageUpload/imageUpload.component.ts new file mode 100644 --- /dev/null +++ b/src/app/_shared/imageUpload/imageUpload.component.ts @@ -0,0 +1,80 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { MatSnackBar } from '@angular/material'; +import { Router } from '@angular/router'; +import { Subject } from 'rxjs/Subject'; +import { Author } from '../../_models/author'; +import { ProfileService } from '../../_services/profile.service'; +import { RouteService } from '../../_services/route.service'; + +declare const Compressor: any; + +@Component({ + templateUrl: 'imageUpload.component.html', + styleUrls: ['./imageUpload.component.scss'] +}) +export class ImageUploadComponent implements OnInit, OnDestroy { + author: Author; + componentDestroyed: Subject = new Subject(); + errors: any; + loading = true; + + constructor( + public snackBar: MatSnackBar, + private router: Router, + private profileService: ProfileService, + private routeService: RouteService + ) { } + + ngOnInit() { + this.profileService.getSelf() + .takeUntil(this.componentDestroyed) + .subscribe((self: Author) => { + this.author = self; + if (this.author.bio === '') { + this.author.bio = '*No Bio*'; + } + this.loading = false; + }); + } + + ngOnDestroy() { + this.componentDestroyed.next(true); + this.componentDestroyed.complete(); + } + + back() { + if (this.routeService.routes.length === 0) { + this.router.navigateByUrl(''); + } else { + this.router.navigateByUrl(this.routeService.getNextRoute()); + } + } + + + uploadImage() { + const self = this; + const file = (document.getElementById('image-upload')).files[0]; + const file2: any = new Compressor(file, { + quality: 0.8, + maxWidth: 500, + maxHeight: 500, + convertSize: 500000, + success(result: Blob) { + self.uploadImg(result); + } + }); + } + + uploadImg(r: Blob) { + this.profileService.setProfilePicture(r) + .takeUntil(this.componentDestroyed) + .subscribe((result2: Author) => { + if (!result2.getError()) { + this.author.avatar = result2.avatar; + } else { + this.errors = result2.getError(); + this.loading = false; + } + }); + } +} diff --git a/src/app/_shared/myPosts/myPosts.component.html b/src/app/_shared/myPosts/myPosts.component.html new file mode 100644 --- /dev/null +++ b/src/app/_shared/myPosts/myPosts.component.html @@ -0,0 +1,34 @@ +
+
+ keyboard_arrow_left +
+
+
+
+
+

My Posts

+

{{currentArea.displayname}}

+
+
+
+
+
+ image + hourglass_full + hourglass_empty + visibility_on + visibility_off + filter_none +
{{post.comments.length}}
+
+

+ ... +
+
+
+ +
+ +
+
+
diff --git a/src/app/_shared/myPosts/myPosts.component.scss b/src/app/_shared/myPosts/myPosts.component.scss new file mode 100644 --- /dev/null +++ b/src/app/_shared/myPosts/myPosts.component.scss @@ -0,0 +1,105 @@ +.profile { + &-button { + width: 100%; + font-family: 'Mukta', sans-serif; + border: 1px solid #EA6C40; + border-radius: 4px; + font-weight: 700; + position: relative; + & input[type="file"]{ + -webkit-appearance:none; + position:absolute; + top:0; + left:0; + opacity:0; + width: 100%; + height: 100%; + } + &-group { + height: 25vh; + padding-left: 3rem; + padding-right: 3rem; + background: transparent !important; + width: 100%; + } + } + &-container { + padding-left: 3rem; + padding-right: 3rem; + width: 100vw; + max-width: 1000px; + } + &-image { + position: relative; + height: 50vh; + width: 100%; + max-width: 1000px; + } + &-input { + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-post { + &-group { + width: 100%; + } + &-row { + width: 100%; + flex-wrap: wrap; + } + &-card { + width: 47.5%; + height: 15vh; + padding-left: 2%; + padding-right: 2%; + margin-bottom: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + &:nth-child(odd) { + margin-right: 5%; + } + } + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + color: #A2A2A2; + font-weight: 500; + font-size: 2rem; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + } + &-title { + font-size: 3rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 600; + max-width: 1000px; + } +} + +#image { + display: none; + flex-direction: column; + box-sizing: border-box; + flex-direction: column; + place-content: center; + align-items: center; +} + +.marked { + overflow-y: scroll; +} + +span.markdown { + color: #ffffff !important; +} diff --git a/src/app/notificationArchive/notificationArchive.component.ts b/src/app/_shared/myPosts/myPosts.component.ts rename from src/app/notificationArchive/notificationArchive.component.ts rename to src/app/_shared/myPosts/myPosts.component.ts --- a/src/app/notificationArchive/notificationArchive.component.ts +++ b/src/app/_shared/myPosts/myPosts.component.ts @@ -1,40 +1,55 @@ -import { Component, OnInit, OnDestroy, NgModule, ChangeDetectorRef } from '@angular/core'; +import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { MatSnackBar } from '@angular/material'; import { Router, ActivatedRoute } from '@angular/router'; import { Subject } from 'rxjs/Subject'; -import { Area } from '../_models/area'; -import * as C from '../_models/constants'; -import { Post } from '../_models/post'; -import { NavBarService } from '../_services/navBar.service'; -import { NotificationService } from '../_services/notification.service'; -import { RouteService } from '../_services/route.service'; -import { NgxMasonryModule } from '../_modules/ngx-masonry/ngx-masonry.module'; +import { Account } from '../../_models/account'; +import { Area } from '../../_models/area'; +import { Author } from '../../_models/author'; +import { Ban } from '../../_models/ban'; +import { Choice } from '../../_models/choice'; +import * as C from '../../_models/constants'; +import { Post } from '../../_models/post'; +import { AreaService } from '../../_services/area.service'; +import { NavBarService } from '../../_services/navBar.service'; +import { PostService } from '../../_services/post.service'; +import { RouteService } from '../../_services/route.service'; @Component({ - templateUrl: 'notificationArchive.component.html' + templateUrl: 'myPosts.component.html', + styleUrls: ['./myPosts.component.scss'] }) -export class NotificationArchiveComponent implements OnInit, OnDestroy { +export class MyPostsComponent implements OnInit, OnDestroy { + account: Account; + author: Author; backupPosts: { [area: string]: Post[]; } = {}; + bans: Ban[] = []; + bioForm: FormGroup; + choices: Choice[]; componentDestroyed: Subject = new Subject(); - currentArea: string; - funPosts: Post[] = []; + currentArea: Area; + data: any; + editBio = false; + emailForm: FormGroup; + errors: any; imageArray: { [area: string]: string[]; } = {}; index = 1; - infoPosts: Post[] = []; limit = 10; loading = true; - model: any = {}; offset = 10; - searchArray: Post[] = []; - searching = false; + self: boolean; superPosts: { [area: string]: Post[]; } = {}; totalCount = 0; + url: string; constructor( private cdRef: ChangeDetectorRef, private route: ActivatedRoute, private router: Router, + public snackBar: MatSnackBar, + private areaService: AreaService, private navBarService: NavBarService, - private notificationService: NotificationService, + private postService: PostService, private routeService: RouteService ) { } @@ -54,7 +69,6 @@ } } } - this.loading = false; } private removeMarkdown(input: string) { @@ -77,7 +91,7 @@ .replace(/\[\^.+?\](\: .*?$)?/g, '') .replace(/\s{0,2}\[.*?\]: .*?$/g, '') // Remove images - .replace(/\!\[.*?\][\[\(].*?[\]\)]/g, '') + .replace(C.WF_IMAGE_REGEX, '') // Remove wildfyre images .replace(/(\[img: \d\])/gm, '') // Remove inline links @@ -102,28 +116,27 @@ ngOnInit() { this.route.params - .takeUntil(this.componentDestroyed) - .subscribe(params => { - if (params['index'] !== undefined) { - this.index = params['index']; - } - }); - - this.navBarService.currentArea + .takeUntil(this.componentDestroyed) + .subscribe(params => { + if (params['area'] !== undefined) { + this.areaService.getAreas() .takeUntil(this.componentDestroyed) - .subscribe((currentArea: Area) => { - if (currentArea.name !== '') { - this.currentArea = currentArea.name; - if (!this.superPosts[currentArea.name]) { - this.superPosts[currentArea.name] = []; + .subscribe((areas) => { + for (let i = 0; i <= areas.length - 1; i++) { + if (areas[i].name === params['area']) { + this.currentArea = areas[i]; } - if (!this.backupPosts[currentArea.name]) { - this.backupPosts[currentArea.name] = []; - } - this.loading = true; - const posts: Post[] = []; + } + + if (!this.superPosts[this.currentArea.name]) { + this.superPosts[this.currentArea.name] = []; + } + if (!this.backupPosts[this.currentArea.name]) { + this.backupPosts[this.currentArea.name] = []; + } + const posts: Post[] = []; - this.notificationService.getArchive(currentArea.name, this.limit, 0) + this.postService.getOwnPosts(this.currentArea.name, this.limit, 0) .takeUntil(this.componentDestroyed) .subscribe(superPost => { superPost.results.forEach((obj: any) => { @@ -131,20 +144,24 @@ }); // Removes binding to original 'superPost' variable - this.superPosts[currentArea.name] = JSON.parse(JSON.stringify(posts)); - this.backupPosts[currentArea.name] = posts; + this.superPosts[this.currentArea.name] = JSON.parse(JSON.stringify(posts)); + this.backupPosts[this.currentArea.name] = posts; this.totalCount = superPost.count; - this.imageInPosts(this.superPosts[currentArea.name], currentArea.name); + this.imageInPosts(this.superPosts[this.currentArea.name], this.currentArea.name); - for (let i = 0; i <= this.backupPosts[currentArea.name].length - 1; i++) { - this.backupPosts[currentArea.name][i].text = this.removeMarkdown(this.backupPosts[currentArea.name][i].text); + for (let i = 0; i <= this.backupPosts[this.currentArea.name].length - 1; i++) { + this.backupPosts[this.currentArea.name][i].text = this.removeMarkdown(this.backupPosts[this.currentArea.name][i].text); } + this.cdRef.detectChanges(); this.loading = false; }); - } - }); + + this.loading = false; + }); + } + }); } ngOnDestroy() { @@ -153,6 +170,7 @@ this.componentDestroyed.complete(); } + back() { if (this.routeService.routes.length === 0) { this.router.navigateByUrl(''); @@ -161,11 +179,11 @@ } } - getPosts(page: number) { + getPosts(page: any) { this.loading = true; const posts: Post[] = []; - this.notificationService.getArchive(this.currentArea, this.limit, (this.offset * page) - this.limit) + this.postService.getOwnPosts(this.currentArea.name, this.limit, (this.offset * page) - this.limit) .takeUntil(this.componentDestroyed) .subscribe(superPost => { superPost.results.forEach((obj: any) => { @@ -173,12 +191,12 @@ }); // Removes binding to original 'superPost' variable - this.superPosts[this.currentArea] = JSON.parse(JSON.stringify(posts)); - this.backupPosts[this.currentArea] = posts; - this.imageInPosts(this.superPosts[this.currentArea], this.currentArea); + this.superPosts[this.currentArea.name] = JSON.parse(JSON.stringify(posts)); + this.backupPosts[this.currentArea.name] = posts; + this.imageInPosts(this.superPosts[this.currentArea.name], this.currentArea.name); - for (let i = 0; i <= this.backupPosts[this.currentArea].length - 1; i++) { - this.backupPosts[this.currentArea][i].text = this.removeMarkdown(this.backupPosts[this.currentArea][i].text); + for (let i = 0; i <= this.backupPosts[this.currentArea.name].length - 1; i++) { + this.backupPosts[this.currentArea.name][i].text = this.removeMarkdown(this.backupPosts[this.currentArea.name][i].text); } this.index = page; this.totalCount = superPost.count; @@ -189,42 +207,6 @@ goto(postID: string) { this.routeService.addNextRouteByIndex(this.index); - this.router.navigateByUrl('/areas/' + this.currentArea + '/' + postID); - } - -/* Removed as of D114 - searchInput() { - if (this.areaService.currentAreaName === 'fun') { - this.searchArray = []; - if (this.model.postText === '') { - this.searching = false; - this.cdRef.detectChanges(); - } else { - this.searching = true; - - for (let i = 0; i <= this.funPosts.length - 1; i++) { - if (this.funPosts[i].text.toLowerCase().includes(this.model.postText.toLowerCase())) { - this.searchArray.push(this.backupFunPosts[i]); - } - } - this.cdRef.detectChanges(); - } - } else { - this.searchArray = []; - if (this.model.postText === '') { - this.searching = false; - this.cdRef.detectChanges(); - } else { - this.searching = true; - - for (let i = 0; i <= this.infoPosts.length - 1; i++) { - if (this.infoPosts[i].text.toLowerCase().includes(this.model.postText.toLowerCase())) { - this.searchArray.push(this.backupInfoPosts[i]); - } - } - this.cdRef.detectChanges(); - } - } + this.router.navigateByUrl('/areas/' + this.currentArea.name + '/' + postID); } - */ } diff --git a/src/app/_shared/notifcations/notifications.component.html b/src/app/_shared/notifcations/notifications.component.html new file mode 100644 --- /dev/null +++ b/src/app/_shared/notifcations/notifications.component.html @@ -0,0 +1,28 @@ + +
+
+
+

Notifications

+ + +
+
+
+
+

{{notification.post.text | slice:0:15}}…

+

- {{notification.post.author.name}}

+
+

{{notification.comments.length}}

+
+
+ delete +
+
+
+
+
+
diff --git a/src/app/_shared/notifcations/notifications.component.scss b/src/app/_shared/notifcations/notifications.component.scss new file mode 100644 --- /dev/null +++ b/src/app/_shared/notifcations/notifications.component.scss @@ -0,0 +1,77 @@ +.login { + &-button { + width: 100%; + font-family: 'Mukta', sans-serif; + border: 1px solid #EA6C40; + border-radius: 4px; + font-weight: 700; + } +} +.home { + &-area { + &-card { + width: 100%; + height: 15vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + &-add { + width: 20vw; + height: 15vw; + margin-left: 5vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + } + } + } + &-content { + &-container { + width: 100vw; + position: fixed; + top: 0; + left: 0; + } + } + &-input { + font-size: 100%; + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-container { + padding-left: 2rem; + padding-right: 2rem; + width: 100vw; + max-width: 1000px; + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 500; + font-size: 2rem; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + } + &-title { + font-size: 3rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 600; + max-width: 1000px; + } + &-comment { + &-container { + width: 100vw; + max-width: 1000px; + } + } +} diff --git a/src/app/notification/notification.component.spec.ts b/src/app/_shared/notifcations/notifications.component.spec.ts rename from src/app/notification/notification.component.spec.ts rename to src/app/_shared/notifcations/notifications.component.spec.ts --- a/src/app/notification/notification.component.spec.ts +++ b/src/app/_shared/notifcations/notifications.component.spec.ts @@ -4,22 +4,22 @@ import { MatCardModule, MatTabsModule, MatDialogModule, MatProgressSpinnerModule, MatSnackBarModule } from '@angular/material'; import { Router, ActivatedRoute, RouterModule } from '@angular/router'; import { Observable } from 'rxjs'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { Notification } from '../_models/notification'; -import { NotificationPost } from '../_models/notificationPost'; -import { Post } from '../_models/post'; -import { SuperNotification } from '../_models/superNotification'; -import { AuthenticationService } from '../_services/authentication.service'; -import { NotificationService } from '../_services/notification.service'; -import { RouteService } from '../_services/route.service'; -import { NavBarService } from '../_services/navBar.service'; -import { NotificationComponent } from './notification.component'; +import { Author } from '../../_models/author'; +import { Comment } from '../../_models/comment'; +import { Notification } from '../../_models/notification'; +import { NotificationPost } from '../../_models/notificationPost'; +import { Post } from '../../_models/post'; +import { SuperNotification } from '../../_models/superNotification'; +import { AuthenticationService } from '../../_services/authentication.service'; +import { NotificationService } from '../../_services/notification.service'; +import { RouteService } from '../../_services/route.service'; +import { NavBarService } from '../../_services/navBar.service'; +import { NotificationsComponent } from './notifications.component'; import { NgxPaginationModule } from 'ngx-pagination'; describe('NotificationComponent', () => { - let comp: NotificationComponent; - let fixture: ComponentFixture; + let comp: NotificationsComponent; + let fixture: ComponentFixture; beforeEach(() => { const routerStub = { @@ -47,7 +47,7 @@ const routeServiceStub = {}; TestBed.configureTestingModule({ - declarations: [ NotificationComponent ], + declarations: [ NotificationsComponent ], providers: [ { provide: Router, useValue: routerStub }, { provide: ActivatedRoute, useValue: activatedRouteStub }, @@ -57,9 +57,10 @@ { provide: RouteService, useValue: routeServiceStub }, { provide: ComponentFixtureAutoDetect, useValue: true } ], - imports: [ MatCardModule, RouterModule, MatTabsModule, NgxPaginationModule, MatDialogModule, MatProgressSpinnerModule, MatSnackBarModule ], + imports: [ MatCardModule, RouterModule, MatTabsModule, NgxPaginationModule, MatDialogModule, + MatProgressSpinnerModule, MatSnackBarModule ], }).compileComponents(); - fixture = TestBed.createComponent(NotificationComponent); + fixture = TestBed.createComponent(NotificationsComponent); comp = fixture.componentInstance; }); diff --git a/src/app/notification/notification.component.ts b/src/app/_shared/notifcations/notifications.component.ts rename from src/app/notification/notification.component.ts rename to src/app/_shared/notifcations/notifications.component.ts --- a/src/app/notification/notification.component.ts +++ b/src/app/_shared/notifcations/notifications.component.ts @@ -2,18 +2,19 @@ import { MatDialog, MatDialogRef, MatSnackBar } from '@angular/material'; import { Router, ActivatedRoute } from '@angular/router'; import { Subject } from 'rxjs/Subject'; -import { ConfirmDeletionDialogComponent } from '../_dialogs/confirmDeletion.dialog.component'; -import { Notification } from '../_models/notification'; -import { Post } from '../_models/post'; -import { SuperNotification } from '../_models/superNotification'; -import { NavBarService } from '../_services/navBar.service'; -import { NotificationService } from '../_services/notification.service'; -import { RouteService } from '../_services/route.service'; +import { ConfirmDeletionDialogComponent } from '../../_dialogs/confirmDeletion.dialog.component'; +import { Notification } from '../../_models/notification'; +import { Post } from '../../_models/post'; +import { SuperNotification } from '../../_models/superNotification'; +import { NavBarService } from '../../_services/navBar.service'; +import { NotificationService } from '../../_services/notification.service'; +import { RouteService } from '../../_services/route.service'; @Component({ - templateUrl: 'notification.component.html' + templateUrl: 'notifications.component.html', + styleUrls: ['./notifications.component.scss'] }) -export class NotificationComponent implements OnInit, OnDestroy { +export class NotificationsComponent implements OnInit, OnDestroy { archivedPosts: Post[] = []; componentDestroyed: Subject = new Subject(); index = 1; @@ -124,7 +125,7 @@ this.notificationService.deleteNotifications(); this.notifications = []; this.navBarService.notifications.next(0); - const snackBarRef = this.snackBar.open('Notifications Deleted Successfully', 'Close', { + this.snackBar.open('Notifications Deleted Successfully', 'Close', { duration: 3000 }); } @@ -159,17 +160,17 @@ }); } - goto(areaID: string, postID: number, comments: number[] = []) { + goto(n: Notification) { let commentString = ''; - for (let i = 0; i < comments.length; i++) { + for (let i = 0; i < n.comments.length; i++) { if (i !== 0) { commentString += '-'; } - commentString += comments[i]; + commentString += n.comments[i]; } this.routeService.addNextRouteByIndex(this.index); this.navBarService.notifications.next(this.superNotification.count - 1); - this.router.navigateByUrl('/areas/' + areaID + '/' + postID + '/' + commentString); + this.router.navigateByUrl('/areas/' + n.area + '/' + n.post.id + '/' + commentString); } } diff --git a/src/app/_shared/password/password.component.html b/src/app/_shared/password/password.component.html new file mode 100644 --- /dev/null +++ b/src/app/_shared/password/password.component.html @@ -0,0 +1,63 @@ + +
+
+
+ keyboard_arrow_left +
+
+

Change Password

+
+
+

Passwords must contain at least 8 characters and be alphanumeric (At least 1 letter and 1 number)

+
+
+
+
+

{{err}}

+
+
+
+ +
+
+

Password is required

+
+
+
+

{{err}}

+
+
+ +
+ +
+
+

Password is required

+
+
+
+

{{err}}

+
+
+ +
+ +
+
+

Password is required

+
+
+
+

{{err}}

+
+
+ +
+ +
+
+ +
+
+
+
diff --git a/src/app/_shared/password/password.component.scss b/src/app/_shared/password/password.component.scss new file mode 100644 --- /dev/null +++ b/src/app/_shared/password/password.component.scss @@ -0,0 +1,54 @@ +.password { + &-button { + width: 100%; + font-family: 'Mukta', sans-serif; + border: 1px solid #EA6C40; + border-radius: 4px; + font-weight: 700; + position: relative; + & input[type="file"]{ + -webkit-appearance:none; + position:absolute; + top:0; + left:0; + opacity:0; + width: 100%; + height: 100%; + } + &-group { + height: 25vh; + padding-left: 3rem; + padding-right: 3rem; + background: transparent !important; + width: 100%; + } + } + &-container { + padding-left: 2rem; + padding-right: 2rem; + width: 100vw; + max-width: 1000px; + } + &-input { + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-title { + font-size: 3rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 600; + max-width: 1000px; + } +} + +p { + color:#A2A2A2; +} diff --git a/src/app/_shared/password/password.component.ts b/src/app/_shared/password/password.component.ts new file mode 100644 --- /dev/null +++ b/src/app/_shared/password/password.component.ts @@ -0,0 +1,114 @@ +import { Component, OnInit, OnDestroy } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { MatSnackBar } from '@angular/material'; +import { Router } from '@angular/router'; +import { Subject } from 'rxjs/Subject'; +import { Account } from '../../_models/account'; +import { AuthenticationService } from '../../_services/authentication.service'; +import { ProfileService } from '../../_services/profile.service'; +import { RouteService } from '../../_services/route.service'; + +@Component({ + templateUrl: 'password.component.html', + styleUrls: ['./password.component.scss'] +}) +export class PasswordComponent implements OnInit, OnDestroy { + account: Account; + componentDestroyed: Subject = new Subject(); + errors: any; + loading = true; + passwordForm: FormGroup; + self: boolean; + + constructor( + public snackBar: MatSnackBar, + private router: Router, + private authenticationService: AuthenticationService, + private profileService: ProfileService, + private routeService: RouteService + ) { } + + ngOnInit() { + this.passwordForm = new FormGroup({ + 'oldPassword': new FormControl(''), + 'password': new FormControl(''), + 'password2': new FormControl(''), + }); + this.loading = false; + } + + ngOnDestroy() { + this.componentDestroyed.next(true); + this.componentDestroyed.complete(); + } + + back() { + if (this.routeService.routes.length === 0) { + this.router.navigateByUrl(''); + } else { + this.router.navigateByUrl(this.routeService.getNextRoute()); + } + } + + changePassword() { + this.loading = true; + + if (this.passwordForm.valid) { + this.authenticationService.login(this.account.username, this.passwordForm.controls.oldPassword.value) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + if (!result.getError()) { + if (this.passwordForm.controls.password.value === this.passwordForm.controls.password2.value) { + this.profileService.setPassword(this.passwordForm.controls.password.value) + .takeUntil(this.componentDestroyed) + .subscribe(result2 => { + if (!result2.getError()) { + this.authenticationService.login(this.account.username, this.passwordForm.controls.password.value) + .takeUntil(this.componentDestroyed) + .subscribe(result3 => { + if (!result3.getError()) { + this.loading = false; + this.passwordForm.controls.oldPassword.setValue(''); + this.passwordForm.controls.password.setValue(''); + this.passwordForm.controls.password2.setValue(''); + this.snackBar.open('Password changed successfully', 'Close', { + duration: 3000 + }); + } else { + this.loading = false; + this.snackBar.open('Error could not set token', 'Close', { + duration: 3000 + }); + } + }); + } else { + this.errors = result2.getError(); + this.loading = false; + this.snackBar.open('You did not follow the requirements', 'Close', { + duration: 3000 + }); + } + }); + + } else { + this.loading = false; + this.snackBar.open('Your new passwords do not match', 'Close', { + duration: 3000 + }); + } + } else { + this.errors = result.getError(); + this.loading = false; + this.snackBar.open('This is not your current password', 'Close', { + duration: 3000 + }); + } + }); + } else { + this.loading = false; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } +} diff --git a/src/app/home/home.component.html b/src/app/_shared/postView/postView.component.html rename from src/app/home/home.component.html rename to src/app/_shared/postView/postView.component.html --- a/src/app/home/home.component.html +++ b/src/app/_shared/postView/postView.component.html @@ -1,4 +1,109 @@ - + +
+
+ +
+ +
+
+ + +
+
+
+ +
+ keyboard_arrow_left +

{{currentArea.displayname}}

+
+
+

Info

+
+
+ + +
+ + +
+ outlined_flag + Avatar of {{post.author.name}} + Avatar of {{post.author.name}} +
+

{{post.author.name}}

+
+

{{post.created}}

+
+
+ info + bookmark_border + bookmark +
+ + +
+ keyboard_arrow_up + keyboard_arrow_down +
+ + +
+

Comments: {{post.comments.length}}

+ keyboard_arrow_up +
+
+
+ + +
+
+
+
+

Comments: {{post.comments.length}}

+ keyboard_arrow_down +
+ +
+
+
+
+
+

{{comment.author.name}} {{comment.created}}

+
+ +
+
+
+
+
+ +
+
+
+
+

{{err}}

+
+
+
+ +
+
+

Comment is required

+
+
+
+

{{err}}

+
+
+
+ +

Send

+
+
+
+
+ + diff --git a/src/app/_shared/postView/postView.component.scss b/src/app/_shared/postView/postView.component.scss new file mode 100644 --- /dev/null +++ b/src/app/_shared/postView/postView.component.scss @@ -0,0 +1,124 @@ +.home { + &-area { + &-card { + width: 80vw; + height: 15vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + &-add { + width: 15vw; + height: 15vw; + margin-left: 5vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + } + } + } + &-content { + &-container { + width: 100vw; + position: fixed; + top: 0; + left: 0; + } + } + &-input { + font-size: 100%; + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-container { + padding-left: 2rem; + padding-right: 2rem; + width: 100vw; + max-width: 1000px; + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 500; + font-size: 2rem; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + } + &-title { + font-size: 3rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 600; + max-width: 1000px; + } + &-comment { + &-container { + width: 100vw; + max-width: 1000px; + } + } +} + +#comment { + display: none; + flex-direction: column; + box-sizing: border-box; + flex-direction: column; + place-content: center; + align-items: center; +} + +#comment-box { + display: none; + flex-direction: row; + box-sizing: border-box; + flex-direction: column; + place-content: center space-between; + align-items: center; + height: 5vh;background: #ffffff; + padding-left: 2rem; + padding-right: 2rem; + box-shadow: 0px -1px 50px rgba(0, 0, 0, 0.25); + position: fixed; + bottom: 0; + width: 100%; + left: 0; +} + +#comment-tab { + display: none; + flex-direction: row; + box-sizing: border-box; + flex-direction: column; + place-content: center space-between; + align-items: center; + height: 5vh; + background: #ffffff; + padding-left: 2rem; + padding-right: 2rem; + box-shadow: 0px -1px 50px rgba(0, 0, 0, 0.25); + position: fixed; + width: 100%; + top: 0; + left: 0; +} + +p.marked span.markdown p { + color: #333333 !important; +} + +p { + color:#A2A2A2; +} + +.hideEndorse { + margin-top: 75vh !important; +} diff --git a/src/app/home/home.component.spec.ts b/src/app/_shared/postView/postView.component.spec.ts rename from src/app/home/home.component.spec.ts rename to src/app/_shared/postView/postView.component.spec.ts --- a/src/app/home/home.component.spec.ts +++ b/src/app/_shared/postView/postView.component.spec.ts @@ -3,27 +3,28 @@ import { ComponentFixture, ComponentFixtureAutoDetect, TestBed, async } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { MatCardModule, MatIconModule, MatListModule, MatMenuModule, MatSlideToggleModule, MatDialogRef, MatDialog, MatProgressSpinnerModule, MatSnackBarModule } from '@angular/material'; +import { MatCardModule, MatIconModule, MatListModule, MatMenuModule, MatSlideToggleModule, MatDialogRef, + MatDialog, MatProgressSpinnerModule, MatSnackBarModule } from '@angular/material'; import { Router, RouterModule } from '@angular/router'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { Post } from '../_models/post'; -import { MarkedPipe } from '../_pipes/marked.pipe'; -import { AreaService } from '../_services/area.service'; -import { CommentService } from '../_services/comment.service'; -import { FlagService } from '../_services/flag.service'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { ProfileService } from '../_services/profile.service'; -import { RouteService } from '../_services/route.service'; -import { HomeComponent } from './home.component'; +import { Author } from '../../_models/author'; +import { Comment } from '../../_models/comment'; +import { Post } from '../../_models/post'; +import { MarkedPipe } from '../../_pipes/marked.pipe'; +import { AreaService } from '../../_services/area.service'; +import { CommentService } from '../../_services/comment.service'; +import { FlagService } from '../../_services/flag.service'; +import { NavBarService } from '../../_services/navBar.service'; +import { PostService } from '../../_services/post.service'; +import { ProfileService } from '../../_services/profile.service'; +import { RouteService } from '../../_services/route.service'; +import { PostViewComponent } from './postView.component'; import { ClipboardModule } from 'ngx-clipboard'; -describe('HomeComponent', () => { - let comp: HomeComponent; - let fixture: ComponentFixture; +describe('PostViewComponent', () => { + let comp: PostViewComponent; + let fixture: ComponentFixture; let de: DebugElement; let el: HTMLElement; @@ -97,7 +98,7 @@ }; TestBed.configureTestingModule({ - declarations: [ HomeComponent, MarkedPipe ], + declarations: [ PostViewComponent, MarkedPipe ], providers: [ { provide: ChangeDetectorRef, useValue: changeDetectorRefStub }, { provide: Router, useValue: routerStub }, @@ -115,9 +116,10 @@ { provide: RouteService, useValue: routeServiceStub }, { provide: ComponentFixtureAutoDetect, useValue: true } ], - imports: [ MatCardModule, MatIconModule, MatListModule, MatMenuModule, FormsModule, ClipboardModule, MatProgressSpinnerModule, MatSlideToggleModule, RouterModule, MatSnackBarModule ] + imports: [ MatCardModule, MatIconModule, MatListModule, MatMenuModule, FormsModule, + ClipboardModule, MatProgressSpinnerModule, MatSlideToggleModule, RouterModule, MatSnackBarModule ] }); - fixture = TestBed.createComponent(HomeComponent); + fixture = TestBed.createComponent(PostViewComponent); comp = fixture.componentInstance; de = fixture.debugElement.query(By.css('.mainText')); el = de.nativeElement; diff --git a/src/app/home/home.component.ts b/src/app/_shared/postView/postView.component.ts rename from src/app/home/home.component.ts rename to src/app/_shared/postView/postView.component.ts --- a/src/app/home/home.component.ts +++ b/src/app/_shared/postView/postView.component.ts @@ -1,24 +1,26 @@ import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { FormGroup, FormControl } from '@angular/forms'; import { MatDialog, MatSnackBar } from '@angular/material'; -import { Router } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { Subject } from 'rxjs/Subject'; -import { ConfirmDeletionDialogComponent } from '../_dialogs/confirmDeletion.dialog.component'; -import { FlagDialogComponent } from '../_dialogs/flag.dialog.component'; -import { ShareDialogComponent } from '../_dialogs/share.dialog.component'; -import { Area } from '../_models/area'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { CommentData } from '../_models/commentData'; -import * as C from '../_models/constants'; -import { Link } from '../_models/link'; -import { Post } from '../_models/post'; -import { Reputation } from '../_models/reputation'; -import { CommentService } from '../_services/comment.service'; -import { FlagService } from '../_services/flag.service'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { ProfileService } from '../_services/profile.service'; -import { RouteService } from '../_services/route.service'; +import { ConfirmDeletionDialogComponent } from '../../_dialogs/confirmDeletion.dialog.component'; +import { FlagDialogComponent } from '../../_dialogs/flag.dialog.component'; +import { ShareDialogComponent } from '../../_dialogs/share.dialog.component'; +import { Area } from '../../_models/area'; +import { Author } from '../../_models/author'; +import { Comment } from '../../_models/comment'; +import { CommentData } from '../../_models/commentData'; +import * as C from '../../_models/constants'; +import { Link } from '../../_models/link'; +import { Post } from '../../_models/post'; +import { Reputation } from '../../_models/reputation'; +import { AreaService } from '../../_services/area.service'; +import { CommentService } from '../../_services/comment.service'; +import { FlagService } from '../../_services/flag.service'; +import { NavBarService } from '../../_services/navBar.service'; +import { PostService } from '../../_services/post.service'; +import { ProfileService } from '../../_services/profile.service'; +import { RouteService } from '../../_services/route.service'; enum TypeOfReport { Post, @@ -26,31 +28,39 @@ } @Component({ - templateUrl: 'home.component.html', + templateUrl: 'postView.component.html', + styleUrls: ['./postView.component.scss'] }) -export class HomeComponent implements OnInit, OnDestroy { +export class PostViewComponent implements OnInit, OnDestroy { private systemAuthor: Author = new Author(375, 'WildFyre', '', '', false); areaCheck: string; blockedUsers: string[]; blanketText = `

Fyre Blanket

`; + areas = new Array(new Area('', '', 0, 0)); commentCount = 0; + commentForm: FormGroup; componentDestroyed: Subject = new Subject(); - currentArea: string; + currentArea: Area; + errors: any; fakePost: Post = new Post(0, this.systemAuthor, false, false, Date(), false, 'No more posts in this area, try creating one?', null, null, []); + hasPostId = false; isCopied = false; loading = true; loggedIn = true; + parsedCommentArray: string[] = []; post: Post = this.fakePost; rep: Reputation; - userID: number; + self: Author; wait = true; constructor( + private route: ActivatedRoute, private cdRef: ChangeDetectorRef, private dialog: MatDialog, private router: Router, private snackBar: MatSnackBar, + private areaService: AreaService, private commentService: CommentService, private flagService: FlagService, private navBarService: NavBarService, @@ -68,6 +78,11 @@ this.blockedUsers.pop(); } + this.commentForm = new FormGroup({ + 'comment': new FormControl(''), + 'image': new FormControl('') + }); + this.routeService.resetRoutes(); this.navBarService.comment @@ -77,7 +92,7 @@ if (!this.wait) { if (comment.comment !== '' && this.runImageCheck(comment.comment)) { if (comment.image) { - this.postService.setPicture(comment.image, this.post, this.currentArea, false, comment.comment) + this.postService.setPicture(comment.image, this.post, this.currentArea.name, false, comment.comment) .takeUntil(this.componentDestroyed) .subscribe(result2 => { if (!result2.getError()) { @@ -90,7 +105,7 @@ } }); } else { - this.postService.comment(this.currentArea, this.post, comment.comment) + this.postService.comment(this.currentArea.name, this.post, comment.comment) .takeUntil(this.componentDestroyed) .subscribe(); this.navBarService.clearInputs.next(true); @@ -109,13 +124,76 @@ this.wait = false; }); + this.areaService.getAreas() + .takeUntil(this.componentDestroyed) + .subscribe(areas => { + this.areas = []; + + for (let i = 0; i < areas.length; i++) { + this.areaService.getAreaRep(areas[i].name) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + let area; + area = new Area( + areas[i].name, + areas[i].displayname, + result.reputation, + result.spread + ); + + this.areas.push(area); + this.cdRef.detectChanges(); + }); + } + }); + this.profileService.getSelf() .takeUntil(this.componentDestroyed) .subscribe( (author: Author) => { - this.userID = author.user; + this.self = author; this.loggedIn = true; }); - this.refresh(true); + + this.route.params + .takeUntil(this.componentDestroyed) + .subscribe(params => { + if (params['area'] !== undefined) { + this.areaService.getArea(params['area']) + .subscribe(area => { + this.currentArea = area; + if (params['id']) { + this.hasPostId = true; + this.postService.getPost(this.currentArea.name, params['id']) + .takeUntil(this.componentDestroyed) + .subscribe(post => { + this.post = post; + this.commentCount = this.post.comments.length; + this.loading = false; + this.navBarService.hasPost.next(true); + this.cdRef.detectChanges(); + }); + + let commentIDArray = params['comments']; + commentIDArray = commentIDArray + '-'; + + if (commentIDArray) { + while (commentIDArray.indexOf('-') !== -1) { + this.parsedCommentArray.push(commentIDArray.slice(0, commentIDArray.indexOf('-'))); + commentIDArray = commentIDArray.slice(commentIDArray.indexOf('-') + 1, commentIDArray.length); + } + } + } else { + this.refresh(true); + } + }); + } else { + this.refresh(true); + } + }); + + + + this.cdRef.detectChanges(); } @@ -141,6 +219,10 @@ }); } + info(e: any) { + + } + unblockUser(id: number) { const dialogRef = this.dialog.open(ConfirmDeletionDialogComponent); dialogRef.afterClosed() @@ -179,7 +261,7 @@ return matches; } - gotoUser(user: string) { + gotoUser(user: number) { this.routeService.addNextRoute(this.router.url); this.router.navigateByUrl('/user/' + user); } @@ -188,6 +270,16 @@ return this.blockedUsers.includes(String(c)); } + hideViews() { + document.getElementById('post').style.display = 'none'; + document.getElementById('home').style.display = 'none'; + document.getElementById('comment').style.display = 'none'; + document.getElementById('comment-box').style.display = 'none'; + document.getElementById('comment-tab').style.display = 'none'; + this.errors = null; + this.loading = false; + } + openCommentDeleteDialog(c: Comment) { const dialogRef = this.dialog.open(ConfirmDeletionDialogComponent); dialogRef.afterClosed() @@ -195,7 +287,7 @@ .subscribe(result => { if (result.bool) { this.commentService.deleteComment( - this.currentArea, + this.currentArea.name, this.post, c ); @@ -221,6 +313,12 @@ }); } + postComment() { + this.loading = true; + this.navBarService.comment.next(new CommentData(this.commentForm.controls.comment.value, this.commentForm.controls.image.value)); + this.loading = false; + } + refresh(reload: boolean) { this.wait = true; this.loading = true; @@ -228,7 +326,7 @@ .takeUntil(this.componentDestroyed) .subscribe((currentArea: Area) => { if (currentArea.name !== '') { - this.currentArea = currentArea.name; + this.currentArea = currentArea; if ((reload === true || this.areaCheck !== currentArea.name) && currentArea.name !== '') { this.postService.getNextPost(currentArea.name) @@ -238,7 +336,7 @@ this.post = nextPost; this.commentCount = this.post.comments.length; this.loading = false; - this.areaCheck = this.currentArea; + this.areaCheck = this.currentArea.name; this.navBarService.hasPost.next(true); this.cdRef.detectChanges(); } else { @@ -247,20 +345,20 @@ this.post = this.fakePost; this.commentCount = 0; this.loading = false; - this.areaCheck = this.currentArea; + this.areaCheck = this.currentArea.name; this.navBarService.hasPost.next(false); this.cdRef.detectChanges(); } }); } else if (currentArea.name === '') { } else { - this.postService.getPost(this.currentArea, this.post.id, false) + this.postService.getPost(this.currentArea.name, this.post.id, false) .takeUntil(this.componentDestroyed) .subscribe(post => { this.post = post; this.commentCount = this.post.comments.length; this.loading = false; - this.areaCheck = this.currentArea; + this.areaCheck = this.currentArea.name; this.navBarService.hasPost.next(true); this.cdRef.detectChanges(); }); @@ -318,12 +416,12 @@ this.navBarService.clearInputs.next(true); this.cdRef.detectChanges(); this.postService.spread( - this.currentArea, + this.currentArea.name, this.post, spread ); - this.postService.getNextPost(this.currentArea) + this.postService.getNextPost(this.currentArea.name) .subscribe(nextPost => { if (nextPost) { this.post = nextPost; @@ -340,8 +438,37 @@ } subscribe(s: boolean) { - this.postService.subscribe(this.currentArea, this.post, s) + this.postService.subscribe(this.currentArea.name, this.post, s) .takeUntil(this.componentDestroyed) .subscribe(); } + + switchRoute(s: string) { + if (s === 'home') { + this.router.navigateByUrl('/'); + } else if (s === 'profile') { + this.router.navigateByUrl('/profile'); + } else if (s === 'notifications') { + this.router.navigateByUrl('/notifications'); + } else if (s === 'my-posts') { + this.router.navigateByUrl('/posts'); + } + } + + switchView(s: string, a?: Area) { + if (s === 'home') { + this.hideViews(); + document.getElementById('home').style.display = 'flex'; + document.getElementById('post').style.display = 'block'; + } else if (s === 'comment') { + this.hideViews(); + document.getElementById('comment').style.display = 'flex'; + document.getElementById('comment-box').style.display = 'flex'; + document.getElementById('comment-tab').style.display = 'flex'; + } else if (s === 'areaList') { + this.hideViews(); + document.getElementById('areaList').style.display = 'flex'; + document.getElementById('navBar').style.display = 'flex'; + } + } } diff --git a/src/app/_shared/profile/profile.component.html b/src/app/_shared/profile/profile.component.html new file mode 100644 --- /dev/null +++ b/src/app/_shared/profile/profile.component.html @@ -0,0 +1,107 @@ + +
+
+ Avatar of {{author?.name}} + Avatar of {{author?.name}} +
+
+
+ +
+
+

Password

+

Info

+
+
+ +
+
+

{{author?.name}}

+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+
+

+
+
+
+

{{err}}

+
+
+
+
+
+ + diff --git a/src/app/_shared/profile/profile.component.scss b/src/app/_shared/profile/profile.component.scss new file mode 100644 --- /dev/null +++ b/src/app/_shared/profile/profile.component.scss @@ -0,0 +1,119 @@ +.profile { + &-button { + width: 100%; + font-family: 'Mukta', sans-serif; + border: 1px solid #EA6C40; + border-radius: 4px; + font-weight: 700; + position: relative; + & input[type="file"]{ + -webkit-appearance:none; + position:absolute; + top:0; + left:0; + opacity:0; + width: 100%; + height: 100%; + } + &-group { + height: 25vh; + padding-left: 3rem; + padding-right: 3rem; + background: transparent !important; + width: 100%; + } + } + &-container { + padding-left: 3rem; + padding-right: 3rem; + width: 100vw; + max-width: 1000px; + position: relative; + margin-top: -50vh; + left: 0; + background-image: linear-gradient( + to bottom, + hsla(0, 0%, 100%, 0) 0%, + hsla(0, 0%, 100%, 0.143) 4.4%, + hsla(0, 0%, 100%, 0.274) 7.7%, + hsla(0, 0%, 100%, 0.392) 10.4%, + hsla(0, 0%, 100%, 0.498) 12.7%, + hsla(0, 0%, 100%, 0.593) 14.8%, + hsla(0, 0%, 100%, 0.676) 17.2%, + hsla(0, 0%, 100%, 0.749) 20.1%, + hsla(0, 0%, 100%, 0.811) 23.9%, + hsla(0, 0%, 100%, 0.864) 28.8%, + hsla(0, 0%, 100%, 0.907) 35.2%, + hsla(0, 0%, 100%, 0.942) 43.3%, + hsla(0, 0%, 100%, 0.968) 53.6%, + hsla(0, 0%, 100%, 0.986) 66.3%, + hsla(0, 0%, 100%, 0.997) 81.6%, + hsl(0, 0%, 100%) 100% + ); + } + &-image { + position: relative; + height: 50vh; + width: 100%; + max-width: 1000px; + } + &-input { + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-post { + &-group { + width: 100%; + } + &-row { + width: 100%; + flex-wrap: wrap; + + &-icons { + padding-left: 5%; + padding-right: 5%; + } + } + &-card { + width: 47.5%; + height: 15vh; + padding-left: 2%; + padding-right: 2%; + margin-bottom: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + &:nth-child(odd) { + margin-right: 5%; + } + } + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + color: #A2A2A2; + font-weight: 500; + font-size: 2rem; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + } + &-title { + font-size: 2rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 500; + max-width: 1000px; + } +} + +.marked { + overflow-y: scroll; +} diff --git a/src/app/profile/profile.component.spec.ts b/src/app/_shared/profile/profile.component.spec.ts rename from src/app/profile/profile.component.spec.ts rename to src/app/_shared/profile/profile.component.spec.ts --- a/src/app/profile/profile.component.spec.ts +++ b/src/app/_shared/profile/profile.component.spec.ts @@ -42,7 +42,7 @@ const authenticationServiceStub = { token: 'token' }; - const reasonServiceStub = {} + const reasonServiceStub = {}; const profileServiceStub = { getUser: (id: number) => { if (id !== 1) { diff --git a/src/app/_shared/profile/profile.component.ts b/src/app/_shared/profile/profile.component.ts new file mode 100644 --- /dev/null +++ b/src/app/_shared/profile/profile.component.ts @@ -0,0 +1,249 @@ +import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; +import { MatSnackBar } from '@angular/material'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Subject } from 'rxjs/Subject'; +import { Account } from '../../_models/account'; +import { Author } from '../../_models/author'; +import { Ban } from '../../_models/ban'; +import { Post } from '../../_models/post'; +import { SuperBan } from '../../_models/superBan'; +import { ProfileService } from '../../_services/profile.service'; +import { RouteService } from '../../_services/route.service'; + +declare const Compressor: any; + +@Component({ + templateUrl: 'profile.component.html', + styleUrls: ['./profile.component.scss'] +}) +export class ProfileComponent implements OnInit, OnDestroy { + account: Account; + author: Author; + bans: Ban[] = []; + bioForm: FormGroup; + componentDestroyed: Subject = new Subject(); + editBio = false; + emailForm: FormGroup; + errors: any; + imageArray: { [area: string]: string[]; } = {}; + index = 1; + limit = 10; + loading = true; + offset = 10; + passwordForm: FormGroup; + path = ''; + self: boolean; + superPosts: { [area: string]: Post[]; } = {}; + totalCount = 0; + url: string; + + constructor( + private route: ActivatedRoute, + private cdRef: ChangeDetectorRef, + private router: Router, + public snackBar: MatSnackBar, + private profileService: ProfileService, + private routeService: RouteService + ) { } + + ngOnInit() { + this.route.url + .subscribe(r => { + if (r[0]) { + this.path = r[0].path; + } + }); + + this.emailForm = new FormGroup({ + 'email': new FormControl(''), + }); + + this.bioForm = new FormGroup({ + 'bio': new FormControl(''), + }); + + this.profileService.getSelf() + .takeUntil(this.componentDestroyed) + .subscribe((self: Author) => { + this.author = self; + if (this.author.bio === '') { + this.author.bio = '*No Bio*'; + } + this.loading = false; + this.bioForm.controls.bio.setValue(this.author.bio); + }); + + this.profileService.getAccount() + .takeUntil(this.componentDestroyed) + .subscribe((self: Account) => { + this.account = self; + if (this.account.email === '') { + this.account.email = '*Please verify your email*'; + } + this.emailForm.controls.email.setValue(this.account.email); + }); + + this.profileService.getBans(this.limit, (this.index * this.limit) - this.limit) + .takeUntil(this.componentDestroyed) + .subscribe((superBan: SuperBan) => { + superBan.results.forEach((obj: any) => { + this.bans.push(Ban.parse(obj)); + }); + this.totalCount = superBan.count; + }); + } + + ngOnDestroy() { + this.componentDestroyed.next(true); + this.componentDestroyed.complete(); + } + + getBans(page: number) { + this.loading = true; + this.bans = []; + + this.profileService.getBans(this.limit, (this.offset * page) - this.limit) + .takeUntil(this.componentDestroyed) + .subscribe(superBan => { + + superBan.results.forEach((obj: any) => { + this.bans.push(Ban.parse(obj)); + }); + + this.index = page; + this.totalCount = superBan.count; + this.cdRef.detectChanges(); + this.loading = false; + }); + } + + goto(s: string) { + this.routeService.addNextRoute(this.path); + + if (s === 'password') { + this.router.navigateByUrl('/tools/password'); + } else { + this.router.navigateByUrl('/tools/image-upload'); + } + } + + info(event: any) { + event.stopPropagation(); + this.snackBar.open('Touch the item you want to edit', 'Close', { + duration: 3000 + }); + } + + infoNo() { + this.snackBar.open('You can not edit this', 'Close', { + duration: 3000 + }); + } + + setBio() { + this.loading = true; + + if (this.bioForm.valid) { + this.profileService.setBio(this.author, this.bioForm.controls.bio.value) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + if (!result.getError()) { + this.author = result; + this.snackBar.open('Bio changed successfully', 'Close', { + duration: 3000 + }); + this.toggleBio(); + this.loading = false; + } else { + this.errors = result.getError(); + this.loading = false; + } + }); + } else { + this.loading = false; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } + + setEmail() { + this.loading = true; + if (this.bioForm.valid) { + this.profileService.setEmail(this.emailForm.controls.email.value) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + if (!result.getError()) { + this.account = result; + this.snackBar.open('We just sent you a verification email, you must verify your email for it to be set', 'Close', { + duration: 3000 + }); + this.undoEmail(); + this.loading = false; + } else { + this.errors = result.getError(); + this.loading = false; + } + }); + } else { + this.loading = false; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } + + toggleBio() { + this.editBio = !this.editBio; + + if (!this.editBio) { + this.bioForm.controls.bio.setValue(this.author.bio); + } + } + + undoEmail() { + this.emailForm.controls.email.setValue(this.account.email); + } + + viewProfile() { + this.routeService.addNextRoute(this.router.url); + this.router.navigateByUrl('/user/' + this.author.user); + } + + /* Removed as of D114 + searchInput() { + if (this.areaService.currentAreaName === 'fun') { + this.searchArray = []; + if (this.model.postText === '') { + this.searching = false; + this.cdRef.detectChanges(); + } else { + this.searching = true; + + for (let i = 0; i <= this.funPosts.length - 1; i++) { + if (this.funPosts[i].text.toLowerCase().includes(this.model.postText.toLowerCase())) { + this.searchArray.push(this.backupFunPosts[i]); + } + } + this.cdRef.detectChanges(); + } + } else { + this.searchArray = []; + if (this.model.postText === '') { + this.searching = false; + this.cdRef.detectChanges(); + } else { + this.searching = true; + + for (let i = 0; i <= this.infoPosts.length - 1; i++) { + if (this.infoPosts[i].text.toLowerCase().includes(this.model.postText.toLowerCase())) { + this.searchArray.push(this.backupInfoPosts[i]); + } + } + this.cdRef.detectChanges(); + } + } + } + */ +} diff --git a/src/app/app.component.html b/src/app/app.component.html --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,3 +1,2 @@ Loading.. -




diff --git a/src/app/app.component.ts b/src/app/app.component.ts --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -23,7 +23,7 @@ if (this.authenticationService.token) { this.areaService.getAreas() .takeUntil(this.componentDestroyed) - .subscribe(result => { + .subscribe(() => { this.loading = false; this.cdRef.detectChanges(); }); diff --git a/src/app/app.module.ts b/src/app/app.module.ts --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,47 +1,40 @@ // Angular Modules import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserModule } from '@angular/platform-browser'; -import { FormsModule } from '@angular/forms'; +import { FlexLayoutModule } from '@angular/flex-layout'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { MatButtonModule, MatCardModule, MatCheckboxModule, MatDialogModule, MatExpansionModule, MatIconModule, MatInputModule, MatListModule, MatMenuModule, MatProgressSpinnerModule, MatRadioModule, - MatSelectModule, MatSidenavModule, MatSlideToggleModule, MatSnackBarModule, MatTabsModule } from '@angular/material'; + MatSelectModule, MatSidenavModule, MatSlideToggleModule, MatSnackBarModule, MatTabsModule, MatTooltipModule } from '@angular/material'; import { NgModule } from '@angular/core'; // Core Components import { AppComponent } from './app.component'; import { Component404Component } from './404component/404.component'; import { CreatePostComponent } from './createPost/createPost.component'; -import { DraftsComponent } from './drafts/drafts.component'; -import { HomeComponent } from './home/home.component'; +import { PostViewComponent } from './_shared/postView/postView.component'; import { LoginComponent } from './login/login.component'; import { NavBarComponent } from './navBar/navBar.component'; -import { NotificationArchiveComponent } from './notificationArchive/notificationArchive.component'; -import { NotificationComponent } from './notification/notification.component'; -import { PostViewComponent } from './postView/postView.component'; -import { ProfileComponent } from './profile/profile.component'; -import { ProfileViewComponent } from './profileView/profileView.component'; -import { RecoverComponent } from './recover/recover.component'; -import { RecoverPasswordComponent } from './recoverPassword/recoverPassword.component'; -import { RegisterComponent } from './register/register.component'; -import { RegisterSuccessComponent } from './registerSuccess/registerSuccess.component'; -import { UserPostsComponent } from './userPosts/userPosts.component'; + +// Shared Components +import { AreaListComponent } from './_shared/areaList/areaList.component'; +import { ImageUploadComponent } from './_shared/imageUpload/imageUpload.component'; +import { MyPostsComponent } from './_shared/myPosts/myPosts.component'; +import { NotificationsComponent } from './_shared/notifcations/notifications.component'; +import { PasswordComponent } from './_shared/password/password.component'; +import { ProfileComponent } from './_shared/profile/profile.component'; // Core Dialogs -import { AvatarDialogComponent } from './_dialogs/avatar.dialog.component'; -import { BioDialogComponent } from './_dialogs/bio.dialog.component'; import { ConfirmDeletionDialogComponent } from './_dialogs/confirmDeletion.dialog.component'; -import { EmailDialogComponent } from './_dialogs/email.dialog.component'; import { FlagDialogComponent } from './_dialogs/flag.dialog.component'; import { LogoutDialogComponent } from './_dialogs/logout.dialog.component'; -import { PasswordDialogComponent } from './_dialogs/password.dialog.component'; import { PictureDialogComponent } from './_dialogs/picture.dialog.component'; import { PicturesDialogComponent } from './_dialogs/pictures.dialog.component'; import { ShareDialogComponent } from './_dialogs/share.dialog.component'; import { YouTubeDialogComponent } from './_dialogs/youtube.dialog.component'; // Core Modules -import { NgxMasonryModule } from './_modules/ngx-masonry/ngx-masonry.module'; import { ShareModule } from './_modules/ng2share/share.module'; // Core Pipes @@ -68,6 +61,7 @@ import { ClipboardModule } from 'ngx-clipboard'; import 'hammerjs'; import { ImageCropperModule } from 'ngx-img-cropper'; +import { NgxImageCompressService } from 'ngx-image-compress'; import { NgxPaginationModule } from 'ngx-pagination'; import { ReCaptchaModule } from 'angular2-recaptcha'; @@ -76,13 +70,11 @@ // forRoot Angulartics2Module.forRoot([ Angulartics2Piwik ]), - // Core Modules - NgxMasonryModule, - // Modules BrowserAnimationsModule, BrowserModule, FormsModule, + FlexLayoutModule, HttpClientModule, ImageCropperModule, MatButtonModule, @@ -101,6 +93,8 @@ MatSlideToggleModule, MatSnackBarModule, MatTabsModule, + MatTooltipModule, + ReactiveFormsModule, Routing, // Third Party Modules @@ -115,30 +109,23 @@ // Components AppComponent, Component404Component, - DraftsComponent, CreatePostComponent, - HomeComponent, LoginComponent, NavBarComponent, - NotificationArchiveComponent, - NotificationComponent, + + // Shared Components + AreaListComponent, + ImageUploadComponent, + MyPostsComponent, + NotificationsComponent, + PasswordComponent, PostViewComponent, ProfileComponent, - ProfileViewComponent, - RecoverComponent, - RecoverPasswordComponent, - RegisterComponent, - RegisterSuccessComponent, - UserPostsComponent, // Dialogs - AvatarDialogComponent, - BioDialogComponent, ConfirmDeletionDialogComponent, - EmailDialogComponent, FlagDialogComponent, LogoutDialogComponent, - PasswordDialogComponent, PictureDialogComponent, PicturesDialogComponent, ShareDialogComponent, @@ -146,7 +133,7 @@ // Pipes MarkedPipe - ], + ], providers: [ AreaService, AuthGuard, @@ -155,6 +142,7 @@ FlagService, HttpService, NavBarService, + NgxImageCompressService, NotificationService, PostService, ProfileService, @@ -163,13 +151,9 @@ RouteService ], entryComponents: [ - AvatarDialogComponent, - BioDialogComponent, ConfirmDeletionDialogComponent, - EmailDialogComponent, FlagDialogComponent, LogoutDialogComponent, - PasswordDialogComponent, PictureDialogComponent, PicturesDialogComponent, ShareDialogComponent, diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts --- a/src/app/app.routing.ts +++ b/src/app/app.routing.ts @@ -1,40 +1,33 @@ import { Routes, RouterModule } from '@angular/router'; +import { AreaListComponent } from './_shared/areaList/areaList.component'; import { Component404Component } from './404component/404.component'; -import { DraftsComponent } from './drafts/drafts.component'; import { CreatePostComponent } from './createPost/createPost.component'; -import { HomeComponent } from './home/home.component'; +import { PostViewComponent } from './_shared/postView/postView.component'; +import { ImageUploadComponent } from './_shared/imageUpload/imageUpload.component'; import { LoginComponent } from './login/login.component'; -import { NotificationArchiveComponent } from './notificationArchive/notificationArchive.component'; -import { NotificationComponent } from './notification/notification.component'; -import { RecoverComponent } from './recover/recover.component'; -import { RecoverPasswordComponent } from './recoverPassword/recoverPassword.component'; -import { RegisterComponent } from './register/register.component'; -import { RegisterSuccessComponent } from './registerSuccess/registerSuccess.component'; -import { PostViewComponent } from './postView/postView.component'; -import { ProfileComponent } from './profile/profile.component'; -import { ProfileViewComponent } from './profileView/profileView.component'; -import { UserPostsComponent } from './userPosts/userPosts.component'; +import { MyPostsComponent } from './_shared/myPosts/myPosts.component'; +import { NotificationsComponent } from './_shared/notifcations/notifications.component'; +import { PasswordComponent } from './_shared/password/password.component'; +import { ProfileComponent } from './_shared/profile/profile.component'; import { AuthGuard } from './_guards/auth.guard'; const appRoutes: Routes = [ - { path: '', component: HomeComponent, canActivate: [AuthGuard] }, + { path: '', component: AreaListComponent, canActivate: [AuthGuard] }, + { path: 'areas/:area', component: PostViewComponent, canActivate: [AuthGuard] }, { path: 'areas/:area/:id', component: PostViewComponent }, { path: 'areas/:area/:id/:comments', component: PostViewComponent }, - { path: 'create', component: CreatePostComponent, canActivate: [AuthGuard] }, - { path: 'create/:id', component: CreatePostComponent, canActivate: [AuthGuard] }, - { path: 'drafts', component: DraftsComponent, canActivate: [AuthGuard] }, + { path: 'create/:area', component: CreatePostComponent, canActivate: [AuthGuard] }, + { path: 'create/:area/:id', component: CreatePostComponent, canActivate: [AuthGuard] }, { path: 'login', component: LoginComponent }, - { path: 'notifications', component: NotificationComponent, canActivate: [AuthGuard] }, - { path: 'notifications/:index', component: NotificationComponent, canActivate: [AuthGuard] }, - { path: 'notifications/archive/:index', component: NotificationArchiveComponent, canActivate: [AuthGuard] }, - { path: 'posts', component: UserPostsComponent, canActivate: [AuthGuard] }, - { path: 'posts/:index', component: UserPostsComponent, canActivate: [AuthGuard] }, + { path: 'notifications', component: NotificationsComponent, canActivate: [AuthGuard] }, + { path: 'notifications/:index', component: NotificationsComponent, canActivate: [AuthGuard] }, + { path: 'notifications/archive/:index', component: NotificationsComponent, canActivate: [AuthGuard] }, + { path: 'posts', component: AreaListComponent, canActivate: [AuthGuard] }, + { path: 'posts/:area', component: MyPostsComponent, canActivate: [AuthGuard] }, { path: 'profile', component: ProfileComponent, canActivate: [AuthGuard] }, - { path: 'recover', component: RecoverComponent }, - { path: 'recover/password/:trans', component: RecoverPasswordComponent }, - { path: 'register', component: RegisterComponent }, - { path: 'register/success', component: RegisterSuccessComponent }, - { path: 'user/:id', component: ProfileViewComponent }, + { path: 'tools/image-upload', component: ImageUploadComponent, canActivate: [AuthGuard] }, + { path: 'tools/password', component: PasswordComponent, canActivate: [AuthGuard] }, + { path: 'user/:id', component: ProfileComponent }, // otherwise redirect to 404 { path: '**', component: Component404Component } diff --git a/src/app/createPost/createPost.component.html b/src/app/createPost/createPost.component.html --- a/src/app/createPost/createPost.component.html +++ b/src/app/createPost/createPost.component.html @@ -1,4 +1,58 @@ - +
+
+
+ +
+ keyboard_arrow_left +

{{currentArea.displayname}}

+
+
+ save +
+
+
+ +
+
+ text_fields + + + + + + + + + format_bold + format_italic + strikethrough_s + format_list_bulleted + format_list_numbered + format_quote +
+
+ code + border_all + remove + insert_photo + collections + slideshow +
+
+
+

Anonymous Post

+ info +
+ +
+
+

Drafts

+
+
+
+ + + diff --git a/src/app/createPost/createPost.component.scss b/src/app/createPost/createPost.component.scss new file mode 100644 --- /dev/null +++ b/src/app/createPost/createPost.component.scss @@ -0,0 +1,130 @@ +.login { + &-button { + width: 100%; + font-family: 'Mukta', sans-serif; + border: 1px solid #EA6C40; + border-radius: 4px; + font-weight: 700; + } +} + +.home { + &-area { + &-card { + width: 80vw; + height: 15vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + &-add { + width: 15vw; + height: 15vw; + margin-left: 5vw; + margin-top: 5%; + background: linear-gradient(0deg, #A2A2A2, #A2A2A2), linear-gradient(180deg, #A2A2A2 0%, #d3d3d3 99.99%); + box-shadow: 0px 0.986257px 7.39693px rgba(0, 0, 0, 0.3); + } + } + } + &-content { + &-container { + width: 100vw; + position: fixed; + top: 0; + left: 0; + } + } + &-input { + font-size: 100%; + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + margin: 0; + padding: 0; + max-width: 1000px; + overflow-y: auto; + } + &-container { + padding-left: 2rem; + padding-right: 2rem; + width: 100vw; + max-width: 1000px; + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 500; + font-size: 2rem; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + } + &-title { + font-size: 3rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 600; + max-width: 1000px; + } + &-comment { + &-container { + width: 100vw; + max-width: 1000px; + } + } +} + +#comment { + display: none; + flex-direction: column; + box-sizing: border-box; + flex-direction: column; + place-content: center; + align-items: center; +} + +#comment-box { + display: none; + flex-direction: row; + box-sizing: border-box; + flex-direction: column; + place-content: center space-between; + align-items: center; + height: 5vh;background: #ffffff; + padding-left: 2rem; + padding-right: 2rem; + box-shadow: 0px -1px 50px rgba(0, 0, 0, 0.25); + position: fixed; + bottom: 0; + width: 100%; + left: 0; +} + +#comment-tab { + display: none; + flex-direction: row; + box-sizing: border-box; + flex-direction: column; + place-content: center space-between; + align-items: center; + height: 5vh; + background: #ffffff; + padding-left: 2rem; + padding-right: 2rem; + box-shadow: 0px -1px 50px rgba(0, 0, 0, 0.25); + position: fixed; + width: 100%; + top: 0; + left: 0; +} + +p.marked span.markdown p { + color: #333333 !important; +} + +p { + color:#A2A2A2; +} diff --git a/src/app/createPost/createPost.component.ts b/src/app/createPost/createPost.component.ts --- a/src/app/createPost/createPost.component.ts +++ b/src/app/createPost/createPost.component.ts @@ -10,21 +10,29 @@ import * as C from '../_models/constants'; import { Image } from '../_models/image'; import { Post, PostError } from '../_models/post'; -import { NavBarService } from '../_services/navBar.service'; +import { AreaService } from '../_services/area.service'; import { PostService } from '../_services/post.service'; import { RouteService } from '../_services/route.service'; @Component({ - templateUrl: 'createPost.component.html' + templateUrl: 'createPost.component.html', + styleUrls: ['./createPost.component.scss'] }) export class CreatePostComponent implements OnInit, OnDestroy { + backupPosts: { [area: string]: Post[]; } = {}; componentDestroyed: Subject = new Subject(); currentArea: Area; errors: PostError; + imageArray: { [area: string]: string[]; } = {}; imageData: any; + index = 1; isDraft = false; + limit = 10; loading: boolean; + offset = 10; post: Post = new Post(null, null, false, null, null, null, 's', null, [], []); + superPosts: { [area: string]: Post[]; } = {}; + totalCount = 0; constructor( private cdRef: ChangeDetectorRef, @@ -32,7 +40,7 @@ private snackBar: MatSnackBar, private route: ActivatedRoute, private router: Router, - private navBarService: NavBarService, + private areaService: AreaService, private postService: PostService, private routeService: RouteService ) { } @@ -41,28 +49,30 @@ this.post.text = ''; this.routeService.resetRoutes(); - this.navBarService.currentArea - .takeUntil(this.componentDestroyed) - .subscribe((currentArea: Area) => { - if (currentArea.name !== '') { - this.currentArea = currentArea; + this.route.params + .takeUntil(this.componentDestroyed) + .subscribe(params => { + if (params['area'] !== undefined) { + this.areaService.getArea(params['area']).subscribe(area => { + this.currentArea = area; this.route.params - .takeUntil(this.componentDestroyed) - .subscribe(params => { - if (params['id'] !== undefined) { - this.isDraft = true; + .takeUntil(this.componentDestroyed) + .subscribe(params2 => { + if (params2['id'] !== undefined) { + this.isDraft = true; - this.postService.getPost(this.currentArea.name, params['id'], true) - .takeUntil(this.componentDestroyed) - .subscribe(post => { - this.post = post; - this.loading = false; - this.cdRef.detectChanges(); + this.postService.getPost(this.currentArea.name, params2['id'], true) + .takeUntil(this.componentDestroyed) + .subscribe(post => { + this.post = post; + this.loading = false; + this.cdRef.detectChanges(); }); } }); - } + }); + } }); } @@ -76,6 +86,68 @@ this.post.text = this.post.text !== '' ? this.post.text += `${s}\n` : this.post.text = `${s}\n`; } + private imageInPosts(posts: Post[], area: string) { + this.imageArray[area] = []; + + for (let i = 0; i <= posts.length - 1; i++) { + // Find image markdown data in post.text - Guarenteed by Regex + const indexOfStart = posts[i].text.search(C.WF_IMAGE_REGEX); + if (indexOfStart !== -1) { + // Start at index and parse until we find a closing ')' char + for (let j = indexOfStart; j <= posts[i].text.length; j++) { + if (posts[i].text.charAt(j) === ']') { + // Add data to image array in specific area + this.imageArray[area][i] = posts[i].text.slice(indexOfStart, j + 1); + } + } + } + } + this.loading = false; + } + + private removeMarkdown(input: string) { + input = input + // Remove horizontal rules (stripListHeaders conflict with this rule, which is why it has been moved to the top) + .replace(/^(-\s*?|\*\s*?|_\s*?){3,}\s*$/gm, '[Horizontal-Rule]') + // Remove horizontal rules + .replace(/^(-\s*?|\*\s*?|_\s*?){3,}\s*$/gm, '') + // Header + .replace(/\n={2,}/g, '\n') + // Strikethrough + .replace(/~~/g, '') + // Fenced codeblocks + .replace(/`{3}.*\n/g, '') + // Remove HTML tags + .replace(/<[^>]*>/g, '') + // Remove setext-style headers + .replace(/^[=\-]{2,}\s*$/g, '') + // Remove footnotes? + .replace(/\[\^.+?\](\: .*?$)?/g, '') + .replace(/\s{0,2}\[.*?\]: .*?$/g, '') + // Remove images + .replace(C.WF_IMAGE_REGEX, '') + // Remove wildfyre images + .replace(/(\[img: \d\])/gm, '') + // Remove inline links + .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') + // Remove blockquotes + .replace(/^\s{0,3}>\s?/g, '') + // Remove reference-style links? + .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, '') + // Remove atx-style headers + .replace(/^(\n)?\s{0,}#{1,6}\s+| {0,}(\n)?\s{0,}#{0,} {0,}(\n)?\s{0,}$/gm, '$1$2$3') + // Remove emphasis (repeat the line to remove double emphasis) + .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, '$2') + .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, '$2') + // Remove code blocks + .replace(/(`{3,})(.*?)\1/gm, '$2') + // Remove inline code + .replace(/`(.+?)`/g, '$1') + // Replace two or more newlines with exactly two? Not entirely sure this belongs here... + .replace(/\n{2,}/g, '\n\n'); + return input; + } + addBlockQoutes() { this.addLineBreak('> Blockquote example\n> This line is part of the same quote.\n\nQuote break.\n\n>' + ' This is a very long line that will still be quoted properly when it wraps. You can *put* **Markdown** into a blockquote.'); @@ -147,6 +219,14 @@ this.addLineBreak('* Unordered list can use asterisks\n- Or minuses\n+ Or pluses'); } + back() { + if (this.routeService.routes.length === 0) { + this.router.navigateByUrl(''); + } else { + this.router.navigateByUrl(this.routeService.getNextRoute()); + } + } + createPost(draft: boolean) { this.loading = true; this.cdRef.detectChanges(); @@ -207,6 +287,32 @@ } } + getDrafts(page: number) { + this.loading = true; + const posts: Post[] = []; + + this.postService.getDrafts(this.currentArea.name, this.limit, (this.offset * page) - this.limit) + .takeUntil(this.componentDestroyed) + .subscribe(superPost => { + superPost.results.forEach((obj: any) => { + posts.push(Post.parse(obj)); + }); + + // Removes binding to original 'superPost' variable + this.superPosts[this.currentArea.name] = JSON.parse(JSON.stringify(posts)); + this.backupPosts[this.currentArea.name] = posts; + this.imageInPosts(this.superPosts[this.currentArea.name], this.currentArea.name); + + for (let i = 0; i <= this.backupPosts[this.currentArea.name].length - 1; i++) { + this.backupPosts[this.currentArea.name][i].text = this.removeMarkdown(this.backupPosts[this.currentArea.name][i].text); + } + this.index = page; + this.totalCount = superPost.count; + this.cdRef.detectChanges(); + this.loading = false; + }); + } + getImageMatchesByGroup(index: number, str: string, reg: RegExp): string[] { let match: any; const matches: string[] = []; @@ -219,11 +325,6 @@ return matches; } - loadDrafts() { - this.routeService.addNextRoute('/create'); - this.router.navigateByUrl('/drafts'); - } - makeAnonymous(value: any) { this.post.anonym = value.checked; } @@ -389,7 +490,7 @@ .replace('m.', '') .replace('youtube.com/watch?v=', '') .replace('youtu.be/', '') - .replace('youtube.com/', '') + .replace('youtube.com/', ''); if (result.url.indexOf('?') !== -1) { result.url = result.url.slice(0, result.url.indexOf('?')); @@ -397,7 +498,7 @@ this.post.text = this.post.text === undefined ? `[![${result.altText}](https://img.youtube.com/vi/${result.url}/0.jpg)](https://www.youtube.com/watch?v=${result.url})\n` : - `[![${result.altText}](https://img.youtube.com/vi/${result.url}/0.jpg)](https://www.youtube.com/watch?v=${result.url})\n${this.post.text}` +`[![${result.altText}](https://img.youtube.com/vi/${result.url}/0.jpg)](https://www.youtube.com/watch?v=${result.url})\n${this.post.text}`; } }); } @@ -447,7 +548,7 @@ }); } else { for (let i = 0; i < invalidMatch.length; i++) { - if (Number.parseInt(invalidMatch[i]) !== this.post.additional_images[i].num) { + if (parseInt(invalidMatch[i], 10) !== this.post.additional_images[i].num) { valid = false; this.snackBar.open( 'This markdown does not work here', diff --git a/src/app/drafts/drafts.component.html b/src/app/drafts/drafts.component.html deleted file mode 100644 --- a/src/app/drafts/drafts.component.html +++ /dev/null @@ -1,25 +0,0 @@ -
arrow_back
- - No drafts, try saving one? - - -

- - - - - - - - visibility_on - visibility_off - image - ... -
- {{post.created}} -
-
-
-
- - diff --git a/src/app/drafts/drafts.component.spec.ts b/src/app/drafts/drafts.component.spec.ts deleted file mode 100644 --- a/src/app/drafts/drafts.component.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { By } from '@angular/platform-browser'; -import { ComponentFixture, ComponentFixtureAutoDetect, TestBed, async } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { MatCardModule, MatProgressSpinnerModule, MatSlideToggleModule } from '@angular/material'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Observable } from 'rxjs'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { Post } from '../_models/post'; -import { MarkedPipe } from '../_pipes/marked.pipe'; -import { AreaService } from '../_services/area.service'; -import { AuthenticationService } from '../_services/authentication.service'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { RouteService } from '../_services/route.service'; -import { DraftsComponent } from './drafts.component'; -import { NgxMasonryModule } from '../_modules/ngx-masonry/ngx-masonry.module'; -import { NgxPaginationModule } from 'ngx-pagination'; - -describe('DraftsComponent', () => { - let comp: DraftsComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - const routerStub = { - url: '/posts' - }; - const authenticationServiceStub = { - token: 'token' - }; - const activatedRouteStub = { - params: Observable.of({'id': 1}) - }; - const postServiceStub = { - getOwnPosts: () => { - return Observable.of( - new Array( - new Post(1, - new Author(1, 'test', null, 'test', false), false, false, '2017-07-22T12:03:23.465373Z', false, 'test', null, [], - new Array( - new Comment(1, - new Author(1, 'test', null, 'test', false), '2017-07-22T12:03:23.465373Z', 'test', null))) - ) - ); - } - }; - const areaServiceStub = { - isAreaChecked: {}, - currentAreaName: {}, - getAreaRep: () => ({ - subscribe: () => ({}) - }) - }; - const routeServiceStub = {}; - - const navBarServiceStub = {}; - - TestBed.configureTestingModule({ - declarations: [ DraftsComponent, MarkedPipe ], - providers: [ - { provide: Router, useValue: routerStub }, - { provide: ActivatedRoute, useValue: activatedRouteStub }, - { provide: AreaService, useValue: areaServiceStub }, - { provide: AuthenticationService, useValue: authenticationServiceStub }, - { provide: NavBarService, useValue: navBarServiceStub }, - { provide: PostService, useValue: postServiceStub }, - { provide: RouteService, useValue: routeServiceStub }, - { provide: ComponentFixtureAutoDetect, useValue: true } - ], - imports: [ MatCardModule, MatProgressSpinnerModule, MatSlideToggleModule, FormsModule, NgxMasonryModule, NgxPaginationModule ], - }); - fixture = TestBed.createComponent(DraftsComponent); - comp = fixture.componentInstance; - }); - - it('should set user posts', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('.funPosts')) - .nativeElement.textContent).toBe('test Sat Jul 22 2017 08:03:23 GMT-0400 (Eastern Daylight Time)'); - }); - })); - -}); diff --git a/src/app/drafts/drafts.component.ts b/src/app/drafts/drafts.component.ts deleted file mode 100644 --- a/src/app/drafts/drafts.component.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { Component, OnInit, OnDestroy, NgModule, ChangeDetectorRef } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { Area } from '../_models/area'; -import * as C from '../_models/constants'; -import { Post } from '../_models/post'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { RouteService } from '../_services/route.service'; - -@Component({ - templateUrl: 'drafts.component.html' -}) -export class DraftsComponent implements OnInit, OnDestroy { - backupPosts: { [area: string]: Post[]; } = {}; - componentDestroyed: Subject = new Subject(); - currentArea: string; - imageArray: { [area: string]: string[]; } = {}; - index = 1; - limit = 10; - loading = true; - model: any = {}; - offset = 10; - searchArray: Post[] = []; - searching = false; - superPosts: { [area: string]: Post[]; } = {}; - totalCount = 0; - - constructor( - private cdRef: ChangeDetectorRef, - private route: ActivatedRoute, - private router: Router, - private navBarService: NavBarService, - private postService: PostService, - private routeService: RouteService - ) { } - - private imageInPosts(posts: Post[], area: string) { - this.imageArray[area] = []; - - for (let i = 0; i <= posts.length - 1; i++) { - // Find image markdown data in post.text - Guarenteed by Regex - const indexOfStart = posts[i].text.search(C.WF_IMAGE_REGEX); - if (indexOfStart !== -1) { - // Start at index and parse until we find a closing ')' char - for (let j = indexOfStart; j <= posts[i].text.length; j++) { - if (posts[i].text.charAt(j) === ']') { - // Add data to image array in specific area - this.imageArray[area][i] = posts[i].text.slice(indexOfStart, j + 1); - } - } - } - } - this.loading = false; - } - - private removeMarkdown(input: string) { - input = input - // Remove horizontal rules (stripListHeaders conflict with this rule, which is why it has been moved to the top) - .replace(/^(-\s*?|\*\s*?|_\s*?){3,}\s*$/gm, '[Horizontal-Rule]') - // Remove horizontal rules - .replace(/^(-\s*?|\*\s*?|_\s*?){3,}\s*$/gm, '') - // Header - .replace(/\n={2,}/g, '\n') - // Strikethrough - .replace(/~~/g, '') - // Fenced codeblocks - .replace(/`{3}.*\n/g, '') - // Remove HTML tags - .replace(/<[^>]*>/g, '') - // Remove setext-style headers - .replace(/^[=\-]{2,}\s*$/g, '') - // Remove footnotes? - .replace(/\[\^.+?\](\: .*?$)?/g, '') - .replace(/\s{0,2}\[.*?\]: .*?$/g, '') - // Remove images - .replace(C.WF_IMAGE_REGEX, '') - // Remove wildfyre images - .replace(/(\[img: \d\])/gm, '') - // Remove inline links - .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') - // Remove blockquotes - .replace(/^\s{0,3}>\s?/g, '') - // Remove reference-style links? - .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, '') - // Remove atx-style headers - .replace(/^(\n)?\s{0,}#{1,6}\s+| {0,}(\n)?\s{0,}#{0,} {0,}(\n)?\s{0,}$/gm, '$1$2$3') - // Remove emphasis (repeat the line to remove double emphasis) - .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, '$2') - .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, '$2') - // Remove code blocks - .replace(/(`{3,})(.*?)\1/gm, '$2') - // Remove inline code - .replace(/`(.+?)`/g, '$1') - // Replace two or more newlines with exactly two? Not entirely sure this belongs here... - .replace(/\n{2,}/g, '\n\n'); - return input; - } - - ngOnInit() { - this.cdRef.detectChanges(); - this.route.params - .takeUntil(this.componentDestroyed) - .subscribe(params => { - if (params['index'] !== undefined) { - this.index = params['index']; - } - }); - - this.navBarService.currentArea - .takeUntil(this.componentDestroyed) - .subscribe((currentArea: Area) => { - if (currentArea.name !== '') { - this.currentArea = currentArea.name; - if (!this.superPosts[currentArea.name]) { - this.superPosts[currentArea.name] = []; - } - if (!this.backupPosts[currentArea.name]) { - this.backupPosts[currentArea.name] = []; - } - this.loading = true; - const posts: Post[] = []; - - this.postService.getDrafts(currentArea.name, this.limit, 0) - .takeUntil(this.componentDestroyed) - .subscribe(superPost => { - superPost.results.forEach((obj: any) => { - posts.push(Post.parse(obj)); - }); - - // Removes binding to original 'superPost' variable - this.superPosts[currentArea.name] = JSON.parse(JSON.stringify(posts)); - this.backupPosts[currentArea.name] = posts; - this.totalCount = superPost.count; - - this.imageInPosts(this.superPosts[currentArea.name], currentArea.name); - - for (let i = 0; i <= this.backupPosts[currentArea.name].length - 1; i++) { - this.backupPosts[currentArea.name][i].text = this.removeMarkdown(this.backupPosts[currentArea.name][i].text); - } - this.cdRef.detectChanges(); - this.loading = false; - }); - } - }); - } - - ngOnDestroy() { - this.cdRef.detach(); - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - back() { - if (this.routeService.routes.length === 0) { - this.router.navigateByUrl(''); - } else { - this.router.navigateByUrl(this.routeService.getNextRoute()); - } - } - - getDrafts(page: number) { - this.loading = true; - const posts: Post[] = []; - - this.postService.getDrafts(this.currentArea, this.limit, (this.offset * page) - this.limit) - .takeUntil(this.componentDestroyed) - .subscribe(superPost => { - superPost.results.forEach((obj: any) => { - posts.push(Post.parse(obj)); - }); - - // Removes binding to original 'superPost' variable - this.superPosts[this.currentArea] = JSON.parse(JSON.stringify(posts)); - this.backupPosts[this.currentArea] = posts; - this.imageInPosts(this.superPosts[this.currentArea], this.currentArea); - - for (let i = 0; i <= this.backupPosts[this.currentArea].length - 1; i++) { - this.backupPosts[this.currentArea][i].text = this.removeMarkdown(this.backupPosts[this.currentArea][i].text); - } - this.index = page; - this.totalCount = superPost.count; - this.cdRef.detectChanges(); - this.loading = false; - }); - } - - goto(postID: string) { - this.routeService.addNextRouteByIndex(this.index); - this.router.navigateByUrl('/create/' + postID); - } -} diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -1,37 +1,390 @@ - + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
diff --git a/src/app/login/login.component.scss b/src/app/login/login.component.scss new file mode 100644 --- /dev/null +++ b/src/app/login/login.component.scss @@ -0,0 +1,65 @@ +.login { + &-button { + width: 100%; + font-family: 'Mukta', sans-serif; + border: 1px solid #EA6C40; + border-radius: 4px; + font-weight: 700; + } + &-container { + padding-left: 2rem; + padding-right: 2rem; + width: 100vw; + height: 100vh; + max-width: 1000px; + } + &-input { + width: 100%; + border: none; + outline: none; + box-shadow: none; + color: #A2A2A2; + } + &-subtitle { + text-align: left; + font-family: 'Mukta', sans-serif; + color: #A2A2A2; + font-weight: 400; + } + &-title { + font-size: 6rem; + text-align: left; + font-family: 'Mukta', sans-serif; + font-weight: 900; + } +} + +#login { + display: none; + flex-direction: column; + box-sizing: border-box; +} + +#register { + display: none; + flex-direction: column; + box-sizing: border-box; +} + +#recover-username { + display: none; + flex-direction: column; + box-sizing: border-box; +} + +#recover-password { + display: none; + flex-direction: column; + box-sizing: border-box; +} + +#recover-password2 { + display: none; + flex-direction: column; + box-sizing: border-box; +} diff --git a/src/app/login/login.component.spec.ts b/src/app/login/login.component.spec.ts --- a/src/app/login/login.component.spec.ts +++ b/src/app/login/login.component.spec.ts @@ -46,9 +46,9 @@ return Observable.of( new SuperNotification(1, '', '', new Array( - new Notification('', - new NotificationPost(0, - new Author(0, '', '', '', false), 'test'), + new Notification('', + new NotificationPost(0, + new Author(0, '', '', '', false), 'test'), new Array(0))) )); } diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -1,22 +1,34 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; +import { FormControl, FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material'; import { Router } from '@angular/router'; import 'rxjs/add/operator/catch'; import { Subject } from 'rxjs/Subject'; -import { AuthError } from '../_models/auth'; import { AuthenticationService } from '../_services/authentication.service'; import { NavBarService } from '../_services/navBar.service'; import { NotificationService } from '../_services/notification.service'; +import { RegistrationService } from '../_services/registration.service'; import { RouteService } from '../_services/route.service'; +import { ReCaptchaComponent } from 'angular2-recaptcha'; @Component({ - templateUrl: 'login.component.html' + templateUrl: 'login.component.html', + styleUrls: ['./login.component.scss'] }) export class LoginComponent implements OnInit, OnDestroy { + @ViewChild(ReCaptchaComponent) captcha: ReCaptchaComponent; + componentDestroyed: Subject = new Subject(); - errors: string; + errors: any; loading = false; - model: any = {}; + loginForm: FormGroup; + registerForm: FormGroup; + recoverUsernameForm: FormGroup; + recoverPasswordForm: FormGroup; + recoverPasswordForm2: FormGroup; + resetTransaction: string; + token: any; + submitted = false; constructor( private router: Router, @@ -24,14 +36,38 @@ private authenticationService: AuthenticationService, private navBarService: NavBarService, private notificationService: NotificationService, + private registrationService: RegistrationService, private routeService: RouteService - ) { - const snackBarRef = this.snackBar.open('Authentication Required', 'Close', { - duration: 3000 - }); - } + ) { } ngOnInit() { + this.loginForm = new FormGroup({ + 'usernamel': new FormControl(''), + 'passwordl': new FormControl(''), + }); + + this.registerForm = new FormGroup({ + 'usernamer': new FormControl(''), + 'emailr': new FormControl(''), + 'passwordr': new FormControl(''), + 'password2r': new FormControl(''), + }); + + this.recoverUsernameForm = new FormGroup({ + 'emailru': new FormControl(''), + }); + + this.recoverPasswordForm = new FormGroup({ + 'emailrp': new FormControl(''), + 'usernamerp': new FormControl(''), + }); + + this.recoverPasswordForm2 = new FormGroup({ + 'tokenrp2': new FormControl(''), + 'passwordrp2': new FormControl(''), + 'password2rp2': new FormControl(''), + }); + // reset login status this.routeService.resetRoutes(); this.authenticationService.logout(); @@ -44,25 +80,217 @@ this.componentDestroyed.complete(); } + switchView(s: string) { + if (s === 'register') { + this.hideViews(); + document.getElementById('register').style.display = 'flex'; + } else if (s === 'login') { + this.hideViews(); + document.getElementById('login').style.display = 'flex'; + } else if (s === 'landing') { + this.hideViews(); + document.getElementById('landing').style.display = 'flex'; + } else if (s === 'recover-password') { + this.hideViews(); + document.getElementById('recover-password').style.display = 'flex'; + } else if (s === 'recover-password2') { + this.hideViews(); + document.getElementById('recover-password2').style.display = 'flex'; + } else if (s === 'recover-username') { + this.hideViews(); + document.getElementById('recover-username').style.display = 'flex'; + } + } + + hideViews() { + document.getElementById('register').style.display = 'none'; + document.getElementById('login').style.display = 'none'; + document.getElementById('landing').style.display = 'none'; + document.getElementById('recover-password').style.display = 'none'; + document.getElementById('recover-password2').style.display = 'none'; + document.getElementById('recover-username').style.display = 'none'; + this.errors = null; + this.loading = false; + this.submitted = false; + } + login() { + this.errors = null; + this.loading = true; + this.submitted = false; + + if (this.loginForm.valid) { + this.authenticationService.login(this.loginForm.controls.usernamel.value, this.loginForm.controls.passwordl.value) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + if (!result.getError()) { + this.notificationService.getSuperNotification(10, 0) + .takeUntil(this.componentDestroyed) + .subscribe(superNotification => { + this.navBarService.notifications.next(superNotification.count); + }); + this.navBarService.loggedIn.next(true); + this.navBarService.areaVisible.next(true); + this.router.navigate(['/']); + this.loading = false; + this.submitted = true; + } else { + this.errors = result.getError(); + this.loading = false; + this.submitted = true; + } + }); + } else { + this.loading = false; + this.submitted = true; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } + + recoverPassword() { + this.errors = null; + this.loading = true; + this.submitted = false; + if (this.recoverPasswordForm.valid) { + this.registrationService.recoverPasswordStep1( + this.recoverPasswordForm.controls.emailrp.value, + this.recoverPasswordForm.controls.usernamerp.value, + this.token) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + if (!result.getError()) { + this.router.navigateByUrl('/recover/password/' + result.transaction); + this.resetTransaction = result.transaction; + this.loading = false; + this.submitted = true; + } else { + this.errors = result.getError(); + this.loading = false; + this.submitted = true; + } + }); + } else { + this.loading = false; + this.submitted = true; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } + + recoverUsername() { + this.errors = null; this.loading = true; - this.authenticationService.login(this.model.username, this.model.password) + this.submitted = false; + + if (this.recoverUsernameForm.valid) { + this.registrationService.recoverUsername(this.recoverUsernameForm.controls.emailru.value, this.token) .takeUntil(this.componentDestroyed) .subscribe(result => { if (!result.getError()) { - this.notificationService.getSuperNotification(10, 0) - .takeUntil(this.componentDestroyed) - .subscribe(superNotification => { - this.navBarService.notifications.next(superNotification.count); + this.snackBar.open('We will contact you via the information provided', 'Close', { + duration: 3000 }); - this.navBarService.loggedIn.next(true); - this.navBarService.areaVisible.next(true); - this.router.navigate(['/']); this.loading = false; + this.submitted = true; + } else { + this.errors = result.getError(); + this.loading = false; + this.submitted = true; } - }, err => { - this.errors = 'Unable to log in with provided credentials.'; + }); + } else { this.loading = false; - }); + this.submitted = true; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } + + register() { + this.errors = null; + this.loading = true; + this.submitted = false; + + if (this.registerForm.valid) { + if (this.registerForm.controls.passwordr.value === this.registerForm.controls.password2r.value) { + this.registrationService.register( + this.registerForm.controls.usernamer.value, + this.registerForm.controls.emailr.value, + this.registerForm.controls.passwordr.value, + this.token) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + if (!result.getError()) { + this.router.navigate(['/register/success']); + this.loading = false; + this.submitted = true; + } else { + this.errors = result.getError(); + this.loading = false; + this.submitted = true; + } + }); + } else { + this.loading = false; + this.submitted = true; + this.snackBar.open('Your passwords do not match', 'Close', { + duration: 3000 + }); + } + } else { + this.loading = false; + this.submitted = true; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } + + resetPassword() { + if (this.recoverPasswordForm2.valid) { + if (this.recoverPasswordForm2.controls.passwordrp2.value === this.recoverPasswordForm2.controls.password2rp2.value) { + this.registrationService.recoverPasswordStep2( + this.recoverPasswordForm2.controls.passwordrp2.value, + this.recoverPasswordForm2.controls.tokenrp2.value, + this.resetTransaction, + this.token) + .takeUntil(this.componentDestroyed) + .subscribe(result => { + if (!result.getError()) { + this.snackBar.open('Your new password is now set', 'Close', { + duration: 3000 + }); + this.router.navigateByUrl('login'); + this.loading = false; + this.captcha.reset(); + } else { + this.snackBar.open('You inputted something incorrectly', 'Close', { + duration: 3000 + }); + this.errors = result.getError(); + this.loading = false; + this.captcha.reset(); + } + }); + } else { + this.snackBar.open('Your passwords did not match', 'Close', { + duration: 3000 + }); + } + } else { + this.loading = false; + this.submitted = true; + this.snackBar.open('Your information is incorrect', 'Close', { + duration: 3000 + }); + } + } + + setCaptchaResponse(res: any) { + this.token = res; } } diff --git a/src/app/navBar/navBar.component.html b/src/app/navBar/navBar.component.html --- a/src/app/navBar/navBar.component.html +++ b/src/app/navBar/navBar.component.html @@ -1,90 +1,23 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - About Us - - - Open Source! - - - FAQ - - - Terms and Conditions - - - Privacy Policy - - - Logout - -
- - - -
- WildFyre Facebook - WildFyre Telegram - WildFyre Twitter -
-
- - Please report any and all bugs to bugs@wildfyre.net - -
-
- Copyright © 2017-2019 WildFyre -
-
-
-


-
+ + + diff --git a/src/app/navBar/navBar.component.scss b/src/app/navBar/navBar.component.scss new file mode 100644 --- /dev/null +++ b/src/app/navBar/navBar.component.scss @@ -0,0 +1,7 @@ +.white { + color: #ffffff; +} + +p { + color:#A2A2A2; +} diff --git a/src/app/navBar/navBar.component.spec.ts b/src/app/navBar/navBar.component.spec.ts --- a/src/app/navBar/navBar.component.spec.ts +++ b/src/app/navBar/navBar.component.spec.ts @@ -6,7 +6,8 @@ import { FormsModule } from '@angular/forms'; import { ComponentFixture, ComponentFixtureAutoDetect, TestBed , async} from '@angular/core/testing'; import { Router, ActivatedRoute, RouterModule, Routes } from '@angular/router'; -import { MatTabsModule, MatListModule, MatMenuModule, MatDialogModule, MatSelectModule, MatSidenavModule, MatOptionModule, MatSnackBarModule } from '@angular/material'; +import { MatTabsModule, MatListModule, MatMenuModule, MatDialogModule, MatSelectModule, + MatSidenavModule, MatOptionModule, MatSnackBarModule } from '@angular/material'; import { Observable } from 'rxjs'; import { Author } from '../_models/author'; import { Notification } from '../_models/notification'; @@ -82,7 +83,8 @@ { provide: NotificationService, useValue: notificationServiceStub }, { provide: ComponentFixtureAutoDetect, useValue: true } ], - imports: [ MatTabsModule, MatListModule, MatOptionModule, FormsModule, MatSelectModule, MatSidenavModule, MatMenuModule, MatSnackBarModule, MatDialogModule, RouterModule.forRoot(routes), BrowserAnimationsModule ], + imports: [ MatTabsModule, MatListModule, MatOptionModule, FormsModule, MatSelectModule, + MatSidenavModule, MatMenuModule, MatSnackBarModule, MatDialogModule, RouterModule.forRoot(routes), BrowserAnimationsModule ], }); fixture = TestBed.createComponent(NavBarComponent); comp = fixture.componentInstance; diff --git a/src/app/navBar/navBar.component.ts b/src/app/navBar/navBar.component.ts --- a/src/app/navBar/navBar.component.ts +++ b/src/app/navBar/navBar.component.ts @@ -15,12 +15,13 @@ @Component({ selector: 'app-nav-bar', - templateUrl: 'navBar.component.html' + templateUrl: 'navBar.component.html', + styleUrls: ['./navBar.component.scss'] }) export class NavBarComponent implements OnInit, OnDestroy { @ViewChild('sidenav') sidenav: MatSidenav; - activeLinkIndex = 2; + activeLinkIndex = 1; areas = new Array(new Area('', '', 0, 0)); areaReputation: { [area: string]: number; } = { }; areaSpread: { [area: string]: number; } = { }; @@ -58,52 +59,14 @@ private authenticationService: AuthenticationService, private notificationService: NotificationService, private navBarService: NavBarService - ) { - this.routeLinks = [ - {label: 'Profile', link: '/profile/', index: '0'}, - {label: 'Notifications', link: '/notifications/1/', index: '1'}, - {label: 'Home', link: '/', index: '2'}, - {label: 'My Posts', link: '/posts/1/', index: '3'}, - {label: 'Create a Post', link: '/create/', index: '4'} - ]; - - this.mobileRouteLinks = [ - {label: 'perm_identity', link: '/profile/', index: '0'}, - {label: 'notifications_none', link: '/notifications/1/', index: '1'}, - {label: 'home', link: '/', index: '2'}, - {label: 'content_copy', link: '/posts/1/', index: '3'}, - {label: 'create', link: '/create/', index: '4'} - ]; - } + ) { } ngOnInit() { - this.navBarService.areaVisible - .takeUntil(this.componentDestroyed) - .subscribe((visible: boolean) => { - this.areaVisible = visible; - this.cdRef.detectChanges(); - }); - - this.navBarService.hasPost - .takeUntil(this.componentDestroyed) - .subscribe((has: boolean) => { - this.hasPost = has; - this.cdRef.detectChanges(); - }); - - this.navBarService.clearInputs + this.router.events .takeUntil(this.componentDestroyed) - .subscribe((action: boolean) => { - if (action) { - this.comment.comment = ''; - this.comment.image = null; - this.contractBox(); - this.commentDisabled = false; - } else { - this.commentDisabled = false; - } + .subscribe((url: any) => { + this.setActiveIndex(url.url); }); - this.navBarService.loggedIn .takeUntil(this.componentDestroyed) .subscribe((loggedIn: boolean) => { @@ -127,100 +90,11 @@ } ngOnDestroy() { - this.contractBox(); this.cdRef.detach(); this.componentDestroyed.next(true); this.componentDestroyed.complete(); } - private addLineBreak(s: string) { - if (this.comment.comment !== '') { - this.comment.comment += '\n'; - } - this.comment.comment += s; - } - - addBlockQoutes() { - this.addLineBreak('> Blockquote example'); - } - - addBold() { - this.addLineBreak('**Example**'); - } - - addImage() { - const dialogRef = this.dialog.open(PictureDialogComponent); - dialogRef.componentInstance.comment = true; - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - this.comment.image = result.picture; - this.snackBar.open('Image added successfully', 'Close', { - duration: 3000 - }); - } else { - this.snackBar.open('You did not select a valid image file', 'Close', { - duration: 3000 - }); - } - }); - } - - addItalics() { - this.addLineBreak('_Example_'); - } - - addStrikethrough() { - this.addLineBreak('~~Example~~'); - } - - close() { - this.sidenav.close(); - } - - contractBox() { - this.expanded = false; - this.rowsExapanded = 2; - this.styleMobile = ''; - - this.styleHeightTextarea = '56px'; - - if (window.screen.width < 600) { - this.styleHeightTextarea = '40px'; - this.styleBottomTextarea = '40px'; - this.styleBottomEditor = '3px'; - this.styleHeightEditor = '48px'; - this.styleBottomSend = '42px'; - this.styleHeightSend = '38px'; - } - } - - deleteImage() { - this.comment.image = null; - this.snackBar.open('Image removed successfully', 'Close', { - duration: 3000 - }); - } - - expandBox() { - this.expanded = true; - this.rowsExapanded = 3; - this.styleMobile = 'none'; - - this.styleBottomEditor = '48px'; - this.styleHeightTextarea = '96px'; - - if (window.screen.width < 600) { - this.styleHeightTextarea = '118px'; - this.styleBottomTextarea = '0px'; - this.styleBottomEditor = '59px'; - this.styleHeightEditor = '59px'; - this.styleBottomSend = '0px'; - this.styleHeightSend = '59px'; - } - } - getNotificationLength(nLength: number) { if (nLength.toString().length === 4) { return nLength.toString().slice(0, 1) + 'K'; @@ -251,13 +125,6 @@ this.cdRef.detectChanges(); }); - this.navBarService.isVisibleSource - .takeUntil(this.componentDestroyed) - .subscribe((isVisible: string) => { - this.styleMobile = isVisible; - this.cdRef.detectChanges(); - }); - Observable.interval(2000 * 60) .takeUntil(this.componentDestroyed) .subscribe(x => { @@ -269,12 +136,6 @@ }); }); - this.router.events - .takeUntil(this.componentDestroyed) - .subscribe((url: any) => { - this.setActiveIndex(url.url); - }); - this.areaService.getAreas() .takeUntil(this.componentDestroyed) .subscribe(areas => { @@ -344,62 +205,48 @@ } if (s === '/profile') { this.stylePage = false; - this.activeLinkIndex = 0; - this.navBarService.areaVisible.next(false); + this.activeLinkIndex = 4; } else if (s === '/notifications/archive') { this.stylePage = false; - this.width = '90%'; - this.activeLinkIndex = 1; - this.navBarService.areaVisible.next(true); + this.activeLinkIndex = 2; } else if (s.lastIndexOf('/notifications/archive/') !== -1) { this.stylePage = false; - this.width = '90%'; - this.activeLinkIndex = 1; - this.navBarService.areaVisible.next(true); + this.activeLinkIndex = 2; } else if (s === '/notifications') { - this.stylePage = false; - this.activeLinkIndex = 1; - this.navBarService.areaVisible.next(false); + this.activeLinkIndex = 2; } else if (s.lastIndexOf('/notifications/') !== -1) { - this.stylePage = false; - this.activeLinkIndex = 1; - this.navBarService.areaVisible.next(false); - } else if (s === '/') { - this.stylePage = true; this.activeLinkIndex = 2; - this.navBarService.areaVisible.next(true); + } else if (s === '/') { + this.activeLinkIndex = 1; } else if (s === '/posts') { - this.stylePage = false; this.activeLinkIndex = 3; - this.navBarService.areaVisible.next(true); } else if (s.lastIndexOf('/posts/') !== -1) { - this.stylePage = false; this.activeLinkIndex = 3; - this.navBarService.areaVisible.next(true); } else if (s === '/create') { - this.stylePage = false; - this.activeLinkIndex = 4; - this.navBarService.areaVisible.next(true); + this.activeLinkIndex = -1; } else if (s.lastIndexOf('/create/') !== -1) { - this.stylePage = false; - this.activeLinkIndex = 4; - this.navBarService.areaVisible.next(false); + this.activeLinkIndex = -1; } else if (s === '/drafts') { - this.stylePage = false; - this.width = '90%'; - this.activeLinkIndex = 4; - this.navBarService.areaVisible.next(true); + this.activeLinkIndex = -1; } else if (s.lastIndexOf('/areas/') !== -1) { - this.stylePage = true; - this.width = '90%'; - this.activeLinkIndex = 2; - this.navBarService.areaVisible.next(false); + this.activeLinkIndex = -1; } else if (s.lastIndexOf('/user/') !== -1) { - this.stylePage = false; - this.width = '90%'; - this.activeLinkIndex = 0; - this.navBarService.areaVisible.next(false); + this.activeLinkIndex = -1; + } else if (s.lastIndexOf('/login') !== -1) { + this.activeLinkIndex = -1; } this.cdRef.detectChanges(); } + + switchRoute(s: string) { + if (s === 'home') { + this.router.navigateByUrl('/'); + } else if (s === 'profile') { + this.router.navigateByUrl('/profile'); + } else if (s === 'notifications') { + this.router.navigateByUrl('/notifications'); + } else if (s === 'my-posts') { + this.router.navigateByUrl('/posts'); + } + } } diff --git a/src/app/notification/notification.component.html b/src/app/notification/notification.component.html deleted file mode 100644 --- a/src/app/notification/notification.component.html +++ /dev/null @@ -1,25 +0,0 @@ - - -
- -
- -
- No more notifications, try engaging more? -
- -
- -
- -
-

{{notification.comments.length}}

-
-
- {{notification.post.text | slice:0:31}}… -
- –{{notification.post.author.name}} -
-
-
- diff --git a/src/app/notificationArchive/notificationArchive.component.html b/src/app/notificationArchive/notificationArchive.component.html deleted file mode 100644 --- a/src/app/notificationArchive/notificationArchive.component.html +++ /dev/null @@ -1,67 +0,0 @@ - - - No posts, try commenting on posts? - - -

- -
arrow_back
- - - - - - visibility_on - visibility_off - image - ... -
- {{post.created}} -
-
-
-
- - - - diff --git a/src/app/notificationArchive/notificationArchive.component.spec.ts b/src/app/notificationArchive/notificationArchive.component.spec.ts deleted file mode 100644 --- a/src/app/notificationArchive/notificationArchive.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { By } from '@angular/platform-browser'; -import { ComponentFixture, ComponentFixtureAutoDetect, TestBed, async } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { NO_ERRORS_SCHEMA, Component } from '@angular/core'; -import { MatCardModule, MatTabsModule, MatProgressSpinnerModule, MatSlideToggleModule } from '@angular/material'; -import { Router, RouterModule, ActivatedRoute } from '@angular/router'; -import { Observable } from 'rxjs'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { Notification } from '../_models/notification'; -import { Post } from '../_models/post'; -import { SuperPost } from '../_models/superPost'; -import { MarkedPipe } from '../_pipes/marked.pipe'; -import { AreaService } from '../_services/area.service'; -import { AuthenticationService } from '../_services/authentication.service'; -import { NavBarService } from '../_services/navBar.service'; -import { NotificationService } from '../_services/notification.service'; -import { RouteService } from '../_services/route.service'; -import { NotificationArchiveComponent } from './notificationArchive.component'; -import { NgxMasonryModule } from '../_modules/ngx-masonry/ngx-masonry.module'; -import { NgxPaginationModule } from 'ngx-pagination'; - -describe('NotificationArchiveComponent', () => { - let comp: NotificationArchiveComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - const routerStub = { - url: '/notifications' - }; - const authenticationServiceStub = { - token: 'token' - }; - const areaServiceStub = { - isAreaChecked: {}, - currentAreaName: {}, - getAreaRep: () => ({ - subscribe: () => ({}) - }) - }; - const activatedRouteStub = { - params: Observable.of({'id': 1}) - }; - const navBarServiceStub = {}; - const routeServiceStub = {}; - - const notificationServiceStub = { - getArchive: () => { - return Observable.of( - new SuperPost(1, '', '', - new Array( - new Post(1, - new Author(1, 'test', null, 'test', false), false, false, '2017-07-22T12:03:23.465373Z', false, 'test', null, [], - new Array( - new Comment(1, - new Author(1, 'test', null, 'test', false), '2017-07-22T12:03:23.465373Z', 'test', null))) - ))); - } - }; - - TestBed.configureTestingModule({ - declarations: [ NotificationArchiveComponent, MarkedPipe ], - providers: [ - { provide: Router, useValue: routerStub }, - { provide: ActivatedRoute, useValue: activatedRouteStub }, - { provide: AreaService, useValue: areaServiceStub }, - { provide: AuthenticationService, useValue: authenticationServiceStub }, - { provide: NavBarService, useValue: navBarServiceStub }, - { provide: NotificationService, useValue: notificationServiceStub }, - { provide: RouteService, useValue: routeServiceStub }, - { provide: ComponentFixtureAutoDetect, useValue: true } - ], - imports: [ MatCardModule, RouterModule, MatTabsModule, MatProgressSpinnerModule, MatSlideToggleModule, FormsModule, NgxMasonryModule, NgxPaginationModule ], - }).compileComponents(); - fixture = TestBed.createComponent(NotificationArchiveComponent); - comp = fixture.componentInstance; - }); - - it('should set notification text', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('.notifications')).nativeElement.textContent).toBe('test'); - }); - })); -}); diff --git a/src/app/postView/postView.component.html b/src/app/postView/postView.component.html deleted file mode 100644 --- a/src/app/postView/postView.component.html +++ /dev/null @@ -1,112 +0,0 @@ - -
- -
arrow_back
- - -
- Avatar of {{post?.author?.name}} - Avatar of {{post?.author?.name}} - -
- {{post?.author?.name}}

{{post?.created}}

-
-
-
- -
-
{{getCommentLength(post?.comments?.length)}}
- - - - - - - -
-
-
- -
arrow_back
- - - -
- Avatar of {{post?.author?.name}} - Avatar of {{post?.author?.name}} - -
- {{post?.author?.name}}

{{post?.created}}

-
-
-
- -
-
{{getCommentLength(post?.comments?.length)}}
- - - - - - - - - - -
-
-
- - -
- -
- - - - -
-
- -
- Avatar of {{comment.author?.name}} - Avatar of {{comment.author?.name}} - -
- {{comment.author?.name}}

{{comment.created}}

-
-
-
-
- - -
- - - - - - - -
-
- - -
- Avatar of {{comment.author?.name}} - Avatar of {{comment.author?.name}} - -
- {{comment.author?.name}}

{{comment.created}}

-
-
-
-
- -
-
- - - No comments, try commenting? - - diff --git a/src/app/postView/postView.component.spec.ts b/src/app/postView/postView.component.spec.ts deleted file mode 100644 --- a/src/app/postView/postView.component.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { By } from '@angular/platform-browser'; -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { DebugElement } from '@angular/core'; -import { MatIconModule, MatListModule, MatSnackBar, MatMenuModule, MatProgressSpinnerModule, MatCardModule, MatDialogModule, MatSnackBarModule } from '@angular/material'; -import { FormsModule } from '@angular/forms'; -import { Router } from '@angular/router'; -import { RouterTestingModule } from '@angular/router/testing'; -import { Observable } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { Post } from '../_models/post'; -import { MarkedPipe } from '../_pipes/marked.pipe'; -import { AreaService } from '../_services/area.service'; -import { AuthenticationService } from '../_services/authentication.service'; -import { CommentService } from '../_services/comment.service'; -import { FlagService } from '../_services/flag.service'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { ProfileService } from '../_services/profile.service'; -import { RouteService } from '../_services/route.service'; -import { PostViewComponent } from './postView.component'; -import { ClipboardModule } from 'ngx-clipboard'; - -describe('PostViewComponent', () => { - let comp: PostViewComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let el: HTMLElement; - - beforeEach(() => { - const routerStub = { - url: '/areas/fun/78270840618' - }; - const activatedRouteStub = { - params: Observable.of({'id': 1}) - }; - const postStub = {}; - const commentStub = {}; - const areaServiceStub = { - isAreaChecked: {}, - currentAreaName: {} - }; - const authenticationServiceStub = { - token: 'token' - }; - const commentServiceStub = { - deleteComment: () => ({}) - }; - const flagServiceStub = { - currentComment: {}, - currentPost: {}, - openDialog: () => ({}) - }; - const postServiceStub = { - getPost: () => { - return Observable.of( - new Array( - new Post(1, - new Author(1, 'test', null, 'test', false), false, false, '2017-07-22T12:03:23.465373Z', false, 'test', null, [], - new Array( - new Comment(1, - new Author(1, 'test', null, 'test', false), '2017-07-22T12:03:23.465373Z', 'test', null))) - ) - ); - }, - comment: () => ({ - subscribe: () => ({}) - }), - subscribe: () => ({ - subscribe: () => ({}) - }), - deletePost: () => ({}) - }; - const profileServiceStub = { - getSelf: () => { - return Observable.of( - new Author(1, 'Test User', null, 'test', false) - ); - } - }; - const routeServiceStub = {}; - const navBarServiceStub = {}; - TestBed.configureTestingModule({ - declarations: [ PostViewComponent, MarkedPipe ], - providers: [ - { provide: Router, useValue: routerStub }, - { provide: ActivatedRoute, useValue: activatedRouteStub }, - { provide: Post, useValue: postStub }, - { provide: Comment, useValue: commentStub }, - { provide: AreaService, useValue: areaServiceStub }, - { provide: AuthenticationService, useValue: authenticationServiceStub }, - { provide: CommentService, useValue: commentServiceStub }, - { provide: FlagService, useValue: flagServiceStub }, - { provide: NavBarService, useValue: navBarServiceStub }, - { provide: PostService, useValue: postServiceStub }, - { provide: ProfileService, useValue: profileServiceStub }, - { provide: RouteService, useValue: routeServiceStub } - ], - imports: [ MatListModule, MatMenuModule, MatCardModule, ClipboardModule, MatDialogModule, MatIconModule, MatProgressSpinnerModule, MatSnackBarModule, - FormsModule, BrowserAnimationsModule, RouterTestingModule ], - }); - fixture = TestBed.createComponent(PostViewComponent); - comp = fixture.componentInstance; - de = fixture.debugElement.query(By.css('.mainText')); - el = de.nativeElement; - }); - - it('should set post text', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - expect(el.textContent).toBe('test\n'); - }); - })); - - it('should set comment text', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('.commentText')).nativeElement.textContent).toBe('test\n'); - }); - })); - -}); diff --git a/src/app/postView/postView.component.ts b/src/app/postView/postView.component.ts deleted file mode 100644 --- a/src/app/postView/postView.component.ts +++ /dev/null @@ -1,322 +0,0 @@ -import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; -import { MatDialog, MatSnackBar } from '@angular/material'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { ConfirmDeletionDialogComponent } from '../_dialogs/confirmDeletion.dialog.component'; -import { FlagDialogComponent } from '../_dialogs/flag.dialog.component'; -import { ShareDialogComponent } from '../_dialogs/share.dialog.component'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { CommentData } from '../_models/commentData'; -import * as C from '../_models/constants'; -import { Link } from '../_models/link'; -import { Post } from '../_models/post'; -import { CommentService } from '../_services/comment.service'; -import { FlagService } from '../_services/flag.service'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { ProfileService } from '../_services/profile.service'; -import { RouteService } from '../_services/route.service'; - -enum TypeOfReport { - Post, - Comment -} - -@Component({ - templateUrl: 'postView.component.html', -}) -export class PostViewComponent implements OnInit, OnDestroy { - blockedUsers: string[]; - blanketText = `

Fyre Blanket

`; - commentCount = 0; - componentDestroyed: Subject = new Subject(); - currentArea: string; - isCopied = false; - imageData: any = null; - loading: boolean; - loggedIn: boolean; - parsedCommentArray: string[] = []; - post: Post; - userID: number; - wait = true; - - constructor( - private cdRef: ChangeDetectorRef, - private dialog: MatDialog, - private route: ActivatedRoute, - private router: Router, - private snackBar: MatSnackBar, - private commentService: CommentService, - private flagService: FlagService, - private navBarService: NavBarService, - private postService: PostService, - private profileService: ProfileService, - private routeService: RouteService, - ) { } - - ngOnInit() { - this.loading = true; - - this.blockedUsers = []; - if (window.localStorage.getItem('blockedUsers')) { - this.blockedUsers = window.localStorage.getItem('blockedUsers').split(','); - this.blockedUsers.pop(); - } - - this.profileService.getSelf() - .takeUntil(this.componentDestroyed) - .subscribe( (author: Author) => { - this.userID = author.user; - this.loggedIn = true; - }); - - this.navBarService.comment - .takeUntil(this.componentDestroyed) - .subscribe((comment: CommentData) => { - this.cdRef.detectChanges(); - if (!this.wait) { - if (comment.comment !== '' && this.runImageCheck(comment.comment)) { - if (comment.image) { - this.postService.setPicture(comment.image, this.post, this.currentArea, false, comment.comment) - .takeUntil(this.componentDestroyed) - .subscribe(result2 => { - if (!result2.getError()) { - this.post.comments.push(result2); - this.navBarService.clearInputs.next(true); - } else { - this.snackBar.open('Your image file must be below 512KiB in size', 'Close', { - duration: 3000 - }); - } - }); - } else { - this.postService.comment(this.currentArea, this.post, comment.comment) - .takeUntil(this.componentDestroyed) - .subscribe(); - this.navBarService.clearInputs.next(true); - } - this.commentCount += 1; - this.cdRef.detectChanges(); - } else { - this.snackBar.open( - 'Please enter something' - , 'Close', { - duration: 3000 - }); - this.navBarService.clearInputs.next(false); - } - } - this.wait = false; - }); - - this.route.params - .takeUntil(this.componentDestroyed) - .subscribe(params => { - this.currentArea = params['area']; - - this.postService.getPost(this.currentArea, params['id']) - .takeUntil(this.componentDestroyed) - .subscribe(post => { - this.post = post; - this.commentCount = this.post.comments.length; - this.loading = false; - this.navBarService.hasPost.next(true); - this.cdRef.detectChanges(); - }); - - let commentIDArray = params['comments']; - commentIDArray = commentIDArray + '-'; - - if (commentIDArray) { - while (commentIDArray.indexOf('-') !== -1) { - this.parsedCommentArray.push(commentIDArray.slice(0, commentIDArray.indexOf('-'))); - commentIDArray = commentIDArray.slice(commentIDArray.indexOf('-') + 1, commentIDArray.length); - } - } - }); - this.cdRef.detectChanges(); - } - - ngOnDestroy() { - this.cdRef.detach(); - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - back() { - if (this.routeService.routes.length === 0) { - this.router.navigateByUrl(''); - } else { - this.router.navigateByUrl(this.routeService.getNextRoute()); - } - } - - blockUser(id: number) { - const dialogRef = this.dialog.open(ConfirmDeletionDialogComponent); - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - if (window.localStorage.getItem('blockedUsers')) { - window.localStorage.setItem('blockedUsers', window.localStorage.getItem('blockedUsers') + String(id + ',')); - } else { - window.localStorage.setItem('blockedUsers', String(id + ',')); - } - this.ngOnInit(); - } - }); - } - - unblockUser(id: number) { - const dialogRef = this.dialog.open(ConfirmDeletionDialogComponent); - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - if (window.localStorage.getItem('blockedUsers')) { - window.localStorage.setItem('blockedUsers', window.localStorage.getItem('blockedUsers').replace(id + ',', '')); - } - this.ngOnInit(); - } - }); - } - - getCommentLength(nLength: number) { - if (nLength.toString().length === 4) { - return nLength.toString().slice(0, 1) + 'K'; - } else if (nLength.toString().length === 5) { - return nLength.toString().slice(0, 2) + 'K'; - } else if (nLength.toString().length >= 6) { - return '\u221E'; - } else { - return nLength.toString(); - } - } - - getImageMatchesByGroup(index: number, str: string, reg: RegExp): string[] { - let match: any; - const matches: string[] = []; - // Find any occurence of image markdown - while ((match = reg.exec(str))) { - if (match[index] !== undefined) { - matches.push(match[index]); - } - } - return matches; - } - - gotoUser(user: string) { - this.routeService.addNextRoute(this.router.url); - this.router.navigateByUrl('/user/' + user); - } - - isBlockedUser(c: number) { - return this.blockedUsers.includes(String(c)); - } - - notificationIndication(commentID: number) { - if (this.parsedCommentArray.indexOf(commentID.toString()) !== -1) { - return '2px solid #ed763e'; - } else { - return ''; - } - } - - openCommentDeleteDialog(c: Comment) { - const dialogRef = this.dialog.open(ConfirmDeletionDialogComponent); - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - this.commentService.deleteComment( - this.currentArea, - this.post, - c - ); - this.commentCount -= 1; - this.snackBar.open('Comment deleted successfully', 'Close', { - duration: 3000 - }); - } - }); - } - - openFlagDialog(comment: Comment, typeOfFlagReport: TypeOfReport) { - this.flagService.currentComment = comment; - this.flagService.currentPost = this.post; - - const dialogRef = this.dialog.open(FlagDialogComponent); - dialogRef.componentInstance.typeOfReport = typeOfFlagReport; - - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - this.flagService.sendFlagReport(result.typeOfReport, result.report, result.choice, result.area); - }); - } - - openPostDeleteDialog() { - const dialogRef = this.dialog.open(ConfirmDeletionDialogComponent); - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - this.postService.deletePost(this.currentArea, this.post.id, false); - this.snackBar.open('Post deleted successfully', 'Close', { - duration: 3000 - }); - this.router.navigateByUrl(this.routeService.getNextRoute()); - } - }); - } - - runImageCheck(comment: string): boolean { - this.cdRef.detectChanges(); - const linkMatch = this.getImageMatchesByGroup(1, comment, C.WF_IMAGE_REGEX); - // Find duplicates and invalids - if (linkMatch.length > 0) { - return false; - } - return true; - } - - share(commentID: number) { - let commentURL = ''; - let authorName = this.post.author.name; - let description = this.post.text.slice(0, 100); - - if (commentID !== undefined) { - commentURL = '/' + commentID.toString(); - - for (let i = 0; i < this.post.comments.length; i++) { - if (this.post.comments[i].id === commentID) { - authorName = this.post.comments[i].author.name; - description = this.post.comments[i].text.slice(0, 100); - } - } - } - - this.navBarService.link.next( - new Link('https://client.wildfyre.net/areas/' + this.currentArea + '/' + this.post.id + commentURL, - description, - authorName - )); - const dialogRef = this.dialog.open(ShareDialogComponent); - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.isLink) { - this.snackBar.open('Link copied successfully', 'Close', { - duration: 3000 - }); - } - }); - } - - subscribe(s: boolean) { - this.postService.subscribe(this.currentArea, this.post, s) - .takeUntil(this.componentDestroyed) - .subscribe(); - } -} diff --git a/src/app/profile/profile.component.html b/src/app/profile/profile.component.html deleted file mode 100644 --- a/src/app/profile/profile.component.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - -
-

You are currently banned

-
-
-
-
- Reason: {{getReason(ban.reason)}}
- {{ban.comment}}
- You can not - post, comment, or flag. - post - or - comment - or - flag. -
- {{ban.timestamp}}
-
- Expires: {{ban.expiry}} -
-
-
- - - - - Avatar of {{author?.name}} - Avatar of {{author?.name}} -
-
-
- {{author?.name}}
- - {{account?.email}} - -
-
-
- - - -
ID: {{author?.user}}
diff --git a/src/app/profile/profile.component.ts b/src/app/profile/profile.component.ts deleted file mode 100644 --- a/src/app/profile/profile.component.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { Component, OnInit, OnDestroy, ViewChild, ChangeDetectorRef } from '@angular/core'; -import { MatDialog, MatDialogRef, MatSnackBar } from '@angular/material'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { AvatarDialogComponent } from '../_dialogs/avatar.dialog.component'; -import { BioDialogComponent } from '../_dialogs/bio.dialog.component'; -import { EmailDialogComponent } from '../_dialogs/email.dialog.component'; -import { PasswordDialogComponent } from '../_dialogs/password.dialog.component'; -import { Account } from '../_models/account'; -import { Author } from '../_models/author'; -import { Ban } from '../_models/ban'; -import { Choice } from '../_models/choice'; -import { SuperBan } from '../_models/superBan'; -import { AuthenticationService } from '../_services/authentication.service'; -import { ProfileService } from '../_services/profile.service'; -import { ReasonService } from '../_services/reason.service'; -import { RouteService } from '../_services/route.service'; - -@Component({ - templateUrl: 'profile.component.html' -}) -export class ProfileComponent implements OnInit, OnDestroy { - account: Account; - author: Author; - choices: Choice[]; - componentDestroyed: Subject = new Subject(); - data: any; - index = 1; - limit = 2; - loading = true; - model: any = {}; - offset = 2; - url: string; - self: boolean; - bans: Ban[] = []; - totalCount = 0; - - constructor( - private cdRef: ChangeDetectorRef, - private dialog: MatDialog, - private route: ActivatedRoute, - private router: Router, - public snackBar: MatSnackBar, - private authenticationService: AuthenticationService, - private profileService: ProfileService, - private reasonService: ReasonService, - private routeService: RouteService - ) { } - - ngOnInit() { - this.reasonService.getFlagReasons() - .takeUntil(this.componentDestroyed) - .subscribe((choices) => { - this.choices = choices; - }); - this.routeService.resetRoutes(); - this.route.params - .takeUntil(this.componentDestroyed) - .subscribe((parms) => { - if (parms['id']) { - this.profileService.getUser(parms['id']) - .takeUntil(this.componentDestroyed) - .subscribe((user: Author) => { - this.self = false; - this.author = user; - }); - } else { - this.self = true; - - this.profileService.getSelf() - .takeUntil(this.componentDestroyed) - .subscribe((self: Author) => { - this.author = self; - this.model.bio = this.author.bio; - }); - - this.profileService.getAccount() - .takeUntil(this.componentDestroyed) - .subscribe((self: Account) => { - this.account = self; - this.model.email = this.account.email; - }); - - this.profileService.getBans(this.limit, (this.index * this.limit) - this.limit) - .takeUntil(this.componentDestroyed) - .subscribe((superBan: SuperBan) => { - superBan.results.forEach((obj: any) => { - this.bans.push(Ban.parse(obj)); - }); - this.totalCount = superBan.count; - this.cdRef.detectChanges(); - }); - - } - }); - - this.profileService.getAccount() - .takeUntil(this.componentDestroyed) - .subscribe((self: Account) => { - this.account = self; - this.model.email = this.account.email; - this.self = true; - }); - this.loading = false; - } - - ngOnDestroy() { - this.cdRef.detach(); - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - getBans(page: number) { - this.loading = true; - this.bans = []; - - this.profileService.getBans(this.limit, (this.offset * page) - this.limit) - .takeUntil(this.componentDestroyed) - .subscribe(superBan => { - - superBan.results.forEach((obj: any) => { - this.bans.push(Ban.parse(obj)); - }); - - this.index = page; - this.totalCount = superBan.count; - this.cdRef.detectChanges(); - this.loading = false; - }); - } - - getReason(number: number): string { - if (number !== null) { - return this.choices[number].value; - } else { - return this.choices[3].value; - } - } - - openBioDialog() { - const dialogRef = this.dialog.open(BioDialogComponent); - dialogRef.componentInstance.model.bio = this.author.bio; - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - this.profileService.setBio(this.author, result.bio) - .takeUntil(this.componentDestroyed) - .subscribe(); - const snackBarRef = this.snackBar.open('Bio changed successfully', 'Close', { - duration: 3000 - }); - } - }); - } - - openEmailDialog() { - const dialogRef = this.dialog.open(EmailDialogComponent); - dialogRef.componentInstance.model.email = this.account.email; - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - this.profileService.setEmail(result.email) - .takeUntil(this.componentDestroyed) - .subscribe(); - const snackBarRef = this.snackBar - .open('We just sent you a verification email, you must verify your email for it to be set', 'Close', { - duration: 3000 - }); - } - }); - } - - openPasswordDialog() { - const dialogRef = this.dialog.open(PasswordDialogComponent); - dialogRef.componentInstance.account = this.account; - dialogRef.componentInstance.author = this.author; - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - const snackBarRef = this.snackBar.open('Password changed successfully', 'Close', { - duration: 3000 - }); - } - }); - } - - openPictureDialog() { - const dialogRef = this.dialog.open(AvatarDialogComponent); - dialogRef.componentInstance.author = this.author; - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (result.bool) { - if (result.profilePicture) { - this.profileService.setProfilePicture(result.profilePicture) - .takeUntil(this.componentDestroyed) - .subscribe(result2 => { - if (!result2.getError()) { - this.author.avatar = result2.avatar; - } else { - const snackBarRef = this.snackBar.open('Your image file must be below 512KiB in size', 'Close', { - duration: 3000 - }); - } - }); - } else { - const snackBarRef = this.snackBar.open('You did not select a valid image file', 'Close', { - duration: 3000 - }); - } - } - }); - } - - viewProfile() { - this.routeService.addNextRoute(this.router.url); - this.router.navigateByUrl('/user/' + this.author.user); - } - } diff --git a/src/app/profileView/profileView.component.html b/src/app/profileView/profileView.component.html deleted file mode 100644 --- a/src/app/profileView/profileView.component.html +++ /dev/null @@ -1,18 +0,0 @@ -
arrow_back
- - -
- User is currently banned -
- Avatar of {{author?.name}} - Avatar of {{author?.name}} -
-
- {{author?.name}}
-
-
-
- - - -
ID: {{author?.user}}
diff --git a/src/app/profileView/profileView.component.spec.ts b/src/app/profileView/profileView.component.spec.ts deleted file mode 100644 --- a/src/app/profileView/profileView.component.spec.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ComponentFixture, TestBed, async } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; -import { Observable } from 'rxjs'; -import { ProfileViewComponent } from './profileView.component'; -import { Router, ActivatedRoute } from '@angular/router'; -import { AuthenticationService } from '../_services/authentication.service'; -import { ProfileService } from '../_services/profile.service'; -import { RouteService } from '../_services/route.service'; -import { MatCardModule, MatDialogModule, MatIconModule } from '@angular/material'; -import { MarkedPipe } from '../_pipes/marked.pipe'; -import { Author } from '../_models/author'; -import { NavBarService } from '../_services/navBar.service'; - -describe('ProfileViewComponent', () => { - let comp: ProfileViewComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let el: HTMLElement; - - beforeEach(() => { - // stubs - const activatedRouteStub = { - params: Observable.of({'id': 1}) - }; - const routerStub = {}; - const authenticationServiceStub = { - token: 'token' - }; - const profileServiceStub = { - getUser: (id: number) => { - if (id !== 1) { - throw new Error('Requests for users other than with Id 1 not implemented'); - } - - return Observable.of( - new Author(1, 'Test User', null, 'test', false) - ); - } - }; - const navBarServiceStub = {}; - const routeServiceStub = {}; - - TestBed.configureTestingModule({ - declarations: [ ProfileViewComponent, MarkedPipe ], - providers: [ - { provide: ActivatedRoute, useValue: activatedRouteStub }, - { provide: Router, useValue: routerStub }, - { provide: AuthenticationService, useValue: authenticationServiceStub }, - { provide: ProfileService, useValue: profileServiceStub }, - { provide: RouteService, useValue: routeServiceStub }, - { provide: NavBarService, useValue: navBarServiceStub } - ], - imports: [ MatCardModule, MatDialogModule, MatIconModule ], - }); - - fixture = TestBed.createComponent(ProfileViewComponent); - comp = fixture.componentInstance; - - de = fixture.debugElement.query(By.css('#name')); - el = de.nativeElement; - }); - - it('should set the author name', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - - expect(el.textContent).toBe('Test User'); - }); - })); - - it('should set bio', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - - expect(fixture.debugElement.query(By.css('#bio')).nativeElement.textContent).toBe('test\n'); - }); - })); - - it('should set id', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - - expect(fixture.debugElement.query(By.css('#userID')).nativeElement.textContent).toBe('ID: 1'); - }); - })); - -}); diff --git a/src/app/profileView/profileView.component.ts b/src/app/profileView/profileView.component.ts deleted file mode 100644 --- a/src/app/profileView/profileView.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { MatDialog, MatDialogRef } from '@angular/material'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { ShareDialogComponent } from '../_dialogs/share.dialog.component'; -import { Author } from '../_models/author'; -import { Link } from '../_models/link'; -import { AuthenticationService } from '../_services/authentication.service'; -import { NavBarService } from '../_services/navBar.service'; -import { ProfileService } from '../_services/profile.service'; -import { RouteService } from '../_services/route.service'; - -@Component({ - templateUrl: 'profileView.component.html', -}) -export class ProfileViewComponent implements OnInit, OnDestroy { - author: Author; - componentDestroyed: Subject = new Subject(); - - constructor( - private dialog: MatDialog, - private route: ActivatedRoute, - private router: Router, - private authenticationService: AuthenticationService, - private navBarService: NavBarService, - private profileService: ProfileService, - private routeService: RouteService - ) { } - - ngOnInit() { - this.route.params - .takeUntil(this.componentDestroyed) - .subscribe(params => { - const id = params['id']; - - // Get post from secure api end point - this.profileService.getUser(id) - .takeUntil(this.componentDestroyed) - .subscribe(author => { - this.author = author; - }); - }); - } - - ngOnDestroy() { - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - back() { - if (this.routeService.routes.length === 0) { - this.router.navigateByUrl(''); - } else { - this.router.navigateByUrl(this.routeService.getNextRoute()); - } - } - - share() { - this.navBarService.link.next( - new Link('https://client.wildfyre.net/user/' + this.author.user, - this.author.bio.slice(0, 100), - this.author.name - )); - const dialogRef = this.dialog.open(ShareDialogComponent); - dialogRef.afterClosed() - .takeUntil(this.componentDestroyed) - .subscribe(result => { }); - } -} diff --git a/src/app/recover/recover.component.html b/src/app/recover/recover.component.html deleted file mode 100644 --- a/src/app/recover/recover.component.html +++ /dev/null @@ -1,78 +0,0 @@ - - - -

Recover

- - - - - Recover your Username - - -
- account_circle -
-
- - - -
-
    -
  • {{err}}
  • -
-
-
- -
-
    -
  • {{err}}
  • -
-
-
- - - - -
- - - - Recover your Password - - -
- lock -
-
- - - -
-
    -
  • {{err}}
  • -
-
- - - -
-
    -
  • {{err}}
  • -
-
-
- -
-
    -
  • {{err}}
  • -
-
-
- - - - -
-
-
-
diff --git a/src/app/recover/recover.component.spec.ts b/src/app/recover/recover.component.spec.ts deleted file mode 100644 --- a/src/app/recover/recover.component.spec.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ComponentFixture, TestBed, inject } from '@angular/core/testing'; -import { NgModel, NgForm } from '@angular/forms'; -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { MatSnackBar } from '@angular/material'; -import { Router } from '@angular/router'; -import { RegistrationService } from '../_services/registration.service'; -import { RecoverComponent } from './recover.component'; - -describe('RecoverComponent', () => { - let comp: RecoverComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - const mdSnackBarStub = { - open: () => ({}) - }; - const routerStub = { - navigateByUrl: () => ({}) - }; - const registrationServiceStub = { - recoverPasswordStep1: () => ({ - subscribe: () => ({}) - }), - recoverUsername: () => ({ - subscribe: () => ({}) - }) - }; - TestBed.configureTestingModule({ - declarations: [ RecoverComponent, NgForm, NgModel ], - schemas: [ NO_ERRORS_SCHEMA ], - providers: [ - { provide: MatSnackBar, useValue: mdSnackBarStub }, - { provide: Router, useValue: routerStub }, - { provide: RegistrationService, useValue: registrationServiceStub } - ] - }); - fixture = TestBed.createComponent(RecoverComponent); - comp = fixture.componentInstance; - }); - - it('can load instance', () => { - expect(comp).toBeTruthy(); - }); - - it('loading defaults to: false', () => { - expect(comp.loading).toEqual(false); - }); - - it('should create', inject([RegistrationService], (registrationService: RegistrationService) => { - spyOn(registrationService, 'recoverPasswordStep1').and.returnValue({subscribe: () => {}}); - expect(comp).toBeTruthy(); - })); - - it('should create', inject([RegistrationService], (registrationService: RegistrationService) => { - spyOn(registrationService, 'recoverUsername').and.returnValue({subscribe: () => {}}); - expect(comp).toBeTruthy(); - })); - -}); diff --git a/src/app/recover/recover.component.ts b/src/app/recover/recover.component.ts deleted file mode 100644 --- a/src/app/recover/recover.component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { Component, OnDestroy } from '@angular/core'; -import { MatSnackBar } from '@angular/material'; -import { Router } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { ViewChild } from '@angular/core'; -import { RecoverTransaction, RecoverTransactionError } from '../_models/recoverTransaction'; -import { RegistrationService } from '../_services/registration.service'; -import { ReCaptchaComponent } from 'angular2-recaptcha'; - -@Component({ - templateUrl: 'recover.component.html' -}) -export class RecoverComponent implements OnDestroy { - @ViewChild(ReCaptchaComponent) captcha: ReCaptchaComponent; - - componentDestroyed: Subject = new Subject(); - errors: RecoverTransactionError; - loading = false; - model: any = {}; - token: any; - transID: string; - - constructor( - private snackBar: MatSnackBar, - private router: Router, - private registrationService: RegistrationService - ) { } - - ngOnDestroy() { - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - recoverPassword() { - this.registrationService.recoverPasswordStep1(this.model.email2, this.model.username, this.token) - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (!result.getError()) { - this.router.navigateByUrl('/recover/password/' + result.transaction); - this.loading = false; - this.model.email2 = ''; - this.model.username = ''; - this.captcha.reset(); - } else { - this.errors = result.getError(); - this.loading = false; - this.captcha.reset(); - } - }); - } - - recoverUsername() { - this.registrationService.recoverUsername(this.model.email, this.token) - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (!result.getError()) { - const snackBarRef = this.snackBar.open('We will contact you via the information provided', 'Close', { - duration: 3000 - }); - this.loading = false; - this.model.email = ''; - this.captcha.reset(); - } else { - this.errors = result.getError(); - this.loading = false; - this.captcha.reset(); - } - }); - } - - setCaptchaResponse(res: any) { - this.token = res; - } -} diff --git a/src/app/recoverPassword/recoverPassword.component.html b/src/app/recoverPassword/recoverPassword.component.html deleted file mode 100644 --- a/src/app/recoverPassword/recoverPassword.component.html +++ /dev/null @@ -1,72 +0,0 @@ - - - -

Recover Password

-
-

Warning!

- Do not close this webpage or you will have to restart!
- We sent a Password Reset Token to you via the information provided.
- You must have it in order to continue using this form! -
-
- Passwords must contain at least 8 characters and be alphanumeric (At least 1 letter and 1 number) -
-
-
-
    -
  • {{err}}
  • -
-
- -
- - - -
Token is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- - - -
Password is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- - - -
Password is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- -
-
    -
  • {{err}}
  • -
-
-
-
- - -
-
- -
-
diff --git a/src/app/recoverPassword/recoverPassword.component.spec.ts b/src/app/recoverPassword/recoverPassword.component.spec.ts deleted file mode 100644 --- a/src/app/recoverPassword/recoverPassword.component.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ComponentFixture, TestBed, inject } from '@angular/core/testing'; -import { NgModel, NgForm } from '@angular/forms'; -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { MatSnackBar } from '@angular/material'; -import { Router } from '@angular/router'; -import { ActivatedRoute } from '@angular/router'; -import { RegistrationService } from '../_services/registration.service'; -import { RecoverPasswordComponent } from './recoverPassword.component'; - -describe('RecoverPasswordComponent', () => { - let comp: RecoverPasswordComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - const mdSnackBarStub = { - open: () => ({}) - }; - const routerStub = { - navigateByUrl: () => ({}) - }; - const activatedRouteStub = { - params: { - subscribe: () => ({}) - } - }; - const registrationServiceStub = { - recoverPasswordStep2: () => ({ - subscribe: () => ({}) - }) - }; - TestBed.configureTestingModule({ - declarations: [ RecoverPasswordComponent, NgForm, NgModel ], - schemas: [ NO_ERRORS_SCHEMA ], - providers: [ - { provide: MatSnackBar, useValue: mdSnackBarStub }, - { provide: Router, useValue: routerStub }, - { provide: ActivatedRoute, useValue: activatedRouteStub }, - { provide: RegistrationService, useValue: registrationServiceStub } - ] - }); - fixture = TestBed.createComponent(RecoverPasswordComponent); - comp = fixture.componentInstance; - }); - - it('can load instance', () => { - expect(comp).toBeTruthy(); - }); - - it('loading defaults to: false', () => { - expect(comp.loading).toEqual(false); - }); - - it('should create', inject([RegistrationService], (registrationService: RegistrationService) => { - spyOn(registrationService, 'recoverPasswordStep2').and.returnValue({subscribe: () => {}}); - expect(comp).toBeTruthy(); - })); - -}); diff --git a/src/app/recoverPassword/recoverPassword.component.ts b/src/app/recoverPassword/recoverPassword.component.ts deleted file mode 100644 --- a/src/app/recoverPassword/recoverPassword.component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { MatSnackBar } from '@angular/material'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { ViewChild } from '@angular/core'; -import { ResetError } from '../_models/reset'; -import { RegistrationService } from '../_services/registration.service'; -import { ReCaptchaComponent } from 'angular2-recaptcha'; - -@Component({ - templateUrl: 'recoverPassword.component.html' -}) -export class RecoverPasswordComponent implements OnInit, OnDestroy { - @ViewChild(ReCaptchaComponent) captcha: ReCaptchaComponent; - - componentDestroyed: Subject = new Subject(); - errors: ResetError; - loading = false; - model: any = {}; - token: any; - transactionID: string; - - constructor( - private snackBar: MatSnackBar, - private route: ActivatedRoute, - private router: Router, - private registrationService: RegistrationService - ) { } - - ngOnInit() { - this.route.params - .subscribe(params => { - this.transactionID = params['trans']; - }); - } - - ngOnDestroy() { - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - resetPassword() { - if (this.model.password === this.model.password2) { - this.registrationService.recoverPasswordStep2(this.model.password, this.model.token, this.transactionID, this.token) - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (!result.getError()) { - const snackBarRef = this.snackBar.open('Your new password is now set', 'Close', { - duration: 3000 - }); - this.router.navigateByUrl('login'); - this.loading = false; - this.model.password = ''; - this.model.password2 = ''; - this.model.token = ''; - this.captcha.reset(); - } else { - const snackBarRef = this.snackBar.open('You inputted something incorrectly', 'Close', { - duration: 3000 - }); - this.errors = result.getError(); - this.loading = false; - this.captcha.reset(); - } - }); - } else { - const snackBarRef = this.snackBar.open('Your passwords did not match', 'Close', { - duration: 3000 - }); - this.model.password = ''; - this.model.password2 = ''; - } - } - - setCaptchaResponse(res: any) { - this.token = res; - } -} diff --git a/src/app/register/register.component.html b/src/app/register/register.component.html deleted file mode 100644 --- a/src/app/register/register.component.html +++ /dev/null @@ -1,81 +0,0 @@ - - - -
- Usernames must use Letters, Digits and @/./+/-/_ only.
- Passwords must contain at least 8 characters and be alphanumeric (At least 1 letter and 1 number) -
-

Register

-
-
-
    -
  • {{err}}
  • -
-
- -
- - - -
Username is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- - - -
Email is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- - - -
Password is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- - - -
Second password is required
-
-
    -
  • {{err}}
  • -
-
-
- -
- -
-
    -
  • {{err}}
  • -
-
-
-
-
- By clicking Register, you agree to our Terms - and that you have read our Privacy Policy. - - -
-
-
-
diff --git a/src/app/register/register.component.spec.ts b/src/app/register/register.component.spec.ts deleted file mode 100644 --- a/src/app/register/register.component.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ComponentFixture, TestBed, inject } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { MatSnackBarModule } from '@angular/material'; -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { Router } from '@angular/router'; -import { AuthenticationService } from '../_services/authentication.service'; -import { RegistrationService } from '../_services/registration.service'; -import { RegisterComponent } from './register.component'; - -describe('RegisterComponent', () => { - let comp: RegisterComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - const routerStub = { - navigate: () => ({}) - }; - const authenticationServiceStub = { - logout: () => ({}) - }; - const registrationServiceStub = { - register: () => ({ - subscribe: () => ({}) - }) - }; - TestBed.configureTestingModule({ - declarations: [ RegisterComponent ], - schemas: [ NO_ERRORS_SCHEMA ], - providers: [ - { provide: Router, useValue: routerStub }, - { provide: AuthenticationService, useValue: authenticationServiceStub }, - { provide: RegistrationService, useValue: registrationServiceStub } - ], - imports: [ FormsModule, MatSnackBarModule ] - }); - fixture = TestBed.createComponent(RegisterComponent); - comp = fixture.componentInstance; - }); - - it('can load instance', () => { - expect(comp).toBeTruthy(); - }); - - it('loading defaults to: false', () => { - expect(comp.loading).toEqual(false); - }); - - describe('ngOnInit', () => { - it('makes expected calls', () => { - const authenticationServiceStub = fixture.debugElement.injector.get(AuthenticationService); - spyOn(authenticationServiceStub, 'logout'); - comp.ngOnInit(); - expect(authenticationServiceStub.logout).toHaveBeenCalled(); - }); - }); - - it('should create', inject([RegistrationService], (registrationService: RegistrationService) => { - spyOn(registrationService, 'register').and.returnValue({subscribe: () => {}}); - expect(comp).toBeTruthy(); - })); - -}); diff --git a/src/app/register/register.component.ts b/src/app/register/register.component.ts deleted file mode 100644 --- a/src/app/register/register.component.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Component, OnInit, OnDestroy } from '@angular/core'; -import { MatSnackBar } from '@angular/material'; -import { Router } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { ViewChild } from '@angular/core'; -import { RegistrationError } from '../_models/registration'; -import { AuthenticationService } from '../_services/authentication.service'; -import { RegistrationService } from '../_services/registration.service'; -import { ReCaptchaComponent } from 'angular2-recaptcha'; - -@Component({ - templateUrl: 'register.component.html' -}) -export class RegisterComponent implements OnInit, OnDestroy { - @ViewChild(ReCaptchaComponent) captcha: ReCaptchaComponent; - - componentDestroyed: Subject = new Subject(); - errors: RegistrationError; - loading = false; - model: any = {}; - token: any; - - constructor( - private snackBar: MatSnackBar, - private router: Router, - private authenticationService: AuthenticationService, - private registrationService: RegistrationService - ) { } - - ngOnInit() { - // Reset login status - this.authenticationService.logout(); - } - - ngOnDestroy() { - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - register() { - this.loading = true; - - if (this.model.password === this.model.password2) { - this.registrationService.register(this.model.username, this.model.email, this.model.password, this.token) - .takeUntil(this.componentDestroyed) - .subscribe(result => { - if (!result.getError()) { - this.router.navigate(['/register/success']); - } else { - this.errors = result.getError(); - this.loading = false; - } - }); - } else { - this.loading = false; - const snackBarRef = this.snackBar.open('Your passwords do not match', 'Close', { - duration: 3000 - }); - } - } - setCaptchaResponse(res: any) { - this.token = this.captcha.getResponse(); - } -} diff --git a/src/app/registerSuccess/registerSuccess.component.html b/src/app/registerSuccess/registerSuccess.component.html deleted file mode 100644 --- a/src/app/registerSuccess/registerSuccess.component.html +++ /dev/null @@ -1,14 +0,0 @@ - - - -
- Registration Successful!
- We sent a verification email to you. - You can now log in! -
-
-
- -
-
-
diff --git a/src/app/registerSuccess/registerSuccess.component.ts b/src/app/registerSuccess/registerSuccess.component.ts deleted file mode 100644 --- a/src/app/registerSuccess/registerSuccess.component.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { AuthenticationService } from '../_services/authentication.service'; - -@Component({ - templateUrl: 'registerSuccess.component.html' -}) -export class RegisterSuccessComponent implements OnInit { - loading: boolean; - - constructor( - private router: Router, - private authenticationService: AuthenticationService - ) { } - - ngOnInit() { - // Reset login status - this.authenticationService.logout(); - } - - letsGo() { - this.router.navigate(['/login']); - } -} diff --git a/src/app/userPosts/userPosts.component.html b/src/app/userPosts/userPosts.component.html deleted file mode 100644 --- a/src/app/userPosts/userPosts.component.html +++ /dev/null @@ -1,66 +0,0 @@ - - - No posts, try posting? - - -

- - - - - - - visibility_on - visibility_off - image - ... -
- {{post.created}} -
-
-
-
- - - - diff --git a/src/app/userPosts/userPosts.component.spec.ts b/src/app/userPosts/userPosts.component.spec.ts deleted file mode 100644 --- a/src/app/userPosts/userPosts.component.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { By } from '@angular/platform-browser'; -import { ComponentFixture, ComponentFixtureAutoDetect, TestBed, async } from '@angular/core/testing'; -import { FormsModule } from '@angular/forms'; -import { MatCardModule, MatProgressSpinnerModule, MatSlideToggleModule } from '@angular/material'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Observable } from 'rxjs'; -import { Author } from '../_models/author'; -import { Comment } from '../_models/comment'; -import { Post } from '../_models/post'; -import { MarkedPipe } from '../_pipes/marked.pipe'; -import { AreaService } from '../_services/area.service'; -import { AuthenticationService } from '../_services/authentication.service'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { RouteService } from '../_services/route.service'; -import { UserPostsComponent } from './userPosts.component'; -import { NgxMasonryModule } from '../_modules/ngx-masonry/ngx-masonry.module'; -import { NgxPaginationModule } from 'ngx-pagination'; - -describe('UserPostsComponent', () => { - let comp: UserPostsComponent; - let fixture: ComponentFixture; - - beforeEach(() => { - const routerStub = { - url: '/posts' - }; - const authenticationServiceStub = { - token: 'token' - }; - const activatedRouteStub = { - params: Observable.of({'id': 1}) - }; - const postServiceStub = { - getOwnPosts: () => { - return Observable.of( - new Array( - new Post(1, - new Author(1, 'test', null, 'test', false), false, false, '2017-07-22T12:03:23.465373Z', false, 'test', null, [], - new Array( - new Comment(1, - new Author(1, 'test', null, 'test', false), '2017-07-22T12:03:23.465373Z', 'test', null))) - ) - ); - } - }; - const areaServiceStub = { - isAreaChecked: {}, - currentAreaName: {}, - getAreaRep: () => ({ - subscribe: () => ({}) - }) - }; - const routeServiceStub = {}; - - const navBarServiceStub = {}; - - TestBed.configureTestingModule({ - declarations: [ UserPostsComponent, MarkedPipe ], - providers: [ - { provide: Router, useValue: routerStub }, - { provide: ActivatedRoute, useValue: activatedRouteStub }, - { provide: AreaService, useValue: areaServiceStub }, - { provide: AuthenticationService, useValue: authenticationServiceStub }, - { provide: NavBarService, useValue: navBarServiceStub }, - { provide: PostService, useValue: postServiceStub }, - { provide: RouteService, useValue: routeServiceStub }, - { provide: ComponentFixtureAutoDetect, useValue: true } - ], - imports: [ MatCardModule, MatProgressSpinnerModule, MatSlideToggleModule, FormsModule, NgxMasonryModule, NgxPaginationModule ], - }); - fixture = TestBed.createComponent(UserPostsComponent); - comp = fixture.componentInstance; - }); - - it('should set user posts', async(() => { - fixture.detectChanges(); - - fixture.whenStable().then(() => { - fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('.funPosts')) - .nativeElement.textContent).toBe('test Sat Jul 22 2017 08:03:23 GMT-0400 (Eastern Daylight Time)'); - }); - })); - -}); diff --git a/src/app/userPosts/userPosts.component.ts b/src/app/userPosts/userPosts.component.ts deleted file mode 100644 --- a/src/app/userPosts/userPosts.component.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { Component, OnInit, OnDestroy, NgModule, ChangeDetectorRef } from '@angular/core'; -import { Router, ActivatedRoute } from '@angular/router'; -import { Subject } from 'rxjs/Subject'; -import { Area } from '../_models/area'; -import * as C from '../_models/constants'; -import { Post } from '../_models/post'; -import { NavBarService } from '../_services/navBar.service'; -import { PostService } from '../_services/post.service'; -import { RouteService } from '../_services/route.service'; - -@Component({ - templateUrl: 'userPosts.component.html' -}) -export class UserPostsComponent implements OnInit, OnDestroy { - backupPosts: { [area: string]: Post[]; } = {}; - componentDestroyed: Subject = new Subject(); - currentArea: string; - imageArray: { [area: string]: string[]; } = {}; - index = 1; - limit = 10; - loading = true; - model: any = {}; - offset = 10; - searchArray: Post[] = []; - searching = false; - superPosts: { [area: string]: Post[]; } = {}; - totalCount = 0; - - constructor( - private cdRef: ChangeDetectorRef, - private route: ActivatedRoute, - private router: Router, - private navBarService: NavBarService, - private postService: PostService, - private routeService: RouteService - ) { } - - private imageInPosts(posts: Post[], area: string) { - this.imageArray[area] = []; - - for (let i = 0; i <= posts.length - 1; i++) { - // Find image markdown data in post.text - Guarenteed by Regex - const indexOfStart = posts[i].text.search(C.WF_IMAGE_REGEX); - if (indexOfStart !== -1) { - // Start at index and parse until we find a closing ')' char - for (let j = indexOfStart; j <= posts[i].text.length; j++) { - if (posts[i].text.charAt(j) === ']') { - // Add data to image array in specific area - this.imageArray[area][i] = posts[i].text.slice(indexOfStart, j + 1); - } - } - } - } - this.loading = false; - } - - private removeMarkdown(input: string) { - input = input - // Remove horizontal rules (stripListHeaders conflict with this rule, which is why it has been moved to the top) - .replace(/^(-\s*?|\*\s*?|_\s*?){3,}\s*$/gm, '[Horizontal-Rule]') - // Remove horizontal rules - .replace(/^(-\s*?|\*\s*?|_\s*?){3,}\s*$/gm, '') - // Header - .replace(/\n={2,}/g, '\n') - // Strikethrough - .replace(/~~/g, '') - // Fenced codeblocks - .replace(/`{3}.*\n/g, '') - // Remove HTML tags - .replace(/<[^>]*>/g, '') - // Remove setext-style headers - .replace(/^[=\-]{2,}\s*$/g, '') - // Remove footnotes? - .replace(/\[\^.+?\](\: .*?$)?/g, '') - .replace(/\s{0,2}\[.*?\]: .*?$/g, '') - // Remove images - .replace(C.WF_IMAGE_REGEX, '') - // Remove wildfyre images - .replace(/(\[img: \d\])/gm, '') - // Remove inline links - .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1') - // Remove blockquotes - .replace(/^\s{0,3}>\s?/g, '') - // Remove reference-style links? - .replace(/^\s{1,2}\[(.*?)\]: (\S+)( ".*?")?\s*$/g, '') - // Remove atx-style headers - .replace(/^(\n)?\s{0,}#{1,6}\s+| {0,}(\n)?\s{0,}#{0,} {0,}(\n)?\s{0,}$/gm, '$1$2$3') - // Remove emphasis (repeat the line to remove double emphasis) - .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, '$2') - .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, '$2') - // Remove code blocks - .replace(/(`{3,})(.*?)\1/gm, '$2') - // Remove inline code - .replace(/`(.+?)`/g, '$1') - // Replace two or more newlines with exactly two? Not entirely sure this belongs here... - .replace(/\n{2,}/g, '\n\n'); - return input; - } - - ngOnInit() { - this.cdRef.detectChanges(); - this.routeService.resetRoutes(); - this.routeService.addNextRoute('/posts'); - this.route.params - .takeUntil(this.componentDestroyed) - .subscribe(params => { - if (params['index'] !== undefined) { - this.index = params['index']; - } - }); - - this.navBarService.currentArea - .takeUntil(this.componentDestroyed) - .subscribe((currentArea: Area) => { - if (currentArea.name !== '') { - this.currentArea = currentArea.name; - if (!this.superPosts[currentArea.name]) { - this.superPosts[currentArea.name] = []; - } - if (!this.backupPosts[currentArea.name]) { - this.backupPosts[currentArea.name] = []; - } - this.loading = true; - const posts: Post[] = []; - - this.postService.getOwnPosts(currentArea.name, this.limit, 0) - .takeUntil(this.componentDestroyed) - .subscribe(superPost => { - superPost.results.forEach((obj: any) => { - posts.push(Post.parse(obj)); - }); - - // Removes binding to original 'superPost' variable - this.superPosts[currentArea.name] = JSON.parse(JSON.stringify(posts)); - this.backupPosts[currentArea.name] = posts; - this.totalCount = superPost.count; - - this.imageInPosts(this.superPosts[currentArea.name], currentArea.name); - - for (let i = 0; i <= this.backupPosts[currentArea.name].length - 1; i++) { - this.backupPosts[currentArea.name][i].text = this.removeMarkdown(this.backupPosts[currentArea.name][i].text); - } - this.cdRef.detectChanges(); - this.loading = false; - }); - } - }); - } - - ngOnDestroy() { - this.cdRef.detach(); - this.componentDestroyed.next(true); - this.componentDestroyed.complete(); - } - - getPosts(page: number) { - this.loading = true; - const posts: Post[] = []; - - this.postService.getOwnPosts(this.currentArea, this.limit, (this.offset * page) - this.limit) - .takeUntil(this.componentDestroyed) - .subscribe(superPost => { - superPost.results.forEach((obj: any) => { - posts.push(Post.parse(obj)); - }); - - // Removes binding to original 'superPost' variable - this.superPosts[this.currentArea] = JSON.parse(JSON.stringify(posts)); - this.backupPosts[this.currentArea] = posts; - this.imageInPosts(this.superPosts[this.currentArea], this.currentArea); - - for (let i = 0; i <= this.backupPosts[this.currentArea].length - 1; i++) { - this.backupPosts[this.currentArea][i].text = this.removeMarkdown(this.backupPosts[this.currentArea][i].text); - } - this.index = page; - this.totalCount = superPost.count; - this.cdRef.detectChanges(); - this.loading = false; - }); - } - - goto(postID: string) { - this.routeService.addNextRouteByIndex(this.index); - this.router.navigateByUrl('/areas/' + this.currentArea + '/' + postID); - } - -/* Removed as of D114 - searchInput() { - if (this.areaService.currentAreaName === 'fun') { - this.searchArray = []; - if (this.model.postText === '') { - this.searching = false; - this.cdRef.detectChanges(); - } else { - this.searching = true; - - for (let i = 0; i <= this.funPosts.length - 1; i++) { - if (this.funPosts[i].text.toLowerCase().includes(this.model.postText.toLowerCase())) { - this.searchArray.push(this.backupFunPosts[i]); - } - } - this.cdRef.detectChanges(); - } - } else { - this.searchArray = []; - if (this.model.postText === '') { - this.searching = false; - this.cdRef.detectChanges(); - } else { - this.searching = true; - - for (let i = 0; i <= this.infoPosts.length - 1; i++) { - if (this.infoPosts[i].text.toLowerCase().includes(this.model.postText.toLowerCase())) { - this.searchArray.push(this.backupInfoPosts[i]); - } - } - this.cdRef.detectChanges(); - } - } - } - */ -} diff --git a/src/assets/manifest.json b/src/assets/manifest.json --- a/src/assets/manifest.json +++ b/src/assets/manifest.json @@ -13,7 +13,7 @@ "type": "image/png" } ], - "theme_color": "#ed763e", + "theme_color": "#EA6C40", "description": "", "orientation": "any", "background_color": "#263238", diff --git a/src/index.html b/src/index.html --- a/src/index.html +++ b/src/index.html @@ -6,7 +6,7 @@ - + @@ -15,6 +15,8 @@ + + + + + + + + +