From f1d00ecf323859893ea5dad5de5facaabcb21e62 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Sun, 5 Aug 2018 18:38:56 +0300 Subject: [PATCH 01/46] pass tests without crashing --- app/components/IssuesList/Issue.js | 6 +++--- app/components/IssuesList/Issue.spec.js | 3 ++- app/components/IssuesList/IssueList.spec.js | 2 ++ app/components/IssuesList/IssuesList.js | 12 ++---------- app/components/Link/Link.spec.js | 4 +++- app/components/Paging/PageButton.spec.js | 2 +- app/components/Paging/Paging.spec.js | 1 + app/containers/App/tests/index.test.js | 12 ------------ app/containers/IssueDetail/tests/actions.spec.js | 4 ++-- app/containers/IssuesList/IssuesList.js | 5 +++++ app/containers/IssuesList/tests/actions.spec.js | 9 ++++----- app/containers/IssuesSearch/tests/actions.spec.js | 4 ++-- app/tests/store.test.js | 3 +-- app/utils/GitHubApi.js | 2 +- package.json | 7 +++++-- 15 files changed, 34 insertions(+), 42 deletions(-) delete mode 100644 app/containers/App/tests/index.test.js diff --git a/app/components/IssuesList/Issue.js b/app/components/IssuesList/Issue.js index 1f2a963..d6bd281 100644 --- a/app/components/IssuesList/Issue.js +++ b/app/components/IssuesList/Issue.js @@ -13,12 +13,12 @@ class Issue extends PureComponent { }; render() { - const { number, title, createdAt, url } = this.props; + const { number, title, createdAt, internalUrl } = this.props; const b = block('issues-list-element'); const date = formatDate(createdAt); return (
  • - + {title}
    @@ -35,7 +35,7 @@ Issue.propTypes = { title: PropTypes.string.isRequired, createdAt: PropTypes.string.isRequired, onTitleClick: PropTypes.func.isRequired, - url: PropTypes.string.isRequired, + internalUrl: PropTypes.string.isRequired, }; Issue.defaultProps = {}; diff --git a/app/components/IssuesList/Issue.spec.js b/app/components/IssuesList/Issue.spec.js index 0a09dd9..107d12c 100644 --- a/app/components/IssuesList/Issue.spec.js +++ b/app/components/IssuesList/Issue.spec.js @@ -8,6 +8,7 @@ describe('', () => { number: 10, title: 'problems with simulating events', createdAt: 'Sun Sep 10 2017 14:18:04 GMT+0400 (Russia TZ 3 Standard Time)', + internalUrl: '/internalUrl/11', }; beforeEach(() => { @@ -30,7 +31,7 @@ describe('', () => { it('should call onTitleClick callback with issue id arg when click event fire for title element', () => { const { title, props } = setup(); - title.props().onClick(); + title.simulate('click', { preventDefault() {} }); expect(props.onTitleClick.calledOnce && props.onTitleClick.calledWithExactly(props.number)).toBeTruthy(); }); }); diff --git a/app/components/IssuesList/IssueList.spec.js b/app/components/IssuesList/IssueList.spec.js index 9a89cd7..4365545 100644 --- a/app/components/IssuesList/IssueList.spec.js +++ b/app/components/IssuesList/IssueList.spec.js @@ -10,12 +10,14 @@ describe('', () => { number: 10, title: 'problems with simulating events', createdAt: 'Sun Sep 10 2017 14:18:04 GMT+0400 (Russia TZ 3 Standard Time)', + internalUrl: '/internalUrl/10', }, { id: 2, number: 11, title: 'Fix sentence in "Injecting Custom Argument" in readme', createdAt: '2017-07-03T12:08:29Z', + internalUrl: '/internalUrl/11', }, ], onIssueTitleClick: sinon.spy(), diff --git a/app/components/IssuesList/IssuesList.js b/app/components/IssuesList/IssuesList.js index c5af500..8c10999 100644 --- a/app/components/IssuesList/IssuesList.js +++ b/app/components/IssuesList/IssuesList.js @@ -6,19 +6,12 @@ import './IssuesList.scss'; class IssuesList extends PureComponent { render() { - const { issues, onIssueTitleClick, makeIssueUrlByNumber } = this.props; + const { issues, onIssueTitleClick } = this.props; const b = block('issues-list'); return (
      - {issues.map(issue => ( - - ))} + {issues.map(issue => )}
    ); @@ -28,7 +21,6 @@ class IssuesList extends PureComponent { IssuesList.propTypes = { issues: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.number.isRequired })).isRequired, onIssueTitleClick: PropTypes.func.isRequired, - makeIssueUrlByNumber: PropTypes.func.isRequired, }; export default IssuesList; diff --git a/app/components/Link/Link.spec.js b/app/components/Link/Link.spec.js index a010d95..c4492b7 100644 --- a/app/components/Link/Link.spec.js +++ b/app/components/Link/Link.spec.js @@ -2,7 +2,9 @@ import { componentSetup } from 'utils/componentTestingSetup'; import Link from './Link'; describe('', () => { - const defaultProps = {}; + const defaultProps = { + href: 'https://github.com/react-boilerplate/react-boilerplate/issues/2304', + }; const setup = propsOverrides => componentSetup(Link, defaultProps, propsOverrides); it('should render without crashing', () => { diff --git a/app/components/Paging/PageButton.spec.js b/app/components/Paging/PageButton.spec.js index e795789..b654294 100644 --- a/app/components/Paging/PageButton.spec.js +++ b/app/components/Paging/PageButton.spec.js @@ -25,7 +25,7 @@ describe('', () => { it('should call goToNewPage callback with value arg when button be clicked', () => { const { props, wrapper } = setup(); - wrapper.simulate('click'); + wrapper.simulate('click', { preventDefault() {} }); expect(props.goToNewPage.calledOnce && props.goToNewPage.calledWithExactly(props.value)).toBeTruthy(); }); }); diff --git a/app/components/Paging/Paging.spec.js b/app/components/Paging/Paging.spec.js index abade0a..0468c1b 100644 --- a/app/components/Paging/Paging.spec.js +++ b/app/components/Paging/Paging.spec.js @@ -11,6 +11,7 @@ describe('', () => { beforeEach(() => { defaultProps.goToNewPage = sinon.spy(); + defaultProps.makePageUrlByNumber = sinon.spy(); }); const setup = propsOverrides => componentSetup(Paging, defaultProps, propsOverrides); diff --git a/app/containers/App/tests/index.test.js b/app/containers/App/tests/index.test.js deleted file mode 100644 index 4a72d94..0000000 --- a/app/containers/App/tests/index.test.js +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -import { Route } from 'react-router-dom'; - -import App from '../index'; - -describe('', () => { - it('should render some routes', () => { - const renderedComponent = shallow(); - expect(renderedComponent.find(Route).length).not.toBe(0); - }); -}); diff --git a/app/containers/IssueDetail/tests/actions.spec.js b/app/containers/IssueDetail/tests/actions.spec.js index a570943..e5d36d8 100644 --- a/app/containers/IssueDetail/tests/actions.spec.js +++ b/app/containers/IssueDetail/tests/actions.spec.js @@ -33,7 +33,7 @@ describe('async actions', () => { }; nock(api.hostname) - .get(api.withAccessToken(api.getIssuePath(userName, repoName, issueNumber))) + .get(api.makePathString(api.getIssuePath(userName, repoName, issueNumber))) .reply(200, body); const store = mockStore({}); @@ -56,7 +56,7 @@ describe('async actions', () => { const issueNumber = '1'; nock(api.hostname) - .get(api.withAccessToken(api.getIssuePath(userName, repoName, issueNumber))) + .get(api.makePathString(api.getIssuePath(userName, repoName, issueNumber))) .reply(404); const store = mockStore({}); diff --git a/app/containers/IssuesList/IssuesList.js b/app/containers/IssuesList/IssuesList.js index 68e0750..eecaf98 100644 --- a/app/containers/IssuesList/IssuesList.js +++ b/app/containers/IssuesList/IssuesList.js @@ -111,6 +111,10 @@ const withIssuesListProps = withProps(({ issuesPagesCount, issues, pageNumber }) }; }); +const withInternalIssueUrl = withProps(({ issues, makeIssueUrlByNumber }) => ({ + issues: issues.map(({ number, ...props }) => ({ number, internalUrl: makeIssueUrlByNumber(number), ...props })), +})); + export default compose( withReducer, withRouteParams, @@ -124,6 +128,7 @@ export default compose( makePageUrlByNumber: ({ userName, repoName, issuesCountOnPage }) => pageNumber => makeIssuesListUrl(userName, repoName, issuesCountOnPage, pageNumber), }), + withInternalIssueUrl, withHandlers({ onIssueTitleClick: ({ history, makeIssueUrlByNumber }) => number => { history.push(makeIssueUrlByNumber(number)); diff --git a/app/containers/IssuesList/tests/actions.spec.js b/app/containers/IssuesList/tests/actions.spec.js index e1eed1a..7a9986e 100644 --- a/app/containers/IssuesList/tests/actions.spec.js +++ b/app/containers/IssuesList/tests/actions.spec.js @@ -22,7 +22,7 @@ describe('async actions', () => { const body = { open_issues_count: 100 }; nock(api.hostname) - .get(api.withAccessToken(api.getReposInformationPath(userName, repoName))) + .get(api.makePathString(api.getReposInformationPath(userName, repoName))) .reply(200, body); const store = mockStore({}); @@ -40,7 +40,7 @@ describe('async actions', () => { const issuesCountOnPage = '10'; nock(api.hostname) - .get(api.withAccessToken(api.getReposInformationPath(userName, repoName))) + .get(api.makePathString(api.getReposInformationPath(userName, repoName))) .reply(404); const initState = {}; @@ -76,9 +76,8 @@ describe('async actions', () => { user: { html_url: 'html_url', avatar_url: 'avatar_url' }, }, ]; - nock(api.hostname) - .get(api.withAccessToken(api.getIssuesPath(userName, repoName, issuesCountOnPage, pageNumber))) + .get(api.makePathString(api.getIssuesPath(userName, repoName, issuesCountOnPage, pageNumber))) .reply(200, body); const store = mockStore({}); @@ -111,7 +110,7 @@ describe('async actions', () => { const pageNumber = '1'; nock(api.hostname) - .get(api.withAccessToken(api.getIssuesPath(userName, repoName, issuesCountOnPage, pageNumber))) + .get(api.makePathString(api.getIssuesPath(userName, repoName, issuesCountOnPage, pageNumber))) .reply(404); const store = mockStore({}); diff --git a/app/containers/IssuesSearch/tests/actions.spec.js b/app/containers/IssuesSearch/tests/actions.spec.js index adb7bdf..a4e07ba 100644 --- a/app/containers/IssuesSearch/tests/actions.spec.js +++ b/app/containers/IssuesSearch/tests/actions.spec.js @@ -19,7 +19,7 @@ describe('async actions', () => { const repos = ['project1', 'project2', 'project3']; const body = { items: repos.map(name => ({ name })) }; nock(api.hostname) - .get(api.withAccessToken(api.getUserReposPath(userName, ''))) + .get(api.makePathString(api.getUserReposPath(userName, ''))) .reply(200, body); const expectedAction = [{ type: constants.RECEIVE_USER_REPOSITORIES, repos }]; @@ -35,7 +35,7 @@ describe('async actions', () => { it('should dispatch no actions, when request not be successful', () => { const userName = 'userName'; nock(api.hostname) - .get(api.withAccessToken(api.getUserReposPath(userName, ''))) + .get(api.makePathString(api.getUserReposPath(userName, ''))) .reply(404); const initState = {}; diff --git a/app/tests/store.test.js b/app/tests/store.test.js index ccb0e8c..d5f6ca8 100644 --- a/app/tests/store.test.js +++ b/app/tests/store.test.js @@ -2,7 +2,6 @@ * Test store addons */ -import { browserHistory } from 'react-router-dom'; import configureStore from '../configureStore'; describe('configureStore', () => { @@ -24,7 +23,7 @@ describe('configureStore params', () => { /* eslint-disable no-underscore-dangle */ const compose = jest.fn(); window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ = () => compose; - configureStore(undefined, browserHistory); + configureStore(undefined); expect(compose).toHaveBeenCalled(); /* eslint-enable */ }); diff --git a/app/utils/GitHubApi.js b/app/utils/GitHubApi.js index ae77e8f..6143738 100644 --- a/app/utils/GitHubApi.js +++ b/app/utils/GitHubApi.js @@ -23,7 +23,7 @@ export const getIssuePath = (userName, repoName, issueNumber) => ({ path: `/repos/${userName}/${repoName}/issues/${issueNumber}`, }); -const makePathString = ({ queryParams, path }) => +export const makePathString = ({ queryParams = {}, path }) => path + Object.keys(queryParams).reduce((acc, curr) => `${acc}${acc.length ? '&' : '?'}${curr}=${queryParams[curr]}`, ''); diff --git a/package.json b/package.json index 632cce3..29395f8 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "lint:staged": "lint-staged", "pretest": "npm run test:clean && npm run lint", "test:clean": "rimraf ./coverage", - "test": "cross-env NODE_ENV=test jest --coverage", + "test": "cross-env NODE_ENV=test jest", "test:watch": "cross-env NODE_ENV=test jest --watchAll", "coveralls": "cat ./coverage/lcov.info | coveralls", "prettify": "prettier --write", @@ -168,7 +168,10 @@ ], "snapshotSerializers": [ "enzyme-to-json/serializer" - ] + ], + "globals": { + "GITHUB_ACCESS_TOKEN": null + } }, "bundlesize": [], "dependencies": { From 4772b8695c4b417f440379587f23596a26e90d77 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Sun, 5 Aug 2018 23:07:13 +0300 Subject: [PATCH 02/46] not execute generate-templates-for-linting in travis --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index efa83dd..210bdbd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,6 @@ node_js: - 8 script: - - node ./internals/scripts/generate-templates-for-linting - npm test -- --maxWorkers=4 - npm run build @@ -14,10 +13,6 @@ before_install: - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start -notifications: - email: - on_failure: change - after_success: 'npm run coveralls' cache: From 5529919a49b6e1864871edd6aadb7e41be6fea16 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 00:00:56 +0300 Subject: [PATCH 03/46] fix a bug with defining GITHUB_ACCESS_TOKEN in prod --- internals/webpack/webpack.prod.babel.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internals/webpack/webpack.prod.babel.js b/internals/webpack/webpack.prod.babel.js index 10b4466..d63331b 100644 --- a/internals/webpack/webpack.prod.babel.js +++ b/internals/webpack/webpack.prod.babel.js @@ -5,6 +5,7 @@ const WebpackPwaManifest = require('webpack-pwa-manifest'); const OfflinePlugin = require('offline-plugin'); const { HashedModuleIdsPlugin } = require('webpack'); const InlineSourcePlugin = require('html-webpack-inline-source-plugin'); +const webpack = require('webpack'); module.exports = require('./webpack.base.babel')({ mode: 'production', @@ -29,6 +30,9 @@ module.exports = require('./webpack.base.babel')({ plugins: [ // Minify and optimize the index.html + new webpack.DefinePlugin({ + GITHUB_ACCESS_TOKEN: JSON.stringify(null), + }), new HtmlWebpackPlugin({ template: 'app/index.html', minify: { From 1a4cbf53d86c814c0642a9225bb928692aecd2be Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 00:01:38 +0300 Subject: [PATCH 04/46] add travis azure_web_apps deploy provider --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 210bdbd..5bfc59a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,3 +19,6 @@ cache: yarn: true directories: - node_modules + +deploy: + provider: azure_web_apps From 07a0f4971dd184f4c0cb36acba9904653fd29e2b Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 00:03:47 +0300 Subject: [PATCH 05/46] use latest nodejs in travis --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5bfc59a..d11f509 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: node_js node_js: - - 9 - - 8 + - "node" script: - npm test -- --maxWorkers=4 From 05f960c460ed50324265c64ea7c2755d4e45acc8 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 01:47:51 +0300 Subject: [PATCH 06/46] add files for azure deploying --- .deployment | 2 + deploy.sh | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++ web.config | 28 ++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 .deployment create mode 100644 deploy.sh create mode 100644 web.config diff --git a/.deployment b/.deployment new file mode 100644 index 0000000..97ea803 --- /dev/null +++ b/.deployment @@ -0,0 +1,2 @@ +[config] +command = bash scripts/deploy.sh diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..9bbc212 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,121 @@ +#!/bin/bash + +# ---------------------- +# KUDU Deployment Script +# Version: 1.0.9 +# ---------------------- + +# Helpers +# ------- + +exitWithMessageOnError () { + if [ ! $? -eq 0 ]; then + echo "An error has occurred during web site deployment." + echo $1 + exit 1 + fi +} + +# Prerequisites +# ------------- + +# Verify node.js installed +hash node 2>/dev/null +exitWithMessageOnError "Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment." + +# Setup +# ----- + +SCRIPT_DIR="${BASH_SOURCE[0]%\\*}" +SCRIPT_DIR="${SCRIPT_DIR%/*}" +ARTIFACTS=$SCRIPT_DIR/../artifacts +KUDU_SYNC_CMD=${KUDU_SYNC_CMD//\"} + +if [[ ! -n "$DEPLOYMENT_SOURCE" ]]; then + DEPLOYMENT_SOURCE=$SCRIPT_DIR/build +fi + +if [[ ! -n "$NEXT_MANIFEST_PATH" ]]; then + NEXT_MANIFEST_PATH=$ARTIFACTS/manifest + + if [[ ! -n "$PREVIOUS_MANIFEST_PATH" ]]; then + PREVIOUS_MANIFEST_PATH=$NEXT_MANIFEST_PATH + fi +fi + +if [[ ! -n "$DEPLOYMENT_TARGET" ]]; then + DEPLOYMENT_TARGET=$ARTIFACTS/wwwroot +else + KUDU_SERVICE=true +fi + +if [[ ! -n "$KUDU_SYNC_CMD" ]]; then + # Install kudu sync + echo Installing Kudu Sync + npm install kudusync -g --silent + exitWithMessageOnError "npm failed" + + if [[ ! -n "$KUDU_SERVICE" ]]; then + # In case we are running locally this is the correct location of kuduSync + KUDU_SYNC_CMD=kuduSync + else + # In case we are running on kudu service this is the correct location of kuduSync + KUDU_SYNC_CMD=$APPDATA/npm/node_modules/kuduSync/bin/kuduSync + fi +fi + +# Node Helpers +# ------------ + +selectNodeVersion () { + if [[ -n "$KUDU_SELECT_NODE_VERSION_CMD" ]]; then + SELECT_NODE_VERSION="$KUDU_SELECT_NODE_VERSION_CMD \"$DEPLOYMENT_SOURCE\" \"$DEPLOYMENT_TARGET\" \"$DEPLOYMENT_TEMP\"" + eval $SELECT_NODE_VERSION + exitWithMessageOnError "select node version failed" + + if [[ -e "$DEPLOYMENT_TEMP/__nodeVersion.tmp" ]]; then + NODE_EXE=`cat "$DEPLOYMENT_TEMP/__nodeVersion.tmp"` + exitWithMessageOnError "getting node version failed" + fi + + if [[ -e "$DEPLOYMENT_TEMP/__npmVersion.tmp" ]]; then + NPM_JS_PATH=`cat "$DEPLOYMENT_TEMP/__npmVersion.tmp"` + exitWithMessageOnError "getting npm version failed" + fi + + if [[ ! -n "$NODE_EXE" ]]; then + NODE_EXE=node + fi + + NPM_CMD="\"$NODE_EXE\" \"$NPM_JS_PATH\"" + else + NPM_CMD=npm + NODE_EXE=node + fi +} + +################################################################################################################################## +# Deployment +# ---------- + +echo Handling node.js deployment. +# 1. Select node version +selectNodeVersion + +# 2. Install npm packages +if [ -e "$DEPLOYMENT_SOURCE/package.json" ]; then + cd "$DEPLOYMENT_SOURCE" + eval $NPM_CMD install + exitWithMessageOnError "npm failed" + cd - > /dev/null +fi + +# 3. KuduSync +if [[ "$IN_PLACE_DEPLOYMENT" -ne "1" ]]; then + "$KUDU_SYNC_CMD" -v 50 -f "$DEPLOYMENT_SOURCE/build" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh" + cp "$DEPLOYMENT_SOURCE/web.config" "$DEPLOYMENT_TARGET/web.config" + exitWithMessageOnError "Kudu Sync failed" +fi + +################################################################################################################################## +echo "Finished successfully." diff --git a/web.config b/web.config new file mode 100644 index 0000000..3936d14 --- /dev/null +++ b/web.config @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 955e72026586ea70dcb88121a3df067df59b4977 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 01:49:28 +0300 Subject: [PATCH 07/46] edit .deployment file --- .deployment | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.deployment b/.deployment index 97ea803..7c8b899 100644 --- a/.deployment +++ b/.deployment @@ -1,2 +1,2 @@ [config] -command = bash scripts/deploy.sh +command = bash deploy.sh From dd8c89e21677872f7d88b433366543806344db24 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 02:24:35 +0300 Subject: [PATCH 08/46] add lighthouse --- package-lock.json | 594 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 595 insertions(+) diff --git a/package-lock.json b/package-lock.json index 48f575a..9ff60de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2378,12 +2378,30 @@ "samsam": "1.3.0" } }, + "@types/core-js": { + "version": "0.9.46", + "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-0.9.46.tgz", + "integrity": "sha512-LooLR6XHes9V+kNYRz1Qm8w3atw9QMn7XeZUmIpUelllF9BdryeUKd/u0Wh5ErcjpWfG39NrToU9MF7ngsTFVw==", + "dev": true + }, + "@types/mkdirp": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.3.29.tgz", + "integrity": "sha1-fyrX7FX5FEgvybHsS7GuYCjUYGY=", + "dev": true + }, "@types/node": { "version": "10.3.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.5.tgz", "integrity": "sha512-6lRwZN0Y3TuglwaaZN2XPocobmzLlhxcqDjKFjNYSsXG/TFAGYkCqkzZh4+ms8iTHHQE6gJXLHPV7TziVGeWhg==", "dev": true }, + "@types/rimraf": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-0.0.28.tgz", + "integrity": "sha1-VWJRm8eWPKyoq/fxKMrjtZTUHQY=", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.5.12", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.12.tgz", @@ -2760,6 +2778,15 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", @@ -3253,6 +3280,12 @@ "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", "dev": true }, + "axe-core": { + "version": "3.0.0-beta.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.0.0-beta.2.tgz", + "integrity": "sha512-JyMXnHDuzr6hei+mINWsR/iEyPBFSjpgF4/lUijO7QDGVKtTmdpDxc2+7X/xW+rPIwhcd72euJ2UunbRXF+1Eg==", + "dev": true + }, "axios": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz", @@ -3272,6 +3305,23 @@ "ast-types-flow": "0.0.7" } }, + "babar": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babar/-/babar-0.2.0.tgz", + "integrity": "sha512-bH01czBTWEbf7Q6qje/4raQEG14jhPTQJmpj1Uxzw92VCr9yQcCWN+SbKTg34aOvWDs6wrhjfr6SGC8AaeSzaA==", + "dev": true, + "requires": { + "colors": "~0.6.2" + }, + "dependencies": { + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + } + } + }, "babel-cli": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", @@ -4693,6 +4743,29 @@ "hoek": "2.x.x" } }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5314,6 +5387,12 @@ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -5391,6 +5470,36 @@ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true }, + "chrome-devtools-frontend": { + "version": "1.0.422034", + "resolved": "https://registry.npmjs.org/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.422034.tgz", + "integrity": "sha1-BxyM4URmt2UwMvzRrRpKaNXjy9k=", + "dev": true + }, + "chrome-launcher": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.10.2.tgz", + "integrity": "sha512-E+kTHlGgtitPPu8Rci0E4XBasirKtTn6DjqFn8tTLp/7xCUzqb6lig9Il+HLkcudzKvT/aLxJbzbyNCe03w1AA==", + "dev": true, + "requires": { + "@types/core-js": "^0.9.41", + "@types/mkdirp": "^0.3.29", + "@types/node": "^9.3.0", + "@types/rimraf": "^0.0.28", + "is-wsl": "^1.1.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "0.5.1", + "rimraf": "^2.6.1" + }, + "dependencies": { + "@types/node": { + "version": "9.6.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.25.tgz", + "integrity": "sha512-uZpzO9MKSHy7zBiTtziA3JgZP3upcAvLTASkKgheLj6/rNZmRX4UyvsFYaY2kbYcmmh8bNZ2T0eocBRCfZdGvQ==", + "dev": true + } + } + }, "chrome-trace-event": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", @@ -5507,6 +5616,12 @@ "source-map": "0.5.x" } }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -5815,6 +5930,20 @@ "proto-list": "~1.2.1" } }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -6018,6 +6147,12 @@ "which": "^1.2.9" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", @@ -6046,6 +6181,12 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "css": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", @@ -6752,6 +6893,30 @@ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, + "devtools-timeline-model": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/devtools-timeline-model/-/devtools-timeline-model-1.1.6.tgz", + "integrity": "sha1-e+Uac7VdcntZe7MN0e0ujiEGOaU=", + "dev": true, + "requires": { + "chrome-devtools-frontend": "1.0.401423", + "resolve": "1.1.7" + }, + "dependencies": { + "chrome-devtools-frontend": { + "version": "1.0.401423", + "resolved": "https://registry.npmjs.org/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.401423.tgz", + "integrity": "sha1-MqibjQTjeKSUvjyNYycXA74cBOo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -9420,6 +9585,15 @@ } } }, + "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" + } + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -10132,6 +10306,12 @@ "statuses": ">= 1.4.0 < 2" } }, + "http-link-header": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-0.8.0.tgz", + "integrity": "sha1-oitBoMmx4tj6wb8baXxr1TLV9eQ=", + "dev": true + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -10249,6 +10429,12 @@ "prebuild-install": "^2.3.0" } }, + "image-ssim": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", + "integrity": "sha1-g7Qsei5uS4VQVHf+aRf128VkIOU=", + "dev": true + }, "image-webpack-loader": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/image-webpack-loader/-/image-webpack-loader-4.3.1.tgz", @@ -10955,6 +11141,16 @@ "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", "dev": true }, + "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-invalid-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", @@ -11021,6 +11217,12 @@ "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", "dev": true }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -11304,6 +11506,12 @@ "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "is-zip": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", @@ -12031,6 +12239,12 @@ "integrity": "sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ==", "dev": true }, + "js-library-detector": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-4.3.1.tgz", + "integrity": "sha1-bTT1UAKBO8CnVD3u9T+qTi55dns=", + "dev": true + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -12197,6 +12411,15 @@ "integrity": "sha512-nQRpMcHm1cQ6gmztdvLcIvxocznSMqH/y6XtERrWrHaymOYdDGroRqetJvJycxGEr1aakXiigDgn7JnzuXlk6A==", "dev": true }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -12278,6 +12501,145 @@ "resolve": "^1.1.7" } }, + "lighthouse": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-3.0.3.tgz", + "integrity": "sha512-RlHdCRUYCqM22LG/1aGKvyqAfU4alCmVMp65YJhrP39lC2KWU4DyY1JOKu7FGq16fHDEE+vvPsgSaRjS/GTbTA==", + "dev": true, + "requires": { + "axe-core": "3.0.0-beta.2", + "chrome-devtools-frontend": "1.0.422034", + "chrome-launcher": "^0.10.2", + "configstore": "^3.1.1", + "devtools-timeline-model": "1.1.6", + "esprima": "^4.0.0", + "http-link-header": "^0.8.0", + "inquirer": "^3.3.0", + "jpeg-js": "0.1.2", + "js-library-detector": "^4.3.1", + "lighthouse-logger": "^1.0.0", + "lodash.isequal": "^4.5.0", + "metaviewport-parser": "0.2.0", + "mkdirp": "0.5.1", + "opn": "4.0.2", + "parse-cache-control": "1.0.1", + "raven": "^2.2.1", + "rimraf": "^2.6.1", + "robots-parser": "^2.0.1", + "semver": "^5.3.0", + "speedline": "1.3.3", + "update-notifier": "^2.1.0", + "ws": "3.3.2", + "yargs": "3.32.0", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.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" + } + }, + "jpeg-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", + "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "ws": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.2.tgz", + "integrity": "sha512-t+WGpsNxhMR4v6EClXS8r8km5ZljKJzyGhJf7goJz9k5Ye3+b5Bvno5rjqPuIBn5mnn5GBb7o8IrIWHxX1qOLQ==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "lighthouse-logger": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.0.1.tgz", + "integrity": "sha1-8HPYP3rLyWcpvxAKEhyPAGmRrmE=", + "dev": true, + "requires": { + "debug": "^2.6.8" + } + }, "lint-staged": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-7.2.0.tgz", @@ -13123,6 +13485,17 @@ "integrity": "sha512-3Zs9P/0zzwTob2pdgT0CHZuMbnSUSp8MB1bddfm+HDmnFWHGT4jvEZRf+2RuPoa+cjdn/z25SEt5gFTqdhvJAg==", "dev": true }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "dev": true, + "requires": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -13294,6 +13667,12 @@ "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", "dev": true }, + "metaviewport-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz", + "integrity": "sha1-U1w84cz2IjpQJf3cahw2UF9+fbE=", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -14642,6 +15021,16 @@ "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", "dev": true }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -14917,6 +15306,51 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + } + } + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -14978,6 +15412,12 @@ "xml2js": "^0.4.5" } }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=", + "dev": true + }, "parse-entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz", @@ -16849,6 +17289,33 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, + "raven": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/raven/-/raven-2.6.3.tgz", + "integrity": "sha512-bKre7qlDW+y1+G2bUtCuntdDYc8o5v1T233t0vmJfbj8ttGOgLrGRlYB8saelVMW9KUAJNLrhFkAKOwFWFJonw==", + "dev": true, + "requires": { + "cookie": "0.3.1", + "md5": "^2.2.1", + "stack-trace": "0.0.10", + "timed-out": "4.0.1", + "uuid": "3.0.0" + }, + "dependencies": { + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "uuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", + "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=", + "dev": true + } + } + }, "raw-body": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", @@ -17346,6 +17813,25 @@ "regjsparser": "^0.1.4" } }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, "regjsgen": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", @@ -17706,6 +18192,12 @@ "inherits": "^2.0.1" } }, + "robots-parser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-2.1.0.tgz", + "integrity": "sha512-k07MeDS1Tl1zjoYs5bHfUbgQ0MfaeTOepDcjZFxdYXd84p6IeLDQyUwlMk2AZ9c2yExA30I3ayWhmqz9tg0DzQ==", + "dev": true + }, "rst-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", @@ -18112,6 +18604,15 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, "semver-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", @@ -18573,6 +19074,28 @@ "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", "dev": true }, + "speedline": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/speedline/-/speedline-1.3.3.tgz", + "integrity": "sha512-VyBYEbYE2Pm15+mdnb1bfdbMTkxQ8UqqD21p9ynyZlmYELoDX6PFAxy7g2aWukXWljK6LOiyCDCLphcsX+DXGA==", + "dev": true, + "requires": { + "@types/node": "*", + "babar": "0.2.0", + "image-ssim": "^0.2.0", + "jpeg-js": "^0.1.2", + "loud-rejection": "^1.6.0", + "meow": "^3.7.0" + }, + "dependencies": { + "jpeg-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", + "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=", + "dev": true + } + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -18658,6 +19181,12 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, "stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", @@ -19666,6 +20195,15 @@ "uuid": "^3.0.1" } }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + } + }, "test-exclude": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", @@ -20223,6 +20761,12 @@ } } }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, "unbzip2-stream": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz", @@ -20397,6 +20941,15 @@ "through2-filter": "^2.0.0" } }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "unist-util-find-all-after": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz", @@ -20514,6 +21067,32 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + } + } + }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -21353,6 +21932,15 @@ "string-width": "^1.0.2 || 2" } }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -21466,6 +22054,12 @@ "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", "dev": true }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, "xhr": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", diff --git a/package.json b/package.json index 29395f8..e0305d6 100644 --- a/package.json +++ b/package.json @@ -262,6 +262,7 @@ "isomorphic-fetch": "^2.2.1", "jest-cli": "23.1.0", "jest-styled-components": "5.0.1", + "lighthouse": "^3.0.3", "lint-staged": "7.2.0", "ngrok": "3.0.1", "nock": "^9.4.0", From cecf45ebb880ecad95584b56fd1c0d99aac3d81e Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 02:24:57 +0300 Subject: [PATCH 09/46] change postinstall for testing purpose --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e0305d6..494dfe7 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "extract-intl": "node ./internals/scripts/extract-intl.js", "npmcheckversion": "node ./internals/scripts/npmcheckversion.js", "preinstall": "npm run npmcheckversion", - "postinstall": "npm run build:dll", + "postinstall": "npm run build", "prebuild": "npm run build:clean", "build": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p --progress --hide-modules --display-optimization-bailout", "build:clean": "rimraf ./build", From 061c906e267f47b672a9455f26c094f4a71e72b5 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 19:08:42 +0300 Subject: [PATCH 10/46] change preinstall for testing purpose --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 494dfe7..482b045 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "postanalyze": "npm run bundlesize && webpack-bundle-analyzer stats.json build/", "extract-intl": "node ./internals/scripts/extract-intl.js", "npmcheckversion": "node ./internals/scripts/npmcheckversion.js", - "preinstall": "npm run npmcheckversion", "postinstall": "npm run build", "prebuild": "npm run build:clean", "build": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p --progress --hide-modules --display-optimization-bailout", From d7fab301f7121594f5ad10ab1792735f6d0e0c60 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Tue, 7 Aug 2018 22:43:59 +0300 Subject: [PATCH 11/46] add verbose flag to azure travis deploy --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index d11f509..e7e7b7a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,3 +21,4 @@ cache: deploy: provider: azure_web_apps + verbose: true From 6c62ad3548a5025d873437b0403c87440713f9f4 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Wed, 8 Aug 2018 12:41:21 +0300 Subject: [PATCH 12/46] Revert "change preinstall for testing purpose" This reverts commit 061c906 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 482b045..494dfe7 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "postanalyze": "npm run bundlesize && webpack-bundle-analyzer stats.json build/", "extract-intl": "node ./internals/scripts/extract-intl.js", "npmcheckversion": "node ./internals/scripts/npmcheckversion.js", + "preinstall": "npm run npmcheckversion", "postinstall": "npm run build", "prebuild": "npm run build:clean", "build": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p --progress --hide-modules --display-optimization-bailout", From 51bb57e000ddcddbdef60d42e1e05240dcf003f3 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Wed, 8 Aug 2018 12:52:12 +0300 Subject: [PATCH 13/46] Revert "change postinstall for testing purpose" This reverts commit cecf45e --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 494dfe7..e0305d6 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "extract-intl": "node ./internals/scripts/extract-intl.js", "npmcheckversion": "node ./internals/scripts/npmcheckversion.js", "preinstall": "npm run npmcheckversion", - "postinstall": "npm run build", + "postinstall": "npm run build:dll", "prebuild": "npm run build:clean", "build": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p --progress --hide-modules --display-optimization-bailout", "build:clean": "rimraf ./build", From 45f5a6f3885aee969a189fee470bb8da34b258ac Mon Sep 17 00:00:00 2001 From: SparkCode Date: Thu, 9 Aug 2018 02:46:06 +0300 Subject: [PATCH 14/46] let's try to dynamically preconnect to http://api.github.com --- .../GithubIssuesPage/GithubIssuesPage.js | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/app/containers/GithubIssuesPage/GithubIssuesPage.js b/app/containers/GithubIssuesPage/GithubIssuesPage.js index 0026c32..65f07b5 100644 --- a/app/containers/GithubIssuesPage/GithubIssuesPage.js +++ b/app/containers/GithubIssuesPage/GithubIssuesPage.js @@ -5,16 +5,27 @@ import IssuesList from 'containers/IssuesList/Loadable'; import IssueDetail from 'containers/IssueDetail/Loadable'; import DefaultValuesContext from './DefaultValuesContext'; -export default () => ( - - - - - - -); +const preconnectToGithub = () => { + const head = document.getElementsByTagName('head')[0]; + const preconnectLink = document.createElement('link'); + preconnectLink.rel = 'preconnect'; + preconnectLink.href = 'https://api.github.com'; + head.appendChild(preconnectLink); +}; + +export default () => { + preconnectToGithub(); + return ( + + + + + + + ); +}; From 5a8b4c79a92f17bbcf2008b1dd0fded3d408fd72 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Thu, 9 Aug 2018 03:20:26 +0300 Subject: [PATCH 15/46] Revert "Revert "change postinstall for testing purpose"" This reverts commit 51bb57e --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e0305d6..494dfe7 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "extract-intl": "node ./internals/scripts/extract-intl.js", "npmcheckversion": "node ./internals/scripts/npmcheckversion.js", "preinstall": "npm run npmcheckversion", - "postinstall": "npm run build:dll", + "postinstall": "npm run build", "prebuild": "npm run build:clean", "build": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p --progress --hide-modules --display-optimization-bailout", "build:clean": "rimraf ./build", From 06a48dbc1c62ba672ac7b1bd59cf33599b4f8f43 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Thu, 9 Aug 2018 16:30:01 +0300 Subject: [PATCH 16/46] crossOrigin have been lost --- app/containers/GithubIssuesPage/GithubIssuesPage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/containers/GithubIssuesPage/GithubIssuesPage.js b/app/containers/GithubIssuesPage/GithubIssuesPage.js index 65f07b5..ff6353f 100644 --- a/app/containers/GithubIssuesPage/GithubIssuesPage.js +++ b/app/containers/GithubIssuesPage/GithubIssuesPage.js @@ -6,11 +6,11 @@ import IssueDetail from 'containers/IssueDetail/Loadable'; import DefaultValuesContext from './DefaultValuesContext'; const preconnectToGithub = () => { - const head = document.getElementsByTagName('head')[0]; const preconnectLink = document.createElement('link'); preconnectLink.rel = 'preconnect'; preconnectLink.href = 'https://api.github.com'; - head.appendChild(preconnectLink); + preconnectLink.crossOrigin = 'anonymous'; + document.head.appendChild(preconnectLink); }; export default () => { From 8289d2759a58cdf21a13169bb89d0e659b9e184b Mon Sep 17 00:00:00 2001 From: SparkCode Date: Fri, 10 Aug 2018 02:22:35 +0300 Subject: [PATCH 17/46] some static name changes --- app/index.html | 2 +- internals/webpack/webpack.prod.babel.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/index.html b/app/index.html index b5d6d16..efeba9f 100644 --- a/app/index.html +++ b/app/index.html @@ -6,7 +6,7 @@ - React.js Boilerplate + Github Issues diff --git a/internals/webpack/webpack.prod.babel.js b/internals/webpack/webpack.prod.babel.js index d63331b..3ce7163 100644 --- a/internals/webpack/webpack.prod.babel.js +++ b/internals/webpack/webpack.prod.babel.js @@ -78,11 +78,11 @@ module.exports = require('./webpack.base.babel')({ }), new WebpackPwaManifest({ - name: 'React Boilerplate', - short_name: 'React BP', + name: 'Github Issues', + short_name: 'Issues', description: 'My React Boilerplate-based project!', background_color: '#fafafa', - theme_color: '#b1624d', + theme_color: '#005ca9', icons: [ { src: path.resolve('app/images/icon-512x512.png'), From 9c18e9f0479c29735fdceabcb0972dbf9a9a9ccd Mon Sep 17 00:00:00 2001 From: SparkCode Date: Sat, 11 Aug 2018 02:35:29 +0300 Subject: [PATCH 18/46] fix a bug with loading issues after description page --- app/containers/IssuesList/IssuesList.js | 27 +++++++------------------ app/containers/IssuesList/actions.js | 7 ++----- app/containers/IssuesList/reducer.js | 2 +- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/app/containers/IssuesList/IssuesList.js b/app/containers/IssuesList/IssuesList.js index eecaf98..da5cb63 100644 --- a/app/containers/IssuesList/IssuesList.js +++ b/app/containers/IssuesList/IssuesList.js @@ -14,23 +14,10 @@ import { makeIssuesListUrl, makeIssueUrl } from 'containers/GithubIssuesPage/nav import StatusIssuesBar from './StatusIssuesBar'; import './IssuesList.scss'; import { selectIssuesData, selectIssuesPagesCount } from './selectors'; -import { - fetchIssuesIfNeeded as fetchIssuesIfNeededActionCreator, - invalidateIssues as invalidateIssuesAction, -} from './actions'; +import { loadIssuesListData as loadIssuesListDataActionCreator } from './actions'; import reducer from './reducer'; class IssuesListContainer extends PureComponent { - componentDidMount() { - const { fetchIssuesIfNeeded } = this.props; - fetchIssuesIfNeeded(); - } - - componentDidUpdate() { - const { fetchIssuesIfNeeded } = this.props; - fetchIssuesIfNeeded(); - } - render() { const { pageNumber, @@ -68,9 +55,7 @@ class IssuesListContainer extends PureComponent { } } -// todo: seems issuesCountOnPage need to be validated IssuesListContainer.propTypes = { - fetchIssuesIfNeeded: PropTypes.func.isRequired, shouldShowPaging: PropTypes.bool.isRequired, issues: PropTypes.array.isRequired, onIssueTitleClick: PropTypes.func.isRequired, @@ -91,9 +76,8 @@ const withConnect = connect( issues: selectIssuesData(state), }), (dispatch, { userName, repoName, issuesCountOnPage, pageNumber }) => ({ - fetchIssuesIfNeeded: () => - dispatch(fetchIssuesIfNeededActionCreator({ userName, repoName, issuesCountOnPage, pageNumber })), - invalidateIssues: () => dispatch(invalidateIssuesAction()), + loadIssuesListData: () => + dispatch(loadIssuesListDataActionCreator({ userName, repoName, issuesCountOnPage, pageNumber })), }), ); @@ -140,9 +124,12 @@ export default compose( }, }), lifecycle({ + componentDidMount() { + this.props.loadIssuesListData(); + }, componentDidUpdate(prevProps) { if (this.props.location !== prevProps.location) { - this.props.invalidateIssues(); + this.props.loadIssuesListData(); } }, }), diff --git a/app/containers/IssuesList/actions.js b/app/containers/IssuesList/actions.js index c9cbddf..d91519c 100644 --- a/app/containers/IssuesList/actions.js +++ b/app/containers/IssuesList/actions.js @@ -1,7 +1,6 @@ import { makeRequest, mapErrorCauseToMessage, mapErrorToCauseEnum } from 'utils/network/index'; import { getIssuesUrl, getIssuesPagesCountUrl } from 'utils/GitHubApi'; import { RESOURCE_NOT_BE_FOUND } from 'utils/network/constants'; -import { selectDidIssuesInvalidate } from './selectors'; import * as constants from './constants'; import mapGithubIssueToLocalIssue from './utils/mapGithubIssueToLocalIssue'; @@ -28,10 +27,8 @@ export const RequestIssues = () => ({ type: constants.REQUEST_ISSUES, }); -export const fetchIssuesIfNeeded = ({ userName, repoName, ...props }) => (dispatch, getState) => { - if (!(selectDidIssuesInvalidate(getState()) && userName && repoName)) { - return; - } +export const loadIssuesListData = ({ userName, repoName, ...props }) => dispatch => { + dispatch(invalidateIssues()); dispatch(RequestIssues()); dispatch(fetchIssues({ userName, repoName, ...props })); dispatch(fetchIssuesPagesCount({ userName, repoName, ...props })); diff --git a/app/containers/IssuesList/reducer.js b/app/containers/IssuesList/reducer.js index 95d50c6..983af79 100644 --- a/app/containers/IssuesList/reducer.js +++ b/app/containers/IssuesList/reducer.js @@ -2,7 +2,7 @@ import { fromJS } from 'immutable'; import * as constants from './constants'; const defaultIssuesState = fromJS({ - didInvalidate: true, + didInvalidate: false, isFetching: false, isRequestFailed: false, errorMessage: '', From d8ba16ef8beba6c3d28b61d9e930f7c9fea5c78a Mon Sep 17 00:00:00 2001 From: SparkCode Date: Sat, 11 Aug 2018 02:04:37 +0300 Subject: [PATCH 19/46] update top App container margin --- app/containers/App/App.scss | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/containers/App/App.scss b/app/containers/App/App.scss index af9cd4b..e871ee1 100644 --- a/app/containers/App/App.scss +++ b/app/containers/App/App.scss @@ -1,8 +1,9 @@ @import 'stylesheets/abstracts/variables'; +@import "stylesheets/abstracts/mixins"; .app { max-width: 800px; - margin: 30px auto; + margin: 10px auto; padding: 10px; line-height: 1.25; word-wrap: break-word; @@ -10,4 +11,9 @@ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; color: $shark; + + @include respond-to("small") { + margin: 30px auto; + + } } From 6b50cb122ff59c0548cd1e96e952bb3da063a62b Mon Sep 17 00:00:00 2001 From: SparkCode Date: Fri, 10 Aug 2018 22:47:52 +0300 Subject: [PATCH 20/46] call build:dll before start --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 494dfe7..2bd2b06 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "build:clean": "rimraf ./build", "build:dll": "node ./internals/scripts/dependencies.js", "postbuild": "npm run bundlesize", + "prestart": "npm run build:dll", "start": "cross-env NODE_ENV=development node server", "start:tunnel": "cross-env NODE_ENV=development ENABLE_TUNNEL=true node server", "start:production": "npm run test && npm run build && npm run start:prod", From 47660b3c461c3fa6bd6b2f3ef6bbf034b0360f94 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Sun, 12 Aug 2018 17:28:46 +0300 Subject: [PATCH 21/46] tests have been fixed --- app/containers/IssuesList/reducer.js | 2 +- app/containers/IssuesList/tests/reducer.spec.js | 17 ++++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/app/containers/IssuesList/reducer.js b/app/containers/IssuesList/reducer.js index 983af79..2ba40ff 100644 --- a/app/containers/IssuesList/reducer.js +++ b/app/containers/IssuesList/reducer.js @@ -1,7 +1,7 @@ import { fromJS } from 'immutable'; import * as constants from './constants'; -const defaultIssuesState = fromJS({ +export const defaultIssuesState = fromJS({ didInvalidate: false, isFetching: false, isRequestFailed: false, diff --git a/app/containers/IssuesList/tests/reducer.spec.js b/app/containers/IssuesList/tests/reducer.spec.js index abbef1d..da7f1aa 100644 --- a/app/containers/IssuesList/tests/reducer.spec.js +++ b/app/containers/IssuesList/tests/reducer.spec.js @@ -1,17 +1,8 @@ import { fromJS } from 'immutable'; import * as constants from 'containers/IssuesList/constants'; -import reducer from '../reducer'; - -describe('Issue', () => { - const initState = fromJS({ - didInvalidate: true, - isFetching: false, - isRequestFailed: false, - errorMessage: '', - data: [], - issuesPagesCount: null, - }); +import reducer, { defaultIssuesState as initState } from '../reducer'; +describe('IssuesList', () => { it('should return the init state', () => { expect(reducer(undefined, {})).toEqual(initState); }); @@ -21,8 +12,8 @@ describe('Issue', () => { }); it('should handle INVALIDATE_ISSUES action', () => { - const originalState = initState.set('didInvalidate', false).set('data', fromJS([{ id: 1 }, { id: 2 }, { id: 5 }])); - const expectedState = initState; + const originalState = initState.set('data', fromJS([{ id: 1 }, { id: 2 }, { id: 5 }])); + const expectedState = initState.set('didInvalidate', true); expect(reducer(originalState, { type: constants.INVALIDATE_ISSUES })).toEqual(fromJS(expectedState)); }); From 21787aafd10c78e717deda049f3dea4db949c196 Mon Sep 17 00:00:00 2001 From: SparkCode Date: Sun, 12 Aug 2018 19:18:07 +0300 Subject: [PATCH 22/46] some accessibility and SEO improvements --- app/components/Autocomplete/OptionsList.scss | 2 +- app/components/Input/Input.scss | 2 +- app/components/IssuesSearch/IssuesSearch.js | 3 + app/components/Select/Select.scss | 2 +- app/containers/IssueDetail/IssueDetail.js | 23 +- app/containers/IssuesList/IssuesList.js | 15 +- app/containers/IssuesSearch/IssuesSearch.js | 11 +- internals/webpack/webpack.prod.babel.js | 9 + package-lock.json | 258 +++++++++++++++++++ package.json | 7 +- 10 files changed, 318 insertions(+), 14 deletions(-) diff --git a/app/components/Autocomplete/OptionsList.scss b/app/components/Autocomplete/OptionsList.scss index 60eec02..440b64d 100644 --- a/app/components/Autocomplete/OptionsList.scss +++ b/app/components/Autocomplete/OptionsList.scss @@ -3,7 +3,7 @@ .autocomplete-options { padding-left: 0; background-color: $seashell; - color: $grey; + color: $shuttle-gray; margin: 1px 0 0; position: absolute; max-height: 400px; diff --git a/app/components/Input/Input.scss b/app/components/Input/Input.scss index 6f61792..6dbe032 100644 --- a/app/components/Input/Input.scss +++ b/app/components/Input/Input.scss @@ -2,7 +2,7 @@ .input { background-color: $seashell; - color: $grey; + color: $shuttle-gray; padding: 0 10px; border-width: 0; min-height: 34px; diff --git a/app/components/IssuesSearch/IssuesSearch.js b/app/components/IssuesSearch/IssuesSearch.js index bb923d6..2875cb0 100644 --- a/app/components/IssuesSearch/IssuesSearch.js +++ b/app/components/IssuesSearch/IssuesSearch.js @@ -70,6 +70,7 @@ class IssuesSearch extends PureComponent { className={b('user-name')()} onValueChange={this.onChange} placeholder="User name" + aria-label="User name" onBlur={this.onUserNameFieldBlur} required /> @@ -81,11 +82,13 @@ class IssuesSearch extends PureComponent { onValueChange={this.onRepoNameChange} onOptionSelected={this.onRepoSelected} placeholder="Repository name" + aria-label="Repository name" required /> ', () => { const defaultProps = { value: 'Bill' }; diff --git a/app/components/IssueDetail/IssueDetail.spec.js b/app/components/IssueDetail/tests/IssueDetail.spec.js similarity index 93% rename from app/components/IssueDetail/IssueDetail.spec.js rename to app/components/IssueDetail/tests/IssueDetail.spec.js index 5bdd1e4..f7cfa00 100644 --- a/app/components/IssueDetail/IssueDetail.spec.js +++ b/app/components/IssueDetail/tests/IssueDetail.spec.js @@ -1,5 +1,5 @@ import { componentSetup } from 'utils/componentTestingSetup'; -import IssueDetail from './IssueDetail'; +import IssueDetail from '../IssueDetail'; describe('', () => { const defaultProps = { diff --git a/app/components/IssuesList/Issue.spec.js b/app/components/IssuesList/tests/Issue.spec.js similarity index 97% rename from app/components/IssuesList/Issue.spec.js rename to app/components/IssuesList/tests/Issue.spec.js index 107d12c..89d4514 100644 --- a/app/components/IssuesList/Issue.spec.js +++ b/app/components/IssuesList/tests/Issue.spec.js @@ -1,6 +1,6 @@ import sinon from 'sinon'; import { componentSetup } from 'utils/componentTestingSetup'; -import Issue from './Issue'; +import Issue from '../Issue'; describe('', () => { const defaultProps = { diff --git a/app/components/IssuesList/IssueList.spec.js b/app/components/IssuesList/tests/IssueList.spec.js similarity index 95% rename from app/components/IssuesList/IssueList.spec.js rename to app/components/IssuesList/tests/IssueList.spec.js index 4365545..83bd471 100644 --- a/app/components/IssuesList/IssueList.spec.js +++ b/app/components/IssuesList/tests/IssueList.spec.js @@ -1,6 +1,6 @@ import sinon from 'sinon'; import { componentSetup } from 'utils/componentTestingSetup'; -import IssueList from './IssuesList'; +import IssueList from '../IssuesList'; describe('', () => { const defaultProps = { diff --git a/app/components/IssuesSearch/IssuesSearch.spec.js b/app/components/IssuesSearch/tests/IssuesSearch.spec.js similarity index 98% rename from app/components/IssuesSearch/IssuesSearch.spec.js rename to app/components/IssuesSearch/tests/IssuesSearch.spec.js index 91339ec..29c5276 100644 --- a/app/components/IssuesSearch/IssuesSearch.spec.js +++ b/app/components/IssuesSearch/tests/IssuesSearch.spec.js @@ -1,6 +1,6 @@ import sinon from 'sinon'; import { componentSetup } from 'utils/componentTestingSetup'; -import IssuesSearch from './IssuesSearch'; +import IssuesSearch from '../IssuesSearch'; describe('', () => { const defaultProps = { diff --git a/app/components/Link/Link.spec.js b/app/components/Link/tests/Link.spec.js similarity index 95% rename from app/components/Link/Link.spec.js rename to app/components/Link/tests/Link.spec.js index c4492b7..262570b 100644 --- a/app/components/Link/Link.spec.js +++ b/app/components/Link/tests/Link.spec.js @@ -1,5 +1,5 @@ import { componentSetup } from 'utils/componentTestingSetup'; -import Link from './Link'; +import Link from '../Link'; describe('', () => { const defaultProps = { diff --git a/app/components/Markdown/Markdown.spec.js b/app/components/Markdown/tests/Markdown.spec.js similarity index 93% rename from app/components/Markdown/Markdown.spec.js rename to app/components/Markdown/tests/Markdown.spec.js index 08aada4..64d159e 100644 --- a/app/components/Markdown/Markdown.spec.js +++ b/app/components/Markdown/tests/Markdown.spec.js @@ -1,5 +1,5 @@ import { componentSetup } from 'utils/componentTestingSetup'; -import Markdown from './Markdown'; +import Markdown from '../Markdown'; describe('', () => { const defaultProps = { diff --git a/app/components/Paging/PageButton.spec.js b/app/components/Paging/tests/PageButton.spec.js similarity index 95% rename from app/components/Paging/PageButton.spec.js rename to app/components/Paging/tests/PageButton.spec.js index b654294..5f1d9d8 100644 --- a/app/components/Paging/PageButton.spec.js +++ b/app/components/Paging/tests/PageButton.spec.js @@ -1,6 +1,6 @@ import sinon from 'sinon'; import { componentSetup } from 'utils/componentTestingSetup'; -import PageButton from './PageButton'; +import PageButton from '../PageButton'; describe('', () => { const defaultProps = { diff --git a/app/components/Paging/Paging.spec.js b/app/components/Paging/tests/Paging.spec.js similarity index 94% rename from app/components/Paging/Paging.spec.js rename to app/components/Paging/tests/Paging.spec.js index 0468c1b..f4ac449 100644 --- a/app/components/Paging/Paging.spec.js +++ b/app/components/Paging/tests/Paging.spec.js @@ -1,6 +1,6 @@ import sinon from 'sinon'; import { componentSetup } from 'utils/componentTestingSetup'; -import Paging from './Paging'; +import Paging from '../Paging'; describe('', () => { const defaultProps = { diff --git a/app/components/Select/Select.spec.js b/app/components/Select/tests/Select.spec.js similarity index 96% rename from app/components/Select/Select.spec.js rename to app/components/Select/tests/Select.spec.js index 7005ce4..38c9bac 100644 --- a/app/components/Select/Select.spec.js +++ b/app/components/Select/tests/Select.spec.js @@ -1,6 +1,6 @@ import sinon from 'sinon'; import { componentSetup } from 'utils/componentTestingSetup'; -import Select from './Select'; +import Select from '../Select'; describe('