From 985fd68fbbeb9ba6df442ac2d35b4a7dd73e765d Mon Sep 17 00:00:00 2001 From: Ben Firshman Date: Wed, 6 Feb 2019 17:28:26 -0800 Subject: [PATCH] Add Cypress browser tests --- .gitignore | 2 + .travis.yml | 18 +- cypress.json | 4 + cypress/fixtures/profile.png | Bin 0 -> 38461 bytes cypress/integration/booking_spec.js | 41 + cypress/plugins/index.js | 17 + cypress/support/commands.js | 41 + cypress/support/index.js | 20 + docs/browser-tests.md | 16 + package-lock.json | 1662 +++++++++++++++++++++++++++ package.json | 12 + readme.md | 6 +- 12 files changed, 1835 insertions(+), 4 deletions(-) create mode 100644 cypress.json create mode 100644 cypress/fixtures/profile.png create mode 100644 cypress/integration/booking_spec.js create mode 100644 cypress/plugins/index.js create mode 100644 cypress/support/commands.js create mode 100644 cypress/support/index.js create mode 100644 docs/browser-tests.md create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index d1a3218b..d5c6df6a 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ modernomad/local_settings.py.bak ghostdriver.log .env static/CACHE/ + +/node_modules diff --git a/.travis.yml b/.travis.yml index c8ef6bc6..f908de1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,21 @@ +language: node_js +node_js: + - 10 +cache: + npm: true + directories: + # cache folder with Cypress binary + - ~/.cache dist: xenial -script: script/test +install: + - sudo apt-get install xvfb libgtk2.0-0 libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 + - npm ci +script: + - script/test + - docker-compose up -d + - docker-compose run web ./manage.py migrate + - docker-compose run web ./manage.py generate_test_data + - $(npm bin)/cypress run --record --key 88257c2f-8d2e-464c-878b-650cace8563e notifications: slack: rooms: diff --git a/cypress.json b/cypress.json new file mode 100644 index 00000000..ada7a9ad --- /dev/null +++ b/cypress.json @@ -0,0 +1,4 @@ +{ + "baseUrl": "http://localhost:8000", + "projectId": "3gfovh" +} diff --git a/cypress/fixtures/profile.png b/cypress/fixtures/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..88d7435fa82fb04f7c99895b6013f083d47efd65 GIT binary patch literal 38461 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 +const randomstring = require("randomstring"); + +describe("Booking a room", function() { + it("New user flow", function() { + cy.visit("/"); + cy.contains("Cummings Green").click(); + cy.contains("View all rooms").click(); + cy.contains("Evan Johnson").click({ force: true }); + + cy.get("input[name=arrive]").focus(); + // Pick next month so all the dates are available + cy.get(".react-datepicker__navigation--next").click({ force: true }); + cy.get("[aria-label=day-13]").click({ force: true }); + // Force de-select first date picker. For some reason immediately selecting second date + // picker causes first not to close. + cy.get("#network-footer").click("topLeft"); + cy.get("input[name=depart]").focus(); + cy.get("[aria-label=day-16]").click({ force: true }); + cy.get("[name=purpose]").type("Work."); + cy.contains("Request to Book").click(); + + cy.get("[name=bio]").type("I am a robot."); + cy.get("[name=projects]").type("Kill all humans."); + cy.get("[name=sharing]").type("I can do your math homework."); + cy.get("[name=discussion]").type("Is AI risk overrated?"); + cy.get("[name=first_name]").type("Bot"); + cy.get("[name=last_name]").type("McBotface"); + cy.get("[name=referral]").type("Pixel"); + cy.get("[name=city]").type("Chapek 9"); + cy.get("[name=email]").type(`${randomstring.generate(10)}@example.com`); + cy.get("[name=password1]").type("password"); + cy.get("[name=password2]").type("password"); + + cy.uploadFile("profile.png", "input[name=image"); + + cy.contains("Submit").click(); + + cy.contains("Your booking has been submitted."); + }); +}); diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 00000000..fd170fba --- /dev/null +++ b/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/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 00000000..d1072243 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,41 @@ +// *********************************************** +// 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) => { ... }) + +// https://github.com/cypress-io/cypress/issues/170 +Cypress.Commands.add("uploadFile", (fileName, selector) => { + cy.get(selector).then(subject => { + cy.fixture(fileName).then(content => { + Cypress.Blob.base64StringToBlob(content, "image/jpeg").then(blob => { + const el = subject[0]; + const testFile = new File([blob], fileName); + const dataTransfer = new DataTransfer(); + + dataTransfer.items.add(testFile); + el.files = dataTransfer.files; + }); + }); + }); +}); diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 00000000..d68db96d --- /dev/null +++ b/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/docs/browser-tests.md b/docs/browser-tests.md new file mode 100644 index 00000000..9dabefcc --- /dev/null +++ b/docs/browser-tests.md @@ -0,0 +1,16 @@ +# Browser tests + +We use [Cypress](https://www.cypress.io/) to test the high-level features of Modernomad in a browser. This checks that the frontend code and backend code all work together from the level of a user clicking around on the site. + +Cypress needs to run on your local machine, not inside Chrome or a VM, because it has to start and control your browser. + +First, install Cypress: + + $ npm install + +Then, start it up: + + npm run cypress:open + +[The Cypress documentation has information on how to run and write tests.](https://docs.cypress.io/) The test cases are in `cypress/fixtures/`. + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..795814f5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1662 @@ +{ + "name": "modernomad", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@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": { + "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" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.3.tgz", + "integrity": "sha512-yYrK+/bgL3hwoRHMZG4r5fyLniCy1pXex5fimtewAY6vE/jsVs8Q37UsEO03tFlcmiLnQ3rBNMaZBYTi/+C1cw==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "@types/blob-util": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/blob-util/-/blob-util-1.3.3.tgz", + "integrity": "sha512-4ahcL/QDnpjWA2Qs16ZMQif7HjGP2cw3AGjHabybjw7Vm1EKu+cfQN1D78BaZbS1WJNa1opSMF5HNMztx7lR0w==", + "dev": true + }, + "@types/bluebird": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.18.tgz", + "integrity": "sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w==", + "dev": true + }, + "@types/chai": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.8.tgz", + "integrity": "sha512-m812CONwdZn/dMzkIJEY0yAs4apyTkTORgfB2UsMOxgkUbC205AHnm4T8I0I5gPg9MHrFc1dJ35iS75c0CJkjg==", + "dev": true + }, + "@types/chai-jquery": { + "version": "1.1.35", + "resolved": "https://registry.npmjs.org/@types/chai-jquery/-/chai-jquery-1.1.35.tgz", + "integrity": "sha512-7aIt9QMRdxuagLLI48dPz96YJdhu64p6FCa6n4qkGN5DQLHnrIjZpD9bXCvV2G0NwgZ1FAmfP214dxc5zNCfgQ==", + "dev": true, + "requires": { + "@types/chai": "*", + "@types/jquery": "*" + } + }, + "@types/jquery": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.6.tgz", + "integrity": "sha512-403D4wN95Mtzt2EoQHARf5oe/jEPhzBOBNrunk+ydQGW8WmkQ/E8rViRAEB1qEt/vssfGfNVD6ujP4FVeegrLg==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.87", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.87.tgz", + "integrity": "sha512-AqRC+aEF4N0LuNHtcjKtvF9OTfqZI0iaBoe3dA6m/W+/YZJBZjBmW/QIZ8fBeXC6cnytSY9tBoFBqZ9uSCeVsw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mocha": { + "version": "2.2.44", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.44.tgz", + "integrity": "sha512-k2tWTQU8G4+iSMvqKi0Q9IIsWAp/n8xzdZS4Q4YVIltApoMA00wFBFdlJnmoaK1/z7B0Cy0yPe6GgXteSmdUNw==", + "dev": true + }, + "@types/sinon": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.0.0.tgz", + "integrity": "sha512-kcYoPw0uKioFVC/oOqafk2yizSceIQXCYnkYts9vJIwQklFRsMubTObTDrjQamUyBRd47332s85074cd/hCwxg==", + "dev": true + }, + "@types/sinon-chai": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.2.tgz", + "integrity": "sha512-5zSs2AslzyPZdOsbm2NRtuSNAI2aTWzNKOHa/GRecKo7a5efYD7qGcPxMZXQDayVXT2Vnd5waXxBvV31eCZqiA==", + "dev": true, + "requires": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.4.0.tgz", + "integrity": "sha1-SZAgDxjqW4N8LMT4wDGmmFw4VhE=", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "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=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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 + }, + "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" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "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 + }, + "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==", + "dev": true, + "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=", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "common-tags": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.4.0.tgz", + "integrity": "sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA=", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-js": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz", + "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ==", + "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=", + "dev": true + }, + "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" + } + }, + "cypress": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.1.5.tgz", + "integrity": "sha512-jzYGKJqU1CHoNocPndinf/vbG28SeU+hg+4qhousT/HDBMJxYgjecXOmSgBX/ga9/TakhqSrIrSP2r6gW/OLtg==", + "dev": true, + "requires": { + "@cypress/listr-verbose-renderer": "0.4.1", + "@cypress/xvfb": "1.2.3", + "@types/blob-util": "1.3.3", + "@types/bluebird": "3.5.18", + "@types/chai": "4.0.8", + "@types/chai-jquery": "1.1.35", + "@types/jquery": "3.3.6", + "@types/lodash": "4.14.87", + "@types/minimatch": "3.0.3", + "@types/mocha": "2.2.44", + "@types/sinon": "7.0.0", + "@types/sinon-chai": "3.2.2", + "bluebird": "3.5.0", + "cachedir": "1.3.0", + "chalk": "2.4.1", + "check-more-types": "2.24.0", + "commander": "2.11.0", + "common-tags": "1.4.0", + "debug": "3.1.0", + "execa": "0.10.0", + "executable": "4.1.1", + "extract-zip": "1.6.6", + "fs-extra": "4.0.1", + "getos": "3.1.0", + "glob": "7.1.2", + "is-ci": "1.0.10", + "is-installed-globally": "0.1.0", + "lazy-ass": "1.6.0", + "listr": "0.12.0", + "lodash": "4.17.11", + "log-symbols": "2.2.0", + "minimist": "1.2.0", + "moment": "2.22.2", + "ramda": "0.24.1", + "request": "2.87.0", + "request-progress": "0.3.1", + "supports-color": "5.1.0", + "tmp": "0.0.31", + "url": "0.11.0", + "yauzl": "2.8.0" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "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 + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "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 + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "debug": "2.6.9", + "mkdirp": "0.5.0", + "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" + } + }, + "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" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", + "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "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 + }, + "getos": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.0.tgz", + "integrity": "sha512-i9vrxtDu5DlLVFcrbqUqGWYlZN/zZ4pGMICCAcZoYsX3JA54nYp8r5EThw5K+m2q3wszkx4Th746JstspB0H4Q==", + "dev": true, + "requires": { + "async": "2.4.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^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=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "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" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "is-ci": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true, + "requires": { + "ci-info": "^1.0.0" + } + }, + "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": "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" + } + }, + "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-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.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-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true + }, + "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": { + "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" + } + }, + "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-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": { + "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": { + "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" + } + }, + "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 + } + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "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 + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "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" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "requires": { + "mime-db": "~1.37.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 + }, + "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" + } + }, + "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 + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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 + } + } + }, + "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 + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "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-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "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=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "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", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "dev": true + }, + "randomstring": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.1.5.tgz", + "integrity": "sha1-bfBij3XL1ZMpMNn+OrTpVqGFGMM=", + "dev": true, + "requires": { + "array-uniq": "1.0.2" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "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.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, + "request-progress": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz", + "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=", + "dev": true, + "requires": { + "throttleit": "~0.0.2" + } + }, + "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" + } + }, + "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", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "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 + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "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 + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "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 + }, + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "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 + }, + "supports-color": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", + "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + } + } + }, + "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 + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "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 + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "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" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yauzl": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz", + "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..55d68c68 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "modernomad", + "version": "1.0.0", + "dependencies": {}, + "devDependencies": { + "cypress": "^3.1.5", + "randomstring": "^1.1.5" + }, + "scripts": { + "cypress:open": "cypress open" + } +} diff --git a/readme.md b/readme.md index e5d34627..014816ce 100644 --- a/readme.md +++ b/readme.md @@ -25,14 +25,14 @@ Interested in contributing? We use [Trello](https://trello.com/b/FPDnTkqj/modern associated with this repository if you are not on trello and want to report problems, bugs or make suggestions. [Read more about contributing](docs/contributing.md). -### Docker development environment +### Development environment The easiest way to get up and running in development is by using Docker. See [Docker development environment](docs/docker-development-environment.md). -### Manual setup - If you can't or don't want to use Docker, see [Environment Setup](docs/environment-setup.md) and [How to Run](docs/how-to-run.md). +We use browser tests to ensure Modernomad keeps on doing what we want it to do. [See browser test documentation if you want to run or write tests.](docs/browser-tests.md) + ### Configuration see [Configuration](docs/configuration.md)