From 805af726afe23625d418e8927e925cb86ca5b8f5 Mon Sep 17 00:00:00 2001 From: Sergej Kunz Date: Thu, 17 Oct 2019 23:07:47 +0200 Subject: [PATCH 1/7] Feature/e2e (resolves #89) --- .../continuous-integration-workflow.yml | 20 +- frontend/cypress.json | 1 + .../cypress/integration/dashboard.spec.js | 15 + frontend/cypress/plugins/index.js | 17 + frontend/cypress/support/commands.js | 25 + frontend/cypress/support/index.js | 20 + frontend/package-lock.json | 2346 ++++++++++++++++- frontend/package.json | 16 +- 8 files changed, 2432 insertions(+), 28 deletions(-) create mode 100644 frontend/cypress.json create mode 100644 frontend/cypress/integration/dashboard.spec.js create mode 100644 frontend/cypress/plugins/index.js create mode 100644 frontend/cypress/support/commands.js create mode 100644 frontend/cypress/support/index.js diff --git a/.github/workflows/continuous-integration-workflow.yml b/.github/workflows/continuous-integration-workflow.yml index bbe6332be..8f7c6caa8 100644 --- a/.github/workflows/continuous-integration-workflow.yml +++ b/.github/workflows/continuous-integration-workflow.yml @@ -3,7 +3,7 @@ on: [push] jobs: frontend-test: - name: Frontend testing + name: Frontend unit testing runs-on: ${{ matrix.os }} strategy: matrix: @@ -14,6 +14,24 @@ jobs: - name: Run unit tests run: cd frontend && npm install && npm run test + frontend-e2e-test: + name: Frontend e2e testing + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-18.04] + node: [10] + steps: + - uses: actions/checkout@v1 + - name: Install Packages + run: cd frontend && npm install + - name: Build Project + run: cd frontend && npm run build + - name: Run Cypress + run: cd frontend && npm run test:ci + env: + CYPRESS_DASHBOARD_KEY: ${{ secrets.CYPRESS_DASHBOARD_KEY }} + backend-test: name: Backend testing runs-on: ${{ matrix.os }} diff --git a/frontend/cypress.json b/frontend/cypress.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/frontend/cypress.json @@ -0,0 +1 @@ +{} diff --git a/frontend/cypress/integration/dashboard.spec.js b/frontend/cypress/integration/dashboard.spec.js new file mode 100644 index 000000000..1f95b1f8d --- /dev/null +++ b/frontend/cypress/integration/dashboard.spec.js @@ -0,0 +1,15 @@ +/// + +context('Dashboard', () => { + beforeEach(() => { + cy.visit('http://localhost:3000') + }); + + // https://on.cypress.io/interacting-with-elements + + it('Logo is visible', () => { + + cy.get('.near-main-logo') + .should('exist'); + }); +}); diff --git a/frontend/cypress/plugins/index.js b/frontend/cypress/plugins/index.js new file mode 100644 index 000000000..fd170fba6 --- /dev/null +++ b/frontend/cypress/plugins/index.js @@ -0,0 +1,17 @@ +// *********************************************************** +// This example plugins/index.js can be used to load plugins +// +// You can change the location of this file or turn off loading +// the plugins file with the 'pluginsFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/plugins-guide +// *********************************************************** + +// This function is called when a project is opened or re-opened (e.g. due to +// the project's config changing) + +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config +} diff --git a/frontend/cypress/support/commands.js b/frontend/cypress/support/commands.js new file mode 100644 index 000000000..c1f5a772e --- /dev/null +++ b/frontend/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add("login", (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This is will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/frontend/cypress/support/index.js b/frontend/cypress/support/index.js new file mode 100644 index 000000000..d68db96df --- /dev/null +++ b/frontend/cypress/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 971ac501e..9e380ac28 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -505,6 +505,16 @@ "@babel/plugin-syntax-json-strings": "^7.2.0" } }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz", + "integrity": "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", @@ -716,6 +726,18 @@ "babel-plugin-dynamic-import-node": "^2.3.0" } }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", + "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, "@babel/plugin-transform-modules-systemjs": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", @@ -902,6 +924,74 @@ "regexpu-core": "^4.5.4" } }, + "@babel/preset-env": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz", + "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.4.4", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-classes": "^7.4.4", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.4.4", + "@babel/plugin-transform-modules-systemjs": "^7.4.4", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + } + } + }, "@babel/preset-react": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", @@ -1006,6 +1096,209 @@ "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" }, + "@cypress/browserify-preprocessor": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cypress/browserify-preprocessor/-/browserify-preprocessor-2.1.1.tgz", + "integrity": "sha512-S+0bzZbRsiFbrLkEygu5D0958z4ejio7hWxnO5MoSqD7SmZOmGRpjuZ9RaGcDmL6RWnklNjn8DkpP2s368qCKA==", + "dev": true, + "requires": { + "@babel/core": "7.4.5", + "@babel/plugin-proposal-class-properties": "7.3.0", + "@babel/plugin-proposal-object-rest-spread": "7.3.2", + "@babel/plugin-transform-runtime": "7.2.0", + "@babel/preset-env": "7.4.5", + "@babel/preset-react": "7.0.0", + "@babel/runtime": "7.3.1", + "babel-plugin-add-module-exports": "1.0.0", + "babelify": "10.0.0", + "bluebird": "3.5.3", + "browserify": "16.2.3", + "coffeeify": "3.0.1", + "coffeescript": "1.12.7", + "debug": "4.1.1", + "fs-extra": "7.0.1", + "lodash.clonedeep": "4.5.0", + "watchify": "3.11.1" + }, + "dependencies": { + "@babel/core": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", + "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.5", + "@babel/types": "^7.4.4", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz", + "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", + "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/runtime": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", + "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@cypress/listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "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" + } + } + } + }, "@emotion/cache": { "version": "10.0.14", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.14.tgz", @@ -1079,6 +1372,45 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.3.tgz", "integrity": "sha512-zVgvPwGK7c1aVdUVc9Qv7SqepOGRDrqCw7KZPSZziWGxSlbII3gmvGLPzLX4d0n0BMbamBacUrN22zOMyFFEkQ==" }, + "@hapi/address": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.2.tgz", + "integrity": "sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.3.1.tgz", + "integrity": "sha512-75ocgnI7HG/I01iGA3/rs0y6PXydUA/kxhFZM0HoT8NLSTnt/J8Gq03iKl4a4B/2A3iMG0ctXtxr5Hg9SGr1gw==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, "@jest/console": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", @@ -1647,6 +1979,16 @@ "postcss-loader": "3.0.0" } }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abab": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.2.tgz", @@ -1677,6 +2019,31 @@ "acorn-walk": "^6.0.1" } }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "acorn-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", + "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", + "dev": true + } + } + }, "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", @@ -1780,6 +2147,12 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -1804,6 +2177,12 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, + "arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1932,6 +2311,23 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assertion-error-formatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-2.0.1.tgz", + "integrity": "sha512-cjC3jUCh9spkroKue5PDSKH5RFQ/KNuZJhk3GwHYmB/8qqETxLOmMdLH+ohi/VukNzxDlMvIe7zScvLoOdhb6Q==", + "dev": true, + "requires": { + "diff": "^3.0.0", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -1943,6 +2339,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -2230,6 +2635,15 @@ } } }, + "babel-plugin-add-module-exports": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz", + "integrity": "sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw==", + "dev": true, + "requires": { + "chokidar": "^2.0.4" + } + }, "babel-plugin-dynamic-import-node": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", @@ -2498,6 +2912,12 @@ } } }, + "babelify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", + "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2580,6 +3000,12 @@ } } }, + "becke-ch--regex--s0-0-v1--base--pl--lib": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz", + "integrity": "sha1-Qpzuu/pffpNueNc/vcfacWKyDiA=", + "dev": true + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -2666,6 +3092,20 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, "browser-process-hrtime": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", @@ -2689,6 +3129,104 @@ } } }, + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -2783,6 +3321,12 @@ "isarray": "^1.0.0" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -2850,6 +3394,21 @@ "unset-value": "^1.0.0" } }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "cachedir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz", + "integrity": "sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -2919,6 +3478,20 @@ } } }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2929,6 +3502,18 @@ "supports-color": "^5.3.0" } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true + }, "cheerio": { "version": "1.0.0-rc.3", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", @@ -3113,6 +3698,55 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==" }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -3152,6 +3786,28 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "coffeeify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/coffeeify/-/coffeeify-3.0.1.tgz", + "integrity": "sha512-Qjnr7UX6ldK1PHV7wCnv7AuCd4q19KTUtwJnu/6JRJB4rfm12zvcXtKdacUoePOKr1I4ka/ydKiwWpNAdsQb0g==", + "dev": true, + "requires": { + "convert-source-map": "^1.3.0", + "through2": "^2.0.0" + } + }, + "coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -3179,6 +3835,32 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3196,6 +3878,12 @@ "graceful-readlink": ">= 1.0.0" } }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -3734,31 +4422,276 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "csstype": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", + "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" + }, + "cucumber": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-4.2.1.tgz", + "integrity": "sha512-3gQ0Vv4kSHsvXEFC6b1c+TfLRDzWD1/kU7e5vm8Kh8j35b95k6favan9/4ixcBNqd7UsU1T6FYcawC87+DlNKw==", + "dev": true, + "requires": { + "assertion-error-formatter": "^2.0.1", + "babel-runtime": "^6.11.6", + "bluebird": "^3.4.1", + "cli-table": "^0.3.1", + "colors": "^1.1.2", + "commander": "^2.9.0", + "cucumber-expressions": "^5.0.13", + "cucumber-tag-expressions": "^1.1.1", + "duration": "^0.2.0", + "escape-string-regexp": "^1.0.5", + "figures": "2.0.0", + "gherkin": "^5.0.0", + "glob": "^7.0.0", + "indent-string": "^3.1.0", + "is-generator": "^1.0.2", + "is-stream": "^1.1.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash": "^4.17.4", + "mz": "^2.4.0", + "progress": "^2.0.0", + "resolve": "^1.3.3", + "serialize-error": "^2.1.0", + "stack-chain": "^2.0.0", + "stacktrace-js": "^2.0.0", + "string-argv": "0.0.2", + "title-case": "^2.1.1", + "util-arity": "^1.0.2", + "verror": "^1.9.0" + }, + "dependencies": { + "cucumber-expressions": { + "version": "5.0.18", + "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-5.0.18.tgz", + "integrity": "sha1-bHB3nv0668Xp54U5OLERAyJClZY=", + "dev": true, + "requires": { + "becke-ch--regex--s0-0-v1--base--pl--lib": "^1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + } + } + }, + "cucumber-expressions": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-6.6.2.tgz", + "integrity": "sha512-WcFSVBiWNLJbIcAAC3t/ACU46vaOKfe1UIF5H3qveoq+Y4XQm9j3YwHurQNufRKBBg8nCnpU7Ttsx7egjS3hwA==", + "dev": true, + "requires": { + "becke-ch--regex--s0-0-v1--base--pl--lib": "^1.2.0" + } + }, + "cucumber-tag-expressions": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cucumber-tag-expressions/-/cucumber-tag-expressions-1.1.1.tgz", + "integrity": "sha1-f1x7cACbwrZmWRv+ZIVFeL7e6Fo=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "cypress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.4.1.tgz", + "integrity": "sha512-1HBS7t9XXzkt6QHbwfirWYty8vzxNMawGj1yI+Fu6C3/VZJ8UtUngMW6layqwYZzLTZV8tiDpdCNBypn78V4Dg==", + "dev": true, + "requires": { + "@cypress/listr-verbose-renderer": "0.4.1", + "@cypress/xvfb": "1.2.4", + "arch": "2.1.1", + "bluebird": "3.5.0", + "cachedir": "1.3.0", + "chalk": "2.4.2", + "check-more-types": "2.24.0", + "commander": "2.15.1", + "common-tags": "1.8.0", + "debug": "3.2.6", + "execa": "0.10.0", + "executable": "4.1.1", + "extract-zip": "1.6.7", + "fs-extra": "5.0.0", + "getos": "3.1.1", + "is-ci": "1.2.1", + "is-installed-globally": "0.1.0", + "lazy-ass": "1.6.0", + "listr": "0.12.0", + "lodash": "4.17.15", + "log-symbols": "2.2.0", + "minimist": "1.2.0", + "moment": "2.24.0", + "ramda": "0.24.1", + "request": "2.88.0", + "request-progress": "3.0.0", + "supports-color": "5.5.0", + "tmp": "0.1.0", + "url": "0.11.0", + "yauzl": "2.10.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "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" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "is-ci": { + "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.5.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "cypress-cucumber-preprocessor": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-1.16.2.tgz", + "integrity": "sha512-jDJuQnnzrOrO+4PRt+VKFkHxHO7DplJACXOMUHLLWcL7vjlRUkIG4+QWnOkn/Py3yOhv9Rmuug8Iil5+FV8wEw==", + "dev": true, + "requires": { + "@cypress/browserify-preprocessor": "^2.1.1", + "chai": "^4.1.2", + "chokidar": "^2.0.4", + "cosmiconfig": "^4.0.0", + "cucumber": "^4.2.1", + "cucumber-expressions": "^6.0.1", + "cucumber-tag-expressions": "^1.1.1", + "debug": "^3.0.1", + "gherkin": "^5.1.0", + "glob": "^7.1.2", + "js-string-escape": "^1.0.1", + "through": "^2.3.8" + }, + "dependencies": { + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + } + }, + "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" + } + } + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "cssom": "0.3.x" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "csstype": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", - "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" - }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -3792,6 +4725,12 @@ } } }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -3816,6 +4755,15 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -3880,6 +4828,12 @@ } } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -3909,6 +4863,18 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -3929,11 +4895,36 @@ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "devalue": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.0.tgz", "integrity": "sha512-6H2FBD5DPnQS75UWJtQjoVeKZlmXoa765UgYS5RQnx6Ay9LUhUld0w1/D6cYdrY+wnu6XQNlpEBfnJUZK0YyPQ==" }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", @@ -4029,6 +5020,21 @@ "is-obj": "^2.0.0" } }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -4040,6 +5046,16 @@ "stream-shift": "^1.0.0" } }, + "duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4060,6 +5076,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.192.tgz", "integrity": "sha512-JkkpGlrilP1s/aFanueYZWf/DFDJaYgo3ZeamzgL5Drb70KQrVQRIPBq5vBN8sSRoKeZZak3aFJ83YtwsZgeEg==" }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, "elliptic": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", @@ -4229,6 +5251,15 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.4.tgz", + "integrity": "sha512-fZ0KkoxSjLFmhW5lHbUT3tLwy3nX1qEzMYo8koY1vrsAco53CMT1djnBSeC/wUjTEZRhZl9iRw7PaMaxfJ4wzQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.0" + } + }, "es-abstract": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", @@ -4258,6 +5289,38 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4326,6 +5389,21 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", @@ -4361,12 +5439,35 @@ "strip-eof": "^1.0.0" } }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -4515,6 +5616,44 @@ } } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } + }, "extracted-loader": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/extracted-loader/-/extracted-loader-1.0.4.tgz", @@ -4556,11 +5695,30 @@ "bser": "^2.0.0" } }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, "file-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", @@ -4677,6 +5835,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -4686,6 +5850,17 @@ "readable-stream": "^2.0.0" } }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -5206,12 +6381,24 @@ "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==", "dev": true }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -5226,6 +6413,15 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, + "getos": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.1.tgz", + "integrity": "sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg==", + "dev": true, + "requires": { + "async": "2.6.1" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -5235,6 +6431,12 @@ "assert-plus": "^1.0.0" } }, + "gherkin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-5.1.0.tgz", + "integrity": "sha1-aEu7A63STq9731RPWAM+so+zxtU=", + "dev": true + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -5272,6 +6474,15 @@ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -5456,6 +6667,12 @@ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true + }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -5647,6 +6864,15 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -5671,6 +6897,47 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dev": true, + "requires": { + "source-map": "~0.5.3" + }, + "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 + } + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -5777,12 +7044,27 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-generator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", + "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=", + "dev": true + }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", @@ -5797,6 +7079,16 @@ "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -5850,6 +7142,12 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -6478,6 +7776,12 @@ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6581,6 +7885,15 @@ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.1.tgz", "integrity": "sha512-IqUK+Cqc8/MqHsCvv1TMccbKdBzoATOLHXZAF5UDu70/CCxo648cHUig24hc+XTK53TyeNk1UeVTlc2Haovtsw==" }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -6600,6 +7913,27 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -6622,15 +7956,34 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha1-AfG2VzOqdUDuCNiwF0Fk0iCB5OE=", + "dev": true, + "requires": { + "seed-random": "~2.2.0" + } + }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" } }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, "launch-editor": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", @@ -6640,6 +7993,12 @@ "shell-quote": "^1.6.1" } }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -6662,6 +8021,237 @@ "type-check": "~0.3.2" } }, + "listr": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", + "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.2.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.0.0-beta.11", + "stream-to-observable": "^0.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + } + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", + "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -6727,6 +8317,12 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, + "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.escape": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", @@ -6751,6 +8347,18 @@ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -6782,6 +8390,49 @@ "chalk": "^2.0.1" } }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6790,6 +8441,12 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6825,6 +8482,12 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -7023,6 +8686,29 @@ "minimist": "0.0.8" } }, + "module-deps": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", + "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, "moment": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", @@ -7063,6 +8749,17 @@ "safe-buffer": "^5.1.2" } }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -7575,12 +9272,27 @@ } } }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", @@ -7715,6 +9427,12 @@ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, "nwsapi": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", @@ -7936,6 +9654,21 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "dev": true, + "requires": { + "shell-quote": "^1.4.2" + } + }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -7983,6 +9716,15 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, + "pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", + "dev": true, + "requires": { + "repeat-string": "^1.5.2" + } + }, "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", @@ -7998,6 +9740,15 @@ "readable-stream": "^2.1.5" } }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", @@ -8074,6 +9825,12 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, "path-to-regexp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.1.0.tgz", @@ -8094,6 +9851,21 @@ } } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -8106,6 +9878,12 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -9469,6 +11247,12 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", @@ -9535,6 +11319,15 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "requires": { + "event-stream": "=3.3.4" + } + }, "psl": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", @@ -9635,6 +11428,12 @@ "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", "dev": true }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "dev": true + }, "randexp": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", @@ -9917,6 +11716,15 @@ } } }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -10140,6 +11948,15 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -10186,6 +12003,15 @@ } } }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, "request-promise-core": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", @@ -10310,6 +12136,21 @@ "aproba": "^1.1.1" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -10395,6 +12236,12 @@ } } }, + "seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=", + "dev": true + }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -10442,6 +12289,12 @@ } } }, + "serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", + "dev": true + }, "serialize-javascript": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", @@ -10493,6 +12346,16 @@ "safe-buffer": "^5.0.1" } }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -10524,6 +12387,12 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true + }, "sisteransi": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", @@ -10536,6 +12405,12 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -10718,6 +12593,15 @@ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -10764,12 +12648,188 @@ "figgy-pudding": "^3.5.1" } }, + "stack-chain": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz", + "integrity": "sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==", + "dev": true + }, + "stack-generator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.4.tgz", + "integrity": "sha512-ha1gosTNcgxwzo9uKTQ8zZ49aUp5FIUW58YHFxCqaAHtE0XqBg0chGFYA1MfmW//x1KWq3F4G7Ug7bJh4RiRtg==", + "dev": true, + "requires": { + "stackframe": "^1.1.0" + } + }, "stack-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", "dev": true }, + "stackframe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.0.tgz", + "integrity": "sha512-Vx6W1Yvy+AM1R/ckVwcHQHV147pTPBKWCRLrXMuPrFVfvBUc3os7PR1QLIWCMhPpRg5eX9ojzbQIMLGBwyLjqg==", + "dev": true + }, + "stacktrace-gps": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.3.tgz", + "integrity": "sha512-51Rr7dXkyFUKNmhY/vqZWK+EvdsfFSRiQVtgHTFlAdNIYaDD7bVh21yBHXaNWAvTD+w+QSjxHg7/v6Tz4veExA==", + "dev": true, + "requires": { + "source-map": "0.5.6", + "stackframe": "^1.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + } + } + }, + "stacktrace-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.1.tgz", + "integrity": "sha512-13oDNgBSeWtdGa4/2BycNyKqe+VktCoJ8VLx4pDoJkwGGJVtiHdfMOAj3aW9xTi8oR2v34z9IcvfCvT6XNdNAw==", + "dev": true, + "requires": { + "error-stack-parser": "^2.0.4", + "stack-generator": "^2.0.4", + "stacktrace-gps": "^3.0.3" + } + }, + "start-server-and-test": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.6.tgz", + "integrity": "sha512-Gr/TDePT4JczaoBiKZLZRIWmYgRcoGcFQePtPEHEvZFUuxbdUqTZozx8dqrlKl/67+pipg5OOtBH21U1oJXJIQ==", + "dev": true, + "requires": { + "bluebird": "3.7.1", + "check-more-types": "2.24.0", + "debug": "4.1.1", + "execa": "2.1.0", + "lazy-ass": "1.6.0", + "ps-tree": "1.2.0", + "wait-on": "3.3.0" + }, + "dependencies": { + "bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -10809,6 +12869,25 @@ "readable-stream": "^2.0.2" } }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "~0.1.1" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -10835,11 +12914,33 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-to-observable": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", + "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", + "dev": true + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, + "string-argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", + "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "dev": true + }, "string-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", @@ -10958,6 +13059,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "style-loader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", @@ -11077,6 +13184,23 @@ "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -11085,12 +13209,27 @@ "has-flag": "^3.0.0" } }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -11247,12 +13386,42 @@ "require-main-filename": "^2.0.0" } }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "throat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -11270,6 +13439,25 @@ "setimmediate": "^1.0.4" } }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -11393,6 +13581,12 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.1.tgz", "integrity": "sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==" }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -11402,6 +13596,12 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "typed-styles": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz", @@ -11446,6 +13646,12 @@ } } }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, "uncontrollable": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.0.2.tgz", @@ -11471,6 +13677,19 @@ } } }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, "unfetch": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.1.0.tgz", @@ -11532,6 +13751,12 @@ "imurmurhash": "^0.1.4" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -11578,6 +13803,12 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -11659,6 +13890,12 @@ "inherits": "2.0.3" } }, + "util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha1-WdAa8f2z/t4KxOYysKtfbOl8kzA=", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11718,6 +13955,27 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-on": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", + "minimist": "^1.2.0", + "request": "^2.88.0", + "rx": "^4.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -11735,6 +13993,21 @@ "loose-envify": "^1.0.0" } }, + "watchify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz", + "integrity": "sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "browserify": "^16.1.0", + "chokidar": "^2.1.1", + "defined": "^1.0.0", + "outpipe": "^1.1.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, "watchpack": { "version": "2.0.0-beta.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.0-beta.5.tgz", @@ -12154,6 +14427,27 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + }, + "dependencies": { + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + } + } } } } diff --git a/frontend/package.json b/frontend/package.json index 0918b5962..17ac6bd5a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -8,6 +8,16 @@ "dev": "next", "build": "next build", "start": "next start", + "e2e:test": "npm start & cypress run", + "e2e": "cypress run", + "e2e:chrome": "cypress run --browser chrome", + "e2e:record": "cypress run --record", + "e2e:record:parallel": "cypress run --record --parallel", + "cy:verify": "cypress verify", + "cy:version": "cypress version", + "cy:open": "cypress open", + "cy:run": "cypress run", + "test:ci": "start-server-and-test start:dev 3000 cy:run", "start:dev": "env WAMP_NEAR_EXPLORER_URL=wss://near-explorer-wamp.onrender.com/ws next" }, "repository": { @@ -53,6 +63,10 @@ "postcss-url": "^8.0.0", "react-test-renderer": "^16.10.2", "typescript": "^3.6.3", - "url-loader": "^1.1.2" + "url-loader": "^1.1.2", + "wait-on": "^3.3.0", + "cypress": "^3.4.1", + "cypress-cucumber-preprocessor": "^1.16.0", + "start-server-and-test": "^1.10.2" } } From 31aeb469a97f9d88b7dbb2b00eee60ab26b368c6 Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Fri, 18 Oct 2019 14:48:42 +0300 Subject: [PATCH 2/7] Fixed actions ordering --- .../dashboard/DashboardTransactions.jsx | 6 +- .../components/transactions/ActionsList.tsx | 31 +- .../components/transactions/Transactions.tsx | 24 +- .../transactions/TransactionsList.tsx | 30 +- .../__tests__/ActionsList.test.tsx | 23 + .../__tests__/TransactionsList.test.tsx | 19 + .../__snapshots__/ActionsList.test.tsx.snap | 654 +++++++++++++++++- .../TransactionsList.test.tsx.snap | 442 +++++++++++- .../transactions/__tests__/common.tsx | 41 +- .../libraries/explorer-wamp/transactions.ts | 19 +- frontend/src/pages/accounts/[id].jsx | 2 +- frontend/src/pages/transactions/index.jsx | 2 +- 12 files changed, 1247 insertions(+), 46 deletions(-) diff --git a/frontend/src/components/dashboard/DashboardTransactions.jsx b/frontend/src/components/dashboard/DashboardTransactions.jsx index 4b990a4c6..5f65ea8c6 100644 --- a/frontend/src/components/dashboard/DashboardTransactions.jsx +++ b/frontend/src/components/dashboard/DashboardTransactions.jsx @@ -24,7 +24,11 @@ export default ({ transactions }) => ( - + diff --git a/frontend/src/components/transactions/ActionsList.tsx b/frontend/src/components/transactions/ActionsList.tsx index 3005bf3be..fda998eee 100644 --- a/frontend/src/components/transactions/ActionsList.tsx +++ b/frontend/src/components/transactions/ActionsList.tsx @@ -3,20 +3,25 @@ import * as T from "../../libraries/explorer-wamp/transactions"; import ActionRow, { ViewMode } from "./ActionRow"; export interface Props { - actions: T.Action[]; + actions: (T.Action | keyof T.Action)[]; transaction: T.Transaction; viewMode?: ViewMode; + reversed?: boolean; } -export default ({ actions, transaction, viewMode }: Props) => ( - <> - {actions.map((action, actionIndex) => ( - - ))} - -); +export default ({ actions, transaction, viewMode, reversed }: Props) => { + let actionRows = actions.map((action, actionIndex) => ( + + )); + + if (reversed) { + actionRows.reverse(); + } + + return <>{actionRows}; +}; diff --git a/frontend/src/components/transactions/Transactions.tsx b/frontend/src/components/transactions/Transactions.tsx index 07a81c76f..9907dda2e 100644 --- a/frontend/src/components/transactions/Transactions.tsx +++ b/frontend/src/components/transactions/Transactions.tsx @@ -7,6 +7,8 @@ import TransactionsList from "./TransactionsList"; export interface Props { accountId?: string; blockHash?: string; + reversed: boolean; + limit: number; } export interface State { @@ -14,6 +16,11 @@ export interface State { } export default class extends React.PureComponent { + static defaultProps = { + reversed: false, + limit: 50 + }; + state: State = { transactions: null }; @@ -22,8 +29,10 @@ export default class extends React.PureComponent { this.fetchTransactions(); } - componentDidUpdate() { - this.fetchTransactions(); + componentDidUpdate(prevProps: Props) { + if (this.props !== prevProps) { + this.fetchTransactions(); + } } render() { @@ -31,14 +40,21 @@ export default class extends React.PureComponent { if (transactions === null) { return null; } - return ; + return ( + + ); } fetchTransactions = async () => { const transactions = await TransactionsApi.getTransactions({ signerId: this.props.accountId, receiverId: this.props.accountId, - blockHash: this.props.blockHash + blockHash: this.props.blockHash, + reversed: this.props.reversed, + limit: this.props.limit }); this.setState({ transactions }); }; diff --git a/frontend/src/components/transactions/TransactionsList.tsx b/frontend/src/components/transactions/TransactionsList.tsx index 11203a358..81676fc3f 100644 --- a/frontend/src/components/transactions/TransactionsList.tsx +++ b/frontend/src/components/transactions/TransactionsList.tsx @@ -6,19 +6,23 @@ import { ViewMode } from "./ActionRow"; export interface Props { transactions: T.Transaction[]; viewMode?: ViewMode; + reversed?: boolean; } -export default ({ transactions, viewMode }: Props) => { - return ( - <> - {transactions.map(transaction => ( - - ))} - - ); +export default ({ transactions, viewMode, reversed }: Props) => { + let actions = transactions.map(transaction => ( + + )); + + if (reversed) { + actions.reverse(); + } + + return <>{actions}; }; diff --git a/frontend/src/components/transactions/__tests__/ActionsList.test.tsx b/frontend/src/components/transactions/__tests__/ActionsList.test.tsx index 76c82d327..5963eff17 100644 --- a/frontend/src/components/transactions/__tests__/ActionsList.test.tsx +++ b/frontend/src/components/transactions/__tests__/ActionsList.test.tsx @@ -27,4 +27,27 @@ describe("", () => { ) ).toMatchSnapshot(); }); + + it("renders reversed", () => { + expect( + JSON.stringify( + renderer.create( + + ) + ) + ).toEqual( + JSON.stringify( + renderer.create( + + ) + ) + ); + }); }); diff --git a/frontend/src/components/transactions/__tests__/TransactionsList.test.tsx b/frontend/src/components/transactions/__tests__/TransactionsList.test.tsx index 9cb53f61d..16d76ba25 100644 --- a/frontend/src/components/transactions/__tests__/TransactionsList.test.tsx +++ b/frontend/src/components/transactions/__tests__/TransactionsList.test.tsx @@ -10,4 +10,23 @@ describe("", () => { renderer.create() ).toMatchSnapshot(); }); + + it("renders reversed", () => { + const reversedTransactions = TRANSACTIONS.map(transaction => { + return { ...transaction, actions: [...transaction.actions].reverse() }; + }).reverse(); + expect( + JSON.stringify( + renderer.create( + + ) + ) + ).toEqual( + JSON.stringify( + renderer.create( + + ) + ) + ); + }); }); diff --git a/frontend/src/components/transactions/__tests__/__snapshots__/ActionsList.test.tsx.snap b/frontend/src/components/transactions/__tests__/__snapshots__/ActionsList.test.tsx.snap index 6fd341e68..026714c18 100644 --- a/frontend/src/components/transactions/__tests__/__snapshots__/ActionsList.test.tsx.snap +++ b/frontend/src/components/transactions/__tests__/__snapshots__/ActionsList.test.tsx.snap @@ -1,5 +1,655 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[` renders compact 1`] = `null`; +exports[` renders compact 1`] = ` +Array [ +
+
+
+ + + +
+
+
+
+
+
+
+ New account created: + + @receiver.test + +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +
+
+
+ + + +
+
+
+
+
+
+
+ Transferred 10.00000 Ⓝ to + + @receiver.test + +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +
+
+
+ + + +
+
+
+
+
+
+
+ New key added for + + @receiver.test + + : ed25519:8LXEySy... +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +] +`; -exports[` renders sparsely by default 1`] = `null`; +exports[` renders sparsely by default 1`] = ` +Array [ +
+
+
+ + + +
+ +
+
+
+
+
+
+ New account created: + + @receiver.test + +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +
+
+
+ + + +
+ +
+
+
+
+
+
+ Transferred 10.00000 Ⓝ to + + @receiver.test + +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +
+
+
+ + + +
+ +
+
+
+
+
+
+ New key added for + + @receiver.test + + : ed25519:8LXEySy... +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +] +`; diff --git a/frontend/src/components/transactions/__tests__/__snapshots__/TransactionsList.test.tsx.snap b/frontend/src/components/transactions/__tests__/__snapshots__/TransactionsList.test.tsx.snap index db418f2b8..38f1a9e06 100644 --- a/frontend/src/components/transactions/__tests__/__snapshots__/TransactionsList.test.tsx.snap +++ b/frontend/src/components/transactions/__tests__/__snapshots__/TransactionsList.test.tsx.snap @@ -1,3 +1,443 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[` renders 1`] = `null`; +exports[` renders 1`] = ` +Array [ +
+
+
+ + + +
+ +
+
+
+
+
+
+ New account created: + + @receiver.test + +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +
+
+
+ + + +
+ +
+
+
+
+
+
+ Transferred 10.00000 Ⓝ to + + @receiver.test + +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +
+
+
+ + + +
+ +
+
+
+
+
+
+ New key added for + + @receiver.test + + : ed25519:8LXEySy... +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +
+
+
+ + + +
+ +
+
+
+
+
+
+ Called method in contract: + + @receiver2.test + +
+
+
+ +
+
+
+ +
+
+ + Completed + + + + 1s ago + +
+
+
+
+
+
, +] +`; diff --git a/frontend/src/components/transactions/__tests__/common.tsx b/frontend/src/components/transactions/__tests__/common.tsx index 0b03c3547..1f3960c91 100644 --- a/frontend/src/components/transactions/__tests__/common.tsx +++ b/frontend/src/components/transactions/__tests__/common.tsx @@ -1,4 +1,6 @@ -export const TRANSACTIONS = [ +import * as T from "../../../libraries/explorer-wamp/transactions"; + +export const TRANSACTIONS: T.Transaction[] = [ { hash: "BvJeW6gnFjkCBKCsRNEBrRLDQCFZNxLAi6uXzmLaVrrj", signerId: "signer.test", @@ -6,6 +8,41 @@ export const TRANSACTIONS = [ status: "Completed", blockHash: "BvJeW6gnFjkCBKCsRNEBrRLDQCFZNxLAi6uXzmLaVrrj", blockTimestamp: +new Date(2019, 1, 1), - actions: [] + actions: [ + "CreateAccount" as keyof T.Action, + { + Transfer: { + deposit: "10000000000000000000" + } as T.Transfer + } as T.Action, + { + AddKey: { + access_key: { + nonce: 0, + permission: "FullAccess" + }, + public_key: "ed25519:8LXEySyBYewiTTLxjfF1TKDsxxxxxxxxxxxxxxxxxx" + } as T.AddKey + } as T.Action + ] + }, + + { + hash: "222eW6gnFjkCBKCsRNEBrRLDQCFZNxLAi6uXzmLaVrrj", + signerId: "signer2.test", + receiverId: "receiver2.test", + status: "Completed", + blockHash: "222BBBgnFjkCBKCsRNEBrRLDQCFZNxLAi6uXzmLaVrrj", + blockTimestamp: +new Date(2019, 1, 1), + actions: [ + { + FunctionCall: { + args: "eyJ0ZXh0Ijoid2hlbiBpY28/In0=", + deposit: "0", + gas: 2000000, + method_name: "addMessage" + } + } as T.Action + ] } ]; diff --git a/frontend/src/libraries/explorer-wamp/transactions.ts b/frontend/src/libraries/explorer-wamp/transactions.ts index 21b1e6bbf..7750fab5e 100644 --- a/frontend/src/libraries/explorer-wamp/transactions.ts +++ b/frontend/src/libraries/explorer-wamp/transactions.ts @@ -15,7 +15,12 @@ export interface DeleteAccount {} export interface DeployContract {} -export interface FunctionCall {} +export interface FunctionCall { + args: string; + deposit: string; + gas: number; + method_name: string; +} export interface Transfer { deposit: string; @@ -51,7 +56,7 @@ interface StringActions { } export interface Actions { - actions: Action[]; + actions: (Action | keyof Action)[]; } export type Transaction = TransactionInfo & Actions; @@ -61,7 +66,8 @@ export interface FilterArgs { receiverId?: string; transactionHash?: string; blockHash?: string; - limit?: number; + reversed?: boolean; + limit: number; } export async function getTransactions( @@ -81,9 +87,6 @@ export async function getTransactions( if (blockHash) { whereClause.push(`transactions.block_hash = :blockHash`); } - if (!filters.limit) { - filters.limit = 10; - } try { const transactions = await call< (TransactionInfo & (StringActions | Actions))[] @@ -92,7 +95,7 @@ export async function getTransactions( FROM transactions LEFT JOIN blocks ON blocks.hash = transactions.block_hash ${whereClause.length > 0 ? `WHERE ${whereClause.join(" OR ")}` : ""} - ORDER BY blocks.height DESC + ORDER BY blocks.height ${filters.reversed ? "DESC" : ""} LIMIT :limit`, filters ]); @@ -113,7 +116,7 @@ export async function getTransactions( } export async function getLatestTransactionsInfo(): Promise { - return getTransactions({}); + return getTransactions({ reversed: true, limit: 10 }); } export async function getTransactionInfo( diff --git a/frontend/src/pages/accounts/[id].jsx b/frontend/src/pages/accounts/[id].jsx index 6a9efc2a5..3ec07f830 100644 --- a/frontend/src/pages/accounts/[id].jsx +++ b/frontend/src/pages/accounts/[id].jsx @@ -37,7 +37,7 @@ export default class extends React.Component { icon={} title={

Transactions

} > - + ); diff --git a/frontend/src/pages/transactions/index.jsx b/frontend/src/pages/transactions/index.jsx index 83a8a301d..6864783a7 100644 --- a/frontend/src/pages/transactions/index.jsx +++ b/frontend/src/pages/transactions/index.jsx @@ -11,7 +11,7 @@ export default class extends React.Component { Near Explorer | Transactions Transactions}> - + ); From 36a6ba63bb7ebf51959148abca0d99fb51992385 Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Mon, 21 Oct 2019 23:12:18 +0300 Subject: [PATCH 3/7] Implemented Transaction Details Page (#109) --- .gitignore | 3 + backend/src/wamp.js | 4 + .../components/transactions/ReceiptRow.tsx | 101 +++++++++ .../components/transactions/ReceiptsList.tsx | 15 ++ .../transactions/TransactionDetails.tsx | 92 ++++++++ .../__tests__/ReceiptRow.test.tsx | 15 ++ .../__tests__/ReceiptsList.test.tsx | 15 ++ .../__tests__/TransactionDetails.test.tsx | 13 ++ .../__snapshots__/ReceiptRow.test.tsx.snap | 60 +++++ .../__snapshots__/ReceiptsList.test.tsx.snap | 178 +++++++++++++++ .../TransactionDetails.test.tsx.snap | 209 ++++++++++++++++++ .../transactions/__tests__/common.tsx | 32 ++- .../libraries/explorer-wamp/transactions.ts | 38 +++- frontend/src/pages/transactions/[hash].jsx | 48 +++- 14 files changed, 818 insertions(+), 5 deletions(-) create mode 100644 frontend/src/components/transactions/ReceiptRow.tsx create mode 100644 frontend/src/components/transactions/ReceiptsList.tsx create mode 100644 frontend/src/components/transactions/TransactionDetails.tsx create mode 100644 frontend/src/components/transactions/__tests__/ReceiptRow.test.tsx create mode 100644 frontend/src/components/transactions/__tests__/ReceiptsList.test.tsx create mode 100644 frontend/src/components/transactions/__tests__/TransactionDetails.test.tsx create mode 100644 frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap create mode 100644 frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap create mode 100644 frontend/src/components/transactions/__tests__/__snapshots__/TransactionDetails.test.tsx.snap diff --git a/.gitignore b/.gitignore index 476f8843c..df2de66a2 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,6 @@ typings/ # backend ignores backend/db + +# frontend ignores +frontend/cypress/videos diff --git a/backend/src/wamp.js b/backend/src/wamp.js index 9d75ea1e2..9958ced04 100644 --- a/backend/src/wamp.js +++ b/backend/src/wamp.js @@ -33,6 +33,10 @@ wampHandlers["nearcore-query"] = async ([path, data]) => { return await nearRpc.query(path, data); }; +wampHandlers["nearcore-tx"] = async ([transactionHash]) => { + return await nearRpc.sendJsonRpc("tx", [transactionHash]); +}; + function setupWamp() { const wamp = new autobahn.Connection({ realm: "near-explorer", diff --git a/frontend/src/components/transactions/ReceiptRow.tsx b/frontend/src/components/transactions/ReceiptRow.tsx new file mode 100644 index 000000000..9fa93cd25 --- /dev/null +++ b/frontend/src/components/transactions/ReceiptRow.tsx @@ -0,0 +1,101 @@ +import React from "react"; +import { Row, Col } from "react-bootstrap"; + +import * as T from "../../libraries/explorer-wamp/transactions"; + +export interface Props { + receipt: T.Receipt; +} + +export interface State {} + +export default class extends React.Component { + render() { + const { receipt } = this.props; + + return ( + + + + + + + {receipt.result.result === null ? ( + "No result" + ) : receipt.result.result.length === 0 ? ( + "Empty result" + ) : ( + <> + Result:
{receipt.result.result}
+ + )} + +
+ + + {receipt.result.logs.length === 0 ? ( + "No logs" + ) : ( +
{receipt.result.logs.join("\n")}
+ )} + +
+ + + + + {`${receipt.hash.substr(0, 7)}...`} + + + + + {receipt.result.status} + + + +
+ + +
+ ); + } +} diff --git a/frontend/src/components/transactions/ReceiptsList.tsx b/frontend/src/components/transactions/ReceiptsList.tsx new file mode 100644 index 000000000..b8b8b8b9c --- /dev/null +++ b/frontend/src/components/transactions/ReceiptsList.tsx @@ -0,0 +1,15 @@ +import * as T from "../../libraries/explorer-wamp/transactions"; + +import ReceiptRow from "./ReceiptRow"; + +export interface Props { + receipts: T.Receipt[]; +} + +export default ({ receipts }: Props) => ( + <> + {receipts.map(receipt => ( + + ))} + +); diff --git a/frontend/src/components/transactions/TransactionDetails.tsx b/frontend/src/components/transactions/TransactionDetails.tsx new file mode 100644 index 000000000..c7e1a7280 --- /dev/null +++ b/frontend/src/components/transactions/TransactionDetails.tsx @@ -0,0 +1,92 @@ +import { Row, Col } from "react-bootstrap"; + +import { Transaction } from "../../libraries/explorer-wamp/transactions"; +import moment from "../../libraries/moment"; + +import AccountLink from "../utils/AccountLink"; +import BlockLink from "../utils/BlockLink"; +import CardCell from "../utils/CardCell"; + +export interface Props { + transaction: Transaction; +} + +export default ({ transaction }: Props) => { + return ( +
+ + + } + className="border-0" + /> + + + } + /> + + + + + + + + + + + + + + + + + {transaction.blockHash} + + } + className="transaction-card-block-hash border-0" + /> + + + +
+ ); +}; diff --git a/frontend/src/components/transactions/__tests__/ReceiptRow.test.tsx b/frontend/src/components/transactions/__tests__/ReceiptRow.test.tsx new file mode 100644 index 000000000..cd951848f --- /dev/null +++ b/frontend/src/components/transactions/__tests__/ReceiptRow.test.tsx @@ -0,0 +1,15 @@ +import renderer from "react-test-renderer"; + +import ReceiptRow from "../ReceiptRow"; + +import { TRANSACTIONS } from "./common"; + +describe("", () => { + it("renders", () => { + expect( + renderer.create( + + ) + ).toMatchSnapshot(); + }); +}); diff --git a/frontend/src/components/transactions/__tests__/ReceiptsList.test.tsx b/frontend/src/components/transactions/__tests__/ReceiptsList.test.tsx new file mode 100644 index 000000000..a4a701d33 --- /dev/null +++ b/frontend/src/components/transactions/__tests__/ReceiptsList.test.tsx @@ -0,0 +1,15 @@ +import renderer from "react-test-renderer"; + +import ReceiptsList from "../ReceiptsList"; + +import { TRANSACTIONS } from "./common"; + +describe("", () => { + it("renders", () => { + expect( + renderer.create( + + ) + ).toMatchSnapshot(); + }); +}); diff --git a/frontend/src/components/transactions/__tests__/TransactionDetails.test.tsx b/frontend/src/components/transactions/__tests__/TransactionDetails.test.tsx new file mode 100644 index 000000000..98c79510f --- /dev/null +++ b/frontend/src/components/transactions/__tests__/TransactionDetails.test.tsx @@ -0,0 +1,13 @@ +import renderer from "react-test-renderer"; + +import TransactionDetails from "../TransactionDetails"; + +import { TRANSACTIONS } from "./common"; + +describe("", () => { + it("renders", () => { + expect( + renderer.create() + ).toMatchSnapshot(); + }); +}); diff --git a/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap new file mode 100644 index 000000000..c345032dc --- /dev/null +++ b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap @@ -0,0 +1,60 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` renders 1`] = ` +
+
+
+
+
+
+ No result +
+
+
+
+ No logs +
+
+
+
+
+
+ 9uZxS2c... +
+
+
+
+ Completed +
+
+
+
+
+
+`; diff --git a/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap new file mode 100644 index 000000000..88847a2c7 --- /dev/null +++ b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap @@ -0,0 +1,178 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` renders 1`] = ` +Array [ +
+
+
+
+
+
+ No result +
+
+
+
+ No logs +
+
+
+
+
+
+ 9uZxS2c... +
+
+
+
+ Completed +
+
+
+
+
+
, +
+
+
+
+
+
+ Empty result +
+
+
+
+
+                LOG: Counter is now: 1
+              
+
+
+
+
+
+
+ A8HaLh5... +
+
+
+
+ Completed +
+
+
+
+
+
, +
+
+
+
+
+
+ Empty result +
+
+
+
+ No logs +
+
+
+
+
+
+ A5oSQ6z... +
+
+
+
+ Completed +
+
+
+
+
+
, +] +`; diff --git a/frontend/src/components/transactions/__tests__/__snapshots__/TransactionDetails.test.tsx.snap b/frontend/src/components/transactions/__tests__/__snapshots__/TransactionDetails.test.tsx.snap new file mode 100644 index 000000000..32c84e81c --- /dev/null +++ b/frontend/src/components/transactions/__tests__/__snapshots__/TransactionDetails.test.tsx.snap @@ -0,0 +1,209 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` renders 1`] = ` +
+
+
+
+
+
+
+ + Signed by +
+ +
+
+
+
+
+
+
+
+
+ + Receiver +
+ +
+
+
+
+
+
+
+
+
+ + Status +
+
+ Completed +
+
+
+
+
+
+
+
+
+
+
+
+ Created +
+
+ February 01, 2019 at 12:00:00am +
+
+
+
+
+
+
+
+
+
+ Hash +
+
+ BvJeW6gnFjkCBKCsRNEBrRLDQCFZNxLAi6uXzmLaVrrj +
+
+
+
+
+
+
+
+ +
+
+
+`; diff --git a/frontend/src/components/transactions/__tests__/common.tsx b/frontend/src/components/transactions/__tests__/common.tsx index 1f3960c91..cdc91f0cf 100644 --- a/frontend/src/components/transactions/__tests__/common.tsx +++ b/frontend/src/components/transactions/__tests__/common.tsx @@ -24,6 +24,35 @@ export const TRANSACTIONS: T.Transaction[] = [ public_key: "ed25519:8LXEySyBYewiTTLxjfF1TKDsxxxxxxxxxxxxxxxxxx" } as T.AddKey } as T.Action + ], + receipts: [ + { + hash: "9uZxS2cuZv7yphcidRiwNqDayMxcVRE1zHkAmwrHr1vs", + result: { + logs: [], + receipts: ["A8HaLh5pzaeuiq4VVnmgghT6RzCRuiNftkJCZmVQvN3v"], + result: null, + status: "Completed" + } + }, + { + hash: "A8HaLh5pzaeuiq4VVnmgghT6RzCRuiNftkJCZmVQvN3v", + result: { + logs: ["LOG: Counter is now: 1"], + receipts: ["A5oSQ6z71zWi3X1KFy9xhNzyjj8bQx4wwboWUMnK3dgp"], + result: "", + status: "Completed" + } + }, + { + hash: "A5oSQ6z71zWi3X1KFy9xhNzyjj8bQx4wwboWUMnK3dgp", + result: { + logs: [], + receipts: [], + result: "", + status: "Completed" + } + } ] }, @@ -43,6 +72,7 @@ export const TRANSACTIONS: T.Transaction[] = [ method_name: "addMessage" } } as T.Action - ] + ], + receipts: [] } ]; diff --git a/frontend/src/libraries/explorer-wamp/transactions.ts b/frontend/src/libraries/explorer-wamp/transactions.ts index 7750fab5e..aa7faae8a 100644 --- a/frontend/src/libraries/explorer-wamp/transactions.ts +++ b/frontend/src/libraries/explorer-wamp/transactions.ts @@ -59,7 +59,23 @@ export interface Actions { actions: (Action | keyof Action)[]; } -export type Transaction = TransactionInfo & Actions; +export interface ReceiptResult { + logs: string[]; + receipts: string[]; + result: string | null; + status: "Completed"; +} + +export interface Receipt { + hash: string; + result: ReceiptResult; +} + +export interface Receipts { + receipts?: Receipt[]; +} + +export type Transaction = TransactionInfo & Actions & Receipts; export interface FilterArgs { signerId?: string; @@ -122,5 +138,23 @@ export async function getLatestTransactionsInfo(): Promise { export async function getTransactionInfo( transactionHash: string ): Promise { - return (await getTransactions({ transactionHash, limit: 1 }))[0] || null; + try { + const [transactionInfo, transactionExtraInfo] = await Promise.all([ + getTransactions({ transactionHash, limit: 1 }).then(it => it[0] || null), + call(".nearcore-tx", [transactionHash]) + ]); + + if (transactionInfo === null) { + return null; + } + const transaction = transactionInfo; + transaction.receipts = transactionExtraInfo.transactions as Receipt[]; + return transaction; + } catch (error) { + console.error( + "Transactions.getTransactionInfo failed to fetch data due to:" + ); + console.error(error); + throw error; + } } diff --git a/frontend/src/pages/transactions/[hash].jsx b/frontend/src/pages/transactions/[hash].jsx index a18abb063..fe42dfa78 100644 --- a/frontend/src/pages/transactions/[hash].jsx +++ b/frontend/src/pages/transactions/[hash].jsx @@ -1,16 +1,60 @@ import Head from "next/head"; +import React from "react"; + +import TransactionIcon from "../../../public/static/images/icon-t-transactions.svg"; + +import * as TransactionApi from "../../libraries/explorer-wamp/transactions"; + +import ActionsList from "../../components/transactions/ActionsList"; +import ReceiptsList from "../../components/transactions/ReceiptsList"; +import TransactionDetails from "../../components/transactions/TransactionDetails"; +import Content from "../../components/utils/Content"; + export default class extends React.Component { static async getInitialProps({ query: { hash } }) { - return { hash }; + try { + return await TransactionApi.getTransactionInfo(hash); + } catch (err) { + return { hash, err }; + } } render() { + const { hash } = this.props; return ( <> - Near Explorer | Transactions + Near Explorer | Transaction + {`Transaction: ${hash.substring(0, 7)}...${hash.substring( + hash.length - 4 + )}`} + } + border={false} + > + {this.props.err ? ( + `Information is not available at the moment. Please, check if the transaction hash is correct or try later.` + ) : ( + + )} + + } + title={

Actions

} + > + +
+ } + title={

Receipts

} + > + +
); } From fc41087f944790e01a4fd1a02de1600f5c1ea59c Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Wed, 23 Oct 2019 01:15:44 +0300 Subject: [PATCH 4/7] Fixed the double-reversed ordering issue on the Transactions list page --- frontend/src/components/transactions/Transactions.tsx | 2 +- frontend/src/libraries/explorer-wamp/transactions.ts | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/transactions/Transactions.tsx b/frontend/src/components/transactions/Transactions.tsx index 9907dda2e..d53e5d225 100644 --- a/frontend/src/components/transactions/Transactions.tsx +++ b/frontend/src/components/transactions/Transactions.tsx @@ -53,7 +53,7 @@ export default class extends React.PureComponent { signerId: this.props.accountId, receiverId: this.props.accountId, blockHash: this.props.blockHash, - reversed: this.props.reversed, + tail: this.props.reversed, limit: this.props.limit }); this.setState({ transactions }); diff --git a/frontend/src/libraries/explorer-wamp/transactions.ts b/frontend/src/libraries/explorer-wamp/transactions.ts index aa7faae8a..bb05d342a 100644 --- a/frontend/src/libraries/explorer-wamp/transactions.ts +++ b/frontend/src/libraries/explorer-wamp/transactions.ts @@ -82,7 +82,7 @@ export interface FilterArgs { receiverId?: string; transactionHash?: string; blockHash?: string; - reversed?: boolean; + tail?: boolean; limit: number; } @@ -111,10 +111,13 @@ export async function getTransactions( FROM transactions LEFT JOIN blocks ON blocks.hash = transactions.block_hash ${whereClause.length > 0 ? `WHERE ${whereClause.join(" OR ")}` : ""} - ORDER BY blocks.height ${filters.reversed ? "DESC" : ""} + ORDER BY blocks.height ${filters.tail ? "DESC" : ""} LIMIT :limit`, filters ]); + if (filters.tail) { + transactions.reverse(); + } transactions.forEach(transaction => { transaction.status = "Completed"; try { @@ -132,7 +135,7 @@ export async function getTransactions( } export async function getLatestTransactionsInfo(): Promise { - return getTransactions({ reversed: true, limit: 10 }); + return getTransactions({ tail: true, limit: 10 }); } export async function getTransactionInfo( From 371ac82f247e205564b5ffedcee0522e8e7470ac Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Sun, 27 Oct 2019 09:21:18 +0200 Subject: [PATCH 5/7] Resolved the compatibility issues with nearcore 0.4 (resolves #115) --- backend/src/sync.js | 24 ++++++++- .../components/accounts/AccountDetails.tsx | 8 +-- .../__tests__/AccountDetails.test.tsx | 2 +- .../AccountDetails.test.tsx.snap | 6 +-- .../components/transactions/ReceiptRow.tsx | 53 ++++++++++++------- .../components/transactions/ReceiptsList.tsx | 2 +- .../__snapshots__/ReceiptRow.test.tsx.snap | 9 ---- .../__snapshots__/ReceiptsList.test.tsx.snap | 29 +--------- .../transactions/__tests__/common.tsx | 33 ++++++------ .../src/libraries/explorer-wamp/accounts.ts | 4 +- .../src/libraries/explorer-wamp/blocks.js | 7 ++- .../libraries/explorer-wamp/transactions.ts | 36 +++++++++---- frontend/src/pages/blocks/[hash].jsx | 32 +++++++---- frontend/src/pages/transactions/[hash].jsx | 35 +++++++----- 14 files changed, 160 insertions(+), 120 deletions(-) diff --git a/backend/src/sync.js b/backend/src/sync.js index 06d9c96f6..1adfd538b 100644 --- a/backend/src/sync.js +++ b/backend/src/sync.js @@ -128,7 +128,29 @@ async function saveBlocksFromRequests(requests) { return [blockResult.value]; }); - return await saveBlocks(blocks); + const transactionsByBlock = await Promise.all( + blocks.map(async block => { + try { + const detailedChunks = await Promise.all( + block.chunks.map(chunk => nearRpc.chunk(chunk.chunk_hash)) + ); + return detailedChunks.map(chunk => chunk.transactions); + } catch (error) { + throw error; + return null; + } + }) + ); + + const blocksWithTransactions = blocks.flatMap((block, i) => { + const transactions = transactionsByBlock[i]; + if (transactions === null) { + return []; + } + block.transactions = transactions.flatMap(it => it); + return [block]; + }); + return await saveBlocks(blocksWithTransactions); } async function syncNearcoreBlocks(topBlockHeight, bottomBlockHeight) { diff --git a/frontend/src/components/accounts/AccountDetails.tsx b/frontend/src/components/accounts/AccountDetails.tsx index 0bbe7a76f..eeb2b65fd 100644 --- a/frontend/src/components/accounts/AccountDetails.tsx +++ b/frontend/src/components/accounts/AccountDetails.tsx @@ -37,14 +37,14 @@ export default ({ account }: Props) => { } /> - + } + text={} /> - + ", () => { account={{ id: "account", amount: "1", - staked: "1", + locked: "1", storageUsage: 0, storagePaidAt: 1, inTransactionsCount: 0, diff --git a/frontend/src/components/accounts/__tests__/__snapshots__/AccountDetails.test.tsx.snap b/frontend/src/components/accounts/__tests__/__snapshots__/AccountDetails.test.tsx.snap index 482f56653..e994741aa 100644 --- a/frontend/src/components/accounts/__tests__/__snapshots__/AccountDetails.test.tsx.snap +++ b/frontend/src/components/accounts/__tests__/__snapshots__/AccountDetails.test.tsx.snap @@ -77,7 +77,7 @@ exports[` renders 1`] = `
renders 1`] = ` className="jsx-3005147464 card-cell-title-img" src="/static/images/icon-m-filter.svg" /> - Staked + Locked
renders 1`] = `
{ render() { const { receipt } = this.props; + let statusInfo; + if ("SuccessValue" in (receipt.outcome.status as T.ReceiptSuccessValue)) { + const { SuccessValue } = receipt.outcome.status as T.ReceiptSuccessValue; + if (SuccessValue === null) { + statusInfo = "No result"; + } else if (SuccessValue.length === 0) { + statusInfo = "Empty result"; + } else { + statusInfo = ( + <> + Result: +
{SuccessValue}
+ + ); + } + } else { + if ("Failure" in (receipt.outcome.status as T.ReceiptFailure)) { + const { Failure } = receipt.outcome.status as T.ReceiptFailure; + statusInfo = ( + <> + Failure: +
{JSON.stringify(Failure, null, 2)}
+ + ); + } else { + statusInfo = {receipt.outcome.status}; + } + } + return ( - - {receipt.result.result === null ? ( - "No result" - ) : receipt.result.result.length === 0 ? ( - "Empty result" - ) : ( - <> - Result:
{receipt.result.result}
- - )} - + {statusInfo}
- {receipt.result.logs.length === 0 ? ( + {receipt.outcome.logs.length === 0 ? ( "No logs" ) : ( -
{receipt.result.logs.join("\n")}
+
{receipt.outcome.logs.join("\n")}
)}
@@ -44,12 +63,7 @@ export default class extends React.Component { - {`${receipt.hash.substr(0, 7)}...`} - - - - - {receipt.result.status} + {`${receipt.id.substr(0, 7)}...`} @@ -85,7 +99,6 @@ export default class extends React.Component { font-size: 14px; font-weight: 500; line-height: 1.29; - color: #0072ce; } .receipt-row-status { diff --git a/frontend/src/components/transactions/ReceiptsList.tsx b/frontend/src/components/transactions/ReceiptsList.tsx index b8b8b8b9c..0103c01aa 100644 --- a/frontend/src/components/transactions/ReceiptsList.tsx +++ b/frontend/src/components/transactions/ReceiptsList.tsx @@ -9,7 +9,7 @@ export interface Props { export default ({ receipts }: Props) => ( <> {receipts.map(receipt => ( - + ))} ); diff --git a/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap index c345032dc..9bb23f623 100644 --- a/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap +++ b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptRow.test.tsx.snap @@ -44,15 +44,6 @@ exports[` renders 1`] = ` 9uZxS2c...
-
-
- Completed -
-
diff --git a/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap index 88847a2c7..dff3cbe17 100644 --- a/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap +++ b/frontend/src/components/transactions/__tests__/__snapshots__/ReceiptsList.test.tsx.snap @@ -45,15 +45,6 @@ Array [ 9uZxS2c... -
-
- Completed -
-
@@ -86,7 +77,7 @@ Array [ className="receipt-row-text col" >
                 LOG: Counter is now: 1
               
@@ -105,15 +96,6 @@ Array [ A8HaLh5... -
-
- Completed -
-
@@ -161,15 +143,6 @@ Array [ A5oSQ6z... -
-
- Completed -
-
diff --git a/frontend/src/components/transactions/__tests__/common.tsx b/frontend/src/components/transactions/__tests__/common.tsx index cdc91f0cf..8737ad2b3 100644 --- a/frontend/src/components/transactions/__tests__/common.tsx +++ b/frontend/src/components/transactions/__tests__/common.tsx @@ -27,30 +27,30 @@ export const TRANSACTIONS: T.Transaction[] = [ ], receipts: [ { - hash: "9uZxS2cuZv7yphcidRiwNqDayMxcVRE1zHkAmwrHr1vs", - result: { + id: "9uZxS2cuZv7yphcidRiwNqDayMxcVRE1zHkAmwrHr1vs", + outcome: { logs: [], - receipts: ["A8HaLh5pzaeuiq4VVnmgghT6RzCRuiNftkJCZmVQvN3v"], - result: null, - status: "Completed" + receipt_ids: ["A8HaLh5pzaeuiq4VVnmgghT6RzCRuiNftkJCZmVQvN3v"], + status: { SuccessValue: null }, + gas_burnt: 0 } }, { - hash: "A8HaLh5pzaeuiq4VVnmgghT6RzCRuiNftkJCZmVQvN3v", - result: { + id: "A8HaLh5pzaeuiq4VVnmgghT6RzCRuiNftkJCZmVQvN3v", + outcome: { logs: ["LOG: Counter is now: 1"], - receipts: ["A5oSQ6z71zWi3X1KFy9xhNzyjj8bQx4wwboWUMnK3dgp"], - result: "", - status: "Completed" + receipt_ids: ["A5oSQ6z71zWi3X1KFy9xhNzyjj8bQx4wwboWUMnK3dgp"], + status: { SuccessValue: "" }, + gas_burnt: 0 } }, { - hash: "A5oSQ6z71zWi3X1KFy9xhNzyjj8bQx4wwboWUMnK3dgp", - result: { + id: "A5oSQ6z71zWi3X1KFy9xhNzyjj8bQx4wwboWUMnK3dgp", + outcome: { logs: [], - receipts: [], - result: "", - status: "Completed" + receipt_ids: [], + status: { SuccessValue: "" }, + gas_burnt: 0 } } ] @@ -66,11 +66,12 @@ export const TRANSACTIONS: T.Transaction[] = [ actions: [ { FunctionCall: { + result: "", args: "eyJ0ZXh0Ijoid2hlbiBpY28/In0=", deposit: "0", gas: 2000000, method_name: "addMessage" - } + } as T.FunctionCall } as T.Action ], receipts: [] diff --git a/frontend/src/libraries/explorer-wamp/accounts.ts b/frontend/src/libraries/explorer-wamp/accounts.ts index f36b8dd54..0ec5c971d 100644 --- a/frontend/src/libraries/explorer-wamp/accounts.ts +++ b/frontend/src/libraries/explorer-wamp/accounts.ts @@ -11,7 +11,7 @@ interface AccountStats { interface AccountInfo { amount: string; - staked: string; + locked: string; storageUsage: number; storagePaidAt: number; } @@ -38,7 +38,7 @@ export async function getAccountInfo(id: string): Promise { return { id, amount: accountInfo.amount, - staked: accountInfo.staked, + locked: accountInfo.locked, storageUsage: accountInfo.storage_usage, storagePaidAt: accountInfo.storage_paid_at, ...accountStats[0] diff --git a/frontend/src/libraries/explorer-wamp/blocks.js b/frontend/src/libraries/explorer-wamp/blocks.js index d6b431e0b..f0787fde4 100644 --- a/frontend/src/libraries/explorer-wamp/blocks.js +++ b/frontend/src/libraries/explorer-wamp/blocks.js @@ -73,9 +73,12 @@ export async function getBlockInfo(hash) { { hash } - ]); + ]).then(it => (it[0].hash !== null ? it[0] : null)); - return block[0]; + if (block === null) { + throw new Error("block not found"); + } + return block; } catch (error) { console.error("Blocks.getBlockInfo failed to fetch data due to:"); console.error(error); diff --git a/frontend/src/libraries/explorer-wamp/transactions.ts b/frontend/src/libraries/explorer-wamp/transactions.ts index bb05d342a..c1099aa20 100644 --- a/frontend/src/libraries/explorer-wamp/transactions.ts +++ b/frontend/src/libraries/explorer-wamp/transactions.ts @@ -59,16 +59,26 @@ export interface Actions { actions: (Action | keyof Action)[]; } -export interface ReceiptResult { +export interface ReceiptSuccessValue { + SuccessValue: string | null; +} + +export interface ReceiptFailure { + Failure: any; +} + +export type ReceiptStatus = ReceiptSuccessValue | ReceiptFailure | string; + +export interface ReceiptOutcome { logs: string[]; - receipts: string[]; - result: string | null; - status: "Completed"; + receipt_ids: string[]; + status: ReceiptStatus; + gas_burnt: number; } export interface Receipt { - hash: string; - result: ReceiptResult; + id: string; + outcome: ReceiptOutcome; } export interface Receipts { @@ -142,16 +152,24 @@ export async function getTransactionInfo( transactionHash: string ): Promise { try { - const [transactionInfo, transactionExtraInfo] = await Promise.all([ + let [transactionInfo, transactionExtraInfo] = await Promise.all([ getTransactions({ transactionHash, limit: 1 }).then(it => it[0] || null), call(".nearcore-tx", [transactionHash]) ]); if (transactionInfo === null) { - return null; + transactionInfo = { + status: transactionExtraInfo.status, + hash: transactionExtraInfo.transaction.id, + signerId: "", + receiverId: "", + blockHash: "", + blockTimestamp: 0, + actions: [] + }; } const transaction = transactionInfo; - transaction.receipts = transactionExtraInfo.transactions as Receipt[]; + transaction.receipts = transactionExtraInfo.receipts as Receipt[]; return transaction; } catch (error) { console.error( diff --git a/frontend/src/pages/blocks/[hash].jsx b/frontend/src/pages/blocks/[hash].jsx index 5b0e939e6..2d7199481 100644 --- a/frontend/src/pages/blocks/[hash].jsx +++ b/frontend/src/pages/blocks/[hash].jsx @@ -15,7 +15,7 @@ export default class extends React.Component { try { return await BlockApi.getBlockInfo(hash); } catch (err) { - return {}; + return { hash, err }; } } @@ -26,18 +26,30 @@ export default class extends React.Component { Near Explorer | Block {`Block #${this.props.height}`}} + title={ +

{`Block ${ + this.props.height + ? `#${this.props.height}` + : `${this.props.hash.substring(0, 7)}...` + }`}

+ } border={false} > - -
- } - title={

Transactions

} - > - + {this.props.err ? ( + `Information is not available at the moment. Please, check if the block hash is correct or try later.` + ) : ( + + )}
+ {!this.props.err ? ( + } + title={

Transactions

} + > + +
+ ) : null} ); } diff --git a/frontend/src/pages/transactions/[hash].jsx b/frontend/src/pages/transactions/[hash].jsx index fe42dfa78..b58871d7b 100644 --- a/frontend/src/pages/transactions/[hash].jsx +++ b/frontend/src/pages/transactions/[hash].jsx @@ -41,20 +41,27 @@ export default class extends React.Component { )} - } - title={

Actions

} - > - -
- } - title={

Receipts

} - > - -
+ {this.props.actions && ( + } + title={

Actions

} + > + +
+ )} + {this.props.receipts && ( + } + title={

Receipts

} + > + +
+ )} ); } From 6ef0bd23d7adbba7fdc96c13d040a62e7c69bc49 Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Sun, 27 Oct 2019 09:36:34 +0200 Subject: [PATCH 6/7] Use a non-released version of nearlib with chunks API support (resolves #115) --- backend/package-lock.json | 1077 ++++--------------------------------- backend/package.json | 8 +- 2 files changed, 108 insertions(+), 977 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index e78898b54..41e63e399 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -4,24 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, "@types/bn.js": { "version": "4.11.5", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.5.tgz", @@ -31,9 +13,9 @@ } }, "@types/node": { - "version": "12.6.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.7.tgz", - "integrity": "sha512-Dagl2ASgoIeJCD/HWqgAPIZABYQdNHIUg11wz7JpvXSj0pUlP2ASBNvPp3J14Wmw3PS/NcFFtU1BkdFtz83qvA==" + "version": "12.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", + "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==" }, "abbrev": { "version": "1.1.1", @@ -41,9 +23,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -56,14 +38,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -83,14 +57,6 @@ "readable-stream": "^2.0.6" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -105,9 +71,9 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "asynckit": { "version": "0.4.0", @@ -140,25 +106,15 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base-x": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.6.tgz", - "integrity": "sha512-4PaF8u2+AlViJxRVjurkLTxpp7CaFRD/jo5rPT9ONnKxyhQ8f59yzamEvq7EkriG56yn5On4ONyaG75HLqr46w==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", + "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", "requires": { "safe-buffer": "^5.0.1" } @@ -186,9 +142,9 @@ } }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==" }, "bn.js": { "version": "4.11.8", @@ -221,17 +177,6 @@ "node-gyp-build": "~3.7.0" } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "capability": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/capability/-/capability-0.2.5.tgz", @@ -253,45 +198,10 @@ "nofilter": "^1.0.1" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "cli-color": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", - "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", - "dev": true, - "requires": { - "ansi-regex": "^2.1.1", - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.5" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" }, "cls-bluebird": { "version": "2.1.0", @@ -307,19 +217,6 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -338,68 +235,21 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, - "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, "crypto-js": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=" }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -416,12 +266,6 @@ "ms": "^2.1.1" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -452,11 +296,6 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, "dottie": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", @@ -471,41 +310,6 @@ "safer-buffer": "^2.1.0" } }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "error-polyfill": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/error-polyfill/-/error-polyfill-0.1.2.tgz", @@ -516,90 +320,6 @@ "u3": "^0.1.0" } }, - "es5-ext": { - "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.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -620,15 +340,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -644,23 +355,12 @@ "mime-types": "^2.1.12" } }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs-minipass": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", - "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -681,49 +381,6 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" } }, "getpass": { @@ -735,9 +392,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -747,12 +404,6 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", - "dev": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -767,11 +418,6 @@ "har-schema": "^2.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -815,9 +461,9 @@ } }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "requires": { "minimatch": "^3.0.4" } @@ -846,33 +492,18 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-bluebird": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -884,49 +515,16 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "js-beautify": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.0.tgz", - "integrity": "sha512-OMwf/tPDpE/BLlYKqZOhqWsd3/z2N3KOlyn1wsCRGFwViE8LOQTcDtathQvHvZc+q+zWmcNAbwKSC+iJoMaH2Q==", - "dev": true, - "requires": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "~0.5.1", - "nopt": "~4.0.1" - } - }, "js-sha256": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -955,15 +553,6 @@ "delimit-stream": "0.1.0" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -975,84 +564,10 @@ "verror": "1.10.0" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", - "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" - }, - "lru-cache": { - "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", - "yallist": "^2.1.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "mime-db": { "version": "1.40.0", @@ -1067,12 +582,6 @@ "mime-db": "1.40.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1087,27 +596,20 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" - } } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mkdirp": { @@ -1124,9 +626,9 @@ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { - "version": "0.5.26", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", - "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "version": "0.5.27", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", + "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", "requires": { "moment": ">= 2.9.0" } @@ -1153,8 +655,8 @@ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nearlib": { - "version": "github:nearprotocol/nearlib#ca98e8939c1bd3a8800d98ef425d4bf01c75b27e", - "from": "github:nearprotocol/nearlib#master", + "version": "github:nearprotocol/nearlib#eb4009848e0aa758192cb2b3a840fb0f3d755b1d", + "from": "github:nearprotocol/nearlib#feature/chunk-rpc", "requires": { "@types/bn.js": "^4.11.5", "bn.js": "^4.11.5", @@ -1163,7 +665,6 @@ "http-errors": "^1.7.2", "js-sha256": "^0.9.0", "node-fetch": "^2.3.0", - "tslint": "^5.18.0", "tweetnacl": "^1.0.1", "typescript": "^3.5.1" }, @@ -1195,18 +696,6 @@ } } }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", @@ -1236,9 +725,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -1262,23 +751,14 @@ "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" }, "npm-packlist": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", - "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", + "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -1326,17 +806,6 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -1351,70 +820,11 @@ "os-tmpdir": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1425,32 +835,10 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", - "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" }, "punycode": { "version": "2.1.1", @@ -1502,12 +890,6 @@ "util-deprecate": "~1.0.1" } }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -1535,26 +917,6 @@ "uuid": "^3.3.2" } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", - "requires": { - "path-parse": "^1.0.6" - } - }, "retry-as-promised": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", @@ -1564,9 +926,9 @@ } }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { "glob": "^7.1.3" } @@ -1587,53 +949,30 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "sequelize": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.10.1.tgz", - "integrity": "sha512-wE7jOUABVD9Kr8pAchRqk5quHoqE3tUHfKJ/WdLyZjHx4oMK5YWv1MEiny9DmiOlXOf1JNXwbPL9imSvzFq7aw==", + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.21.1.tgz", + "integrity": "sha512-JI+53MwcClfCFUPJT/l2dDzSpEzWAueyCZus33L/yhJxKTisfdd9OHrUPQ6/dI5nR5eIYT/EafrjkqTAlEQS2w==", "requires": { "bluebird": "^3.5.0", "cls-bluebird": "^2.1.0", "debug": "^4.1.1", "dottie": "^2.0.0", "inflection": "1.12.0", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "moment": "^2.24.0", "moment-timezone": "^0.5.21", - "retry-as-promised": "^3.1.0", - "semver": "^6.1.1", + "retry-as-promised": "^3.2.0", + "semver": "^6.3.0", "sequelize-pool": "^2.3.0", "toposort-class": "^1.0.1", - "uuid": "^3.2.1", + "uuid": "^3.3.3", "validator": "^10.11.0", - "wkx": "^0.4.6" - }, - "dependencies": { - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==" - } - } - }, - "sequelize-cli": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.5.0.tgz", - "integrity": "sha512-twVQ02alCpr2XvxNmpi32C48WZs6xHTH1OFTfTS5Meg3BVqOM8ghiZoml4FITFjlD8sAJSQjlAHTwqTbuolA6Q==", - "dev": true, - "requires": { - "bluebird": "^3.5.3", - "cli-color": "^1.4.0", - "fs-extra": "^7.0.1", - "js-beautify": "^1.8.8", - "lodash": "^4.17.5", - "resolve": "^1.5.0", - "umzug": "^2.1.0", - "yargs": "^13.1.0" + "wkx": "^0.4.8" } }, "sequelize-pool": { @@ -1651,46 +990,20 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, "shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, "sqlite3": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.9.tgz", - "integrity": "sha512-IkvzjmsWQl9BuBiM4xKpl5X8WCR4w0AeJHRdobCdXZ8dT/lNc1XS6WqvY35N6+YzIIgzSBeY5prdFObID9F9tA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.1.0.tgz", + "integrity": "sha512-RvqoKxq+8pDHsJo7aXxsFR18i+dU2Wp5o12qAJOV5LNcDt+fgJsc2QKKg3sIRfXrN9ZjzY1T7SNe/DFVqAXjaw==", "requires": { "nan": "^2.12.1", "node-pre-gyp": "^0.11.0", @@ -1719,14 +1032,13 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -1738,70 +1050,30 @@ } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^2.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, "tar": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", - "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.5", + "minipass": "^2.8.6", "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", "yallist": "^3.0.3" - }, - "dependencies": { - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" - } - } - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" } }, "toidentifier": { @@ -1830,39 +1102,6 @@ } } }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tslint": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.19.0.tgz", - "integrity": "sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw==", - "requires": { - "@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.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "requires": { - "tslib": "^1.8.1" - } - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -1876,38 +1115,16 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, "typescript": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", - "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==" + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", + "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==" }, "u3": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/u3/-/u3-0.1.0.tgz", "integrity": "sha1-AGCSdmO2g1PFOc2pnpUR1mh+3Z0=" }, - "umzug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", - "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==", - "dev": true, - "requires": { - "babel-runtime": "^6.23.0", - "bluebird": "^3.5.3" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -1931,9 +1148,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "validator": { "version": "10.11.0", @@ -1955,125 +1172,39 @@ "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "requires": { "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "wkx": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.7.tgz", - "integrity": "sha512-pHf546L96TK8RradLt1cWaIffstgv/zXZ14CGz5KnBs1AxBX0wm+IDphjJw0qrEqRv8P9W9CdTt8Z1unMRZ19A==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", "requires": { "@types/node": "*" } }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.0.tgz", - "integrity": "sha512-Swie2C4fs7CkwlHu1glMePLYJJsWjzhl1vm3ZaLplD0h7OMkZyZ6kLTB/OagiU923bZrPFXuDTeEqaEN4NWG4g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.0.tgz", + "integrity": "sha512-+SqNqFbwTm/0DC18KYzIsMTnEWpLwJsiasW/O17la4iDRRIO9uaHbvKiAS3AHgTiuuWerK/brj4O6MYZkei9xg==", "requires": { "async-limiter": "^1.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" - } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } } diff --git a/backend/package.json b/backend/package.json index 26337ba02..cf435194e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,9 +19,9 @@ "homepage": "https://github.com/nearprotocol/near-explorer#readme", "dependencies": { "autobahn": "19.4.1", - "nearlib": "github:nearprotocol/nearlib#master", - "sequelize": "^5.10.1", - "sqlite3": "^4.0.9", - "ws": "^7.1.0" + "nearlib": "github:nearprotocol/nearlib#feature/chunk-rpc", + "sequelize": "^5.21.1", + "sqlite3": "^4.1.0", + "ws": "^7.2.0" } } From f6e22c0b41ec1852b04b5e8165d501a2873049f2 Mon Sep 17 00:00:00 2001 From: Vlad Frolov Date: Thu, 31 Oct 2019 18:16:48 +0200 Subject: [PATCH 7/7] Implemented multinet support (resolves #110) --- backend/Dockerfile | 2 +- backend/config/config.json | 14 -- backend/config/database.js | 17 ++ backend/models/index.js | 2 +- backend/package-lock.json | 13 +- backend/package.json | 5 +- backend/src/config.js | 4 +- backend/src/wamp.js | 7 +- docker-compose.yml | 3 +- frontend/next.config.js | 21 ++ frontend/package.json | 7 +- .../src/components/blocks/BlocksHeader.jsx | 6 +- frontend/src/components/blocks/BlocksList.jsx | 16 +- frontend/src/components/nodes/Nodes.jsx | 11 +- .../components/transactions/Transactions.tsx | 18 +- .../transactions/TransactionsHeader.jsx | 14 -- .../src/components/utils/DataProvider.jsx | 24 --- .../src/components/utils/DataProvider.tsx | 26 +++ .../components/utils/HeaderDropdownNav.jsx | 18 +- .../src/libraries/explorer-wamp/accounts.ts | 50 ++--- .../src/libraries/explorer-wamp/blocks.js | 201 +++++++++--------- .../src/libraries/explorer-wamp/details.js | 63 +++--- frontend/src/libraries/explorer-wamp/index.ts | 179 +++++++++------- frontend/src/libraries/explorer-wamp/nodes.js | 26 +-- .../libraries/explorer-wamp/transactions.ts | 160 +++++++------- frontend/src/pages/_app.jsx | 24 ++- frontend/src/pages/accounts/[id].jsx | 6 +- frontend/src/pages/api/nodes.js | 4 +- frontend/src/pages/blocks/[hash].jsx | 6 +- frontend/src/pages/index.jsx | 16 +- frontend/src/pages/transactions/[hash].jsx | 6 +- 31 files changed, 532 insertions(+), 437 deletions(-) delete mode 100644 backend/config/config.json create mode 100644 backend/config/database.js delete mode 100644 frontend/src/components/utils/DataProvider.jsx create mode 100644 frontend/src/components/utils/DataProvider.tsx diff --git a/backend/Dockerfile b/backend/Dockerfile index 2a4602955..e85748337 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -14,4 +14,4 @@ RUN mkdir ./db && \ chown -R nobody: . USER nobody -CMD ["/bin/sh", "-c", "exec npm run start"] +CMD ["/bin/sh", "-c", "if stat -t .env-* >/dev/null 2>&1 ; then for env in .env-*; do source \"$env\" && npm run start & done ; wait ; else exec npm run start ; fi"] diff --git a/backend/config/config.json b/backend/config/config.json deleted file mode 100644 index fff37c625..000000000 --- a/backend/config/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "development": { - "dialect": "sqlite", - "storage": "db/development-database.sqlite" - }, - "test": { - "dialect": "sqlite", - "storage": "db/test-database.sqlite" - }, - "production": { - "dialect": "sqlite", - "storage": "db/production-database.sqlite" - } -} diff --git a/backend/config/database.js b/backend/config/database.js new file mode 100644 index 000000000..fce26057f --- /dev/null +++ b/backend/config/database.js @@ -0,0 +1,17 @@ +const dbPrefix = + process.env.NEAR_DB_PREFIX || process.env.WAMP_NEAR_NETWORK_NAME; + +module.exports = { + development: { + dialect: "sqlite", + storage: `db/${dbPrefix || "development"}-database.sqlite` + }, + test: { + dialect: "sqlite", + storage: `db/${dbPrefix || "test"}-database.sqlite` + }, + production: { + dialect: "sqlite", + storage: `db/${dbPrefix || "production"}-database.sqlite` + } +}; diff --git a/backend/models/index.js b/backend/models/index.js index 62986a2ab..fb406b20e 100644 --- a/backend/models/index.js +++ b/backend/models/index.js @@ -5,7 +5,7 @@ const path = require("path"); const Sequelize = require("sequelize"); const basename = path.basename(__filename); const env = process.env.NODE_ENV || "development"; -const config = require(__dirname + "/../config/config.json")[env]; +const config = require(__dirname + "/../config/database")[env]; const db = {}; const sequelize = new Sequelize( diff --git a/backend/package-lock.json b/backend/package-lock.json index 41e63e399..6fbae0cf9 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -147,9 +147,9 @@ "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==" }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.0.0.tgz", + "integrity": "sha512-bVwDX8AF+72fIUNuARelKAlQUNtPOfG2fRxorbVvFk4zpHbqLrPdOGfVg5vrKwVzLLePqPBiATaOZNELQzmS0A==" }, "brace-expansion": { "version": "1.1.11", @@ -655,11 +655,12 @@ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nearlib": { - "version": "github:nearprotocol/nearlib#eb4009848e0aa758192cb2b3a840fb0f3d755b1d", - "from": "github:nearprotocol/nearlib#feature/chunk-rpc", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/nearlib/-/nearlib-0.17.0.tgz", + "integrity": "sha512-1Pek0Aoxdv1TXMKyD28OjPz3V1Zw6PpLyt4t2KBrPDIngwtjuJcujvVmE9jKDe3NAKSAC1TA2sW2iWQQT2wKDQ==", "requires": { "@types/bn.js": "^4.11.5", - "bn.js": "^4.11.5", + "bn.js": "^5.0.0", "bs58": "^4.0.0", "error-polyfill": "^0.1.2", "http-errors": "^1.7.2", diff --git a/backend/package.json b/backend/package.json index cf435194e..b50ee01de 100644 --- a/backend/package.json +++ b/backend/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "node src/index.js" + "start": "env NODE_ENV=production node src/index.js", + "start:testnet": "env NEAR_RPC_URL=https://rpc.nearprotocol.com NEAR_DB_PREFIX=testnet npm run start" }, "repository": { "type": "git", @@ -19,7 +20,7 @@ "homepage": "https://github.com/nearprotocol/near-explorer#readme", "dependencies": { "autobahn": "19.4.1", - "nearlib": "github:nearprotocol/nearlib#feature/chunk-rpc", + "nearlib": "^0.17.0", "sequelize": "^5.21.1", "sqlite3": "^4.1.0", "ws": "^7.2.0" diff --git a/backend/src/config.js b/backend/src/config.js index 3515ceed2..5f5a193a3 100644 --- a/backend/src/config.js +++ b/backend/src/config.js @@ -1,4 +1,4 @@ -exports.nearRpcUrl = process.env.NEAR_RPC_URL || "https://rpc.nearprotocol.com"; +exports.nearRpcUrl = process.env.NEAR_RPC_URL || "http://localhost:3030"; exports.syncFetchQueueSize = process.env.NEAR_SYNC_FETCH_QUEUE_SIZE || 1000; exports.syncSaveQueueSize = process.env.NEAR_SYNC_SAVE_QUEUE_SIZE || 10; exports.bulkDbUpdateSize = process.env.NEAR_SYNC_BULK_DB_UPDATE_SIZE || 10; @@ -7,6 +7,8 @@ exports.regularSyncNewNearcoreStateInterval = exports.regularSyncMissingNearcoreStateInterval = process.env.NEAR_REGULAR_SYNC_MISSING_NEARCORE_STATE_INTERVAL || 60000; +exports.wampNearNetworkName = + process.env.WAMP_NEAR_NETWORK_NAME || "localhostnet"; exports.wampNearExplorerUrl = process.env.WAMP_NEAR_EXPLORER_URL || "ws://localhost:8080/ws"; exports.wampNearExplorerBackendSecret = diff --git a/backend/src/wamp.js b/backend/src/wamp.js index 9958ced04..2dc6df848 100644 --- a/backend/src/wamp.js +++ b/backend/src/wamp.js @@ -3,6 +3,7 @@ const autobahn = require("autobahn"); const models = require("../models"); const { + wampNearNetworkName, wampNearExplorerUrl, wampNearExplorerBackendSecret } = require("./config"); @@ -33,8 +34,8 @@ wampHandlers["nearcore-query"] = async ([path, data]) => { return await nearRpc.query(path, data); }; -wampHandlers["nearcore-tx"] = async ([transactionHash]) => { - return await nearRpc.sendJsonRpc("tx", [transactionHash]); +wampHandlers["nearcore-tx"] = async ([transactionHash, accountId]) => { + return await nearRpc.sendJsonRpc("tx", [transactionHash, accountId]); }; function setupWamp() { @@ -63,7 +64,7 @@ function setupWamp() { console.log("WAMP connection is established. Waiting for commands..."); for (const [name, handler] of Object.entries(wampHandlers)) { - const uri = `com.nearprotocol.explorer.${name}`; + const uri = `com.nearprotocol.${wampNearNetworkName}.explorer.${name}`; try { await session.register(uri, handler); } catch (error) { diff --git a/docker-compose.yml b/docker-compose.yml index 317fb1a65..f3a0df713 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,13 +6,13 @@ services: environment: - WAMP_NEAR_EXPLORER_PORT=8080 - WAMP_NEAR_EXPLORER_BACKEND_SECRET=back - - WAMP_NEAR_EXPLORER_FRONTEND_SECRET=front ports: - 8080:8080 backend: build: ./backend environment: + - NEAR_RPC_URL=https://rpc.nearprotocol.com - WAMP_NEAR_EXPLORER_URL=ws://wamp:8080/ws - WAMP_NEAR_EXPLORER_BACKEND_SECRET=back @@ -22,6 +22,5 @@ services: - PORT=3000 - WAMP_NEAR_EXPLORER_URL=ws://localhost:8080/ws - WAMP_NEAR_EXPLORER_INTERNAL_URL=ws://wamp:8080/ws - - WAMP_NEAR_EXPLORER_FRONTEND_SECRET=front ports: - 3000:3000 diff --git a/frontend/next.config.js b/frontend/next.config.js index ac83d51fb..e73a171c9 100644 --- a/frontend/next.config.js +++ b/frontend/next.config.js @@ -3,6 +3,25 @@ const withCSS = require("@zeit/next-css"); const defaultWampNearExplorerUrl = "ws://localhost:8080/ws"; +let nearNetworks; +if (process.env.NEAR_NETWORKS) { + nearNetworks = JSON.parse(process.env.NEAR_NETWORKS); +} else { + nearNetworks = [ + { + name: "localhostnet", + explorerLink: "http://localhost:3000", + aliases: ["localhost:3000", "localhost", "127.0.0.1", "127.0.0.1:3000"] + } + ]; +} +const nearNetworkAliases = {}; +for (const nearNetwork of nearNetworks) { + for (const alias of nearNetwork.aliases) { + nearNetworkAliases[alias] = nearNetwork; + } +} + module.exports = withCSS({ serverRuntimeConfig: { wampNearExplorerUrl: @@ -11,6 +30,8 @@ module.exports = withCSS({ defaultWampNearExplorerUrl }, publicRuntimeConfig: { + nearNetworks, + nearNetworkAliases, wampNearExplorerUrl: process.env.WAMP_NEAR_EXPLORER_URL || defaultWampNearExplorerUrl, googleAnalytics: process.env.NEAR_EXPLORER_GOOGLE_ANALYTICS diff --git a/frontend/package.json b/frontend/package.json index 17ac6bd5a..75cd338b9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,8 +6,12 @@ "typecheck": "tsc --noEmit", "test": "npm run typecheck && jest", "dev": "next", + "dev:local-wamp": "env WAMP_NEAR_EXPLORER_URL=ws://localhost:8080/ws npm run dev", + "dev:production-wamp": "env 'NEAR_NETWORKS=[{\"name\": \"testnet\", \"explorerLink\": \"http://localhost:3000/\", \"aliases\": [\"localhost:3000\", \"127.0.0.1:3000\"]}]' WAMP_NEAR_EXPLORER_URL=wss://near-explorer-wamp.onrender.com/ws npm run dev", "build": "next build", "start": "next start", + "start:local-wamp": "env WAMP_NEAR_EXPLORER_URL=ws://localhost:8080/ws npm run start", + "start:production-wamp": "env 'NEAR_NETWORKS=[{\"name\": \"testnet\", \"explorerLink\": \"http://localhost:3000/\", \"aliases\": [\"localhost:3000\", \"127.0.0.1:3000\"]}]' WAMP_NEAR_EXPLORER_URL=wss://near-explorer-wamp.onrender.com/ws npm run start", "e2e:test": "npm start & cypress run", "e2e": "cypress run", "e2e:chrome": "cypress run --browser chrome", @@ -17,8 +21,7 @@ "cy:version": "cypress version", "cy:open": "cypress open", "cy:run": "cypress run", - "test:ci": "start-server-and-test start:dev 3000 cy:run", - "start:dev": "env WAMP_NEAR_EXPLORER_URL=wss://near-explorer-wamp.onrender.com/ws next" + "test:ci": "start-server-and-test start:production-wamp 3000 cy:run" }, "repository": { "type": "git", diff --git a/frontend/src/components/blocks/BlocksHeader.jsx b/frontend/src/components/blocks/BlocksHeader.jsx index 6ccb6f14b..47df0adc8 100644 --- a/frontend/src/components/blocks/BlocksHeader.jsx +++ b/frontend/src/components/blocks/BlocksHeader.jsx @@ -1,6 +1,6 @@ import { Row, Col } from "react-bootstrap"; -import * as BlocksApi from "../../libraries/explorer-wamp/blocks"; +import BlocksApi from "../../libraries/explorer-wamp/blocks"; import Search from "../utils/Search"; @@ -10,9 +10,9 @@ export default ({ setLoading, setBlocks, pagination, setPagination }) => { let blocks; if (text === null || text === undefined || text.trim().length === 0) { - blocks = await BlocksApi.getLatestBlocksInfo(); + blocks = await new BlocksApi().getLatestBlocksInfo(); } else { - blocks = await BlocksApi.searchBlocks(text); + blocks = await new BlocksApi().searchBlocks(text); } setBlocks(() => blocks); diff --git a/frontend/src/components/blocks/BlocksList.jsx b/frontend/src/components/blocks/BlocksList.jsx index 43c67942f..ec48e3487 100644 --- a/frontend/src/components/blocks/BlocksList.jsx +++ b/frontend/src/components/blocks/BlocksList.jsx @@ -1,17 +1,23 @@ import LoadingOverlay from "react-loading-overlay"; -import * as BlocksApi from "../../libraries/explorer-wamp/blocks"; +import BlocksApi from "../../libraries/explorer-wamp/blocks"; import BlocksRow from "./BlocksRow"; export default class extends React.Component { + constructor(props) { + super(props); + + this._blocksApi = new BlocksApi(); + } + componentDidMount() { this._blockLoader = document.getElementById("block-loader"); document.addEventListener("scroll", this._onScroll); this._loadBlocks(); - BlocksApi.getTotal().then(total => { + this._blocksApi.getTotal().then(total => { this.props.setPagination(pagination => { return { ...pagination, total }; }); @@ -60,7 +66,7 @@ export default class extends React.Component { _loadBlocks = async () => { let blocks; if (this.props.pagination.stop === null) { - blocks = await BlocksApi.getLatestBlocksInfo(); + blocks = await this._blocksApi.getLatestBlocksInfo(); } else { blocks = await this._getNextBatch(this.props.pagination); } @@ -81,12 +87,12 @@ export default class extends React.Component { let blocks = []; try { if (pagination.search) { - blocks = await BlocksApi.searchBlocks( + blocks = await this._blocksApi.searchBlocks( pagination.search, pagination.stop ); } else { - blocks = await BlocksApi.getPreviousBlocks( + blocks = await this._blocksApi.getPreviousBlocks( pagination.stop, pagination.count ); diff --git a/frontend/src/components/nodes/Nodes.jsx b/frontend/src/components/nodes/Nodes.jsx index c2a76382b..c46463486 100644 --- a/frontend/src/components/nodes/Nodes.jsx +++ b/frontend/src/components/nodes/Nodes.jsx @@ -2,23 +2,30 @@ import { Row, Col } from "react-bootstrap"; import FlipMove from "react-flip-move"; import LoadingOverlay from "react-loading-overlay"; -import * as NodesApi from "../../libraries/explorer-wamp/nodes"; +import NodesApi from "../../libraries/explorer-wamp/nodes"; import NodeRow from "./NodeRow"; export default class extends React.Component { state = { loading: true, nodes: null }; + constructor(props) { + super(props); + + this._nodesApi = new NodesApi(); + } + componentDidMount() { this.regularFetchInfo(); } + componentWillUnmount() { clearTimeout(this.timer); this.timer = false; } fetchInfo = async () => { - const nodes = await NodesApi.getNodesInfo(); + const nodes = await this._nodesApi.getNodesInfo(); await this.setState({ loading: false, nodes }); }; diff --git a/frontend/src/components/transactions/Transactions.tsx b/frontend/src/components/transactions/Transactions.tsx index d53e5d225..e4e875758 100644 --- a/frontend/src/components/transactions/Transactions.tsx +++ b/frontend/src/components/transactions/Transactions.tsx @@ -1,6 +1,6 @@ import React from "react"; -import * as TransactionsApi from "../../libraries/explorer-wamp/transactions"; +import TransactionsApi, * as T from "../../libraries/explorer-wamp/transactions"; import TransactionsList from "./TransactionsList"; @@ -12,7 +12,7 @@ export interface Props { } export interface State { - transactions: TransactionsApi.Transaction[] | null; + transactions: T.Transaction[] | null; } export default class extends React.PureComponent { @@ -25,6 +25,15 @@ export default class extends React.PureComponent { transactions: null }; + _transactionsApi: TransactionsApi | null; + + constructor(props: Props) { + super(props); + + // TODO: Design ExplorerApi to handle server-side rendering gracefully. + this._transactionsApi = null; + } + componentDidMount() { this.fetchTransactions(); } @@ -49,7 +58,10 @@ export default class extends React.PureComponent { } fetchTransactions = async () => { - const transactions = await TransactionsApi.getTransactions({ + if (this._transactionsApi === null) { + this._transactionsApi = new TransactionsApi(); + } + const transactions = await this._transactionsApi.getTransactions({ signerId: this.props.accountId, receiverId: this.props.accountId, blockHash: this.props.blockHash, diff --git a/frontend/src/components/transactions/TransactionsHeader.jsx b/frontend/src/components/transactions/TransactionsHeader.jsx index eb163a281..ecb9502e1 100644 --- a/frontend/src/components/transactions/TransactionsHeader.jsx +++ b/frontend/src/components/transactions/TransactionsHeader.jsx @@ -1,24 +1,10 @@ import { Row, Col } from "react-bootstrap"; -import { DataConsumer } from "../utils/DataProvider"; import Search from "../utils/Search"; export default props => ( - - {ctx => ( - - - {ctx.pagination.start}-{ctx.pagination.stop} - - - {" "} - of {ctx.pagination.total} Total - - - )} - diff --git a/frontend/src/components/utils/DataProvider.jsx b/frontend/src/components/utils/DataProvider.jsx deleted file mode 100644 index 5d0902bb3..000000000 --- a/frontend/src/components/utils/DataProvider.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import { useState } from "react"; - -const DataContext = React.createContext(); - -const networks = ["Testnet One"]; - -export default props => { - const [network, setNetwork] = useState(networks[0]); - - return ( - - {props.children} - - ); -}; - -const DataConsumer = DataContext.Consumer; - -export { DataConsumer, DataContext }; diff --git a/frontend/src/components/utils/DataProvider.tsx b/frontend/src/components/utils/DataProvider.tsx new file mode 100644 index 000000000..c22135e90 --- /dev/null +++ b/frontend/src/components/utils/DataProvider.tsx @@ -0,0 +1,26 @@ +import { createContext } from "react"; + +const DataContext = createContext({}); + +export interface Props { + currentNearNetwork: any; + nearNetworks: any; + children: React.ReactNode; +} + +export default (props: Props) => { + return ( + + {props.children} + + ); +}; + +const DataConsumer = DataContext.Consumer; + +export { DataConsumer, DataContext }; diff --git a/frontend/src/components/utils/HeaderDropdownNav.jsx b/frontend/src/components/utils/HeaderDropdownNav.jsx index 49144cd95..7ba73be19 100644 --- a/frontend/src/components/utils/HeaderDropdownNav.jsx +++ b/frontend/src/components/utils/HeaderDropdownNav.jsx @@ -2,9 +2,9 @@ import { Dropdown } from "react-bootstrap"; import { DataConsumer } from "./DataProvider"; -const HeaderDropdownItem = props => ( - - {props.title} +const HeaderDropdownItem = ({ link, title }) => ( + + {title} ); @@ -14,16 +14,18 @@ const HeaderDropdownNav = () => ( - {context.network} + + {context.currentNearNetwork.name} + - {context.networks.map((network, index) => { + {context.nearNetworks.map(network => { return ( context.updateNetwork(index)} + key={network.name} + title={network.name} + link={network.explorerLink} /> ); })} diff --git a/frontend/src/libraries/explorer-wamp/accounts.ts b/frontend/src/libraries/explorer-wamp/accounts.ts index 0ec5c971d..af2de7ac8 100644 --- a/frontend/src/libraries/explorer-wamp/accounts.ts +++ b/frontend/src/libraries/explorer-wamp/accounts.ts @@ -1,4 +1,4 @@ -import { call } from "."; +import { ExplorerApi } from "."; interface AccountId { id: string; @@ -18,34 +18,36 @@ interface AccountInfo { export type Account = AccountId & AccountStats & AccountInfo; -export async function getAccountInfo(id: string): Promise { - try { - const [accountInfo, accountStats] = await Promise.all([ - call(".nearcore-query", [`account/${id}`, ""]), - call(".select", [ - `SELECT outTransactionsCount.outTransactionsCount, inTransactionsCount.inTransactionsCount FROM +export default class AccountApi extends ExplorerApi { + async getAccountInfo(id: string): Promise { + try { + const [accountInfo, accountStats] = await Promise.all([ + this.call("nearcore-query", [`account/${id}`, ""]), + this.call("select", [ + `SELECT outTransactionsCount.outTransactionsCount, inTransactionsCount.inTransactionsCount FROM (SELECT COUNT(transactions.hash) as outTransactionsCount FROM transactions WHERE signer_id = :id) as outTransactionsCount, (SELECT COUNT(transactions.hash) as inTransactionsCount FROM transactions WHERE receiver_id = :id) as inTransactionsCount `, - { - id - } - ]) - ]); + { + id + } + ]) + ]); - return { - id, - amount: accountInfo.amount, - locked: accountInfo.locked, - storageUsage: accountInfo.storage_usage, - storagePaidAt: accountInfo.storage_paid_at, - ...accountStats[0] - }; - } catch (error) { - console.error("Accounts.getAccountInfo failed to fetch data due to:"); - console.error(error); - throw error; + return { + id, + amount: accountInfo.amount, + locked: accountInfo.locked, + storageUsage: accountInfo.storage_usage, + storagePaidAt: accountInfo.storage_paid_at, + ...accountStats[0] + }; + } catch (error) { + console.error("Accounts.getAccountInfo failed to fetch data due to:"); + console.error(error); + throw error; + } } } diff --git a/frontend/src/libraries/explorer-wamp/blocks.js b/frontend/src/libraries/explorer-wamp/blocks.js index f0787fde4..935acb650 100644 --- a/frontend/src/libraries/explorer-wamp/blocks.js +++ b/frontend/src/libraries/explorer-wamp/blocks.js @@ -1,113 +1,114 @@ -import { call } from "."; +import { ExplorerApi } from "."; -export async function searchBlocks(keyword, height = -1, limit = 15) { - try { - return await call(".select", [ - `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount - FROM ( - SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash FROM blocks - WHERE blocks.height LIKE :keyword AND blocks.height < :height - ) as blocks - LEFT JOIN transactions ON transactions.block_hash = blocks.hash - GROUP BY blocks.hash - ORDER BY blocks.height DESC`, - { - keyword: `${keyword}%`, - height: height === -1 ? "MAX(blocks.height)" : height, - limit - } - ]); - } catch (error) { - console.error("Blocks.searchBlocks failed to fetch data due to:"); - console.error(error); - throw error; +export default class BlocksApi extends ExplorerApi { + async searchBlocks(keyword, height = -1, limit = 15) { + try { + return await this.call("select", [ + `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount + FROM ( + SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash FROM blocks + WHERE blocks.height LIKE :keyword AND blocks.height < :height + ) as blocks + LEFT JOIN transactions ON transactions.block_hash = blocks.hash + GROUP BY blocks.hash + ORDER BY blocks.height DESC`, + { + keyword: `${keyword}%`, + height: height === -1 ? "MAX(blocks.height)" : height, + limit + } + ]); + } catch (error) { + console.error("Blocks.searchBlocks failed to fetch data due to:"); + console.error(error); + throw error; + } } -} -export async function getTotal() { - try { - const _ = await call(".select", [ - `SELECT COUNT(blocks.hash) AS total FROM blocks` - ]); - return _[0].total; - } catch (error) { - console.error("Blocks.getTotal failed to fetch data due to:"); - console.error(error); - throw error; + async getTotal() { + try { + return await this.call("select", [ + `SELECT COUNT(blocks.hash) AS total FROM blocks` + ]).then(it => it[0].total); + } catch (error) { + console.error("Blocks.getTotal failed to fetch data due to:"); + console.error(error); + throw error; + } } -} -export async function getLatestBlocksInfo(limit = 15) { - try { - return await call(".select", [ - `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount - FROM ( - SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash FROM blocks - ORDER BY blocks.height DESC - LIMIT :limit - ) as blocks - LEFT JOIN transactions ON transactions.block_hash = blocks.hash - GROUP BY blocks.hash - ORDER BY blocks.height DESC`, - { - limit - } - ]); - } catch (error) { - console.error("Blocks.getBlocksInfo[] failed to fetch data due to:"); - console.error(error); - throw error; + async getLatestBlocksInfo(limit = 15) { + try { + return await this.call("select", [ + `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount + FROM ( + SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash FROM blocks + ORDER BY blocks.height DESC + LIMIT :limit + ) as blocks + LEFT JOIN transactions ON transactions.block_hash = blocks.hash + GROUP BY blocks.hash + ORDER BY blocks.height DESC`, + { + limit + } + ]); + } catch (error) { + console.error("Blocks.getBlocksInfo[] failed to fetch data due to:"); + console.error(error); + throw error; + } } -} -export async function getBlockInfo(hash) { - try { - const block = await call(".select", [ - `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount - FROM ( - SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash - FROM blocks - WHERE blocks.hash = :hash - ) as blocks - LEFT JOIN transactions ON transactions.block_hash = blocks.hash`, - { - hash - } - ]).then(it => (it[0].hash !== null ? it[0] : null)); + async getBlockInfo(hash) { + try { + const block = await this.call("select", [ + `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount + FROM ( + SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash + FROM blocks + WHERE blocks.hash = :hash + ) as blocks + LEFT JOIN transactions ON transactions.block_hash = blocks.hash`, + { + hash + } + ]).then(it => (it[0].hash !== null ? it[0] : null)); - if (block === null) { - throw new Error("block not found"); + if (block === null) { + throw new Error("block not found"); + } + return block; + } catch (error) { + console.error("Blocks.getBlockInfo failed to fetch data due to:"); + console.error(error); + throw error; } - return block; - } catch (error) { - console.error("Blocks.getBlockInfo failed to fetch data due to:"); - console.error(error); - throw error; } -} -export async function getPreviousBlocks(lastBlockHeight, limit = 15) { - try { - return await call(".select", [ - `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount - FROM ( - SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash - FROM blocks - WHERE blocks.height < :height - ORDER BY blocks.height DESC - LIMIT :limit - ) as blocks - LEFT JOIN transactions ON transactions.block_hash = blocks.hash - GROUP BY blocks.hash - ORDER BY blocks.height DESC`, - { - height: lastBlockHeight, - limit - } - ]); - } catch (error) { - console.error("Blocks.getPreviousBlocks failed to fetch data due to:"); - console.error(error); - throw error; + async getPreviousBlocks(lastBlockHeight, limit = 15) { + try { + return await this.call("select", [ + `SELECT blocks.*, COUNT(transactions.hash) as transactionsCount + FROM ( + SELECT blocks.hash, blocks.height, blocks.timestamp, blocks.prev_hash as prevHash + FROM blocks + WHERE blocks.height < :height + ORDER BY blocks.height DESC + LIMIT :limit + ) as blocks + LEFT JOIN transactions ON transactions.block_hash = blocks.hash + GROUP BY blocks.hash + ORDER BY blocks.height DESC`, + { + height: lastBlockHeight, + limit + } + ]); + } catch (error) { + console.error("Blocks.getPreviousBlocks failed to fetch data due to:"); + console.error(error); + throw error; + } } } diff --git a/frontend/src/libraries/explorer-wamp/details.js b/frontend/src/libraries/explorer-wamp/details.js index 253997ae1..f2df37781 100644 --- a/frontend/src/libraries/explorer-wamp/details.js +++ b/frontend/src/libraries/explorer-wamp/details.js @@ -1,34 +1,35 @@ -import { call } from "."; +import { ExplorerApi } from "."; -export async function getDetails() { - try { - const details = await call(".select", [ - `SELECT - total_accounts.accountsCount, - nodes.totalNodesCount, - online_nodes.onlineNodesCount, - transactions.lastDayTxCount, - last_block.lastBlockHeight, - ((transactions_per_second.tx_last_10_seconds + 9) / 10) as transactionsPerSecond - FROM - (SELECT COUNT(*) as totalNodesCount FROM nodes) as nodes, - (SELECT COUNT(*) as onlineNodesCount FROM nodes WHERE last_seen > (strftime('%s','now') - 60) * 1000) as online_nodes, - ( - SELECT COUNT(*) as lastDayTxCount FROM transactions - LEFT JOIN blocks ON blocks.hash = transactions.block_hash - WHERE blocks.timestamp > (strftime('%s','now') - 60 * 60 * 24) * 1000 - ) as transactions, - (SELECT COUNT(transactions.hash) as tx_last_10_seconds FROM transactions - LEFT JOIN blocks ON blocks.hash = transactions.block_hash - WHERE blocks.timestamp > (strftime('%s','now') - 10) * 1000 - ) as transactions_per_second, - (SELECT height as lastBlockHeight FROM blocks ORDER BY height DESC LIMIT 1) as last_block, - (SELECT COUNT(DISTINCT signer_id) as accountsCount FROM transactions) as total_accounts` - ]); - return details[0]; - } catch (error) { - console.error("Details.getDetails failed to fetch data due to:"); - console.error(error); - throw error; +export default class DetailsApi extends ExplorerApi { + async getDetails() { + try { + return await this.call("select", [ + `SELECT + total_accounts.accountsCount, + nodes.totalNodesCount, + online_nodes.onlineNodesCount, + transactions.lastDayTxCount, + last_block.lastBlockHeight, + ((transactions_per_second.tx_last_10_seconds + 9) / 10) as transactionsPerSecond + FROM + (SELECT COUNT(*) as totalNodesCount FROM nodes) as nodes, + (SELECT COUNT(*) as onlineNodesCount FROM nodes WHERE last_seen > (strftime('%s','now') - 60) * 1000) as online_nodes, + ( + SELECT COUNT(*) as lastDayTxCount FROM transactions + LEFT JOIN blocks ON blocks.hash = transactions.block_hash + WHERE blocks.timestamp > (strftime('%s','now') - 60 * 60 * 24) * 1000 + ) as transactions, + (SELECT COUNT(transactions.hash) as tx_last_10_seconds FROM transactions + LEFT JOIN blocks ON blocks.hash = transactions.block_hash + WHERE blocks.timestamp > (strftime('%s','now') - 10) * 1000 + ) as transactions_per_second, + (SELECT height as lastBlockHeight FROM blocks ORDER BY height DESC LIMIT 1) as last_block, + (SELECT COUNT(DISTINCT signer_id) as accountsCount FROM transactions) as total_accounts` + ]).then(it => it[0]); + } catch (error) { + console.error("Details.getDetails failed to fetch data due to:"); + console.error(error); + throw error; + } } } diff --git a/frontend/src/libraries/explorer-wamp/index.ts b/frontend/src/libraries/explorer-wamp/index.ts index f42069d52..b49b6a907 100644 --- a/frontend/src/libraries/explorer-wamp/index.ts +++ b/frontend/src/libraries/explorer-wamp/index.ts @@ -7,95 +7,118 @@ interface IPromisePair { reject: (value?: string) => void; } -const awaitingOnSession: Array = []; +export class ExplorerApi { + static awaitingOnSession: Array = []; -const subscriptions: Record< - string, - [autobahn.SubscribeHandler, autobahn.ISubscribeOptions | undefined] -> = {}; + static subscriptions: Record< + string, + [autobahn.SubscribeHandler, autobahn.ISubscribeOptions | undefined] + > = {}; -let wampNearExplorerUrl: string; + static wamp: autobahn.Connection; -if (typeof window === "undefined") { - const { serverRuntimeConfig } = getConfig(); - wampNearExplorerUrl = serverRuntimeConfig.wampNearExplorerUrl; -} else { - const { publicRuntimeConfig } = getConfig(); - wampNearExplorerUrl = publicRuntimeConfig.wampNearExplorerUrl; -} + apiPrefix: string; -const wamp = new autobahn.Connection({ - url: wampNearExplorerUrl, - realm: "near-explorer", - retry_if_unreachable: true, - max_retries: Number.MAX_SAFE_INTEGER, - max_retry_delay: 10 -}); - -// Establish and handle concurrent requests to establish WAMP connection. -function getWampSession(): Promise { - return new Promise( - ( - resolve: (value?: autobahn.Session) => void, - reject: (value?: string) => void - ) => { - if (wamp.transport.info.type === "websocket") { - // The connection is open/opening - if (wamp.session && wamp.session.isOpen) { - // Resolve the established session as it is ready - resolve(wamp.session); - } else { - // Push the promise resolvers on a queue - awaitingOnSession.push({ resolve, reject }); - } + constructor(apiPrefixSource?: any) { + const { publicRuntimeConfig, serverRuntimeConfig } = getConfig(); + + if (ExplorerApi.wamp === undefined) { + let wampNearExplorerUrl: string; + if (typeof window === "undefined") { + wampNearExplorerUrl = serverRuntimeConfig.wampNearExplorerUrl; } else { - // Establish new session - awaitingOnSession.push({ resolve, reject }); - - wamp.onopen = session => { - Object.entries(subscriptions).forEach(([topic, [handler, options]]) => - session.subscribe(topic, handler, options) - ); - while (awaitingOnSession.length > 0) { - awaitingOnSession.pop()!.resolve(session); - } - }; + wampNearExplorerUrl = publicRuntimeConfig.wampNearExplorerUrl; + } - wamp.onclose = reason => { - while (awaitingOnSession.length > 0) { - awaitingOnSession.pop()!.reject(reason); + ExplorerApi.wamp = new autobahn.Connection({ + url: wampNearExplorerUrl, + realm: "near-explorer", + retry_if_unreachable: true, + max_retries: Number.MAX_SAFE_INTEGER, + max_retry_delay: 10 + }); + } + + if (apiPrefixSource === undefined) { + this.apiPrefix = location.host; + } else if (typeof apiPrefixSource === "string") { + this.apiPrefix = apiPrefixSource; + } else if ("socket" in apiPrefixSource) { + this.apiPrefix = apiPrefixSource.headers.host; + } else { + throw Error( + `Unknown apiPrefixSource ${apiPrefixSource} (of type ${typeof apiPrefixSource})` + ); + } + + const { nearNetworkAliases } = publicRuntimeConfig; + if (this.apiPrefix in nearNetworkAliases) { + this.apiPrefix = nearNetworkAliases[this.apiPrefix].name; + } + } + + // Establish and handle concurrent requests to establish WAMP connection. + static getWampSession(): Promise { + return new Promise( + ( + resolve: (value?: autobahn.Session) => void, + reject: (value?: string) => void + ) => { + if (ExplorerApi.wamp.transport.info.type === "websocket") { + // The connection is open/opening + if (ExplorerApi.wamp.session && ExplorerApi.wamp.session.isOpen) { + // Resolve the established session as it is ready + resolve(ExplorerApi.wamp.session); + } else { + // Push the promise resolvers on a queue + ExplorerApi.awaitingOnSession.push({ resolve, reject }); } - return false; - }; + } else { + // Establish new session + ExplorerApi.awaitingOnSession.push({ resolve, reject }); + + ExplorerApi.wamp.onopen = session => { + Object.entries(ExplorerApi.subscriptions).forEach( + ([topic, [handler, options]]) => + session.subscribe(topic, handler, options) + ); + while (ExplorerApi.awaitingOnSession.length > 0) { + ExplorerApi.awaitingOnSession.pop()!.resolve(session); + } + }; + + ExplorerApi.wamp.onclose = reason => { + while (ExplorerApi.awaitingOnSession.length > 0) { + ExplorerApi.awaitingOnSession.pop()!.reject(reason); + } + return false; + }; - wamp.open(); + ExplorerApi.wamp.open(); + } } - } - ); -} + ); + } -export async function subscribe( - topic: string, - handler: autobahn.SubscribeHandler, - options?: autobahn.ISubscribeOptions -): Promise { - if (topic[0] === ".") { - topic = "com.nearprotocol.explorer" + topic; + async subscribe( + topic: string, + handler: autobahn.SubscribeHandler, + options?: autobahn.ISubscribeOptions + ): Promise { + topic = `com.nearprotocol.${this.apiPrefix}.explorer.${topic}`; + ExplorerApi.subscriptions[topic] = [handler, options]; + const session = await ExplorerApi.getWampSession(); + return await session.subscribe(topic, handler, options); } - subscriptions[topic] = [handler, options]; - const session = await getWampSession(); - return await session.subscribe(topic, handler, options); -} -export async function call( - procedure: string, - args?: any[] | any, - kwargs?: any, - options?: autobahn.ICallOptions -): Promise { - if (procedure[0] === ".") { - procedure = "com.nearprotocol.explorer" + procedure; + async call( + procedure: string, + args?: any[] | any, + kwargs?: any, + options?: autobahn.ICallOptions + ): Promise { + procedure = `com.nearprotocol.${this.apiPrefix}.explorer.${procedure}`; + const session = await ExplorerApi.getWampSession(); + return (await session.call(procedure, args, kwargs, options)) as T; } - const session = await getWampSession(); - return (await session.call(procedure, args, kwargs, options)) as T; } diff --git a/frontend/src/libraries/explorer-wamp/nodes.js b/frontend/src/libraries/explorer-wamp/nodes.js index 8e71b144a..de92055f2 100644 --- a/frontend/src/libraries/explorer-wamp/nodes.js +++ b/frontend/src/libraries/explorer-wamp/nodes.js @@ -1,15 +1,17 @@ -import { call } from "."; +import { ExplorerApi } from "."; -export async function getNodesInfo() { - try { - return await call(".select", [ - `SELECT ip_address as ipAddress, moniker, account_id as accountId, node_id as nodeId, last_seen as lastSeen, last_height as lastHeight - FROM nodes - ORDER BY lastSeen DESC` - ]); - } catch (error) { - console.error("Nodes.getNodesInfo[] failed to fetch data due to:"); - console.error(error); - throw error; +export default class NodesApi extends ExplorerApi { + async getNodesInfo() { + try { + return await this.call("select", [ + `SELECT ip_address as ipAddress, moniker, account_id as accountId, node_id as nodeId, last_seen as lastSeen, last_height as lastHeight + FROM nodes + ORDER BY lastSeen DESC` + ]); + } catch (error) { + console.error("Nodes.getNodesInfo[] failed to fetch data due to:"); + console.error(error); + throw error; + } } } diff --git a/frontend/src/libraries/explorer-wamp/transactions.ts b/frontend/src/libraries/explorer-wamp/transactions.ts index c1099aa20..649ee7b86 100644 --- a/frontend/src/libraries/explorer-wamp/transactions.ts +++ b/frontend/src/libraries/explorer-wamp/transactions.ts @@ -1,4 +1,4 @@ -import { call } from "."; +import { ExplorerApi } from "."; export interface TransactionInfo { hash: string; @@ -96,86 +96,90 @@ export interface FilterArgs { limit: number; } -export async function getTransactions( - filters: FilterArgs -): Promise { - const { signerId, receiverId, transactionHash, blockHash } = filters; - const whereClause = []; - if (signerId) { - whereClause.push(`transactions.signer_id = :signerId`); - } - if (receiverId) { - whereClause.push(`transactions.receiver_id = :receiverId`); - } - if (transactionHash) { - whereClause.push(`transactions.hash = :transactionHash`); - } - if (blockHash) { - whereClause.push(`transactions.block_hash = :blockHash`); - } - try { - const transactions = await call< - (TransactionInfo & (StringActions | Actions))[] - >(".select", [ - `SELECT transactions.hash, transactions.signer_id as signerId, transactions.receiver_id as receiverId, transactions.actions, transactions.block_hash as blockHash, blocks.timestamp as blockTimestamp - FROM transactions - LEFT JOIN blocks ON blocks.hash = transactions.block_hash - ${whereClause.length > 0 ? `WHERE ${whereClause.join(" OR ")}` : ""} - ORDER BY blocks.height ${filters.tail ? "DESC" : ""} - LIMIT :limit`, - filters - ]); - if (filters.tail) { - transactions.reverse(); +export default class TransactionsApi extends ExplorerApi { + async getTransactions(filters: FilterArgs): Promise { + const { signerId, receiverId, transactionHash, blockHash } = filters; + const whereClause = []; + if (signerId) { + whereClause.push(`transactions.signer_id = :signerId`); + } + if (receiverId) { + whereClause.push(`transactions.receiver_id = :receiverId`); + } + if (transactionHash) { + whereClause.push(`transactions.hash = :transactionHash`); + } + if (blockHash) { + whereClause.push(`transactions.block_hash = :blockHash`); + } + try { + const transactions = await this.call< + (TransactionInfo & (StringActions | Actions))[] + >("select", [ + `SELECT transactions.hash, transactions.signer_id as signerId, transactions.receiver_id as receiverId, transactions.actions, transactions.block_hash as blockHash, blocks.timestamp as blockTimestamp + FROM transactions + LEFT JOIN blocks ON blocks.hash = transactions.block_hash + ${whereClause.length > 0 ? `WHERE ${whereClause.join(" OR ")}` : ""} + ORDER BY blocks.height ${filters.tail ? "DESC" : ""} + LIMIT :limit`, + filters + ]); + if (filters.tail) { + transactions.reverse(); + } + transactions.forEach(transaction => { + transaction.status = "Completed"; + try { + transaction.actions = JSON.parse(transaction.actions as string); + } catch {} + }); + return transactions as Transaction[]; + } catch (error) { + console.error( + "Transactions.getTransactionsInfo failed to fetch data due to:" + ); + console.error(error); + throw error; } - transactions.forEach(transaction => { - transaction.status = "Completed"; - try { - transaction.actions = JSON.parse(transaction.actions as string); - } catch {} - }); - return transactions as Transaction[]; - } catch (error) { - console.error( - "Transactions.getTransactionsInfo failed to fetch data due to:" - ); - console.error(error); - throw error; } -} -export async function getLatestTransactionsInfo(): Promise { - return getTransactions({ tail: true, limit: 10 }); -} - -export async function getTransactionInfo( - transactionHash: string -): Promise { - try { - let [transactionInfo, transactionExtraInfo] = await Promise.all([ - getTransactions({ transactionHash, limit: 1 }).then(it => it[0] || null), - call(".nearcore-tx", [transactionHash]) - ]); - - if (transactionInfo === null) { - transactionInfo = { - status: transactionExtraInfo.status, - hash: transactionExtraInfo.transaction.id, - signerId: "", - receiverId: "", - blockHash: "", - blockTimestamp: 0, - actions: [] - }; + async getLatestTransactionsInfo(): Promise { + return this.getTransactions({ tail: true, limit: 10 }); + } + + async getTransactionInfo( + transactionHash: string + ): Promise { + try { + let transactionInfo = await this.getTransactions({ + transactionHash, + limit: 1 + }).then(it => it[0] || null); + + if (transactionInfo === null) { + transactionInfo = { + status: "Not started", + hash: transactionHash, + signerId: "", + receiverId: "", + blockHash: "", + blockTimestamp: 0, + actions: [] + }; + } else { + const transactionExtraInfo = await this.call("nearcore-tx", [ + transactionHash, + transactionInfo.signerId + ]); + transactionInfo.receipts = transactionExtraInfo.receipts as Receipt[]; + } + return transactionInfo; + } catch (error) { + console.error( + "Transactions.getTransactionInfo failed to fetch data due to:" + ); + console.error(error); + throw error; } - const transaction = transactionInfo; - transaction.receipts = transactionExtraInfo.receipts as Receipt[]; - return transaction; - } catch (error) { - console.error( - "Transactions.getTransactionInfo failed to fetch data due to:" - ); - console.error(error); - throw error; } } diff --git a/frontend/src/pages/_app.jsx b/frontend/src/pages/_app.jsx index 0d7f2087c..f216c2c63 100644 --- a/frontend/src/pages/_app.jsx +++ b/frontend/src/pages/_app.jsx @@ -10,6 +10,10 @@ import DataProvider from "../components/utils/DataProvider"; import "bootstrap/dist/css/bootstrap.min.css"; +const { + publicRuntimeConfig: { nearNetworks, nearNetworkAliases, googleAnalytics } +} = getConfig(); + export default class extends App { static async getInitialProps(appContext) { // WARNING: Do not remove this getInitialProps implementation as it @@ -22,14 +26,21 @@ export default class extends App { // > `` with `getInitialProps`. // // https://github.com/zeit/next.js#runtime-configuration - return { ...(await App.getInitialProps(appContext)) }; + + let currentNearNetwork; + if (typeof window === "undefined") { + currentNearNetwork = nearNetworkAliases[appContext.ctx.req.headers.host]; + } else { + currentNearNetwork = nearNetworkAliases[window.location.host]; + } + return { + currentNearNetwork, + ...(await App.getInitialProps({ ...appContext, currentNearNetwork })) + }; } render() { const { Component, pageProps } = this.props; - const { - publicRuntimeConfig: { googleAnalytics } - } = getConfig(); return ( <> @@ -40,7 +51,10 @@ export default class extends App { href="/static/favicon.ico" /> - +
diff --git a/frontend/src/pages/accounts/[id].jsx b/frontend/src/pages/accounts/[id].jsx index 3ec07f830..e88ce30bc 100644 --- a/frontend/src/pages/accounts/[id].jsx +++ b/frontend/src/pages/accounts/[id].jsx @@ -4,16 +4,16 @@ import React from "react"; import TransactionIcon from "../../../public/static/images/icon-t-transactions.svg"; -import * as AccountApi from "../../libraries/explorer-wamp/accounts"; +import AccountsApi from "../../libraries/explorer-wamp/accounts"; import AccountDetails from "../../components/accounts/AccountDetails"; import Transactions from "../../components/transactions/Transactions"; import Content from "../../components/utils/Content"; export default class extends React.Component { - static async getInitialProps({ query: { id } }) { + static async getInitialProps({ req, query: { id } }) { try { - return await AccountApi.getAccountInfo(id); + return await new AccountsApi(req).getAccountInfo(id); } catch (err) { return { id, err }; } diff --git a/frontend/src/pages/api/nodes.js b/frontend/src/pages/api/nodes.js index fb3419504..ef9b21e21 100644 --- a/frontend/src/pages/api/nodes.js +++ b/frontend/src/pages/api/nodes.js @@ -1,8 +1,8 @@ -import { call } from "../../libraries/explorer-wamp"; +import { ExplorerApi } from "../../libraries/explorer-wamp"; export default async function(req, res) { try { - await call(".node-telemetry", [ + await new ExplorerApi(req).call("node-telemetry", [ { ...req.body, ip_address: req.headers["x-forwarded-for"] || req.socket.remoteAddress diff --git a/frontend/src/pages/blocks/[hash].jsx b/frontend/src/pages/blocks/[hash].jsx index 2d7199481..3a70df87c 100644 --- a/frontend/src/pages/blocks/[hash].jsx +++ b/frontend/src/pages/blocks/[hash].jsx @@ -4,16 +4,16 @@ import React from "react"; import TransactionIcon from "../../../public/static/images/icon-t-transactions.svg"; -import * as BlockApi from "../../libraries/explorer-wamp/blocks"; +import BlocksApi from "../../libraries/explorer-wamp/blocks"; import BlockDetails from "../../components/blocks/BlockDetails"; import Transactions from "../../components/transactions/Transactions"; import Content from "../../components/utils/Content"; export default class extends React.Component { - static async getInitialProps({ query: { hash } }) { + static async getInitialProps({ req, query: { hash } }) { try { - return await BlockApi.getBlockInfo(hash); + return await new BlocksApi(req).getBlockInfo(hash); } catch (err) { return { hash, err }; } diff --git a/frontend/src/pages/index.jsx b/frontend/src/pages/index.jsx index 983b74a89..7bc07cd17 100644 --- a/frontend/src/pages/index.jsx +++ b/frontend/src/pages/index.jsx @@ -3,9 +3,9 @@ import Head from "next/head"; import { useEffect, useContext } from "react"; import { Row, Col } from "react-bootstrap"; -import * as BlocksApi from "../libraries/explorer-wamp/blocks"; -import * as DetailsApi from "../libraries/explorer-wamp/details"; -import * as TransactionsApi from "../libraries/explorer-wamp/transactions"; +import BlocksApi from "../libraries/explorer-wamp/blocks"; +import DetailsApi from "../libraries/explorer-wamp/details"; +import TransactionsApi from "../libraries/explorer-wamp/transactions"; import DashboardHeader from "../components/dashboard/DashboardHeader"; import DashboardTransactions from "../components/dashboard/DashboardTransactions"; @@ -13,11 +13,13 @@ import DashboardBlocks from "../components/dashboard/DashboardBlocks"; import Content from "../components/utils/Content"; export default class extends React.Component { - static async getInitialProps() { + static async getInitialProps({ req }) { const ignoreErr = promise => promise.catch(() => null); - const details = ignoreErr(DetailsApi.getDetails()); - const blocks = ignoreErr(BlocksApi.getLatestBlocksInfo()); - const transactions = ignoreErr(TransactionsApi.getLatestTransactionsInfo()); + const details = ignoreErr(new DetailsApi(req).getDetails()); + const blocks = ignoreErr(new BlocksApi(req).getLatestBlocksInfo()); + const transactions = ignoreErr( + new TransactionsApi(req).getLatestTransactionsInfo() + ); return { details: await details, blocks: await blocks, diff --git a/frontend/src/pages/transactions/[hash].jsx b/frontend/src/pages/transactions/[hash].jsx index b58871d7b..979b7fba6 100644 --- a/frontend/src/pages/transactions/[hash].jsx +++ b/frontend/src/pages/transactions/[hash].jsx @@ -4,7 +4,7 @@ import React from "react"; import TransactionIcon from "../../../public/static/images/icon-t-transactions.svg"; -import * as TransactionApi from "../../libraries/explorer-wamp/transactions"; +import TransactionsApi from "../../libraries/explorer-wamp/transactions"; import ActionsList from "../../components/transactions/ActionsList"; import ReceiptsList from "../../components/transactions/ReceiptsList"; @@ -12,9 +12,9 @@ import TransactionDetails from "../../components/transactions/TransactionDetails import Content from "../../components/utils/Content"; export default class extends React.Component { - static async getInitialProps({ query: { hash } }) { + static async getInitialProps({ req, query: { hash } }) { try { - return await TransactionApi.getTransactionInfo(hash); + return await new TransactionsApi(req).getTransactionInfo(hash); } catch (err) { return { hash, err }; }