diff --git a/dapps/tests/app/app/js/index.js b/dapps/tests/app/app/js/index.js index a9c2ddcb2..0f681f421 100644 --- a/dapps/tests/app/app/js/index.js +++ b/dapps/tests/app/app/js/index.js @@ -1,9 +1,25 @@ // import {SimpleStorage} from '../../embarkArtifacts/contracts'; +import $ from 'jquery'; import SimpleStorage from '../../embarkArtifacts/contracts/SimpleStorage.js'; - +import web3 from '../../embarkArtifacts/contracts/web3_init'; +window.web3 = web3; window.SimpleStorage = SimpleStorage; +$("#blockchain button.set").click(function() { + var value = parseInt($("#blockchain input.text").val(), 10); + + SimpleStorage.methods.set(value).send({from: web3.eth.defaultAccount, gas: 5300000}); +}); + +// TODO check why from not set +$("#blockchain button.get").click(function() { + SimpleStorage.methods.get().call({from: web3.eth.defaultAccount}, function(err, value) { + console.log('GET', err, value); + $("#blockchain .value").html(value); + }); +}); + // /*global web3*/ // import React from 'react'; // import EmbarkJS from 'Embark/EmbarkJS'; diff --git a/packages/embark-console-listener/package.json b/packages/embark-console-listener/package.json index 9015935c6..7aa8df416 100644 --- a/packages/embark-console-listener/package.json +++ b/packages/embark-console-listener/package.json @@ -49,7 +49,9 @@ "@babel/runtime-corejs2": "7.3.1", "async": "2.6.1", "embark-i18n": "^4.1.0-beta.3", - "embark-utils": "^4.1.0-beta.5" + "embark-utils": "^4.1.0-beta.5", + "ethereumjs-tx": "1.3.7", + "ethereumjs-util": "6.0.0" }, "devDependencies": { "@babel/cli": "7.2.3", diff --git a/packages/embark-console-listener/src/index.js b/packages/embark-console-listener/src/index.js index 1e35c2bfe..90a0892c7 100644 --- a/packages/embark-console-listener/src/index.js +++ b/packages/embark-console-listener/src/index.js @@ -1,15 +1,23 @@ const async = require('async'); -import { __ } from 'embark-i18n'; -import { dappPath, getAddressToContract, getTransactionParams, hexToNumber } from 'embark-utils'; +import {__} from 'embark-i18n'; +import {dappPath, getAddressToContract, getTransactionParams, hexToNumber} from 'embark-utils'; const ProcessLogsApi = require('embark-process-logs-api'); const EMBARK_PROCESS_NAME = 'embark'; +const Transaction = require('ethereumjs-tx'); +const ethUtil = require('ethereumjs-util'); + +const ETH_CALL = 'eth_call'; +const GET_TX_RECEIPT = 'eth_getTransactionReceipt'; +const SEND_TX = 'eth_sendTransaction'; +const SEND_RAW_TX = 'eth_sendRawTransaction'; +const LISTENED_METHODS = [ETH_CALL, GET_TX_RECEIPT, SEND_TX, SEND_RAW_TX]; + class ConsoleListener { - constructor(embark, options) { + constructor(embark, _options) { this.embark = embark; this.logger = embark.logger; - this.ipc = options.ipc; this.events = embark.events; this.fs = embark.fs; this.addressToContract = []; @@ -18,10 +26,9 @@ class ConsoleListener { this.outputDone = false; this.logFile = dappPath(".embark", "contractLogs.json"); this.processLogsApi = new ProcessLogsApi({embark: this.embark, processName: EMBARK_PROCESS_NAME, silent: false}); + this.transactions = {}; - if (this.ipc.ipcRole === 'server') { - this._listenForLogRequests(); - } + this._listenForLogRequests(); this._registerAPI(); this.events.on("contracts:log", this._saveLog.bind(this)); @@ -79,23 +86,53 @@ class ConsoleListener { }); }); - this.ipc.on('log', (request) => { - this._onIpcLogRequest(request); - }); + this.events.on('blockchain:proxy:response', this._onLogRequest.bind(this)); } - _onIpcLogRequest(request) { - if (request.type !== 'contract-log') { - return this.logger.info(JSON.stringify(request)); + _onLogRequest(args) { + //TODO test this once you can Need to make the Dapp connect first + const method = args.reqData.method; + if (!this.contractsDeployed || !LISTENED_METHODS.includes(method)) { + return; } - if (!this.contractsDeployed) return; + if (method === SEND_TX) { + // We just gather data and wait for the receipt + this.transactions[args.respData.result] = { + address: args.reqData.params[0].to, + data: args.reqData.params[0].data, + txHash: args.respData.result + }; + return; + } else if (method === SEND_RAW_TX) { + const rawData = Buffer.from(ethUtil.stripHexPrefix(args.reqData.params[0]), 'hex'); + const tx = new Transaction(rawData, 'hex'); + this.transactions[args.respData.result] = { + address: '0x' + tx.to.toString('hex'), + data: '0x' + tx.data.toString('hex') + }; + return; + } - const {address, data} = request; + let dataObject; + if (method === GET_TX_RECEIPT) { + dataObject = args.respData.result; + if (this.transactions[args.respData.result.transactionHash]) { + // This is the normal case. If we don't get here, it's because we missed a TX + dataObject = Object.assign(dataObject, this.transactions[args.respData.result.transactionHash]); + } + } else { + dataObject = args.reqData.params[0]; + } + const {to: address, data} = dataObject; + if (!address) { + // It's a deployment + return; + } const contract = this.addressToContract[address]; if (!contract) { - this.logger.info(`Contract log for unknown contract: ${JSON.stringify(request)}`); + this.logger.info(`Contract log for unknown contract: ${JSON.stringify(args)}`); return this._getContractsList((contractsList) => { this.addressToContract = getAddressToContract(contractsList, this.addressToContract); }); @@ -106,22 +143,40 @@ class ConsoleListener { return; } - const {functionName, paramString} = getTransactionParams(contract, data); + let functionName, paramString; + if (!data) { + // We missed the TX + functionName = 'unknown'; + paramString = 'unknown'; + } else { + const txParams = getTransactionParams(contract, data); + functionName = txParams.functionName; + paramString = txParams.paramString; + } - if (request.kind === 'call') { - const log = Object.assign({}, request, {name, functionName, paramString}); + if (method === ETH_CALL) { + // TODO check what the event does + const log = Object.assign({}, args, {name, functionName, paramString}); log.status = '0x1'; return this.events.emit('contracts:log', log); } - let {transactionHash, blockNumber, gasUsed, status} = request; + let {transactionHash, blockNumber, gasUsed, status} = args.respData.result; gasUsed = hexToNumber(gasUsed); blockNumber = hexToNumber(blockNumber); - const log = Object.assign({}, request, {name, functionName, paramString, gasUsed, blockNumber}); + const log = Object.assign({}, args, {name, functionName, paramString, gasUsed, blockNumber}); this.events.emit('contracts:log', log); this.logger.info(`Blockchain>`.underline + ` ${name}.${functionName}(${paramString})`.bold + ` | ${transactionHash} | gas:${gasUsed} | blk:${blockNumber} | status:${status}`); - this.events.emit('blockchain:tx', {name: name, functionName: functionName, paramString: paramString, transactionHash: transactionHash, gasUsed: gasUsed, blockNumber: blockNumber, status: status}); + this.events.emit('blockchain:tx', { + name: name, + functionName: functionName, + paramString: paramString, + transactionHash: transactionHash, + gasUsed: gasUsed, + blockNumber: blockNumber, + status: status + }); } _registerAPI() { @@ -130,8 +185,10 @@ class ConsoleListener { 'ws', apiRoute, (ws, _req) => { - this.events.on('contracts:log', function (log) { - ws.send(JSON.stringify(log), () => {}); + // FIXME this will be broken probably in the cokcpit because we don't send the same data as before + this.events.on('contracts:log', function(log) { + ws.send(JSON.stringify(log), () => { + }); }); } ); diff --git a/packages/embark-proxy/package.json b/packages/embark-proxy/package.json index eba1f627d..27906e4b8 100644 --- a/packages/embark-proxy/package.json +++ b/packages/embark-proxy/package.json @@ -45,6 +45,7 @@ }, "dependencies": { "@babel/runtime-corejs2": "7.3.1", + "cors": "2.8.5", "embark-core": "^4.1.0-beta.5", "embark-i18n": "^4.1.0-beta.3", "embark-utils": "^4.1.0-beta.5", diff --git a/packages/embark-proxy/src/old_proxy.js b/packages/embark-proxy/src/old_proxy.js index 46ebc6db3..51c5a65f4 100644 --- a/packages/embark-proxy/src/old_proxy.js +++ b/packages/embark-proxy/src/old_proxy.js @@ -54,9 +54,6 @@ export class Proxy { } modifyPayload(toModifyPayloads, body, accounts) { - this.plugins.emitAndRunActionsForEvent('proxy:redponse:received', {body: body}, () => { - - }) switch (toModifyPayloads[body.id]) { case METHODS_TO_MODIFY.accounts: delete toModifyPayloads[body.id]; diff --git a/packages/embark-proxy/src/proxy.js b/packages/embark-proxy/src/proxy.js index 284f51f60..ca52fb6c5 100644 --- a/packages/embark-proxy/src/proxy.js +++ b/packages/embark-proxy/src/proxy.js @@ -3,10 +3,11 @@ import {__} from 'embark-i18n'; import axios from "axios"; import {canonicalHost, timer, pingEndpoint, deconstructUrl} from 'embark-utils'; import express from 'express'; +import cors from 'cors'; +import {rsort} from "semver"; export class Proxy { constructor(options) { - this.ipc = options.ipc; this.commList = {}; this.receipts = {}; this.transactions = {}; @@ -42,6 +43,7 @@ export class Proxy { const app = express(); + app.use(cors()) app.use(express.json()); app.use(express.urlencoded({extended: true})); diff --git a/packages/embark/src/lib/core/engine.js b/packages/embark/src/lib/core/engine.js index 89bfd9e0d..0c652fadb 100644 --- a/packages/embark/src/lib/core/engine.js +++ b/packages/embark/src/lib/core/engine.js @@ -209,7 +209,7 @@ class Engine { this.registerModulePackage('embark-web3', {plugins: this.plugins}); this.registerModulePackage('embark-accounts-manager'); this.registerModulePackage('embark-specialconfigs', {plugins: this.plugins}); - this.registerModulePackage('embark-console-listener', {ipc: this.ipc}); + this.registerModulePackage('embark-console-listener'); } storageComponent() { diff --git a/packages/embark/src/lib/core/plugins.js b/packages/embark/src/lib/core/plugins.js index bb63c5940..9fc3e6ea6 100644 --- a/packages/embark/src/lib/core/plugins.js +++ b/packages/embark/src/lib/core/plugins.js @@ -236,7 +236,11 @@ Plugins.prototype.runActionsForEvent = function(eventName, args, cb) { }; Plugins.prototype.emitAndRunActionsForEvent = function(eventName, args, cb) { - this.events.emit(eventName); + if (typeof (args) === 'function') { + cb = args; + args = []; + } + this.events.emit(eventName, args); return this.runActionsForEvent(eventName, args, cb); }; diff --git a/yarn.lock b/yarn.lock index b24c77269..995f55a74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3339,6 +3339,14 @@ accepts@~1.3.4, accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" @@ -4690,6 +4698,22 @@ body-parser@1.18.3, body-parser@^1.16.0, body-parser@^1.18.2: raw-body "2.3.3" type-is "~1.6.16" +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" @@ -5033,6 +5057,11 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" @@ -5849,6 +5878,13 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + content-security-policy-builder@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz#8749a1d542fcbe82237281ea9f716ce68b394dd2" @@ -5959,6 +5995,11 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + cookiejar@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" @@ -6008,7 +6049,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cors@^2.8.1: +cors@2.8.5, cors@^2.8.1: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -7995,6 +8036,42 @@ express@4.16.3: utils-merge "1.0.1" vary "~1.1.2" +express@4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + 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.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + 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" + express@^4.14.0, express@^4.16.2, express@^4.16.3: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" @@ -8335,6 +8412,19 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + find-babel-config@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355" @@ -9601,6 +9691,28 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-https@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" @@ -9877,6 +9989,11 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -9984,6 +10101,11 @@ ipaddr.js@1.8.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + ipaddr.js@^1.5.2: version "1.8.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" @@ -12227,6 +12349,11 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + "mime-db@>= 1.36.0 < 2", mime-db@~1.37.0: version "1.37.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" @@ -12239,6 +12366,13 @@ mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.17, mime-types@~2.1.18, dependencies: mime-db "~1.37.0" +mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime.json@1.0.x: version "1.0.18" resolved "https://registry.yarnpkg.com/mime.json/-/mime.json-1.0.18.tgz#f3efa110cf9e8c647d626277bd722f9060558f68" @@ -12249,6 +12383,11 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mime@^2.0.3, mime@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" @@ -12658,6 +12797,11 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + neo-async@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" @@ -13747,6 +13891,11 @@ parseurl@~1.3.2: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + pascal-case@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" @@ -14865,6 +15014,14 @@ proxy-addr@~2.0.3, proxy-addr@~2.0.4: forwarded "~0.1.2" ipaddr.js "1.8.0" +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -14990,6 +15147,11 @@ qs@6.5.2, qs@~6.5.1, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + qs@^6.5.1, qs@^6.5.2: version "6.6.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" @@ -15077,6 +15239,11 @@ range-parser@^1.0.3, range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + raw-body@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" @@ -15097,6 +15264,16 @@ raw-body@2.3.3, raw-body@^2.3.0: iconv-lite "0.4.23" unpipe "1.0.0" +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + raw-loader@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" @@ -16606,6 +16783,25 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + sentence-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" @@ -16653,6 +16849,16 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + servify@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" @@ -16709,6 +16915,11 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -17249,7 +17460,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -18004,6 +18215,11 @@ toggle-selection@^1.0.3: resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + topo@2.x.x: version "2.0.2" resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" @@ -18170,6 +18386,14 @@ type-is@~1.6.15, type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typechecker@^2.0.8: version "2.1.0" resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.1.0.tgz#d1c2093a54ff8a19f58cff877eeaa54f2242d383"