From c1f7ef4f3264654c89d8ebef8ede42110ad414cc Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Tue, 3 Oct 2017 21:08:02 +0700 Subject: [PATCH 01/23] Introduce Jest Unit Testing framework --- .babelrc | 9 +- .../components}/__tests__/markdown.spec.js | 0 .../__tests__/commentBox.spec.js | 26 - jest.config.js | 39 + package.json | 11 +- test/client/.eslintrc.json | 3 + test/client/fileMock.js | 1 + test/client/setupJest.js | 38 + test/client/yamlTransformer.js | 8 + yarn.lock | 871 ++++++++++++++++-- 10 files changed, 901 insertions(+), 105 deletions(-) rename client/{talk-plugin-infobox => coral-framework/components}/__tests__/markdown.spec.js (100%) delete mode 100644 client/talk-plugin-commentbox/__tests__/commentBox.spec.js create mode 100644 jest.config.js create mode 100644 test/client/.eslintrc.json create mode 100644 test/client/fileMock.js create mode 100644 test/client/setupJest.js create mode 100644 test/client/yamlTransformer.js diff --git a/.babelrc b/.babelrc index 3dcf42eb7..92a64c2a4 100644 --- a/.babelrc +++ b/.babelrc @@ -10,5 +10,12 @@ "transform-async-to-generator", "transform-react-jsx", "syntax-dynamic-import" - ] + ], + "env": { + "test": { + "plugins": [ + ["transform-es2015-modules-commonjs", "dynamic-import-node"] + ] + } + } } diff --git a/client/talk-plugin-infobox/__tests__/markdown.spec.js b/client/coral-framework/components/__tests__/markdown.spec.js similarity index 100% rename from client/talk-plugin-infobox/__tests__/markdown.spec.js rename to client/coral-framework/components/__tests__/markdown.spec.js diff --git a/client/talk-plugin-commentbox/__tests__/commentBox.spec.js b/client/talk-plugin-commentbox/__tests__/commentBox.spec.js deleted file mode 100644 index 6ae09e786..000000000 --- a/client/talk-plugin-commentbox/__tests__/commentBox.spec.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import {shallow} from 'enzyme'; -import {expect} from 'chai'; -import CommentBox from '../CommentBox'; - -describe('CommentBox', () => { - let comment; - let render; - beforeEach(() => { - comment = {}; - const postItem = (item) => { - comment.posted = item; - return Promise.resolve(4); - }; - render = shallow( comment.text = e.target.value} - item_id={'1'} - comments={['1', '2', '3']}/>); - }); - - it('should render the CommentBox appropriately', () => { - expect(render.contains('
/test/client/setupJest.js', + modulePaths: [ + '/plugins', + '/client', + ...buildTargets.map((target) => path.join('', 'client', target, 'src')), + ...buildEmbeds.map((embed) => path.join('', 'client', `coral-embed-${embed}`, 'src')), + ], + moduleFileExtensions: ['js', 'jsx', 'json', 'yaml', 'yml'], + moduleDirectories: ['node_modules'], + + transform: { + '^.+\\.jsx?$': 'babel-jest', + '\\.ya?ml$': '/test/client/yamlTransformer.js' + }, + + moduleNameMapper: { + '^plugin-api\\/(.*)$': '/plugin-api/$1', + '^plugins\\/(.*)$': '/plugins/$1', + '^pluginsConfig$': pluginsPath, + + '\\.(scss|css|less)$': 'identity-obj-proxy', + '\\.(gif|ttf|eot|svg)$': '/test/client/fileMock.js' + } +}; diff --git a/package.json b/package.json index f8c8c9731..b95a16e06 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "lint": "eslint --ext=.js --ext=.json bin/* .", "lint-fix": "yarn lint --fix", "test": "TEST_MODE=unit NODE_ENV=test mocha -R ${MOCHA_REPORTER:-spec}", + "test-jest": "TEST_MODE=unit NODE_ENV=test jest", "test-cover": "TEST_MODE=unit NODE_ENV=test istanbul cover _mocha --report text --check-coverage -- -R spec", "heroku-postbuild": "./bin/cli plugins reconcile && yarn build", "generate-introspection": "WEBPACK=TRUE NODE_ENV=test ./scripts/generateIntrospectionResult.js" @@ -159,6 +160,7 @@ "react-redux": "^4.4.5", "react-router": "^3.0.0", "react-tagsinput": "^3.17.0", + "react-test-renderer": "15.5", "react-toastify": "^1.5.0", "react-transition-group": "^1.1.3", "recompose": "^0.23.1", @@ -179,17 +181,24 @@ "url-search-params": "^0.9.0", "uuid": "^3.1.0", "webpack": "^2.3.1", + "webpack-sources": "^1.0.1", "yaml-loader": "^0.4.0", "yamljs": "^0.2.10" }, "devDependencies": { "@coralproject/eslint-config-talk": "^0.0.3", + "babel-jest": "^21.2.0", + "babel-plugin-dynamic-import-node": "^1.1.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", "chai": "^3.5.0", "chai-as-promised": "^6.0.0", "chai-http": "^3.0.0", - "enzyme": "^2.9.1", + "enzyme": "^3.0.0", + "enzyme-adapter-react-15": "^1.0.0", "eslint": "^4.5.0", "eslint-plugin-mocha": "^4.11.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^21.2.1", "mocha": "^3.1.2", "mocha-junit-reporter": "^1.12.1", "nodemon": "^1.11.0", diff --git a/test/client/.eslintrc.json b/test/client/.eslintrc.json new file mode 100644 index 000000000..c8a6db18a --- /dev/null +++ b/test/client/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "@coralproject/eslint-config-talk/client" +} diff --git a/test/client/fileMock.js b/test/client/fileMock.js new file mode 100644 index 000000000..86059f362 --- /dev/null +++ b/test/client/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub'; diff --git a/test/client/setupJest.js b/test/client/setupJest.js new file mode 100644 index 000000000..610a57a72 --- /dev/null +++ b/test/client/setupJest.js @@ -0,0 +1,38 @@ +import Enzyme from 'enzyme'; +import Adapter from 'enzyme-adapter-react-15'; + +Enzyme.configure({adapter: new Adapter()}); + +// Storage Mock + +// TODO: If our code is written well, there shouldn't be a hardcoded dependency +// to the local storage, and this global mock wouldn't be needed. + +function storageMock() { + let storage = {}; + + return { + setItem: function(key, value) { + storage[key] = value || ''; + }, + getItem: function(key) { + return key in storage ? storage[key] : null; + }, + removeItem: function(key) { + delete storage[key]; + }, + get length() { + return Object.keys(storage).length; + }, + key: function(i) { + let keys = Object.keys(storage); + return keys[i] || null; + } + }; +} + +// mock the localStorage +window.localStorage = storageMock(); + +// mock the sessionStorage +window.sessionStorage = storageMock(); diff --git a/test/client/yamlTransformer.js b/test/client/yamlTransformer.js new file mode 100644 index 000000000..5434ac98f --- /dev/null +++ b/test/client/yamlTransformer.js @@ -0,0 +1,8 @@ +const yaml = require('yamljs'); + +module.exports = { + process(src) { + const data = yaml.parse(src); + return `module.exports = ${JSON.stringify(data)};`; + }, +}; diff --git a/yarn.lock b/yarn.lock index 29d4a2605..464ac6a26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,6 +50,10 @@ version "7.0.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.12.tgz#ae5f67a19c15f752148004db07cbbb372e69efc9" +"@types/node@^6.0.46": + version "6.0.88" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.88.tgz#f618f11a944f6a18d92b5c472028728a3e3d4b66" + "@types/serve-static@*": version "1.7.31" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a" @@ -63,7 +67,7 @@ dependencies: "@types/node" "*" -abab@^1.0.0: +abab@^1.0.0, abab@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" @@ -90,7 +94,7 @@ acorn-globals@^1.0.4: dependencies: acorn "^2.1.0" -acorn-globals@^3.0.0: +acorn-globals@^3.0.0, acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" dependencies: @@ -178,6 +182,10 @@ ansi-escapes@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + ansi-regex@^1.0.0, ansi-regex@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" @@ -194,7 +202,7 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.1.0: +ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: @@ -280,6 +288,10 @@ arr-flatten@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -305,7 +317,7 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -343,6 +355,10 @@ assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -419,7 +435,7 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0: +babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: @@ -558,6 +574,13 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e" + dependencies: + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^21.2.0" + babel-loader@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" @@ -578,6 +601,26 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-dynamic-import-node@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz#bd1d88ac7aaf98df4917c384373b04d971a2b37a" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-istanbul@^4.0.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.5" + test-exclude "^4.1.1" + +babel-plugin-jest-hoist@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -602,7 +645,7 @@ babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" -babel-plugin-syntax-object-rest-spread@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" @@ -724,6 +767,15 @@ babel-plugin-transform-es2015-modules-commonjs@^6.24.1: babel-template "^6.24.1" babel-types "^6.24.1" +babel-plugin-transform-es2015-modules-commonjs@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + babel-plugin-transform-es2015-modules-systemjs@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" @@ -903,6 +955,13 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" +babel-preset-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" + dependencies: + babel-plugin-jest-hoist "^21.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-preset-react@^6.23.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" @@ -1094,6 +1153,12 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" @@ -1156,6 +1221,12 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + bson@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.4.tgz#93c10d39eaa5b58415cbc4052f3e53e562b0b72c" @@ -1218,6 +1289,10 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -1226,6 +1301,10 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + camelize@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -1300,7 +1379,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" dependencies: @@ -1360,26 +1439,16 @@ cheerio@^0.20.0: optionalDependencies: jsdom "^7.0.2" -cheerio@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.2" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" dependencies: css-select "~1.2.0" dom-serializer "~0.1.0" entities "~1.1.1" htmlparser2 "^3.9.1" - lodash.assignin "^4.0.9" - lodash.bind "^4.1.4" - lodash.defaults "^4.0.1" - lodash.filter "^4.4.0" - lodash.flatten "^4.2.0" - lodash.foreach "^4.3.0" - lodash.map "^4.4.0" - lodash.merge "^4.4.0" - lodash.pick "^4.2.1" - lodash.reduce "^4.4.0" - lodash.reject "^4.4.0" - lodash.some "^4.4.0" + lodash "^4.15.0" + parse5 "^3.0.1" chokidar@^1.4.3, chokidar@^1.6.1: version "1.6.1" @@ -1402,6 +1471,10 @@ chrono-node@^1.2.3: dependencies: moment "^2.10.3" +ci-info@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" + cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" @@ -1554,6 +1627,10 @@ colormin@^1.0.5: css-color-names "0.0.4" has "^1.0.1" +colors@0.5.x: + version "0.5.1" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -1702,6 +1779,10 @@ content-security-policy-builder@1.1.0: dependencies: dashify "^0.2.0" +content-type-parser@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" + content-type@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" @@ -1719,7 +1800,7 @@ conventional-commit-types@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.1.0.tgz#45d860386c9a2e6537ee91d8a1b61bd0411b3d04" -convert-source-map@^1.5.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -1809,7 +1890,7 @@ create-react-class@^15.5.1, create-react-class@^15.5.2: fbjs "^0.8.9" object-assign "^4.1.1" -cross-spawn@^5.1.0: +cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: @@ -1955,11 +2036,11 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" -cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0", "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" -"cssstyle@>= 0.2.29 < 0.3.0": +"cssstyle@>= 0.2.29 < 0.3.0", "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" dependencies: @@ -2153,7 +2234,7 @@ did-you-mean@^0.0.1: levenshtein "*" underscore "*" -diff@3.2.0, diff@^3.1.0: +diff@3.2.0, diff@^3.1.0, diff@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" @@ -2165,6 +2246,10 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + dns-prefetch-control@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" @@ -2319,22 +2404,40 @@ env-rewrite@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/env-rewrite/-/env-rewrite-1.0.2.tgz#3e344a95af1bdaab34a559479b8be3abd0804183" -enzyme@^2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.9.1.tgz#07d5ce691241240fb817bf2c4b18d6e530240df6" +enzyme-adapter-react-15@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-15/-/enzyme-adapter-react-15-1.0.1.tgz#c1a3e5966bf1c7221c40aa0f877850175035406f" dependencies: - cheerio "^0.22.0" - function.prototype.name "^1.0.0" + enzyme-adapter-utils "^1.0.0" + lodash "^4.17.4" + object.assign "^4.0.4" + object.values "^1.0.4" + prop-types "^15.5.10" + +enzyme-adapter-utils@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.0.1.tgz#fcd81223339a55a312f7552641e045c404084009" + dependencies: + lodash "^4.17.4" + object.assign "^4.0.4" + prop-types "^15.5.10" + +enzyme@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.1.0.tgz#d8ca84085790fbcec6ed40badd14478faee4c25a" + dependencies: + cheerio "^1.0.0-rc.2" + function.prototype.name "^1.0.3" is-subset "^0.1.1" lodash "^4.17.4" object-is "^1.0.1" object.assign "^4.0.4" object.entries "^1.0.4" object.values "^1.0.4" - prop-types "^15.5.10" - uuid "^3.0.1" + raf "^3.3.2" + rst-selector-parser "^2.2.2" -errno@^0.1.3: +errno@^0.1.3, errno@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" dependencies: @@ -2555,6 +2658,24 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -2579,6 +2700,17 @@ expect-ct@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/expect-ct/-/expect-ct-0.1.0.tgz#52735678de18530890d8d7b95f0ac63640958094" +expect@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^21.2.1" + jest-get-type "^21.2.0" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" + jest-regex-util "^21.2.0" + exports-loader@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886" @@ -2657,6 +2789,12 @@ fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + fbjs@^0.8.1, fbjs@^0.8.9: version "0.8.12" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" @@ -2752,7 +2890,7 @@ find-parent-dir@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" -find-up@2.1.0, find-up@^2.1.0: +find-up@2.1.0, find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -2906,7 +3044,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0: +fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" dependencies: @@ -2934,7 +3072,7 @@ function-bind@^1.0.2, function-bind@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" -function.prototype.name@^1.0.0: +function.prototype.name@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.3.tgz#0099ae5572e9dd6f03c97d023fd92bcc5e639eac" dependencies: @@ -2963,6 +3101,10 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -3276,6 +3418,10 @@ growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + hammerjs@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" @@ -3301,6 +3447,10 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" +harmony-reflect@^1.4.6: + version "1.5.1" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.5.1.tgz#b54ca617b00cc8aef559bbb17b3d85431dc7e329" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -3436,6 +3586,12 @@ html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" +html-encoding-sniffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" + dependencies: + whatwg-encoding "^1.0.1" + htmlparser2@3.8.x, htmlparser2@~3.8.1: version "3.8.3" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" @@ -3498,6 +3654,10 @@ https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + iconv-lite@0.4.15: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" @@ -3516,6 +3676,12 @@ icss-utils@^2.1.0: dependencies: postcss "^6.0.1" +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" + dependencies: + harmony-reflect "^1.4.6" + ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" @@ -3738,6 +3904,12 @@ is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-ci@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" @@ -3884,7 +4056,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.0, is-stream@^1.0.1: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3951,7 +4123,7 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.1.0-alpha: +istanbul-api@^1.1.0-alpha, istanbul-api@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.7.tgz#f6f37f09f8002b130f891c646b70ee4a8e7345ae" dependencies: @@ -3967,6 +4139,10 @@ istanbul-api@^1.1.0-alpha: mkdirp "^0.5.1" once "^1.4.0" +istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + istanbul-lib-coverage@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" @@ -3977,6 +4153,18 @@ istanbul-lib-hook@^1.0.5: dependencies: append-transform "^0.4.0" +istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5: + version "1.8.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz#66f6c9421cc9ec4704f76f2db084ba9078a2b532" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.1.1" + semver "^5.3.0" + istanbul-lib-instrument@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz#b8e0dc25709bb44e17336ab47b7bb5c97c23f659" @@ -3998,7 +4186,7 @@ istanbul-lib-report@^1.0.0: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.1.1: +istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz#f8c8c2e8f2160d1d91526d97e5bd63b2079af71c" dependencies: @@ -4042,6 +4230,231 @@ iterall@^1.1.0, iterall@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.1.tgz#f7f0af11e9a04ec6426260f5019d9fcca4d50214" +jest-changed-files@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" + dependencies: + throat "^4.0.0" + +jest-cli@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + istanbul-api "^1.1.1" + istanbul-lib-coverage "^1.0.1" + istanbul-lib-instrument "^1.4.2" + istanbul-lib-source-maps "^1.1.0" + jest-changed-files "^21.2.0" + jest-config "^21.2.1" + jest-environment-jsdom "^21.2.1" + jest-haste-map "^21.2.0" + jest-message-util "^21.2.1" + jest-regex-util "^21.2.0" + jest-resolve-dependencies "^21.2.0" + jest-runner "^21.2.1" + jest-runtime "^21.2.1" + jest-snapshot "^21.2.1" + jest-util "^21.2.1" + micromatch "^2.3.11" + node-notifier "^5.0.2" + pify "^3.0.0" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + worker-farm "^1.3.1" + yargs "^9.0.0" + +jest-config@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^21.2.1" + jest-environment-node "^21.2.1" + jest-get-type "^21.2.0" + jest-jasmine2 "^21.2.1" + jest-regex-util "^21.2.0" + jest-resolve "^21.2.0" + jest-util "^21.2.1" + jest-validate "^21.2.1" + pretty-format "^21.2.1" + +jest-diff@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" + +jest-docblock@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" + +jest-environment-jsdom@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" + dependencies: + jest-mock "^21.2.0" + jest-util "^21.2.1" + jsdom "^9.12.0" + +jest-environment-node@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" + dependencies: + jest-mock "^21.2.0" + jest-util "^21.2.1" + +jest-get-type@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" + +jest-haste-map@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^21.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + worker-farm "^1.3.1" + +jest-jasmine2@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" + dependencies: + chalk "^2.0.1" + expect "^21.2.1" + graceful-fs "^4.1.11" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" + jest-snapshot "^21.2.1" + p-cancelable "^0.3.0" + +jest-matcher-utils@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" + +jest-message-util@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" + dependencies: + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + +jest-mock@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f" + +jest-regex-util@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" + +jest-resolve-dependencies@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" + dependencies: + jest-regex-util "^21.2.0" + +jest-resolve@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + is-builtin-module "^1.0.0" + +jest-runner@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" + dependencies: + jest-config "^21.2.1" + jest-docblock "^21.2.0" + jest-haste-map "^21.2.0" + jest-jasmine2 "^21.2.1" + jest-message-util "^21.2.1" + jest-runtime "^21.2.1" + jest-util "^21.2.1" + pify "^3.0.0" + throat "^4.0.0" + worker-farm "^1.3.1" + +jest-runtime@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" + dependencies: + babel-core "^6.0.0" + babel-jest "^21.2.0" + babel-plugin-istanbul "^4.0.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + graceful-fs "^4.1.11" + jest-config "^21.2.1" + jest-haste-map "^21.2.0" + jest-regex-util "^21.2.0" + jest-resolve "^21.2.0" + jest-util "^21.2.1" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^9.0.0" + +jest-snapshot@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" + dependencies: + chalk "^2.0.1" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^21.2.1" + +jest-util@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + jest-message-util "^21.2.1" + jest-mock "^21.2.0" + jest-validate "^21.2.1" + mkdirp "^0.5.1" + +jest-validate@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.2.0" + leven "^2.1.0" + pretty-format "^21.2.1" + +jest@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" + dependencies: + jest-cli "^21.2.1" + jju@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" @@ -4131,6 +4544,30 @@ jsdom@^7.0.2: whatwg-url-compat "~0.6.5" xml-name-validator ">= 2.0.1 < 3.0.0" +jsdom@^9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -4332,6 +4769,10 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + levenshtein@*: version "1.0.5" resolved "https://registry.yarnpkg.com/levenshtein/-/levenshtein-1.0.5.tgz#3911737a9cb56da345d008f55782c6f138979ba3" @@ -4381,6 +4822,15 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -4460,11 +4910,7 @@ lodash.assign@^4.0.3, lodash.assign@^4.0.6, lodash.assign@^4.1.0, lodash.assign@ version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" -lodash.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - -lodash.bind@^4.1.4, lodash.bind@^4.2.1: +lodash.bind@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" @@ -4495,7 +4941,7 @@ lodash.defaults@^3.1.2: lodash.assign "^3.0.0" lodash.restparam "^3.0.0" -lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: +lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -4503,15 +4949,15 @@ lodash.difference@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" -lodash.filter@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - lodash.flatten@^4.2.0, lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" -lodash.foreach@^4.3.0, lodash.foreach@^4.5.0: +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + +lodash.foreach@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" @@ -4551,7 +4997,7 @@ lodash.keys@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" -lodash.map@^4.4.0, lodash.map@^4.5.1: +lodash.map@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" @@ -4559,10 +5005,6 @@ lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" -lodash.merge@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" - lodash.noop@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" @@ -4575,18 +5017,14 @@ lodash.partial@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.partial/-/lodash.partial-4.2.1.tgz#49f3d8cfdaa3bff8b3a91d127e923245418961d4" -lodash.pick@^4.2.1, lodash.pick@^4.4.0: +lodash.pick@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" -lodash.reduce@4.6.0, lodash.reduce@^4.4.0: +lodash.reduce@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" -lodash.reject@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -4599,10 +5037,6 @@ lodash.shuffle@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b" -lodash.some@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" @@ -4623,7 +5057,7 @@ lodash@3.7.x: version "3.7.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" -lodash@4.17.4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@4.17.4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -4691,6 +5125,12 @@ make-error@^1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.2.3.tgz#6c4402df732e0977ac6faf754a5074b3d2b1d19d" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -4719,6 +5159,12 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -4730,6 +5176,10 @@ merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + metascraper@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/metascraper/-/metascraper-1.0.7.tgz#2343f9108f34e4d2b55b7b4f543c96dfc52e1478" @@ -4745,7 +5195,7 @@ methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" -micromatch@^2.1.5: +micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -4816,7 +5266,7 @@ minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4966,6 +5416,14 @@ natural@^0.2.0: sylvester ">= 0.0.12" underscore ">=1.3.1" +nearley@^2.7.10: + version "2.11.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.11.0.tgz#5e626c79a6cd2f6ab9e7e5d5805e7668967757ae" + dependencies: + nomnom "~1.6.2" + railroad-diagrams "^1.0.0" + randexp "^0.4.2" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" @@ -5020,6 +5478,10 @@ node-fetch@^1.0.1, node-fetch@^1.7.2: encoding "^0.1.11" is-stream "^1.0.1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + node-libs-browser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -5048,6 +5510,15 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-notifier@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + node-pre-gyp@^0.6.29: version "0.6.32" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" @@ -5140,6 +5611,13 @@ nodemon@^1.11.0: undefsafe "0.0.3" update-notifier "0.5.0" +nomnom@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.6.2.tgz#84a66a260174408fc5b77a18f888eccc44fb6971" + dependencies: + colors "0.5.x" + underscore "~1.4.4" + nopt@3.x, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -5180,6 +5658,12 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + npmlog@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" @@ -5203,7 +5687,7 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -"nwmatcher@>= 1.3.7 < 2.0.0": +"nwmatcher@>= 1.3.7 < 2.0.0", "nwmatcher@>= 1.3.9 < 2.0.0": version "1.3.9" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" @@ -5324,6 +5808,14 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5343,6 +5835,14 @@ output-file-sync@^1.1.2: mkdirp "^0.5.1" object-assign "^4.1.0" +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + p-limit@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" @@ -5406,6 +5906,12 @@ parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" +parse5@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510" + dependencies: + "@types/node" "^6.0.46" + parseurl@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" @@ -5456,6 +5962,10 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -5478,6 +5988,12 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -5498,10 +6014,18 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + pinkie-promise@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" @@ -6023,6 +6547,13 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" +pretty-format@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -6245,10 +6776,27 @@ quote@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/quote/-/quote-0.4.0.tgz#10839217f6c1362b89194044d29b233fd7f32f01" +raf@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" + dependencies: + performance-now "^2.1.0" + +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + ramda@0.24.1, ramda@^0.24.1: version "0.24.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" +randexp@^0.4.2: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + randomatic@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" @@ -6363,6 +6911,13 @@ react-tagsinput@^3.17.0: version "3.17.0" resolved "https://registry.yarnpkg.com/react-tagsinput/-/react-tagsinput-3.17.0.tgz#d699bc7ff3be3492d5a3d2a57f6976908774fba3" +react-test-renderer@15.5: + version "15.5.4" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.5.4.tgz#d4ebb23f613d685ea8f5390109c2d20fbf7c83bc" + dependencies: + fbjs "^0.8.9" + object-assign "^4.1.0" + react-toastify@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-1.5.0.tgz#e9857e0b5d640064e5ba6caf7a96bb1578273de7" @@ -6408,6 +6963,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -6416,6 +6978,14 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + readable-stream@1.1: version "1.1.13" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" @@ -6698,6 +7268,10 @@ resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" @@ -6718,6 +7292,10 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + rgb@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/rgb/-/rgb-0.1.0.tgz#be27b291e8feffeac1bd99729721bfa40fc037b5" @@ -6742,6 +7320,13 @@ ripemd160@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" +rst-selector-parser@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.2.tgz#9927b619bd5af8dc23a76c64caef04edf90d2c65" + dependencies: + lodash.flattendeep "^4.4.0" + nearley "^2.7.10" + run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -6784,11 +7369,25 @@ samsam@1.x, samsam@^1.1.3: version "1.2.1" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" +sane@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.1.1" + sax@0.5.x: version "0.5.8" resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" -sax@^1.1.4, sax@~1.2.1: +sax@^1.1.4, sax@^1.2.1, sax@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" @@ -6885,6 +7484,10 @@ shelljs@0.7.8, shelljs@^0.7.0: interpret "^1.0.0" rechoir "^0.6.2" +shellwords@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -7119,6 +7722,13 @@ string-length@^1.0.0: dependencies: strip-ansi "^3.0.0" +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -7166,12 +7776,20 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + strip-json-comments@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" @@ -7275,7 +7893,7 @@ symbol-observable@^1.0.2, symbol-observable@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" -"symbol-tree@>= 3.1.0 < 4.0.0": +"symbol-tree@>= 3.1.0 < 4.0.0", symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -7319,6 +7937,16 @@ tcomb@^2.5.1: version "2.7.0" resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-2.7.0.tgz#10d62958041669a5d53567b9a4ee8cde22b1c2b0" +test-exclude@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + text-encoding@0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" @@ -7327,6 +7955,10 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + through@2, through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7373,6 +8005,10 @@ tmp@^0.0.31: dependencies: os-tmpdir "~1.0.1" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -7434,13 +8070,13 @@ touch@1.0.0: dependencies: nopt "~1.0.10" -tough-cookie@^2.0.0, tough-cookie@^2.2.0, tough-cookie@~2.3.0: +tough-cookie@^2.0.0, tough-cookie@^2.2.0, tough-cookie@^2.3.2, tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" dependencies: punycode "^1.4.1" -tr46@~0.0.1: +tr46@~0.0.1, tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -7536,6 +8172,10 @@ underscore@*, underscore@>=1.3.1: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" +underscore@~1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" + underscore@~1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" @@ -7668,12 +8308,25 @@ void-elements@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" dependencies: loose-envify "^1.0.0" +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + watchpack@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" @@ -7690,6 +8343,14 @@ webidl-conversions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + webpack-sources@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" @@ -7730,6 +8391,12 @@ webpack@^2.3.1: webpack-sources "^0.2.3" yargs "^6.0.0" +whatwg-encoding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" + dependencies: + iconv-lite "0.4.13" + whatwg-fetch@>=0.10.0, whatwg-fetch@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" @@ -7740,6 +8407,13 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" @@ -7748,7 +8422,11 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.1.1, which@^1.2.9: +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@^1.1.1, which@^1.2.12, which@^1.2.9: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" dependencies: @@ -7791,6 +8469,13 @@ wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" +worker-farm@^1.3.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.0.tgz#adfdf0cd40581465ed0a1f648f9735722afd5c8d" + dependencies: + errno "^0.1.4" + xtend "^4.0.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -7810,6 +8495,14 @@ write-file-atomic@^1.1.2: imurmurhash "^0.1.4" slide "^1.1.5" +write-file-atomic@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -7833,7 +8526,7 @@ xdg-basedir@^2.0.0: dependencies: os-homedir "^1.0.0" -"xml-name-validator@>= 2.0.1 < 3.0.0": +"xml-name-validator@>= 2.0.1 < 3.0.0", xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" @@ -7886,6 +8579,12 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + yargs@^4.0.0: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" @@ -7942,6 +8641,24 @@ yargs@^6.0.0: y18n "^3.2.1" yargs-parser "^4.2.0" +yargs@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From 14ce9b1e7704f795a413508de43658a96ae24a70 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Tue, 3 Oct 2017 21:19:19 +0700 Subject: [PATCH 02/23] relax language --- test/client/setupJest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/client/setupJest.js b/test/client/setupJest.js index 610a57a72..0f985fc68 100644 --- a/test/client/setupJest.js +++ b/test/client/setupJest.js @@ -5,8 +5,8 @@ Enzyme.configure({adapter: new Adapter()}); // Storage Mock -// TODO: If our code is written well, there shouldn't be a hardcoded dependency -// to the local storage, and this global mock wouldn't be needed. +// TODO: Some places in our code (e.g. translations) has a hardcoded dependency +// to the local storage. Fixing it and we can remove this global mock. function storageMock() { let storage = {}; From 2be8750d0e94e1bf0a5aef807d32ebbf630e2f44 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Tue, 3 Oct 2017 21:30:55 +0700 Subject: [PATCH 03/23] Add yarn jest-watch --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b95a16e06..03ed8a04f 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "build-watch": "WEBPACK=TRUE NODE_ENV=development webpack --progress --config webpack.config.js --watch", "lint": "eslint --ext=.js --ext=.json bin/* .", "lint-fix": "yarn lint --fix", - "test": "TEST_MODE=unit NODE_ENV=test mocha -R ${MOCHA_REPORTER:-spec}", - "test-jest": "TEST_MODE=unit NODE_ENV=test jest", + "jest-watch": "TEST_MODE=unit NODE_ENV=test jest --watch", + "test": "TEST_MODE=unit NODE_ENV=test jest && TEST_MODE=unit NODE_ENV=test mocha -R ${MOCHA_REPORTER:-spec}", "test-cover": "TEST_MODE=unit NODE_ENV=test istanbul cover _mocha --report text --check-coverage -- -R spec", "heroku-postbuild": "./bin/cli plugins reconcile && yarn build", "generate-introspection": "WEBPACK=TRUE NODE_ENV=test ./scripts/generateIntrospectionResult.js" From bd83e9e118499b89033eda0423ab3289b46e81d5 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Tue, 3 Oct 2017 21:31:10 +0700 Subject: [PATCH 04/23] Add first Snapshot testing --- .../__tests__/infoBox.spec.js | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/client/talk-plugin-infobox/__tests__/infoBox.spec.js b/client/talk-plugin-infobox/__tests__/infoBox.spec.js index 2110f5dc9..e26baa54f 100644 --- a/client/talk-plugin-infobox/__tests__/infoBox.spec.js +++ b/client/talk-plugin-infobox/__tests__/infoBox.spec.js @@ -1,29 +1,36 @@ import React from 'react'; import {shallow} from 'enzyme'; -import {expect} from 'chai'; import InfoBox from '../InfoBox'; +import renderer from 'react-test-renderer'; const render = (props) => shallow(); describe('InfoBox', () => { + it('renders correctly', () => { + const tree = renderer.create( + + ).toJSON(); + expect(tree).toMatchSnapshot(); + }); + it('should render hidden InfoBox', () => { const wrapper = render(); const className = wrapper.prop('className'); - expect(className).to.include('-info'); - expect(className).to.include('hidden'); + expect(className).toMatch('-info'); + expect(className).toMatch('hidden'); }); it('should render enabled InfoBox', () => { const wrapper = render({enable: true}); const className = wrapper.prop('className'); - expect(className).to.include('-info'); - expect(className).to.not.include('hidden'); + expect(className).toMatch('-info'); + expect(className).not.toMatch('hidden'); }); it('should render Markdown', () => { const wrapper = render({content: 'x'}); const Markddown = wrapper.find('Markdown'); - expect(Markddown).to.have.length(1); - expect(Markddown.prop('content')).to.equal('x'); + expect(Markddown).toHaveLength(1); + expect(Markddown.prop('content')).toEqual('x'); }); }); From 33920afc74e69f2a9b01b9eb4576ee7adbe1bf47 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Tue, 3 Oct 2017 21:54:15 +0700 Subject: [PATCH 05/23] Port form chai to jest --- .../{markdown.spec.js => Markdown.spec.js} | 5 ++--- .../{infoBox.spec.js => InfoBox.spec.js} | 0 .../__tests__/__snapshots__/InfoBox.spec.js.snap | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) rename client/coral-framework/components/__tests__/{markdown.spec.js => Markdown.spec.js} (81%) rename client/talk-plugin-infobox/__tests__/{infoBox.spec.js => InfoBox.spec.js} (100%) create mode 100644 client/talk-plugin-infobox/__tests__/__snapshots__/InfoBox.spec.js.snap diff --git a/client/coral-framework/components/__tests__/markdown.spec.js b/client/coral-framework/components/__tests__/Markdown.spec.js similarity index 81% rename from client/coral-framework/components/__tests__/markdown.spec.js rename to client/coral-framework/components/__tests__/Markdown.spec.js index 1d98dabae..ab2c1afd1 100644 --- a/client/coral-framework/components/__tests__/markdown.spec.js +++ b/client/coral-framework/components/__tests__/Markdown.spec.js @@ -1,6 +1,5 @@ import React from 'react'; import {shallow} from 'enzyme'; -import {expect} from 'chai'; import Markdown from '../Markdown'; const render = (props) => shallow(); @@ -9,12 +8,12 @@ describe('Markdown', () => { it('should convert Markdown to html', () => { const wrapper = render({content: '*test*'}); const html = wrapper.html(); - expect(html).to.contain(''); + expect(html).toMatch(''); }); it('should set target="_parent" for links', () => { const wrapper = render({content: '[link](https://coralproject.net)'}); const html = wrapper.html(); - expect(html).to.contain('target="_parent"'); + expect(html).toMatch('target="_parent"'); }); }); diff --git a/client/talk-plugin-infobox/__tests__/infoBox.spec.js b/client/talk-plugin-infobox/__tests__/InfoBox.spec.js similarity index 100% rename from client/talk-plugin-infobox/__tests__/infoBox.spec.js rename to client/talk-plugin-infobox/__tests__/InfoBox.spec.js diff --git a/client/talk-plugin-infobox/__tests__/__snapshots__/InfoBox.spec.js.snap b/client/talk-plugin-infobox/__tests__/__snapshots__/InfoBox.spec.js.snap new file mode 100644 index 000000000..4c90404bd --- /dev/null +++ b/client/talk-plugin-infobox/__tests__/__snapshots__/InfoBox.spec.js.snap @@ -0,0 +1,16 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`InfoBox renders correctly 1`] = ` +
+
test

+", + } + } + /> +
+`; From faf75c5c2f989a6fc2f667629d814fd89441f3b1 Mon Sep 17 00:00:00 2001 From: Chi Vinh Le Date: Tue, 3 Oct 2017 22:08:55 +0700 Subject: [PATCH 06/23] Upgrade linters --- package.json | 2 +- yarn.lock | 32 ++++++++++++++------------------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 03ed8a04f..57abb4f1d 100644 --- a/package.json +++ b/package.json @@ -186,7 +186,7 @@ "yamljs": "^0.2.10" }, "devDependencies": { - "@coralproject/eslint-config-talk": "^0.0.3", + "@coralproject/eslint-config-talk": "^0.0.4", "babel-jest": "^21.2.0", "babel-plugin-dynamic-import-node": "^1.1.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", diff --git a/yarn.lock b/yarn.lock index 464ac6a26..3f49f0d23 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,11 @@ # yarn lockfile v1 -"@coralproject/eslint-config-talk@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@coralproject/eslint-config-talk/-/eslint-config-talk-0.0.3.tgz#94965e984519920510f8a18be381f57ea38ee999" +"@coralproject/eslint-config-talk@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@coralproject/eslint-config-talk/-/eslint-config-talk-0.0.4.tgz#35a28c10b12bc4da96417afbce17b4743d3bfcf6" dependencies: + eslint-plugin-jest "^21.2.0" eslint-plugin-json "^1.2.0" eslint-plugin-promise "^3.3.1" eslint-plugin-react "^7.3.0" @@ -758,16 +759,7 @@ babel-plugin-transform-es2015-modules-amd@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.26.0: +babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" dependencies: @@ -2502,6 +2494,10 @@ escodegen@^1.6.1: optionalDependencies: source-map "~0.2.0" +eslint-plugin-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.2.0.tgz#292044df9cf0866ad9c530e78e6528fae287b926" + eslint-plugin-json@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-json/-/eslint-plugin-json-1.2.0.tgz#9ba73bb0be99d50093e889f5b968463d2a30efae" @@ -4139,14 +4135,14 @@ istanbul-api@^1.1.0-alpha, istanbul-api@^1.1.1: mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" - -istanbul-lib-coverage@^1.0.2: +istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz#87a0c015b6910651cb3b184814dfb339337e25e1" +istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + istanbul-lib-hook@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz#6ca3d16d60c5f4082da39f7c5cd38ea8a772b88e" From 5147ca6b86559cbaa9b985d98f19555fbd898899 Mon Sep 17 00:00:00 2001 From: Lance Ruegger Date: Wed, 4 Oct 2017 11:04:47 -0700 Subject: [PATCH 07/23] Add a max-width to the flag-reason text box to prevent cutoff --- client/coral-embed-stream/style/default.css | 1 + 1 file changed, 1 insertion(+) diff --git a/client/coral-embed-stream/style/default.css b/client/coral-embed-stream/style/default.css index a20c94d1a..0dcbf856e 100644 --- a/client/coral-embed-stream/style/default.css +++ b/client/coral-embed-stream/style/default.css @@ -270,6 +270,7 @@ button.comment__action-button[disabled], width: 75%; font-size: 16px; border: 1px solid #ccc; + max-width: calc(100% - 40px); } /* Close comments */ From 841ab53ea7cde647f69b2f47901fffec01483548 Mon Sep 17 00:00:00 2001 From: PepeFranco Date: Wed, 4 Oct 2017 15:42:02 -0500 Subject: [PATCH 08/23] Added env variable TALK_DEFAULT_LAN --- client/coral-framework/services/i18n.js | 2 +- webpack.config.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/client/coral-framework/services/i18n.js b/client/coral-framework/services/i18n.js index 1a4910b21..c25a58769 100644 --- a/client/coral-framework/services/i18n.js +++ b/client/coral-framework/services/i18n.js @@ -13,7 +13,7 @@ import pt_BR from '../../../locales/pt_BR.yml'; // Translations are happening at https://translate.lingohub.com/the-coral-project/dashboard -const defaultLanguage = 'en'; +const defaultLanguage = process.env.TALK_DEFAULT_LAN; const translations = {...en, ...es, ...fr, ...pt_BR}; let lang; diff --git a/webpack.config.js b/webpack.config.js index c555333bc..6e9917afc 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -111,7 +111,8 @@ const config = { new webpack.EnvironmentPlugin({ 'TALK_PLUGINS_JSON': '{}', 'TALK_THREADING_LEVEL': '3', - 'TALK_DEFAULT_STREAM_TAB': 'all' + 'TALK_DEFAULT_STREAM_TAB': 'all', + 'TALK_DEFAULT_LAN': 'en' }) ], resolveLoader: { From 8d6f79ab7944b7e16208ecff674924e2c18a41b3 Mon Sep 17 00:00:00 2001 From: PepeFranco Date: Wed, 4 Oct 2017 16:16:07 -0500 Subject: [PATCH 09/23] Fixed typo from LAN to LANG --- client/coral-framework/services/i18n.js | 2 +- webpack.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/coral-framework/services/i18n.js b/client/coral-framework/services/i18n.js index c25a58769..87e375853 100644 --- a/client/coral-framework/services/i18n.js +++ b/client/coral-framework/services/i18n.js @@ -13,7 +13,7 @@ import pt_BR from '../../../locales/pt_BR.yml'; // Translations are happening at https://translate.lingohub.com/the-coral-project/dashboard -const defaultLanguage = process.env.TALK_DEFAULT_LAN; +const defaultLanguage = process.env.TALK_DEFAULT_LANG; const translations = {...en, ...es, ...fr, ...pt_BR}; let lang; diff --git a/webpack.config.js b/webpack.config.js index 6e9917afc..d9c8ba4a0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -112,7 +112,7 @@ const config = { 'TALK_PLUGINS_JSON': '{}', 'TALK_THREADING_LEVEL': '3', 'TALK_DEFAULT_STREAM_TAB': 'all', - 'TALK_DEFAULT_LAN': 'en' + 'TALK_DEFAULT_LANG': 'en' }) ], resolveLoader: { From 551ac9dd90a2b8be8a1649a1b1271d1f8ddbec59 Mon Sep 17 00:00:00 2001 From: Jose Franco Date: Wed, 4 Oct 2017 17:31:48 -0500 Subject: [PATCH 10/23] Update running-advanced-configuration.md --- docs/_docs/running-advanced-configuration.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/_docs/running-advanced-configuration.md b/docs/_docs/running-advanced-configuration.md index 5512f60cb..7db27fb1c 100644 --- a/docs/_docs/running-advanced-configuration.md +++ b/docs/_docs/running-advanced-configuration.md @@ -24,6 +24,10 @@ otherwise the application will fail to start. Configure the duration for which comment counts are cached for, parsed by [ms](https://www.npmjs.com/package/ms){:target="_blank"}. (Default `1hr`) +## TALK_DEFAULT_LANG + +Specify the default translation language. (Default `en`) + ## TALK_DEFAULT_STREAM_TAB Specify the default stream tab in the admin. (Default `all`) @@ -439,4 +443,4 @@ Could be read as: again, then they must have two of their comments approved in order to get added back to the queue. - At the moment of writing, behavior is not attached to the flagging - reliability, but it is recorded. \ No newline at end of file + reliability, but it is recorded. From 95580f5ffe4d0796f7f886e8757074fe04e73d47 Mon Sep 17 00:00:00 2001 From: Vicky Chijwani Date: Thu, 5 Oct 2017 05:32:37 +0530 Subject: [PATCH 11/23] Add Slack notifications plugin for new comments. --- .gitignore | 1 + .../.eslintrc.json | 3 ++ .../talk-plugin-slack-notifications/index.js | 5 +++ .../package.json | 9 ++++ .../server/config.js | 11 +++++ .../server/hooks.js | 44 +++++++++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 plugins/talk-plugin-slack-notifications/.eslintrc.json create mode 100644 plugins/talk-plugin-slack-notifications/index.js create mode 100644 plugins/talk-plugin-slack-notifications/package.json create mode 100644 plugins/talk-plugin-slack-notifications/server/config.js create mode 100644 plugins/talk-plugin-slack-notifications/server/hooks.js diff --git a/.gitignore b/.gitignore index 9c55f2708..0ab845e4e 100644 --- a/.gitignore +++ b/.gitignore @@ -45,5 +45,6 @@ plugins/* !plugins/talk-plugin-deep-reply-count !plugins/talk-plugin-subscriber !plugins/talk-plugin-flag-details +!plugins/talk-plugin-slack-notifications **/node_modules/* diff --git a/plugins/talk-plugin-slack-notifications/.eslintrc.json b/plugins/talk-plugin-slack-notifications/.eslintrc.json new file mode 100644 index 000000000..78f7c2397 --- /dev/null +++ b/plugins/talk-plugin-slack-notifications/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "@coralproject/eslint-config-talk" +} diff --git a/plugins/talk-plugin-slack-notifications/index.js b/plugins/talk-plugin-slack-notifications/index.js new file mode 100644 index 000000000..1f2a73ff0 --- /dev/null +++ b/plugins/talk-plugin-slack-notifications/index.js @@ -0,0 +1,5 @@ +const hooks = require('./server/hooks'); + +module.exports = { + hooks, +}; diff --git a/plugins/talk-plugin-slack-notifications/package.json b/plugins/talk-plugin-slack-notifications/package.json new file mode 100644 index 000000000..6792e77fa --- /dev/null +++ b/plugins/talk-plugin-slack-notifications/package.json @@ -0,0 +1,9 @@ +{ + "name": "@coralproject/talk-plugin-slack-notifications", + "pluginName": "talk-plugin-slack-notifications", + "version": "0.0.1", + "description": "Posts new comments to Slack via a webhook", + "main": "index.js", + "author": "The Coral Project Team ", + "license": "Apache-2.0" +} diff --git a/plugins/talk-plugin-slack-notifications/server/config.js b/plugins/talk-plugin-slack-notifications/server/config.js new file mode 100644 index 000000000..7571565b0 --- /dev/null +++ b/plugins/talk-plugin-slack-notifications/server/config.js @@ -0,0 +1,11 @@ +const config = { + SLACK_WEBHOOK_URL: process.env.TALK_SLACK_WEBHOOK_URL, + SLACK_WEBHOOK_TIMEOUT: process.env.TALK_SLACK_WEBHOOK_TIMEOUT || 5000, +}; + +if (process.env.NODE_ENV !== 'test' && !config.SLACK_WEBHOOK_URL) { + // TODO this error should point users to Talk's Slack app once that's in place + throw new Error('Please set the TALK_SLACK_WEBHOOK_URL environment variable to use the slack-notifications plugin.'); +} + +module.exports = config; diff --git a/plugins/talk-plugin-slack-notifications/server/hooks.js b/plugins/talk-plugin-slack-notifications/server/hooks.js new file mode 100644 index 000000000..a2f3ca743 --- /dev/null +++ b/plugins/talk-plugin-slack-notifications/server/hooks.js @@ -0,0 +1,44 @@ +const fetch = require('node-fetch'); +const {SLACK_WEBHOOK_URL, SLACK_WEBHOOK_TIMEOUT} = require('./config'); +const debug = require('debug')('talk:plugin:slack-notifications'); + +// We don't add the hooks during _test_ as the Slack API is not available. +if (process.env.NODE_ENV === 'test') { + return null; +} + +module.exports = { + RootMutation: { + createComment: { + async post(_, {input}, context, _info, result) { + debug(`Posting notification to Slack webhook: ${SLACK_WEBHOOK_URL}`); + const { + comment: { + body: text, + created_at: createdAt + } + } = result; + const username = context.user.username; + const response = await fetch(SLACK_WEBHOOK_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + timeout: SLACK_WEBHOOK_TIMEOUT, + body: JSON.stringify({ + attachments: [{ + text: text, + footer: `Comment by ${username}`, + ts: Math.floor(Date.parse(createdAt) / 1000), + }] + }), + }); + if (!response.ok) { + const responseText = await response.text(); + console.trace(`Posting to Slack failed with HTTP code ${response.status} and body '${responseText}'`); + } + return result; + }, + }, + }, +}; From 85f9000a64f5d461a6150928c375b78b4d904d19 Mon Sep 17 00:00:00 2001 From: tylerbrewer2 Date: Wed, 4 Oct 2017 19:38:47 -0400 Subject: [PATCH 12/23] fix admin navigation width --- client/coral-admin/src/components/ui/Header.css | 7 +++---- client/coral-admin/src/components/ui/Layout.css | 1 - .../src/routes/Community/components/FlaggedAccounts.css | 2 ++ .../src/routes/Configure/components/Configure.css | 2 ++ .../src/routes/Dashboard/components/Dashboard.css | 2 ++ .../coral-admin/src/routes/Stories/components/Stories.css | 2 ++ 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/client/coral-admin/src/components/ui/Header.css b/client/coral-admin/src/components/ui/Header.css index f85a7cdf9..1bb08b8a2 100644 --- a/client/coral-admin/src/components/ui/Header.css +++ b/client/coral-admin/src/components/ui/Header.css @@ -16,19 +16,18 @@ } .header { - background-color: transparent; box-shadow: none; min-height: 58px; display: block; + background-color: #696969; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12); } .header > div { - background-color: #696969; position: relative; padding: 0; - min-width: 1280px; + width: 1280px; margin: 0 auto; - box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12); height: 58px; } diff --git a/client/coral-admin/src/components/ui/Layout.css b/client/coral-admin/src/components/ui/Layout.css index a3cc7b7b6..924c6ced7 100644 --- a/client/coral-admin/src/components/ui/Layout.css +++ b/client/coral-admin/src/components/ui/Layout.css @@ -1,5 +1,4 @@ .layout { - max-width: 1280px; margin: 0 auto; background-color: #FAFAFA; } diff --git a/client/coral-admin/src/routes/Community/components/FlaggedAccounts.css b/client/coral-admin/src/routes/Community/components/FlaggedAccounts.css index 4e9600cbd..a41bda485 100644 --- a/client/coral-admin/src/routes/Community/components/FlaggedAccounts.css +++ b/client/coral-admin/src/routes/Community/components/FlaggedAccounts.css @@ -2,6 +2,8 @@ padding: 10px; display: flex; padding-bottom: 200px; + max-width: 1280px; + margin: 0 auto; } .mainFlaggedContent { diff --git a/client/coral-admin/src/routes/Configure/components/Configure.css b/client/coral-admin/src/routes/Configure/components/Configure.css index 0b7319132..eae75caba 100644 --- a/client/coral-admin/src/routes/Configure/components/Configure.css +++ b/client/coral-admin/src/routes/Configure/components/Configure.css @@ -3,6 +3,8 @@ */ .container { + max-width: 1280px; + margin: 0 auto; display: flex; h3 { diff --git a/client/coral-admin/src/routes/Dashboard/components/Dashboard.css b/client/coral-admin/src/routes/Dashboard/components/Dashboard.css index 586ff6c08..aee7e702b 100644 --- a/client/coral-admin/src/routes/Dashboard/components/Dashboard.css +++ b/client/coral-admin/src/routes/Dashboard/components/Dashboard.css @@ -4,6 +4,8 @@ .Dashboard { display: flex; + max-width: 1280px; + margin: 0 auto; } .heading { diff --git a/client/coral-admin/src/routes/Stories/components/Stories.css b/client/coral-admin/src/routes/Stories/components/Stories.css index d8a75a4ce..be6b6f921 100644 --- a/client/coral-admin/src/routes/Stories/components/Stories.css +++ b/client/coral-admin/src/routes/Stories/components/Stories.css @@ -1,6 +1,8 @@ .container { padding: 10px; display: flex; + max-width: 1280px; + margin: 0 auto; } .leftColumn { From b3486ce61427a2b708f78f1f52e156e1b6a8eebe Mon Sep 17 00:00:00 2001 From: Rishabh04-02 Date: Thu, 5 Oct 2017 10:44:12 +0530 Subject: [PATCH 13/23] displaying time in X minutes Y seconds --- .../src/components/CountdownSeconds.js | 18 ++++++++++++++---- locales/en.yml | 2 ++ locales/es.yml | 2 ++ locales/fr.yml | 2 ++ locales/pt_BR.yml | 2 ++ 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/client/coral-embed-stream/src/components/CountdownSeconds.js b/client/coral-embed-stream/src/components/CountdownSeconds.js index 789b674b5..abcc1e398 100644 --- a/client/coral-embed-stream/src/components/CountdownSeconds.js +++ b/client/coral-embed-stream/src/components/CountdownSeconds.js @@ -35,16 +35,26 @@ export class CountdownSeconds extends React.Component { const {until, classNameForMsRemaining} = this.props; const msRemaining = until - now; const secRemaining = msRemaining / 1000; - const wholeSecRemaining = Math.floor(secRemaining); - const plural = secRemaining !== 1; - const units = t(plural ? 'edit_comment.seconds_plural' : 'edit_comment.second'); + const minRemaining = secRemaining / 60; + const secToMinRemaining = secRemaining % 60; + const wholeMinRemaining = Math.floor(minRemaining); + const wholeSecRemaining = Math.floor(secToMinRemaining); + const secUnit = t(wholeSecRemaining !== 1 ? 'edit_comment.seconds_plural' : 'edit_comment.second'); + const minUnit = t(wholeMinRemaining !== 1 ? 'edit_comment.minutes_plural' : 'edit_comment.minute'); let classFromProp; if (typeof classNameForMsRemaining === 'function') { classFromProp = classNameForMsRemaining(msRemaining); } + if (wholeMinRemaining > 0) { + return ( + + {`${wholeMinRemaining} ${minUnit} ${wholeSecRemaining} ${secUnit}`} + + ); + } return ( - {`${wholeSecRemaining} ${units}`} + {`${wholeSecRemaining} ${secUnit}`} ); } diff --git a/locales/en.yml b/locales/en.yml index a979739b5..836239fc4 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -172,6 +172,8 @@ en: edit_window_timer_prefix: "Edit Window: " second: "second" seconds_plural: "seconds" + minute: "minute" + minutes_plural: "minutes" email: confirm: has_been_requested: "A email confirmation has been requested for the following account:" diff --git a/locales/es.yml b/locales/es.yml index e9844667d..e21fc274c 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -171,6 +171,8 @@ es: edit_window_timer_prefix: "Ventana Edición:" second: "segundo" seconds_plural: "segundos" + minute: "minuto" + minutes_plural: "minutos" email: confirm: has_been_requested: "Un correo de confirmación ha sido pedido para la siguiente cuenta:" diff --git a/locales/fr.yml b/locales/fr.yml index f8ff403e7..f703c87f1 100644 --- a/locales/fr.yml +++ b/locales/fr.yml @@ -140,6 +140,8 @@ fr: edit_window_timer_prefix: "Fenêtre d'édition :" second: "seconde" seconds_plural: "secondes" + minute: "minute" + minutes_plural: "minutes" unexpected_error: "Erreur inattendue lors de l'enregistrement des modifications. Désolé !" embedlink: copy: "Copier dans le presse-papier" diff --git a/locales/pt_BR.yml b/locales/pt_BR.yml index 3f2c92628..c8a58f77a 100644 --- a/locales/pt_BR.yml +++ b/locales/pt_BR.yml @@ -163,6 +163,8 @@ pt_BR: edit_window_timer_prefix: "Para editar:" second: "segundo" seconds_plural: "segundos" + minute: "minuto" + minutes_plural: "minutos" email: confirm: has_been_requested: "Uma confirmação de e-mail foi solicitada para a seguinte conta:" From f330c385e552a33cfd19d22d6ec7c22d1ffbb68f Mon Sep 17 00:00:00 2001 From: Kim Gardner Date: Thu, 5 Oct 2017 12:29:27 +0100 Subject: [PATCH 14/23] Clean up README --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 919093750..057b29cf1 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # Talk [![CircleCI](https://circleci.com/gh/coralproject/talk.svg?style=svg)](https://circleci.com/gh/coralproject/talk) + [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://dashboard.heroku.com/new?template=https%3A%2F%2Fgithub.com%2Fcoralproject%2Ftalk&env[TALK_FACEBOOK_APP_ID]=ignore&env[TALK_FACEBOOK_APP_SECRET]=ignore) Online comments are broken. Our open-source Talk tool rethinks how moderation, comment display, and conversation function, creating the opportunity for safer, smarter discussions around your work. [Read more about Talk here](https://coralproject.net/products/talk.html). -## Documentation +Built with <3 by The Coral Project & Mozilla. -Developer Documentation & Setup Guides https://coralproject.github.io/talk/. +## Getting Started + +Check out our Docs: https://coralproject.github.io/talk/ ## Relevant Links From 1510ade47a484ab81144129fa0fcc6c26e6f0ccd Mon Sep 17 00:00:00 2001 From: Dusty Williams Date: Thu, 5 Oct 2017 08:33:29 -0400 Subject: [PATCH 15/23] revised error message for comments less than two characters in length - dmw --- locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/en.yml b/locales/en.yml index a979739b5..397acdde6 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -186,7 +186,7 @@ en: embedlink: copy: "Copy to Clipboard" error: - COMMENT_TOO_SHORT: "Your comment must have something in it" + COMMENT_TOO_SHORT: "Comments should be more than one character, please revise your comment and try again." NOT_AUTHORIZED: "You are not authorized to perform this action." NO_SPECIAL_CHARACTERS: "Usernames can contain letters numbers and _ only" PASSWORD_LENGTH: "Password is too short" From f1bad9e8f20a6ebdba8ec25172a976ccb54adaa5 Mon Sep 17 00:00:00 2001 From: Rishabh04-02 Date: Thu, 5 Oct 2017 23:07:51 +0530 Subject: [PATCH 16/23] modifications - displaying time modifications in displaying like X minutes Y seconds --- .../src/components/CountdownSeconds.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/client/coral-embed-stream/src/components/CountdownSeconds.js b/client/coral-embed-stream/src/components/CountdownSeconds.js index abcc1e398..46b6b1fbf 100644 --- a/client/coral-embed-stream/src/components/CountdownSeconds.js +++ b/client/coral-embed-stream/src/components/CountdownSeconds.js @@ -45,16 +45,13 @@ export class CountdownSeconds extends React.Component { if (typeof classNameForMsRemaining === 'function') { classFromProp = classNameForMsRemaining(msRemaining); } - if (wholeMinRemaining > 0) { - return ( - - {`${wholeMinRemaining} ${minUnit} ${wholeSecRemaining} ${secUnit}`} - - ); - } + const text = wholeMinRemaining > 0 + ? `${wholeMinRemaining} ${minUnit} ${wholeSecRemaining} ${secUnit}` + : `${wholeSecRemaining} ${secUnit}`; + return ( - {`${wholeSecRemaining} ${secUnit}`} + {text} ); } From f164ad80138e9ab336cf44cb2341f495df0b7d91 Mon Sep 17 00:00:00 2001 From: amorimgustavo Date: Thu, 5 Oct 2017 17:10:42 -0300 Subject: [PATCH 17/23] Update pt_BR.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hello Folks, Just edited some (several actually :) messages in your pt_BR.yml for your consideration. You may consider using: - "Banido" instead of "proibido" - "Perfil" or "Usuario" instead of "Bio" - "Opinião" instead of "Feedback" - "Denunciar" instead of "Reportar" - "Usuários(as)" instead of "Comentaristas" - "Listas" instead of "Hilos" or "Filas" - "Conversas" instead of "Histórias" Hope you like those suggestions. Cheers. Gustavo --- locales/pt_BR.yml | 197 ++++++++++++++++++++++++---------------------- 1 file changed, 103 insertions(+), 94 deletions(-) diff --git a/locales/pt_BR.yml b/locales/pt_BR.yml index 3f2c92628..baa7742a5 100644 --- a/locales/pt_BR.yml +++ b/locales/pt_BR.yml @@ -1,122 +1,131 @@ pt_BR: your_account_has_been_suspended: Sua conta foi temporariamente suspensa. your_account_has_been_banned: Sua conta foi banida. - your_username_has_been_rejected: Sua conta foi suspensa porque seu nome de usuário foi considerado inapropriado. Para restaurar sua conta, insira um novo nome de usuário. + your_username_has_been_rejected: Sua conta foi rejeitada porque seu nome de usuário foi considerado inapropriado. Para restaurar sua conta, insira um novo nome de usuário. embed_comments_tab: Comentários bandialog: - are_you_sure: "Tem certeza de que gostaria de proibir a {0}?" - ban_user: "Proibir o usuário?" - banned_user: "Usuário proibido" + are_you_sure: "Tem certeza de que gostaria de banir {0}?" + ban_user: "Deseja banir o usuário?" + banned_user: "Usuário banido" cancel: "Cancelar" note: "Nota: {0}" - note_reject_comment: "Proibir esse usuário também colocará esse comentário na fila rejeitada." - note_ban_user: "Proibir este usuário não os permitirá editar comentários ou remover qualquer coisa." - yes_ban_user: "Sim, proiber o usuário" - bio_offensive: "Essa bio é ofensiva" + note_reject_comment: "Banir esse usuário também colocará esse comentário na fila rejeitada." + note_ban_user: "Banir este usuário não os permitirá editar comentários ou remover qualquer coisa." + yes_ban_user: "Sim, banir o usuário" + bio_offensive: "Esse perfil é ofensiva" cancel: "Cancelar" characters_remaining: "caracteres restantes" comment: anon: "Anônimo" - ban_user: "Proibir o usuário" - comment: "Publicar um comentário" + ban_user: "Banir o usuário" + comment: "Escreva um comentário..." edited: Editado - flagged: "marcado" + flagged: "Marcado" view_context: "Veja o contexto" comment_box: - post: "Publicar" + post: "Enviar" cancel: "Cancelar" reply: "Responder" - comment: "Publicar um comentário" + comment: "Escreva um comentário..." name: "Nome" - comment_post_notif: "Seu comentário foi postado." - comment_post_notif_premod: "Obrigado por publicar seu comentário. Nossa equipe de moderação analisará seu comentário em breve." - comment_post_banned_word: "O seu comentário contém uma ou mais palavras que não são permitidas, portanto, não serão publicadas. Se você acha que esta mensagem está incorreta, contate nossa equipe de moderação." + comment_post_notif: "Seu comentário foi enviado." + comment_post_notif_premod: "Obrigado por compartilhar sua opinião. Nossa equipe de moderação analisará seu comentário em breve." + comment_post_banned_word: "Seu comentário não foi publicado porque contém conteúdo inadequado." characters_remaining: "caracteres restantes" comment_offensive: "Este comentário é ofensivo" comment_singular: Comentário comment_plural: Comentários - comment_post_banned_word: "O seu comentário contém uma ou mais palavras que não são permitidas, portanto, não serão publicadas. Se você acha que esta mensagem está incorret a, contate nossa equipe de moderação." + comment_post_banned_word: "Seu comentário não foi publicado porque contém conteúdo inadequado." comment_post_notif: "Seu comentário foi postado." - comment_post_notif_premod: "Obrigado por publicar seu comentário. Nossa equipe de moderação analisará seu comentário em breve." + comment_post_notif_premod: "Obrigado por compartilhar sua opinião. Nossa equipe de moderação analisará seu comentário em breve." common: - copy: 'Copie' + copy: 'Copiar' error: 'Ocorreu um erro.' + reply: 'Resposta' + replies: 'Respostas' + reaction: 'Reação' + reactions: 'Reações' + story: 'Conversas' community: account_creation_date: "Data de criação da conta" active: Ativo admin: Administrador - ads_marketing: "Isso parece anúncio/marketing" - are_you_sure: "Você tem certeza de que gostaria de proibir a {0}?" - ban_user: "Proibir o usuário?" - banned: Proibida - banned_user: "Usuário proibido" + ads_marketing: "Este comentário parece anúncio" + are_you_sure: "Você tem certeza de que gostaria de banir {0}?" + ban_user: "Banir o usuário?" + banned: Banido + banned_user: "Usuário banido" cancel: Cancelar - flaggedaccounts: "Nomes de usuários marcados" + dont_like_username: "Descurtir usuário" + flaggedaccounts: "Usuários marcados" flags: Marcadas impersonating: "Representação" loading: "Carregando resultados" moderator: Moderador - newsroom_role: "Papel de empresa" - no_flagged_accounts: "A fila de nomes de usuários marcados está atualmente vazia." + newsroom_role: "Papel da empresa" + no_flagged_accounts: "A fila de usuários marcados está atualmente vazia." no_results: "Nenhum usuário encontrado com esse nome de usuário ou e-mail. Eles estão se escondendo!" + offensive: "Ofensivo" + other: Outros people: Pessoas role: "Selecione um papel..." select_status: "Selecione um status..." - staff: "Funcionários" - status: Status + spam_ads: "Spam/Ads" + staff: "Equipe" + status: Situação username_and_email: "Nome de usuário e email" - yes_ban_user: "Sim, proibir esse usuário" + yes_ban_user: "Sim, banir este usuário" configure: apply: Aplicar - banned_word_text: "Os comentários que contenham essas palavras ou frases (não sensíveis a maiúsculas e minúsculas) serão automaticamente removidos do hilo de comentários. Digite uma palavra e pressione Enter ou Tab para adicionar. Opcionalmente cole uma lista separada por vírgulas." + banned_word_text: "Os comentários que contenham essas palavras ou frases (não sensíveis a maiúsculas e minúsculas) serão automaticamente removidos da lista de comentários. Digite uma palavra e pressione Enter ou Tab para adicionar ou cole uma lista separada por vírgulas." banned_words_title: "Lista de palavras proibidas" close: "Fechar" - close_after: "Feche os comentários após" - close_stream: "Feche hilo de comentários" - close_stream_configuration: "Esse hilo de comentários está fechado no momento. Ao abrir esse hilo de comentários, novos comentários podem ser enviados e exibidos." - closed_comments_desc: "Escreva uma mensagem a ser exibida quando o seu hilo de comentários for fechado e deixando de aceitar comentários." - closed_comments_label: "Escreve uma mensagem..." + close_after: "Fechar comentários após" + close_stream: "Fechar comentários" + close_stream_configuration: "Comentários fechados no momento. Ao abrir comentários, novos comentários podem ser enviados e exibidos." + closed_comments_desc: "Escreva uma mensagem a ser exibida quando os comentários estiverem fechados." + closed_comments_label: "Escreva uma mensagem..." closed_stream_settings: "Mensagem de comentários fechados" comment_count_error: "Por favor insira um número válido." - comment_count_header: "Limite o comprimento do comentário" + comment_count_header: "Limite o tamanho do comentário" comment_count_text_post: caracteres comment_count_text_pre: "Os comentários serão limitados a" comment_settings: Configurações - comment_stream: "Hilo de comentários" - comment_stream_will_close: "O hilo de comentários será fechado" - community: Comunidade + comment_stream: "Lista de comentários" + comment_stream_will_close: "Comentários fechados" + community: Usuários configure: Configurar copy_and_paste: "Copie e cole o código abaixo em seu CMS para incorporar sua caixa de comentários em seus artigos." - custom_css_url: "URL personalizado do CSS" - custom_css_url_desc: "URL de uma folha de estilo CSS que irá substituir os estilos padrão dos comentários embutidos. Pode ser interno ou externo." + custom_css_url: "URL para CSS customizado" + custom_css_url_desc: "URL de uma folha de estilo CSS para substituir os estilos padrão dos comentários embutidos. Pode ser interno ou externo." dashboard: Painel de controle days: Dias - description: "Como administrador, você pode personalizar as configurações do hilo de comentários para esta história:" - domain_list_text: "Insira os domínios que você gostaria de permitir para o Talk, como o seu site de preparação ou site de produção (ej. localhost:3000 staging.domain.com domain.com)." + description: "Como administrador, você pode personalizar as configurações da lista de comentários para esta história:" + domain_list_text: "Insira os domínios que você gostaria de permitir para o Talk, como seus ambientes de desenvolvimento, teste ou produção (ej. localhost:3000 staging.domain.com domain.com)." domain_list_title: "Domínios permitidos" edit_comment_timeframe_heading: "Período de tempo para editar comentários" - edit_comment_timeframe_text_pre: "Os comentadores terão" + edit_comment_timeframe_text_pre: "Os usuários terão" edit_comment_timeframe_text_post: "segundos para editar seus comentários." embed_comment_stream: "Comentários embutidos" - enable_premod_links_text: "Os moderadores devem aprovar qualquer comentário contendo um link antes de ser publicado." + enable_premod_links_text: "Demandar aprovação de moderadores antes de publicar comentários com links." enable_pre_moderation: "Habilitar pré-moderação" - enable_pre_moderation_text: "Os moderadores devem aprovar qualquer comentário antes de ser publicado." + enable_pre_moderation_text: "Demandar aprovação de moderadores para todos os comentários." enable_premod_links: "Os moderadores devem aprovar qualquer comentário antes de ser publicado." enable_premod: "Habilitar pré-moderação" - enable_premod_description: "Moderators must approve any comment before it is published." - enable_premod_links_description: "Os moderadores devem aprovar qualquer comentário antes de ser publicado." + enable_premod_description: "Demandar aprovação de moderadores para todos os comentários." + enable_premod_links_description: "Demandar aprovação de moderadores antes de publicar comentários com links." enable_questionbox: "Faça uma pergunta aos leitores" - enable_questionbox_description: "Esta pergunta aparecerá no topo deste hilo de comentários. Pergunte aos leitores sobre um determinado problema no artigo ou coloca questões de discussão, etc." + enable_questionbox_description: "Esta pergunta aparecerá no topo da lista de comentários. Pergunte aos leitores sobre um determinado problema no artigo, abra o assunto para discussão, etc." hours: Horas - include_comment_stream: "Incluir descrição de hilo de comentários para leitores" + include_comment_stream: "Incluir descrição da lista comentários para leitores" include_comment_stream_desc: "Escreva uma mensagem para adicionar ao topo do seu hilo de comentários. Posicionar um tópico, incluem diretrizes comunitárias, etc." include_text: "Inclua seu texto aqui:" include_question_here: "Escreva sua pergunta aqui:" moderate: Moderar moderation_settings: "Configurações de moderação" - open: "Abra" - open_stream: "Abra hilo de comentários" - open_stream_configuration: "Esse hilo de comentários está aberto no momento. Ao fechar este hilo de comentários, nenhum novo comentário pode ser enviado e todos os comentários anteriores ainda serão exibidos." + open: "Abrir" + open_stream: "Abrir comentários" + open_stream_configuration: "Comentários abertos no momento. Ao fechar esta lista de comentários, nenhum novo comentário poderá ser enviado. Mas os comentários anteriores ainda serão exibidos." require_email_verification: "Requerer verificação de email" require_email_verification_text: "Novos usuários devem verificar seu e-mail antes de comentar" save_changes: "Salvar alterações" @@ -125,7 +134,7 @@ pt_BR: stories: Histórias stream_settings: "Configurações de comentários" suspect_word_title: "Lista de palavras suspeitas" - suspect_word_text: "Os comentários que contenham essas palavras ou frases (não sensíveis a maiúsculas e minúsculas) serão destacados no hilo de comentários. Digite uma palavra e pressione Enter ou Tab para adicionar. Opcionalmente cole uma lista separada por vírgulas." + suspect_word_text: "Os comentários que contenham essas palavras ou frases (não sensíveis a maiúsculas e minúsculas) serão automaticamente removidos da lista de comentários. Digite uma palavra e pressione Enter ou Tab para adicionar ou cole uma lista separada por vírgulas." tech_settings: "Configurações técnicas" title: "Configurar comentários" weeks: Semanas @@ -135,7 +144,7 @@ pt_BR: check_the_form: "Formulário inválido. Verifique as entradas do formulário." continue: "Continue com o mesmo nome de usuário do Facebook" error_create: "Erro ao alterar o nome de usuário" - fake_comment_body: "Este é um exemplo de comentário. Os leitores podem compartilhar seus pensamentos e opiniões com as salas de redação na seção de comentários." + fake_comment_body: "Este é um exemplo de comentário. Os leitores podem compartilhar seus pensamentos e opiniões com a redação na seção de comentários." fake_comment_date: "1 minuto atrás" if_you_dont_change_your_name: "Se você não alterar seu nome de usuário nesta etapa, seu nome de exibição do Facebook aparecerá ao lado de todos os seus comentários." required_field: "Requerido" @@ -145,30 +154,30 @@ pt_BR: write_your_username: "Edite seu nome de usuário" your_username: "Nosso nome de usuário aparece em todos os comentários que você publica." dashboard: - auto_update: "Data automatically updates every five minutes or when you Reload." + auto_update: "Atualizado autimaticamente a cada minutos ou após recarregamento." comment_count: comentários - flags: Marcadas - most_flags: "Histórias com a maioria das marcadas" - most_conversations: "Histórias com a maioria das conversas" + flags: Marcações + most_flags: "Conversas com mais comentários marcados" + most_conversations: "Conversas com mais comentários" next_update: "{0} minutos até a próxima atualização." no_activity: "Não houve nenhum comentário nos últimos cinco minutos." - no_flags: "Não houve nenhuma marcada em nenhum lugar nos últimos 5 minutos. Hip Hip Uha!" - no_likes: "Não houve gostos nos últimos 5 minutos." + no_flags: "Não houve nenhum comentário marcado em nenhum lugar nos últimos 5 minutos. Hip Hip Uha!" + no_likes: "Não houve reações nos últimos 5 minutos." done: Feito edit_comment: body_input_label: "Edite este comentário" save_button: "Salvar alterações" edit_window_expired: "Você não pode mais editar esse comentário. A janela de tempo para fazê-lo expirou. Por que não publicar outro?" edit_window_expired_close: "Fechar" - edit_window_timer_prefix: "Para editar:" + edit_window_timer_prefix: "Tempo para editar:" second: "segundo" seconds_plural: "segundos" email: confirm: has_been_requested: "Uma confirmação de e-mail foi solicitada para a seguinte conta:" - to_confirm: "Para confirmar a conta, visite o seguinte link: " + to_confirm: "Para confirmar a conta, visite este link: " confirm_email: "Confirme e-mail" - if_you_did_not: "Se você não solicitou isso, você pode ignorar este e-mail com segurança." + if_you_did_not: "Se você não solicitou isso, você pode ignorar este e-mail." subject: "Confirmação de e-mail" password_reset: we_received_a_request: "Recebemos um pedido para redefinir sua senha. Se você não solicitou esta alteração, pode ignorar este e-mail." @@ -177,7 +186,7 @@ pt_BR: embedlink: copy: "Copiar para área de transferência" error: - COMMENT_TOO_SHORT: "Seu comentário deve conter palavras." + COMMENT_TOO_SHORT: "Seu comentário precisar ter mais de um caracter. Revise seu comentário e envie novamente" NOT_AUTHORIZED: "Você não está autorizado a executar esta ação." NO_SPECIAL_CHARACTERS: "Nomes de usuários podem conter números de letras e _ somente" PASSWORD_LENGTH: "A senha é muito curta" @@ -189,7 +198,7 @@ pt_BR: SAME_USERNAME_PROVIDED: "Você deve enviar um nome de usuário diferente." EMAIL_IN_USE: "Endereço de e-mail já está em uso." EMAIL_REQUIRED: "É necessário o endereço de e-mail." - LOGIN_MAXIMUM_EXCEEDED: "Você fez muitas tentativas de senha mal sucedidas. Por favor, espere." + LOGIN_MAXIMUM_EXCEEDED: "Você fez muitas tentativas de senha mal sucedidas. Espere alguns instantes." PASSWORD_REQUIRED: "Você deve inserir uma senha." COMMENTING_CLOSED: "Os comentários já estão fechados." NOT_FOUND: "Recurso não encontrado" @@ -208,8 +217,8 @@ pt_BR: flag_reason: "Motivo do relatório (opcional)" flag_username: "Informe o nome de usuário" framework: - banned_account_header: "Sua conta está atualmente proibida." - banned_account_body: "Isso significa que você não pode gostar, informar ou escrever comentários." + banned_account_header: "Sua conta está atualmente banida." + banned_account_body: "Isso significa que você não pode curtir, informar ou escrever comentários." comment: comentário comment_is_ignored: "Este comentário está oculto porque você ignorou esse usuário." comments: comentários @@ -241,7 +250,7 @@ pt_BR: account: "contas marcadas" actions: Ações all: todos - all_streams: "Todos os hilos" + all_streams: "Todas as listas" notify_edited: '{0} editou o comentário "{1}"' notify_accepted: '{0} aprovou o comentário "{1}"' notify_rejected: '{0} rejeitou o comentário "{1}"' @@ -252,17 +261,17 @@ pt_BR: billion: B close: Fechar dont_like_username: "Eu não gosto desse nome de usuário" - empty_queue: "Não há mais comentários para moderar! Você está todo apanhado. Vá tomar um ☕️" + empty_queue: "Não há mais comentários para moderar! Aproveite para relaxar e esticar as pernas" flagged: marcado impersonating: Representação less_detail: "Menos detalhes" - likes: gostos + likes: Curtidas million: M - mod_faster: "Moderado mais rápido com atalhos de teclado" + mod_faster: "Modere mais rápido com atalhos de teclado" moderate: "Moderar →" more_detail: "Mais detalhes" new: "Novo" - newest_first: "Mais novo primeiro" + newest_first: "Mais novos primeiro" navigation: Navegação next_comment: "Vá para o próximo comentário" offensive: Ofensiva @@ -272,7 +281,7 @@ pt_BR: prev_comment: "Vá para o comentário anterior" reject: "Rejeitar" rejected: "Rejeitado" - select_stream: "Selecione hilo" + select_stream: "Selecione a lista" shift_key: "⇧" shortcuts: "Atalhos" show_shortcuts: "Ver atalhos" @@ -280,13 +289,13 @@ pt_BR: spam_ads: Spam/Anuncios thismenu: "Abra este menu" thousand: k - try_these: "Tente esse" + try_these: "Tente este" view_more_shortcuts: "Ver mais atalhos" my_comment_history: "Histórico de comentários" name: Nome no_agree_comment: "Eu não concordo com este comentário" - no_like_bio: "Eu não gosto dessa biografia" - no_like_username: "Eu não gosto desse nome de usuário" + no_like_bio: "Eu não gosto dessa descrição de perfil" + no_like_username: "Eu não gosto deste nome de usuário" other: Outro permalink: Link personal_info: "Este comentário revela informações de identificação pessoal" @@ -294,10 +303,10 @@ pt_BR: profile: Perfil profile_settings: "Configurações de perfil" reply: Responder - report: Reportar - report_notif: "Obrigado por reportar este comentário. Nossa equipe de moderação foi notificada e irá revisá-la em breve." - report_notif_remove: "Seu marcado foi removido." - reported: Reportado + report: Denunciar + report_notif: "Obrigado por denunciar este comentário. Nossa equipe de moderação foi notificada e irá revisá-la em breve." + report_notif_remove: "O comentário que você denunciou foi removido." + reported: Denunciado settings: from_settings_page: "Na página de Perfil, você pode ver seu histórico de comentários." my_comment_history: "Histórico de comentários" @@ -316,30 +325,30 @@ pt_BR: all: Todos article: História closed: Fechado - empty_result: "Nenhum recurso corresponde a esta pesquisa. Talvez tente alargar a sua pesquisa?" - filter_streams: "Filtra os hilos" + empty_result: "Nenhum resultado encontrado para esta pesquisa. Que tal refazer a pesquisa com termos diferentes?" + filter_streams: "Filtra as listas" newest: O mais novo oldest: O mais velho open: Aberto pubdate: "Data de publicação" search: Pesquisar sort_by: "Ordenar por" - status: "Status do hilo" - stream_status: "Status do hilo" + status: "Situação dos comentários" + stream_status: "Situação dos comentários" suspenduser: title_suspend: "Suspender usuário" - description_suspend: "Você está suspendendo {0}. Este comentário irá para a fila Rejeitada, e {0} não poderá gostar, reportar, responder ou publicar até que o tempo de suspensão seja concluído." + description_suspend: "Você está suspendendo {0}. Este comentário irá para a fila Rejeitada, e {0} não poderá gostar, denunciar, responder ou publicar até que o tempo de suspensão seja concluído." select_duration: "Selecione a duração da suspensão" one_hour: "1 hora" hours: "{0} horas" days: "{0} dias" cancel: "Cancelar" suspend_user: "Suspender usuário" - email_message_suspend: "Querido/a {0},\n\nDe acordo com as diretrizes da comunidade de {1}, sua conta foi temporariamente suspensa. Durante a suspensão, você não poderá comentar, reportar ou se envolver com outros comentaristas. Por favor, volte para a conversa {2}." + email_message_suspend: "Querido/a {0},\n\nDe acordo com as diretrizes da comunidade de {1}, sua conta foi temporariamente suspensa. Durante a suspensão, você não poderá comentar, denunciar ou se responder outros usuários(as). Por favor, volte para a conversa {2}." title_notify: "Notificar o usuário da suspensão temporária" notify_suspend_until: "O usuário {0} foi temporariamente suspenso. Esta suspensão terminará automaticamente {1}." description_notify: "Suspender este usuário temporariamente desativará sua conta e esconderá todos os seus comentários no site" - write_message: "Escrive uma mensagem" + write_message: "Escrever uma mensagem" send: Enviar reject_username: username: nome de usuário @@ -350,14 +359,14 @@ pt_BR: title_reject: "Percebemos que você rejeitou um nome de usuário" suspend_user: "Suspender usuário" yes_suspend: "Sim suspender" - email_message_reject: "Outro membro da comunidade recentemente sinalizou seu nome de usuário para revisão. Por causa do seu conteúdo, seu nome de usuário foi rejeitado. Isso significa que você não pode mais comentar, gostar, ou reportar conteúdo até que você reescreva seu nome de usuário. Por favor envie-nos um e-mail se tiver dúvidas ou preocupações." + email_message_reject: "Outro membro da comunidade recentemente sinalizou seu nome de usuário para revisão. Por causa do seu conteúdo, seu nome de usuário foi rejeitado. Isso significa que você não pode mais comentar, gostar, ou denunciar conteúdo até que você reescreva seu nome de usuário. Por favor envie-nos um e-mail se tiver dúvidas ou preocupações." write_message: "Escreve uma mensagem" send: Enviar - thank_you: "Nós valorizamos sua segurança e feedback. Um moderador irá rever o seu relatório." + thank_you: "Nós valorizamos sua segurança e opinião. Um moderador irá rever o seu relatório." user: - bio_flags: "Marcadas para esta biografia" - user_bio: "Biografia do usuário" - username_flags: "Marcadas para este nome de usuário" + bio_flags: "Marcadas para este perfil" + user_bio: "Perfil do usuário" + username_flags: "Marcadas para este usuário" user_impersonating: "Este usuário está representando" user_no_comment: "Você nunca deixou um comentário. Participe da conversa!" username_offensive: "Esse nome de usuário é ofensivo" From bf0901e77fa7c8fe3d313b3c52d191f2dda35f92 Mon Sep 17 00:00:00 2001 From: Vicky Chijwani Date: Fri, 6 Oct 2017 02:15:28 +0530 Subject: [PATCH 18/23] Wrap Slack call in process.nextTick() to avoid blocking comment creation. --- .../server/hooks.js | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/plugins/talk-plugin-slack-notifications/server/hooks.js b/plugins/talk-plugin-slack-notifications/server/hooks.js index a2f3ca743..bda9dc4f5 100644 --- a/plugins/talk-plugin-slack-notifications/server/hooks.js +++ b/plugins/talk-plugin-slack-notifications/server/hooks.js @@ -19,24 +19,26 @@ module.exports = { } } = result; const username = context.user.username; - const response = await fetch(SLACK_WEBHOOK_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - timeout: SLACK_WEBHOOK_TIMEOUT, - body: JSON.stringify({ - attachments: [{ - text: text, - footer: `Comment by ${username}`, - ts: Math.floor(Date.parse(createdAt) / 1000), - }] - }), + process.nextTick(async () => { + const response = await fetch(SLACK_WEBHOOK_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + timeout: SLACK_WEBHOOK_TIMEOUT, + body: JSON.stringify({ + attachments: [{ + text: text, + footer: `Comment by ${username}`, + ts: Math.floor(Date.parse(createdAt) / 1000), + }] + }), + }); + if (!response.ok) { + const responseText = await response.text(); + console.trace(`Posting to Slack failed with HTTP code ${response.status} and body '${responseText}'`); + } }); - if (!response.ok) { - const responseText = await response.text(); - console.trace(`Posting to Slack failed with HTTP code ${response.status} and body '${responseText}'`); - } return result; }, }, From 6c95502b4eca32af1c30b123b76fa533e49008f1 Mon Sep 17 00:00:00 2001 From: Lance Ruegger Date: Thu, 5 Oct 2017 17:36:38 -0700 Subject: [PATCH 19/23] Change DOM input to coral-ui TextField to inherit styling, add prop-types validation, convert from using ref to using state. --- .../client/components/ForgotContent.js | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/plugins/talk-plugin-auth/client/components/ForgotContent.js b/plugins/talk-plugin-auth/client/components/ForgotContent.js index 916c3f5b3..49692abbb 100644 --- a/plugins/talk-plugin-auth/client/components/ForgotContent.js +++ b/plugins/talk-plugin-auth/client/components/ForgotContent.js @@ -1,14 +1,27 @@ import React from 'react'; +import PropTypes from 'prop-types'; import styles from './styles.css'; -import {Button} from 'plugin-api/beta/client/components/ui'; +import {Button, TextField} from 'plugin-api/beta/client/components/ui'; import t from 'coral-framework/services/i18n'; class ForgotContent extends React.Component { + constructor() { + super(); + this.state = { + value: '', + }; + } + handleSubmit = (e) => { e.preventDefault(); - this.props.fetchForgotPassword(this.emailInput.value); + this.props.fetchForgotPassword(this.state.value); }; + handleChangEmail = (e) => { + const {value} = e.target; + this.setState({value}); + } + render() { const {changeView, auth} = this.props; const {passwordRequestSuccess, passwordRequestFailure} = auth; @@ -20,13 +33,13 @@ class ForgotContent extends React.Component {
- - (this.emailInput = input)} - type="text" +