From 7c0304e4dabf547feea77f83f323d6f39a66c795 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Mon, 22 Jan 2018 22:14:57 -0500 Subject: [PATCH 01/16] wrote e2e tests --- cypress.json | 3 + cypress/fixtures/example.json | 5 + cypress/integration/spec.js | 38 ++ cypress/plugins/index.js | 17 + cypress/support/commands.js | 25 + cypress/support/index.js | 20 + package-lock.json | 1044 +++++++++++++++++++++++++++++++++ package.json | 1 + 8 files changed, 1153 insertions(+) create mode 100644 cypress.json create mode 100644 cypress/fixtures/example.json create mode 100644 cypress/integration/spec.js create mode 100644 cypress/plugins/index.js create mode 100644 cypress/support/commands.js create mode 100644 cypress/support/index.js diff --git a/cypress.json b/cypress.json new file mode 100644 index 000000000..f5d036516 --- /dev/null +++ b/cypress.json @@ -0,0 +1,3 @@ +{ + "baseUrl": "https://vue-hn.now.sh" +} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 000000000..da18d9352 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/cypress/integration/spec.js b/cypress/integration/spec.js new file mode 100644 index 000000000..0eaf4316a --- /dev/null +++ b/cypress/integration/spec.js @@ -0,0 +1,38 @@ +/* eslint-env mocha */ +/* global cy */ +describe('HackerNews', () => { + beforeEach(() => { + cy.visit('/') + }) + it('loads', () => { + cy.contains('Built with Vue.js') + }) + it('loads news items', () => { + cy.get('.news-item').should('have.length.gt', 10) + }) + it('goes to the second page and back', () => { + cy.contains('.news-list-nav a', 'more >').click() + cy.url().should('contain', '/top/2') + cy.go('back') + cy.url().should('contain', '/top') + }) + it('cannot go to the previous page', () => { + cy.contains('.news-list-nav a', '< prev') + .should('have.class', 'disabled') + }) + it.only('goes to comments and back', () => { + // see comments for the first story + cy.get('.news-item') + .first().find('.meta .comments-link') + .click() + // loader disappears, and comments are there + cy.get('.item-view-comments-header .spinner').should('not.be.visible') + // NOTE: there might be zero comments + cy.get('.comment') + .should('have.length.gte', 0) + .and('be.visible') + // go to the top news + cy.get('nav').contains('Top').click() + cy.url().should('contain', '/top') + }) +}) diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 000000000..fd170fba6 --- /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 000000000..c1f5a772e --- /dev/null +++ b/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/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 000000000..d68db96df --- /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/package-lock.json b/package-lock.json index 1587b9f33..24bda8d7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3,6 +3,27 @@ "requires": true, "lockfileVersion": 1, "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.29.0", + "figures": "1.7.0" + } + }, + "@cypress/xvfb": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.1.3.tgz", + "integrity": "sha512-EfRzw+wgI0Zdb4ZlhSvjh3q7I+oenqEYPXvr7oH/2RnzQqGDrPr7IU1Pi2yzGwoXmkNUQbo6qvntnItvQj0F4Q==", + "dev": true, + "requires": { + "lodash.once": "4.1.1" + } + }, "@firebase/app": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.1.2.tgz", @@ -64,6 +85,74 @@ "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.4.tgz", "integrity": "sha512-jEpglcwMlwdXc/JgvJaJtCSkPMktnFeI0gAZxPrmbJxKVzMZJ2zM582NbW/r6M22pSdNWjcWeg1I2LRg3jQGQA==" }, + "@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": "4.0.8", + "@types/jquery": "3.2.16" + } + }, + "@types/jquery": { + "version": "3.2.16", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.2.16.tgz", + "integrity": "sha512-q2WC02YxQoX2nY1HRKlYGHpGP1saPmD7GN0pwCDlTz35a4eOtJG+aHRlXyjCuXokUukSrR2aXyBhSW3j+jPc0A==", + "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.1", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.1.tgz", + "integrity": "sha512-rUO/jz10KRSyA9SHoCWQ8WX9BICyj5jZYu1/ucKEJKb4KzLZCKMURdYbadP157Q6Zl1x0vHsrU+Z/O0XlhYQDw==", + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-4.0.0.tgz", + "integrity": "sha512-cuK4xM8Lg2wd8cxshcQa8RG4IK/xfyB6TNE6tNVvkrShR4xdrYgsV04q6Dp6v1Lp6biEFdzD8k8zg/ujQeiw+A==", + "dev": true + }, + "@types/sinon-chai": { + "version": "2.7.29", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-2.7.29.tgz", + "integrity": "sha512-EkI/ZvJT4hglWo7Ipf9SX+J+R9htNOMjW8xiOhce7+0csqvgoF5IXqY5Ae1GqRgNtWCuaywR5HjVa1snkTqpOw==", + "dev": true, + "requires": { + "@types/chai": "4.0.8", + "@types/sinon": "4.0.0" + } + }, "accepts": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", @@ -145,6 +234,12 @@ "string-width": "1.0.2" } }, + "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-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -233,6 +328,12 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, "asn1.js": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", @@ -253,6 +354,12 @@ "util": "0.10.3" } }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", @@ -267,6 +374,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, "autoprefixer": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", @@ -281,6 +394,18 @@ "postcss-value-parser": "3.3.0" } }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -939,6 +1064,16 @@ "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -979,6 +1114,15 @@ "type-is": "1.6.15" } }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, "boxen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", @@ -1114,6 +1258,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-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1195,6 +1345,12 @@ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -1217,6 +1373,12 @@ "supports-color": "2.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 + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1234,6 +1396,12 @@ "readdirp": "2.1.0" } }, + "ci-info": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", + "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1259,6 +1427,31 @@ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", "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.2" + } + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -1348,12 +1541,30 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "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.26.0" + } + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1388,6 +1599,17 @@ "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.3.3", + "typedarray": "0.0.6" + } + }, "configstore": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", @@ -1554,6 +1776,15 @@ "which": "1.3.0" } }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -1798,6 +2029,113 @@ "array-find-index": "1.0.2" } }, + "cypress": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-1.4.1.tgz", + "integrity": "sha1-YvQHSgDm8S4t/jiKf06BaknOsD8=", + "dev": true, + "requires": { + "@cypress/listr-verbose-renderer": "0.4.1", + "@cypress/xvfb": "1.1.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.2.16", + "@types/lodash": "4.14.87", + "@types/minimatch": "3.0.1", + "@types/mocha": "2.2.44", + "@types/sinon": "4.0.0", + "@types/sinon-chai": "2.7.29", + "bluebird": "3.5.0", + "chalk": "2.1.0", + "check-more-types": "2.24.0", + "commander": "2.11.0", + "common-tags": "1.4.0", + "debug": "3.1.0", + "extract-zip": "1.6.6", + "fs-extra": "4.0.1", + "getos": "2.8.4", + "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.4", + "minimist": "1.2.0", + "progress": "1.1.8", + "ramda": "0.24.1", + "request": "2.81.0", + "request-progress": "0.3.1", + "supports-color": "5.1.0", + "tmp": "0.0.31", + "url": "0.11.0", + "yauzl": "2.8.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "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" + } + }, + "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.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" + } + } + } + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -1807,6 +2145,29 @@ "es5-ext": "0.10.35" } }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1868,6 +2229,12 @@ } } }, + "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 + }, "depd": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", @@ -1946,6 +2313,16 @@ "readable-stream": "2.3.3" } }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1957,6 +2334,12 @@ "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", "dev": true }, + "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.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", @@ -2192,6 +2575,12 @@ "strip-eof": "1.0.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 + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -2247,6 +2636,12 @@ "vary": "1.1.2" } }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2267,6 +2662,44 @@ "webpack-sources": "1.0.2" } }, + "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": { + "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" + } + }, + "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.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -2291,6 +2724,25 @@ "websocket-driver": "0.7.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" + } + }, + "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.1" + } + }, "file-loader": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", @@ -2397,6 +2849,23 @@ "for-in": "1.0.2" } }, + "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.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -2418,6 +2887,17 @@ "string-length": "1.0.1" } }, + "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.11", + "jsonfile": "3.0.1", + "universalify": "0.1.1" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3352,6 +3832,43 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, + "getos": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/getos/-/getos-2.8.4.tgz", + "integrity": "sha1-e4YD02GcKOOMsP56T2PDrLgNUWM=", + "dev": true, + "requires": { + "async": "2.1.4" + }, + "dependencies": { + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + } + } + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -3385,6 +3902,15 @@ "is-glob": "2.0.1" } }, + "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": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", @@ -3442,6 +3968,34 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + } + } + }, "has": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", @@ -3489,6 +4043,18 @@ "minimalistic-assert": "1.0.0" } }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -3505,6 +4071,12 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -3556,6 +4128,17 @@ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=" }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, "https-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", @@ -3698,6 +4281,15 @@ "builtin-modules": "1.1.1" } }, + "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.1.2" + } + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -3758,6 +4350,16 @@ "is-extglob": "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.1", + "is-path-inside": "1.0.0" + } + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -3821,6 +4423,12 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "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-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -3848,6 +4456,12 @@ "html-comment-regex": "1.1.1" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -3879,6 +4493,12 @@ "isarray": "1.0.0" } }, + "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 + }, "js-base64": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", @@ -3901,6 +4521,13 @@ "esprima": "2.7.3" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -3913,16 +4540,72 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "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=" }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "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", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, + "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.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "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" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3941,6 +4624,12 @@ "package-json": "2.4.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 + }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -3962,6 +4651,72 @@ "invert-kv": "1.0.0" } }, + "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.1", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "ora": "0.2.3", + "p-map": "1.2.0", + "rxjs": "5.5.6", + "stream-to-observable": "0.1.0", + "strip-ansi": "3.0.1" + } + }, + "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.2.0", + "log-symbols": "1.0.2", + "log-update": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "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 + } + } + }, + "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.29.0", + "figures": "1.7.0" + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -4043,6 +4798,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "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.template": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -4065,6 +4826,25 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, + "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.1.3" + } + }, + "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.4.0", + "cli-cursor": "1.0.2" + } + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -4427,6 +5207,12 @@ "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", @@ -4465,6 +5251,24 @@ "wrappy": "1.0.2" } }, + "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.3", + "cli-cursor": "1.0.2", + "cli-spinners": "0.1.2", + "object-assign": "4.1.1" + } + }, "os-browserify": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", @@ -4525,6 +5329,12 @@ "p-limit": "1.1.0" } }, + "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 + }, "package-json": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", @@ -4654,6 +5464,18 @@ "sha.js": "2.4.9" } }, + "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": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -6008,6 +6830,12 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, "promise-polyfill": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz", @@ -6085,6 +6913,12 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "dev": true + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", @@ -6418,6 +7252,59 @@ "is-finite": "1.0.2" } }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.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.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "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": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + } + } + }, + "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" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6444,6 +7331,16 @@ "path-parse": "1.0.5" } }, + "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.1.1", + "onetime": "1.1.0" + } + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -6500,6 +7397,15 @@ } } }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -6646,12 +7552,27 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "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 + }, "slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -6715,6 +7636,30 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, "stackframe": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", @@ -6749,6 +7694,12 @@ "xtend": "4.0.1" } }, + "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", @@ -6784,6 +7735,12 @@ "safe-buffer": "5.1.1" } }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -6954,12 +7911,24 @@ } } }, + "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 + }, "tapable": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, "time-stamp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", @@ -6981,6 +7950,15 @@ "setimmediate": "1.0.5" } }, + "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.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -6993,6 +7971,15 @@ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -7011,6 +7998,22 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "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.1.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, + "optional": true + }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -7020,6 +8023,12 @@ "mime-types": "2.1.17" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "uglify-js": { "version": "3.1.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.9.tgz", @@ -7106,6 +8115,12 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -7232,6 +8247,25 @@ "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", "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.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -7718,6 +8752,16 @@ "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.13", + "fd-slicer": "1.0.1" + } } } } diff --git a/package.json b/package.json index c06822be4..e3002fea9 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "babel-preset-env": "^1.6.1", "chokidar": "^1.7.0", "css-loader": "^0.28.7", + "cypress": "^1.4.1", "file-loader": "^1.1.5", "friendly-errors-webpack-plugin": "^1.6.1", "rimraf": "^2.6.2", From 878c8f5721e14a9d5b55f01f73cf13be795887d8 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Mon, 22 Jan 2018 22:41:02 -0500 Subject: [PATCH 02/16] start component unit tests --- cypress/integration/item-spec.js | 25 +++++++++++++++++++++++++ cypress/integration/spec.js | 2 +- cypress/plugins/index.js | 23 +++++++---------------- package.json | 1 + 4 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 cypress/integration/item-spec.js diff --git a/cypress/integration/item-spec.js b/cypress/integration/item-spec.js new file mode 100644 index 000000000..6f7d4db75 --- /dev/null +++ b/cypress/integration/item-spec.js @@ -0,0 +1,25 @@ +import Item from '../../src/components/Item.vue' +import { timeAgo } from '../../src/util/filters' +import Vue from 'vue' + +const mountVue = require('cypress-vue-unit-test') +/* eslint-env mocha */ +/* global cy */ +describe('Item', () => { + const template = `` + const components = { + 'news-item': Item, + 'router-link': Vue.component('router-link', { + name: 'router-link' + }) + } + const data = { + item: {} + } + const options = { + vue: 'https://unpkg.com/vue' + } + beforeEach(mountVue({ template, components, data }, options)) + + it('loads', () => {}) +}) diff --git a/cypress/integration/spec.js b/cypress/integration/spec.js index 0eaf4316a..41ef6b850 100644 --- a/cypress/integration/spec.js +++ b/cypress/integration/spec.js @@ -20,7 +20,7 @@ describe('HackerNews', () => { cy.contains('.news-list-nav a', '< prev') .should('have.class', 'disabled') }) - it.only('goes to comments and back', () => { + it('goes to comments and back', () => { // see comments for the first story cy.get('.news-item') .first().find('.meta .comments-link') diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index fd170fba6..a3bb8c08f 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -1,17 +1,8 @@ -// *********************************************************** -// 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 +const join = require('path').join +const { + onFilePreprocessor +} = require('cypress-vue-unit-test/preprocessor/webpack') +const config = join(__dirname, '../../build/webpack.base.config') +module.exports = on => { + on('file:preprocessor', onFilePreprocessor(config)) } diff --git a/package.json b/package.json index e3002fea9..7487a0fe8 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "chokidar": "^1.7.0", "css-loader": "^0.28.7", "cypress": "^1.4.1", + "cypress-vue-unit-test": "^1.8.1", "file-loader": "^1.1.5", "friendly-errors-webpack-plugin": "^1.6.1", "rimraf": "^2.6.2", From c5f0a5254914d45b2a79a8a3afc5dec2ddeadea0 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Tue, 23 Jan 2018 09:04:54 -0500 Subject: [PATCH 03/16] setup travis CI --- .gitignore | 3 ++- .travis.yml | 7 +++++++ cypress.json | 3 ++- cypress/integration/item-spec.js | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .travis.yml diff --git a/.gitignore b/.gitignore index 2d25aef65..107c58cd0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ dist/ npm-debug.log yarn-error.log .idea -*.iml \ No newline at end of file +*.iml +cypress/videos diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..771be44fb --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +cache: + directories: + - ~/.npm + - node_modules +script: + - $(npm bin)/cypress run --record diff --git a/cypress.json b/cypress.json index f5d036516..870b3cb82 100644 --- a/cypress.json +++ b/cypress.json @@ -1,3 +1,4 @@ { - "baseUrl": "https://vue-hn.now.sh" + "baseUrl": "https://vue-hn.now.sh", + "projectId": "b1sfu5" } diff --git a/cypress/integration/item-spec.js b/cypress/integration/item-spec.js index 6f7d4db75..1ecd8ac84 100644 --- a/cypress/integration/item-spec.js +++ b/cypress/integration/item-spec.js @@ -5,7 +5,7 @@ import Vue from 'vue' const mountVue = require('cypress-vue-unit-test') /* eslint-env mocha */ /* global cy */ -describe('Item', () => { +describe.skip('Item', () => { const template = `` const components = { 'news-item': Item, From a48e2b736b5db7289f5ba8ec9e1a6401e1f4fc5c Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Tue, 23 Jan 2018 09:06:22 -0500 Subject: [PATCH 04/16] use node 8 on Travis --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 771be44fb..56a3d45d9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: node_js +node_js: + - '8' cache: directories: - ~/.npm From b8f6b93cfcc7ec9f9ccb2ef68f4921885e65e79b Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Tue, 23 Jan 2018 18:16:45 -0500 Subject: [PATCH 05/16] trying to uninstall all SW and clear caches --- cypress/integration/no-sw-spec.js | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 cypress/integration/no-sw-spec.js diff --git a/cypress/integration/no-sw-spec.js b/cypress/integration/no-sw-spec.js new file mode 100644 index 000000000..87cce63f2 --- /dev/null +++ b/cypress/integration/no-sw-spec.js @@ -0,0 +1,42 @@ +/* eslint-env mocha */ +/* global cy, Cypress */ +describe('Without ServiceWorker', () => { + // cleaning anything cached by the ServiceWorker + // and preventing ServiceWorker from registering + // https://github.com/cypress-io/cypress/issues/702 + const clearCache = (name) => + window.caches.delete(name) + + const clearCaches = () => + window.caches.keys().then(cacheNames => + Promise.all(cacheNames.map(clearCache))) + + // prevents new service worker registration + const neverRegisterSW = (win) => { + // use a promise that never resolves + const neverResolves = new Promise(resolve => {}) + win.navigator.serviceWorker.register = () => neverResolves + } + + // unregisters any service workers already registered + const unregisterWorkers = (win) => + win.navigator.serviceWorker.getRegistrations() + .then(registrations => + Cypress.Promise.map(registrations, sw => sw.unregister()) + ) + + beforeEach(clearCaches) + + beforeEach(() => { + cy.visit('/', { + onBeforeLoad: win => { + neverRegisterSW(win) + return unregisterWorkers(win) + } + }) + }) + + it('loads news items', () => { + cy.get('.news-item').should('have.length.gt', 10) + }) +}) From d809f04aa63e66ad7da946ecd975648c0af45ab8 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Tue, 23 Jan 2018 22:47:59 -0500 Subject: [PATCH 06/16] more sw --- cypress/integration/no-sw-spec.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cypress/integration/no-sw-spec.js b/cypress/integration/no-sw-spec.js index 87cce63f2..46ad9988a 100644 --- a/cypress/integration/no-sw-spec.js +++ b/cypress/integration/no-sw-spec.js @@ -28,11 +28,12 @@ describe('Without ServiceWorker', () => { beforeEach(clearCaches) beforeEach(() => { + const clearSW = win => { + neverRegisterSW(win) + return unregisterWorkers(win) + } cy.visit('/', { - onBeforeLoad: win => { - neverRegisterSW(win) - return unregisterWorkers(win) - } + onBeforeLoad: clearSW }) }) From d9de141eeaec051113d317ff674e7a31085b131e Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Tue, 23 Jan 2018 23:39:35 -0500 Subject: [PATCH 07/16] working filters on Item tests except for router-link --- cypress/integration/item-spec.js | 42 ++++-- package-lock.json | 232 +++++++++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 263 insertions(+), 13 deletions(-) diff --git a/cypress/integration/item-spec.js b/cypress/integration/item-spec.js index 1ecd8ac84..1d2f5322c 100644 --- a/cypress/integration/item-spec.js +++ b/cypress/integration/item-spec.js @@ -1,25 +1,43 @@ import Item from '../../src/components/Item.vue' -import { timeAgo } from '../../src/util/filters' -import Vue from 'vue' +import { timeAgo, host } from '../../src/util/filters' const mountVue = require('cypress-vue-unit-test') /* eslint-env mocha */ -/* global cy */ -describe.skip('Item', () => { - const template = `` +/* global cy, Cypress */ +describe('Item', () => { + const template = `` const components = { - 'news-item': Item, - 'router-link': Vue.component('router-link', { - name: 'router-link' - }) + 'news-item': Item } const data = { - item: {} + item: { + title: 'Vue unit testing with Cypress', + score: 101, + url: 'https://www.cypress.io', + id: 'a0x', + by: 'bahmutov', + time: Cypress.moment('Jan 22 2018').unix(), + descendants: 42 + } + } + const extensions = { + filters: { timeAgo, host } } const options = { - vue: 'https://unpkg.com/vue' + vue: 'https://unpkg.com/vue', + extensions } + + beforeEach(() => { + cy.viewport(400, 200) + }) beforeEach(mountVue({ template, components, data }, options)) - it('loads', () => {}) + it('loads news item', () => { + cy.contains('.score', 101) + }) + + it('has link to comments', () => { + cy.contains('router-link', '42 comments') + }) }) diff --git a/package-lock.json b/package-lock.json index 24bda8d7f..182cb6142 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,121 @@ "figures": "1.7.0" } }, + "@cypress/webpack-preprocessor": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-1.1.2.tgz", + "integrity": "sha512-3aV9yGMQAe7kLSP9mcnjPEFjVHWo1Kn4odNErvHvS7YStdzlVZJe75krI4Sg6/ez55imdzYvg4RVMs6b5YkdaQ==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-loader": "7.1.2", + "babel-preset-env": "1.6.0", + "babel-preset-react": "6.24.1", + "bluebird": "3.5.0", + "debug": "3.1.0", + "webpack": "3.6.0" + }, + "dependencies": { + "babel-preset-env": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", + "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.9.0", + "invariant": "2.2.2", + "semver": "5.4.1" + } + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "webpack": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz", + "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.3.0", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.0.4", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.0.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.0.2", + "yargs": "8.0.2" + } + } + } + }, "@cypress/xvfb": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.1.3.tgz", @@ -487,6 +602,17 @@ "babel-types": "6.26.0" } }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" + } + }, "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", @@ -660,6 +786,18 @@ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", @@ -922,6 +1060,56 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, "babel-plugin-transform-regenerator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", @@ -979,6 +1167,29 @@ "semver": "5.4.1" } }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" + } + }, "babel-register": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", @@ -2136,6 +2347,27 @@ } } }, + "cypress-vue-unit-test": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/cypress-vue-unit-test/-/cypress-vue-unit-test-1.9.0.tgz", + "integrity": "sha512-0LTox/kZKqS9PALACclSYQ9C33aotjAoVE50Xq7ikndo2eom+8CFE8SE9bBSftJ4XRHN9q/31JPQw8ncAP7Zqw==", + "dev": true, + "requires": { + "@cypress/webpack-preprocessor": "1.1.2", + "common-tags": "1.6.0" + }, + "dependencies": { + "common-tags": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.6.0.tgz", + "integrity": "sha512-sgmgEodNLbxnSSoR5a2xH23CoDJ9J5MKsJS/tqplfmJLpikG0oWMpAb+tM8ERQCMpp9I+ERf6SYl158G6GwX0w==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + } + } + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", diff --git a/package.json b/package.json index 7487a0fe8..5772408cb 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "chokidar": "^1.7.0", "css-loader": "^0.28.7", "cypress": "^1.4.1", - "cypress-vue-unit-test": "^1.8.1", + "cypress-vue-unit-test": "^1.9.0", "file-loader": "^1.1.5", "friendly-errors-webpack-plugin": "^1.6.1", "rimraf": "^2.6.2", From 12c13a82cb5f0becc09ff24f509b63abcb02f59c Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Wed, 24 Jan 2018 00:16:00 -0500 Subject: [PATCH 08/16] more try and fail --- cypress/integration/item-spec.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/cypress/integration/item-spec.js b/cypress/integration/item-spec.js index 1d2f5322c..d8a9e6612 100644 --- a/cypress/integration/item-spec.js +++ b/cypress/integration/item-spec.js @@ -23,8 +23,25 @@ describe('Item', () => { const extensions = { filters: { timeAgo, host } } + const html = ` + + + +
+ + + + ` + // + // hmm, when adding the vue router getting an error inside the RouterLink + // render function + // var router = this.$router; + // var current = this.$route; + // var ref = router.resolve(this.to, current, this.append); + // this.$router is undefined + // Seems VueRouter.install(Vue) did not go well const options = { - vue: 'https://unpkg.com/vue', + html, extensions } From 7d9074a8cef6bc88665fad109be4877f09e5286a Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Sun, 4 Feb 2018 21:39:06 -0500 Subject: [PATCH 09/16] trying to test router --- cypress/integration/item-spec.js | 24 +++++------------------- package.json | 7 +++++-- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/cypress/integration/item-spec.js b/cypress/integration/item-spec.js index d8a9e6612..d4de1f3bb 100644 --- a/cypress/integration/item-spec.js +++ b/cypress/integration/item-spec.js @@ -1,3 +1,5 @@ +import VueRouter from 'vue-router' +import router from '../../src/router' import Item from '../../src/components/Item.vue' import { timeAgo, host } from '../../src/util/filters' @@ -21,34 +23,18 @@ describe('Item', () => { } } const extensions = { + plugins: [VueRouter], filters: { timeAgo, host } } - const html = ` - - - -
- - - - ` - // - // hmm, when adding the vue router getting an error inside the RouterLink - // render function - // var router = this.$router; - // var current = this.$route; - // var ref = router.resolve(this.to, current, this.append); - // this.$router is undefined - // Seems VueRouter.install(Vue) did not go well + const options = { - html, extensions } beforeEach(() => { cy.viewport(400, 200) }) - beforeEach(mountVue({ template, components, data }, options)) + beforeEach(mountVue({ template, router, components, data }, options)) it('loads news item', () => { cy.contains('.score', 101) diff --git a/package.json b/package.json index 5772408cb..88fc60f55 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "start": "cross-env NODE_ENV=production node server", "build": "rimraf dist && npm run build:client && npm run build:server", "build:client": "cross-env NODE_ENV=production webpack --config build/webpack.client.config.js --progress --hide-modules", - "build:server": "cross-env NODE_ENV=production webpack --config build/webpack.server.config.js --progress --hide-modules" + "build:server": "cross-env NODE_ENV=production webpack --config build/webpack.server.config.js --progress --hide-modules", + "cy:open": "cypress open", + "e2e": "start-server-and-test dev http://localhost:8080 cy:open" }, "engines": { "node": ">=7.0", @@ -39,10 +41,11 @@ "chokidar": "^1.7.0", "css-loader": "^0.28.7", "cypress": "^1.4.1", - "cypress-vue-unit-test": "^1.9.0", + "cypress-vue-unit-test": "^1.10.0", "file-loader": "^1.1.5", "friendly-errors-webpack-plugin": "^1.6.1", "rimraf": "^2.6.2", + "start-server-and-test": "^1.0.0", "stylus": "^0.54.5", "stylus-loader": "^3.0.1", "sw-precache-webpack-plugin": "^0.11.4", From 913e2b3350573c0259d49d5b4c0b43f30070e495 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 16 Feb 2018 20:14:39 +0000 Subject: [PATCH 10/16] chore(package): update dependencies --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 88fc60f55..a778ef28c 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,9 @@ "es6-promise": "^4.1.1", "express": "^4.16.2", "extract-text-webpack-plugin": "^3.0.2", - "firebase": "4.6.2", + "firebase": "4.10.0", "lru-cache": "^4.1.1", - "route-cache": "0.4.3", + "route-cache": "0.4.4", "serve-favicon": "^2.4.5", "vue": "^2.5.3", "vue-router": "^3.0.1", @@ -33,14 +33,14 @@ "vuex-router-sync": "^5.0.0" }, "devDependencies": { - "autoprefixer": "^7.1.6", + "autoprefixer": "^8.0.0", "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-plugin-syntax-dynamic-import": "^6.18.0", "babel-preset-env": "^1.6.1", - "chokidar": "^1.7.0", + "chokidar": "^2.0.2", "css-loader": "^0.28.7", - "cypress": "^1.4.1", + "cypress": "^2.0.0", "cypress-vue-unit-test": "^1.10.0", "file-loader": "^1.1.5", "friendly-errors-webpack-plugin": "^1.6.1", @@ -50,11 +50,11 @@ "stylus-loader": "^3.0.1", "sw-precache-webpack-plugin": "^0.11.4", "url-loader": "^0.6.2", - "vue-loader": "^13.5.0", - "vue-style-loader": "^3.0.3", + "vue-loader": "^14.1.1", + "vue-style-loader": "^4.0.2", "vue-template-compiler": "^2.5.3", "webpack": "^3.8.1", - "webpack-dev-middleware": "^1.12.0", + "webpack-dev-middleware": "^2.0.5", "webpack-hot-middleware": "^2.20.0", "webpack-merge": "^4.1.1", "webpack-node-externals": "^1.6.0" From ac0bcb2618cc41086ca1a43ef2c6a700857438ec Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 16 Feb 2018 20:14:42 +0000 Subject: [PATCH 11/16] docs(readme): add Greenkeeper badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1aec3a95f..5727ce82c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # vue-hackernews-2.0 +[![Greenkeeper badge](https://badges.greenkeeper.io/bahmutov/vue-hackernews-2.0.svg)](https://greenkeeper.io/) + HackerNews clone built with Vue 2.0 + vue-router + vuex, with server-side rendering.

From 7aeac796430316a07b60def4132d6a21a7ff35c8 Mon Sep 17 00:00:00 2001 From: Amir Rustamzadeh Date: Fri, 16 Feb 2018 12:33:33 -0800 Subject: [PATCH 12/16] Fix RouterLink issue and item-spec test (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Cypress commands to scripts * Add Cypress specific webpack config We need a base config but with an alias for ‘create-api’. * Set Cypress ’baseUrl’ to local dev server * Fix Vue Router integeration - add `VueRouter` to plugins option - generate router instance with `createRouter` - include router instance in component object --- build/webpack.cypress.config.js | 13 +++++++++++++ cypress.json | 2 +- cypress/integration/item-spec.js | 9 +++++++-- cypress/plugins/index.js | 2 +- package.json | 2 ++ 5 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 build/webpack.cypress.config.js diff --git a/build/webpack.cypress.config.js b/build/webpack.cypress.config.js new file mode 100644 index 000000000..15899e073 --- /dev/null +++ b/build/webpack.cypress.config.js @@ -0,0 +1,13 @@ +const path = require('path') +const merge = require('webpack-merge') +const base = require('./webpack.base.config') + +const config = merge(base, { + resolve: { + alias: { + 'create-api': './create-api-client.js' + } + } +}) + +module.exports = config \ No newline at end of file diff --git a/cypress.json b/cypress.json index 870b3cb82..3255b61ad 100644 --- a/cypress.json +++ b/cypress.json @@ -1,4 +1,4 @@ { - "baseUrl": "https://vue-hn.now.sh", + "baseUrl": "http://localhost:8080", "projectId": "b1sfu5" } diff --git a/cypress/integration/item-spec.js b/cypress/integration/item-spec.js index d4de1f3bb..60f2c8106 100644 --- a/cypress/integration/item-spec.js +++ b/cypress/integration/item-spec.js @@ -2,8 +2,10 @@ import VueRouter from 'vue-router' import router from '../../src/router' import Item from '../../src/components/Item.vue' import { timeAgo, host } from '../../src/util/filters' +import { createRouter } from '../../src/router' +import VueRouter from 'vue-router' +import mountVue from 'cypress-vue-unit-test' -const mountVue = require('cypress-vue-unit-test') /* eslint-env mocha */ /* global cy, Cypress */ describe('Item', () => { @@ -22,6 +24,7 @@ describe('Item', () => { descendants: 42 } } + const extensions = { plugins: [VueRouter], filters: { timeAgo, host } @@ -31,6 +34,8 @@ describe('Item', () => { extensions } + const router = createRouter() + beforeEach(() => { cy.viewport(400, 200) }) @@ -41,6 +46,6 @@ describe('Item', () => { }) it('has link to comments', () => { - cy.contains('router-link', '42 comments') + cy.contains('.comments-link > a', '42 comments') }) }) diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js index a3bb8c08f..6512accbf 100644 --- a/cypress/plugins/index.js +++ b/cypress/plugins/index.js @@ -2,7 +2,7 @@ const join = require('path').join const { onFilePreprocessor } = require('cypress-vue-unit-test/preprocessor/webpack') -const config = join(__dirname, '../../build/webpack.base.config') +const config = join(__dirname, '../../build/webpack.cypress.config') module.exports = on => { on('file:preprocessor', onFilePreprocessor(config)) } diff --git a/package.json b/package.json index 88fc60f55..0b33d995a 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "author": "Evan You ", "private": true, "scripts": { + "cy:open": "cypress open", + "cy:run": "cypress run", "dev": "node server", "start": "cross-env NODE_ENV=production node server", "build": "rimraf dist && npm run build:client && npm run build:server", From 742b2a3ca6eef090e5422fee0aaf7ff4b67d6a55 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 16 Feb 2018 15:37:44 -0500 Subject: [PATCH 13/16] =?UTF-8?q?Update=20dependencies=20to=20enable=20Gre?= =?UTF-8?q?enkeeper=20=F0=9F=8C=B4=20(#2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(package): update dependencies * docs(readme): add Greenkeeper badge --- README.md | 2 ++ package.json | 16 ++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 1aec3a95f..5727ce82c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # vue-hackernews-2.0 +[![Greenkeeper badge](https://badges.greenkeeper.io/bahmutov/vue-hackernews-2.0.svg)](https://greenkeeper.io/) + HackerNews clone built with Vue 2.0 + vue-router + vuex, with server-side rendering.

diff --git a/package.json b/package.json index 0b33d995a..6b86964cb 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,9 @@ "es6-promise": "^4.1.1", "express": "^4.16.2", "extract-text-webpack-plugin": "^3.0.2", - "firebase": "4.6.2", + "firebase": "4.10.0", "lru-cache": "^4.1.1", - "route-cache": "0.4.3", + "route-cache": "0.4.4", "serve-favicon": "^2.4.5", "vue": "^2.5.3", "vue-router": "^3.0.1", @@ -35,14 +35,14 @@ "vuex-router-sync": "^5.0.0" }, "devDependencies": { - "autoprefixer": "^7.1.6", + "autoprefixer": "^8.0.0", "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-plugin-syntax-dynamic-import": "^6.18.0", "babel-preset-env": "^1.6.1", - "chokidar": "^1.7.0", + "chokidar": "^2.0.2", "css-loader": "^0.28.7", - "cypress": "^1.4.1", + "cypress": "^2.0.0", "cypress-vue-unit-test": "^1.10.0", "file-loader": "^1.1.5", "friendly-errors-webpack-plugin": "^1.6.1", @@ -52,11 +52,11 @@ "stylus-loader": "^3.0.1", "sw-precache-webpack-plugin": "^0.11.4", "url-loader": "^0.6.2", - "vue-loader": "^13.5.0", - "vue-style-loader": "^3.0.3", + "vue-loader": "^14.1.1", + "vue-style-loader": "^4.0.2", "vue-template-compiler": "^2.5.3", "webpack": "^3.8.1", - "webpack-dev-middleware": "^1.12.0", + "webpack-dev-middleware": "^2.0.5", "webpack-hot-middleware": "^2.20.0", "webpack-merge": "^4.1.1", "webpack-node-externals": "^1.6.0" From 97aa8729656ce7bc292cae3419280223ad6649f4 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Fri, 16 Feb 2018 15:39:15 -0500 Subject: [PATCH 14/16] add travis ci badge --- .npmrc | 4 ++++ README.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..bb3a5b488 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +registry=http://registry.npmjs.org/ +save-exact=true +progress=false +package-lock=false diff --git a/README.md b/README.md index 5727ce82c..df4ce052c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # vue-hackernews-2.0 -[![Greenkeeper badge](https://badges.greenkeeper.io/bahmutov/vue-hackernews-2.0.svg)](https://greenkeeper.io/) +[![Greenkeeper badge](https://badges.greenkeeper.io/bahmutov/vue-hackernews-2.0.svg)](https://greenkeeper.io/) [![Build Status](https://travis-ci.org/bahmutov/vue-hackernews-2.0.svg?branch=master)](https://travis-ci.org/bahmutov/vue-hackernews-2.0) HackerNews clone built with Vue 2.0 + vue-router + vuex, with server-side rendering. From a2aa24f19f34443fe84cb40c8edecab2f39e1668 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Fri, 16 Feb 2018 15:45:57 -0500 Subject: [PATCH 15/16] record on CI --- .travis.yml | 2 +- package.json | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 56a3d45d9..df482bc3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,4 +6,4 @@ cache: - ~/.npm - node_modules script: - - $(npm bin)/cypress run --record + - npm run ci:record diff --git a/package.json b/package.json index 6b86964cb..986ea3d6a 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,15 @@ "scripts": { "cy:open": "cypress open", "cy:run": "cypress run", + "cy:run:record": "cypress run --record", "dev": "node server", "start": "cross-env NODE_ENV=production node server", "build": "rimraf dist && npm run build:client && npm run build:server", "build:client": "cross-env NODE_ENV=production webpack --config build/webpack.client.config.js --progress --hide-modules", "build:server": "cross-env NODE_ENV=production webpack --config build/webpack.server.config.js --progress --hide-modules", "cy:open": "cypress open", - "e2e": "start-server-and-test dev http://localhost:8080 cy:open" + "e2e": "start-server-and-test dev http://localhost:8080 cy:open", + "ci:record": "start-server-and-test dev http://localhost:8080 cy:run:record" }, "engines": { "node": ">=7.0", From 2f6bcee9826ec1eb91343df81aeb5621897e651c Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Fri, 16 Feb 2018 15:55:15 -0500 Subject: [PATCH 16/16] remove duplicate import --- cypress/integration/item-spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/cypress/integration/item-spec.js b/cypress/integration/item-spec.js index 60f2c8106..c349924be 100644 --- a/cypress/integration/item-spec.js +++ b/cypress/integration/item-spec.js @@ -3,7 +3,6 @@ import router from '../../src/router' import Item from '../../src/components/Item.vue' import { timeAgo, host } from '../../src/util/filters' import { createRouter } from '../../src/router' -import VueRouter from 'vue-router' import mountVue from 'cypress-vue-unit-test' /* eslint-env mocha */