From cedf7a117a8efb0f97193c535c44c545f3fa4989 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sat, 7 Jul 2018 12:45:31 -0500 Subject: [PATCH 01/35] Initial boilerplate migration to Typescript --- .babelrc | 14 - .eslintignore | 3 - .eslintrc | 6 - images.d.ts | 3 + package.json | 29 +- src/App.test.tsx | 9 + src/{App.js => App.tsx} | 11 +- src/index.js | 8 - src/index.tsx | 11 + ...viceWorker.js => registerServiceWorker.ts} | 46 +- tsconfig.json | 30 + tsconfig.prod.json | 3 + tsconfig.test.json | 6 + tslint.json | 19 + yarn.lock | 3106 ++++++++--------- 15 files changed, 1682 insertions(+), 1622 deletions(-) delete mode 100644 .babelrc delete mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 images.d.ts create mode 100644 src/App.test.tsx rename src/{App.js => App.tsx} (68%) delete mode 100644 src/index.js create mode 100644 src/index.tsx rename src/{registerServiceWorker.js => registerServiceWorker.ts} (72%) create mode 100644 tsconfig.json create mode 100644 tsconfig.prod.json create mode 100644 tsconfig.test.json create mode 100644 tslint.json diff --git a/.babelrc b/.babelrc deleted file mode 100644 index c19affe1..00000000 --- a/.babelrc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "env": { - "testing": { - "presets":[ - ["env", { "modules": false }], - "react" - ], - "plugins": [ - "transform-es2015-modules-commonjs", - "transform-object-rest-spread" - ] - } - } -} diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 958cf535..00000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -/coverage/ -/dist/ -/node_modules/ diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 4af3bee8..00000000 --- a/.eslintrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "react-app", - "env": { - "jest": true - } -} diff --git a/images.d.ts b/images.d.ts new file mode 100644 index 00000000..397cc9b3 --- /dev/null +++ b/images.d.ts @@ -0,0 +1,3 @@ +declare module '*.svg' +declare module '*.png' +declare module '*.jpg' diff --git a/package.json b/package.json index 79558901..3f8b3d52 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,14 @@ "version": "0.1.0", "private": true, "dependencies": { - "react": "^16.2.0", - "react-dom": "^16.2.0", - "react-scripts": "1.1.1" + "react": "^16.4.1", + "react-dom": "^16.4.1", + "react-scripts-ts": "2.16.0" }, "jest": { "collectCoverageFrom": [ - "**/src/**/*.{js,jsx}", - "!**/src/registerServiceWorker.{js,jsx}" + "**/src/**/*.{ts,tsx}", + "!**/src/registerServiceWorker.{ts,tsx}" ], "coverageThreshold": { "global": { @@ -22,15 +22,20 @@ } }, "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "eject": "react-scripts eject", - "lint": "eslint ./", - "test": "yarn lint && yarn jest", - "jest": "react-scripts test --env=jsdom --coverage" + "start": "react-scripts-ts start", + "build": "react-scripts-ts build", + "test": "yarn lint && react-scripts-ts test --env=jsdom", + "eject": "react-scripts-ts eject", + "lint": "tslint -p tsconfig.json -c tslint.json", + "jest": "react-scripts-ts test --env=jsdom --coverage" }, "devDependencies": { "enzyme": "^3.3.0", - "enzyme-adapter-react-16": "^1.1.1" + "enzyme-adapter-react-16": "^1.1.1", + "@types/jest": "^23.1.4", + "@types/node": "^10.5.2", + "@types/react": "^16.4.6", + "@types/react-dom": "^16.0.6", + "typescript": "^2.9.2" } } diff --git a/src/App.test.tsx b/src/App.test.tsx new file mode 100644 index 00000000..e0f09ab5 --- /dev/null +++ b/src/App.test.tsx @@ -0,0 +1,9 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); +}); diff --git a/src/App.js b/src/App.tsx similarity index 68% rename from src/App.js rename to src/App.tsx index 203067e4..c1bc27cc 100644 --- a/src/App.js +++ b/src/App.tsx @@ -1,9 +1,10 @@ -import React, { Component } from 'react'; -import logo from './logo.svg'; +import * as React from 'react'; import './App.css'; -class App extends Component { - render() { +import logo from './logo.svg'; + +class App extends React.Component { + public render() { return (
@@ -11,7 +12,7 @@ class App extends Component {

Welcome to React

- To get started, edit src/App.js and save to reload. + To get started, edit src/App.tsx and save to reload.

); diff --git a/src/index.js b/src/index.js deleted file mode 100644 index fae3e350..00000000 --- a/src/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.css'; -import App from './App'; -import registerServiceWorker from './registerServiceWorker'; - -ReactDOM.render(, document.getElementById('root')); -registerServiceWorker(); diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 00000000..a7b13062 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import App from './App'; +import './index.css'; +import registerServiceWorker from './registerServiceWorker'; + +ReactDOM.render( + , + document.getElementById('root') as HTMLElement +); +registerServiceWorker(); diff --git a/src/registerServiceWorker.js b/src/registerServiceWorker.ts similarity index 72% rename from src/registerServiceWorker.js rename to src/registerServiceWorker.ts index a3e6c0cf..28c89f7b 100644 --- a/src/registerServiceWorker.js +++ b/src/registerServiceWorker.ts @@ -1,8 +1,9 @@ +// tslint:disable:no-console // In production, we register a service worker to serve assets from local cache. // This lets the app load faster on subsequent visits in production, and gives // it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on the "N+1" visit to a page, since previously +// will only see deployed updates on the 'N+1' visit to a page, since previously // cached resources are updated in the background. // To learn more about the benefits of this model, read https://goo.gl/KwvDNy. @@ -21,7 +22,10 @@ const isLocalhost = Boolean( export default function register() { if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL(process.env.PUBLIC_URL, window.location); + const publicUrl = new URL( + process.env.PUBLIC_URL!, + window.location.toString() + ); if (publicUrl.origin !== window.location.origin) { // Our service worker won't work if PUBLIC_URL is on a different origin // from what our page is served on. This might happen if a CDN is used to @@ -52,28 +56,30 @@ export default function register() { } } -function registerValidSW(swUrl) { +function registerValidSW(swUrl: string) { navigator.serviceWorker .register(swUrl) .then(registration => { registration.onupdatefound = () => { const installingWorker = registration.installing; - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the old content will have been purged and - // the fresh content will have been added to the cache. - // It's the perfect time to display a "New content is - // available; please refresh." message in your web app. - console.log('New content is available; please refresh.'); - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); + if (installingWorker) { + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the old content will have been purged and + // the fresh content will have been added to the cache. + // It's the perfect time to display a 'New content is + // available; please refresh.' message in your web app. + console.log('New content is available; please refresh.'); + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // 'Content is cached for offline use.' message. + console.log('Content is cached for offline use.'); + } } - } - }; + }; + } }; }) .catch(error => { @@ -81,14 +87,14 @@ function registerValidSW(swUrl) { }); } -function checkValidServiceWorker(swUrl) { +function checkValidServiceWorker(swUrl: string) { // Check if the service worker can be found. If it can't reload the page. fetch(swUrl) .then(response => { // Ensure service worker exists, and that we really are getting a JS file. if ( response.status === 404 || - response.headers.get('content-type').indexOf('javascript') === -1 + response.headers.get('content-type')!.indexOf('javascript') === -1 ) { // No service worker found. Probably a different app. Reload the page. navigator.serviceWorker.ready.then(registration => { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..1e47f905 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "outDir": "build/dist", + "module": "esnext", + "target": "es5", + "lib": ["es6", "dom"], + "sourceMap": true, + "allowJs": true, + "jsx": "react", + "moduleResolution": "node", + "rootDir": "src", + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": true, + "strictNullChecks": true, + "suppressImplicitAnyIndexErrors": true, + "noUnusedLocals": true + }, + "exclude": [ + "node_modules", + "build", + "scripts", + "acceptance-tests", + "webpack", + "jest", + "src/setupTests.ts" + ] +} diff --git a/tsconfig.prod.json b/tsconfig.prod.json new file mode 100644 index 00000000..4144216d --- /dev/null +++ b/tsconfig.prod.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} \ No newline at end of file diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 00000000..65ffdd49 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs" + } +} \ No newline at end of file diff --git a/tslint.json b/tslint.json new file mode 100644 index 00000000..b8a157b5 --- /dev/null +++ b/tslint.json @@ -0,0 +1,19 @@ +{ + "extends": ["tslint:recommended", "tslint-react", "tslint-config-prettier"], + "linterOptions": { + "exclude": [ + "config/**/*.js", + "coverage/**/*.js", + "dist/**/*.js", + "node_modules/**/*.ts" + ] + }, + "rules": { + "variable-name": [ true, "ban-keywords", "check-format", "allow-leading-underscore", "allow-snake-case" ], + "object-literal-sort-keys": false, + "jsx-boolean-value": false, + "ordered-imports": false, + "curly": [true, "ignore-same-line"] + }, + "defaultSeverity": "warning" +} diff --git a/yarn.lock b/yarn.lock index 927c6773..d3620ac8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,42 @@ # yarn lockfile v1 -"@types/node@*": - version "9.4.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.6.tgz#d8176d864ee48753d053783e4e463aec86b8d82e" +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.52" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.52.tgz#192483bfa0d1e467c101571c21029ccb74af2801" + dependencies: + "@babel/highlight" "7.0.0-beta.52" + +"@babel/highlight@7.0.0-beta.52": + version "7.0.0-beta.52" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.52.tgz#ef24931432f06155e7bc39cdb8a6b37b4a28b3d0" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@types/jest@^23.1.4": + version "23.1.4" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.4.tgz#71e1e2d08b1db742f479ee2795536ebc999a2419" + +"@types/node@*", "@types/node@^10.5.2": + version "10.5.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" -abab@^1.0.3: +"@types/react-dom@^16.0.6": + version "16.0.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.6.tgz#f1a65a4e7be8ed5d123f8b3b9eacc913e35a1a3c" + dependencies: + "@types/node" "*" + "@types/react" "*" + +"@types/react@*", "@types/react@^16.4.6": + version "16.4.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada" + dependencies: + csstype "^2.2.0" + +abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -14,7 +45,7 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -accepts@~1.3.4: +accepts@~1.3.4, accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: @@ -27,29 +58,19 @@ acorn-dynamic-import@^2.0.0: dependencies: acorn "^4.0.3" -acorn-globals@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - dependencies: - acorn "^4.0.4" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + acorn "^5.0.0" -acorn@^4.0.3, acorn@^4.0.4: +acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.0, acorn@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.1.tgz#84e05a9ea0acbe131227da50301e62464dc9c1d8" +acorn@^5.0.0, acorn@^5.3.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" address@1.0.3, address@^1.0.1: version "1.0.3" @@ -59,18 +80,11 @@ ajv-keywords@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" -ajv-keywords@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" -ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.0: +ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -79,13 +93,14 @@ ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.0.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.1.tgz#28a6abc493a2abe0fb4c8507acaedb43fa550671" +ajv@^6.1.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" dependencies: - fast-deep-equal "^1.0.0" + fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.1" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" @@ -109,19 +124,15 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-escapes@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" -ansi-regex@^2.0.0, ansi-regex@^2.1.1: +ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -133,7 +144,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.0.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: @@ -153,19 +164,19 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" dependencies: - default-require-extensions "^1.0.0" + default-require-extensions "^2.0.0" -aproba@^1.0.3: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -176,13 +187,6 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -278,10 +282,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -292,31 +292,35 @@ assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" +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" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.2, async@^2.1.4, async@^2.4.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" +async@^2.1.2, async@^2.1.4, async@^2.4.1, async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" dependencies: - lodash "^4.14.0" + lodash "^4.17.10" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -atob@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" autoprefixer@7.1.6: version "7.1.6" @@ -340,23 +344,13 @@ autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.2.1, aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -axobject-query@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" - dependencies: - ast-types-flow "0.0.7" +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -366,9 +360,9 @@ babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, bab 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" +babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" @@ -380,24 +374,15 @@ babel-core@6.26.0, babel-core@^6.0.0, babel-core@^6.26.0: babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" + convert-source-map "^1.5.1" + debug "^2.6.9" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" - private "^0.1.7" + private "^0.1.8" slash "^1.0.0" - source-map "^0.5.6" - -babel-eslint@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" - dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" + source-map "^0.5.7" babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" @@ -521,17 +506,16 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@20.0.3, babel-jest@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671" +babel-jest@^22.1.0, babel-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d" dependencies: - babel-core "^6.0.0" - babel-plugin-istanbul "^4.0.0" - babel-preset-jest "^20.0.3" + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^22.4.4" -babel-loader@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" +babel-loader@^7.1.2: + version "7.1.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" @@ -557,17 +541,18 @@ babel-plugin-dynamic-import-node@1.1.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" +babel-plugin-istanbul@^4.1.4, babel-plugin-istanbul@^4.1.5: + version "4.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" find-up "^2.1.0" - istanbul-lib-instrument "^1.7.5" - test-exclude "^4.1.1" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" -babel-plugin-jest-hoist@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767" +babel-plugin-jest-hoist@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -593,7 +578,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" @@ -703,8 +688,8 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-template "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - 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" + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" dependencies: babel-plugin-transform-strict-mode "^6.24.1" babel-runtime "^6.26.0" @@ -902,15 +887,16 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" -babel-preset-jest@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a" +babel-preset-jest@^22.0.1, babel-preset-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" dependencies: - babel-plugin-jest-hoist "^20.0.3" + babel-plugin-jest-hoist "^22.4.4" + babel-plugin-syntax-object-rest-spread "^6.13.0" babel-preset-react-app@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.1.tgz#d3f06a79742f0e89d7afcb72e282d9809c850920" + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.2.tgz#49ba3681b917c4e5c73a5249d3ef4c48fae064e2" dependencies: babel-plugin-dynamic-import-node "1.1.0" babel-plugin-syntax-dynamic-import "6.18.0" @@ -949,7 +935,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: @@ -966,7 +952,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -980,7 +966,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-tr invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -989,7 +975,7 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24 lodash "^4.17.4" to-fast-properties "^1.0.3" -babylon@^6.17.0, babylon@^6.18.0: +babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1002,8 +988,8 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" base64-js@^1.0.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801" + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" base@^0.11.1: version "0.11.2" @@ -1022,8 +1008,8 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" dependencies: tweetnacl "^0.14.3" @@ -1035,13 +1021,7 @@ binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird@^3.4.7: +bluebird@^3.4.7, bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -1079,24 +1059,6 @@ boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" @@ -1125,16 +1087,14 @@ braces@^1.8.2: repeat-element "^1.1.2" braces@^2.3.0, braces@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" - define-property "^1.0.0" extend-shallow "^2.0.1" fill-range "^4.0.0" isobject "^3.0.1" - kind-of "^6.0.2" repeat-element "^1.1.2" snapdragon "^0.8.1" snapdragon-node "^2.0.1" @@ -1145,15 +1105,19 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + browser-resolve@^1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" dependencies: resolve "1.1.7" browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1163,16 +1127,16 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: safe-buffer "^5.0.1" browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" dependencies: cipher-base "^1.0.1" des.js "^1.0.0" @@ -1217,18 +1181,16 @@ browserslist@^2.1.2, browserslist@^2.5.1: caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" -bser@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" - dependencies: - node-int64 "^0.4.0" - 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" +buffer-from@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" @@ -1257,6 +1219,24 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1271,16 +1251,6 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -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" @@ -1325,12 +1295,18 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000813" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000813.tgz#e0a1c603f8880ad787b2a35652b2733f32a5e29a" + version "1.0.30000864" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000864.tgz#35a4b2325a8d4553a46b516dbc233bf391d75555" caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000792: - version "1.0.30000813" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz#7b25e27fdfb8d133f3c932b01f77452140fcc6c9" + version "1.0.30000864" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000864.tgz#7a08c78da670f23c06f11aa918831b8f2dd60ddc" + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + dependencies: + rsvp "^3.3.3" capture-stack-trace@^1.0.0: version "1.0.0" @@ -1361,9 +1337,9 @@ chalk@1.1.3, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1373,18 +1349,7 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" -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 "^4.15.0" - parse5 "^3.0.1" - -chokidar@^1.6.0: +chokidar@^1.6.0, chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -1400,8 +1365,8 @@ chokidar@^1.6.0: fsevents "^1.0.0" chokidar@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7" + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -1410,16 +1375,21 @@ chokidar@^2.0.2: inherits "^2.0.1" is-binary-path "^1.0.0" is-glob "^4.0.0" + lodash.debounce "^4.0.8" normalize-path "^2.1.1" path-is-absolute "^1.0.0" readdirp "^2.0.0" - upath "^1.0.0" + upath "^1.0.5" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" ci-info@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" + version "1.1.3" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1428,10 +1398,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -1483,9 +1449,17 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" co@^4.6.0: version "4.6.0" @@ -1509,12 +1483,16 @@ collection-visit@^1.0.0: object-visit "^1.0.0" color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" dependencies: - color-name "^1.1.1" + color-name "1.1.1" -color-name@^1.0.0, color-name@^1.1.1: +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + +color-name@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" @@ -1540,45 +1518,45 @@ 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.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: +combined-stream@1.0.6, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" -commander@2.14.x, commander@^2.11.0, commander@~2.14.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" +commander@2.16.x, commander@^2.12.1, commander@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" compare-versions@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5" + version "3.3.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" compressible@~2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" + version "2.0.14" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" dependencies: - mime-db ">= 1.33.0 < 2" + mime-db ">= 1.34.0 < 2" compression@^1.5.2: version "1.7.2" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" + resolved "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" dependencies: accepts "~1.3.4" bytes "3.0.0" @@ -1592,17 +1570,18 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26" +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" configstore@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1629,23 +1608,15 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" -convert-source-map@^1.4.0, convert-source-map@^1.5.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -1657,6 +1628,17 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1666,8 +1648,8 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" core-js@^2.4.0, core-js@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1685,9 +1667,25 @@ cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: parse-json "^2.2.0" require-from-string "^1.1.0" +cpx@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" + dependencies: + babel-runtime "^6.9.2" + chokidar "^1.6.0" + duplexer "^0.1.1" + glob "^7.0.5" + glob2base "^0.0.12" + minimatch "^3.0.2" + mkdirp "^0.5.1" + resolve "^1.1.7" + safe-buffer "^5.0.1" + shell-quote "^1.6.1" + subarg "^1.0.0" + create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" dependencies: bn.js "^4.1.0" elliptic "^6.0.0" @@ -1699,17 +1697,18 @@ create-error-class@^3.0.0: capture-stack-trace "^1.0.0" create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" dependencies: cipher-base "^1.0.1" inherits "^2.0.1" - ripemd160 "^2.0.0" + md5.js "^1.3.4" + ripemd160 "^2.0.1" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -1718,7 +1717,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@5.1.0, cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: @@ -1726,18 +1725,6 @@ cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1781,7 +1768,7 @@ css-loader@0.28.7: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" -css-select@^1.1.0, css-select@~1.2.0: +css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" dependencies: @@ -1851,48 +1838,60 @@ csso@~2.3.1: source-map "^0.5.3" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + version "0.3.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" -"cssstyle@>= 0.2.37 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" +"cssstyle@>= 0.3.1 < 0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" dependencies: cssom "0.3.x" +csstype@^2.2.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.5.tgz#4125484a3d42189a863943f23b9e4b80fedfa106" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" dependencies: array-find-index "^1.0.1" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + d@1: version "1.0.0" resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" dependencies: es5-ext "^0.10.9" -damerau-levenshtein@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -debug@^3.0.1, debug@^3.1.0: +debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -1910,19 +1909,23 @@ deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" +deepmerge@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768" + +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" dependencies: - strip-bom "^2.0.0" + strip-bom "^3.0.0" define-properties@^1.1.2: version "1.1.2" @@ -1954,7 +1957,7 @@ defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" -del@^2.0.2, del@^2.2.2: +del@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" dependencies: @@ -1989,7 +1992,7 @@ depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" -depd@~1.1.1: +depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2014,13 +2017,17 @@ detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" -detect-port-alt@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.5.tgz#a1aa8fc805a4a5df9b905b7ddc7eed036bcce889" +detect-port-alt@1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" dependencies: address "^1.0.1" debug "^2.6.0" @@ -2030,17 +2037,13 @@ diff@^3.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" dependencies: bn.js "^4.1.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-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2058,26 +2061,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - dom-converter@~0.1: version "0.1.4" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" dependencies: utila "~0.3" -dom-serializer@0, dom-serializer@~0.1.0: +dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" dependencies: @@ -2094,7 +2084,7 @@ domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" -domelementtype@1, domelementtype@^1.3.0: +domelementtype@1: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" @@ -2102,18 +2092,18 @@ domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" +domexception@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + domhandler@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" dependencies: domelementtype "1" -domhandler@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" - dependencies: - domelementtype "1" - domutils@1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" @@ -2127,13 +2117,6 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - dependencies: - dom-serializer "0" - domelementtype "1" - dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -2156,6 +2139,15 @@ duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -2167,8 +2159,8 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: - version "1.3.36" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz#0eabf71a9ebea9013fb1cc35a390e068624f27e8" + version "1.3.51" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.51.tgz#6a42b49daaf7f22a5b37b991daf949f34dbdb9b5" elliptic@^6.0.0: version "6.4.0" @@ -2182,15 +2174,11 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -emoji-regex@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" - emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" -encodeurl@~1.0.1: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2200,7 +2188,13 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -enhanced-resolve@^3.4.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +enhanced-resolve@^3.0.0, enhanced-resolve@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" dependencies: @@ -2209,51 +2203,10 @@ enhanced-resolve@^3.4.0: object-assign "^4.0.1" tapable "^0.2.7" -entities@^1.1.1, entities@~1.1.1: +entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" -enzyme-adapter-react-16@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz#a8f4278b47e082fbca14f5bfb1ee50ee650717b4" - dependencies: - enzyme-adapter-utils "^1.3.0" - lodash "^4.17.4" - object.assign "^4.0.4" - object.values "^1.0.4" - prop-types "^15.6.0" - react-reconciler "^0.7.0" - react-test-renderer "^16.0.0-0" - -enzyme-adapter-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.3.0.tgz#d6c85756826c257a8544d362cc7a67e97ea698c7" - dependencies: - lodash "^4.17.4" - object.assign "^4.0.4" - prop-types "^15.6.0" - -enzyme@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.3.0.tgz#0971abd167f2d4bf3f5bd508229e1c4b6dc50479" - dependencies: - cheerio "^1.0.0-rc.2" - function.prototype.name "^1.0.3" - has "^1.0.1" - is-boolean-object "^1.0.0" - is-callable "^1.1.3" - is-number-object "^1.0.3" - is-string "^1.0.4" - is-subset "^0.1.1" - lodash "^4.17.4" - object-inspect "^1.5.0" - object-is "^1.0.1" - object.assign "^4.1.0" - object.entries "^1.0.4" - object.values "^1.0.4" - raf "^3.4.0" - rst-selector-parser "^2.2.3" - errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -2261,14 +2214,14 @@ errno@^0.1.3, errno@~0.1.7: prr "~1.0.1" error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" dependencies: is-arrayish "^0.2.1" -es-abstract@^1.6.1, es-abstract@^1.7.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" +es-abstract@^1.5.1, es-abstract@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" @@ -2285,11 +2238,12 @@ es-to-primitive@^1.1.1: is-symbol "^1.0.1" es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.39" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87" + version "0.10.45" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" + next-tick "1" es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" @@ -2348,9 +2302,9 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@^1.6.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" +escodegen@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.10.0.tgz#f647395de22519fbd0d928ffcf1d17e0dec2603e" dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2368,132 +2322,6 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-config-react-app@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz#23c909f71cbaff76b945b831d2d814b8bde169eb" - -eslint-import-resolver-node@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-loader@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.9.0.tgz#7e1be9feddca328d3dcfaef1ad49d5beffe83a13" - dependencies: - loader-fs-cache "^1.0.0" - loader-utils "^1.0.2" - object-assign "^4.0.1" - object-hash "^1.1.4" - rimraf "^2.6.1" - -eslint-module-utils@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - -eslint-plugin-flowtype@2.39.1: - version "2.39.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz#b5624622a0388bcd969f4351131232dcb9649cd5" - dependencies: - lodash "^4.15.0" - -eslint-plugin-import@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz#fa1b6ef31fcb3c501c09859c1b86f1fc5b986894" - dependencies: - builtin-modules "^1.1.1" - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.1.1" - has "^1.0.1" - lodash.cond "^4.3.0" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - -eslint-plugin-jsx-a11y@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1" - dependencies: - aria-query "^0.7.0" - array-includes "^3.0.3" - ast-types-flow "0.0.7" - axobject-query "^0.1.0" - damerau-levenshtein "^1.0.0" - emoji-regex "^6.1.0" - jsx-ast-utils "^1.4.0" - -eslint-plugin-react@7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz#300a95861b9729c087d362dd64abcc351a74364a" - dependencies: - doctrine "^2.0.0" - has "^1.0.1" - jsx-ast-utils "^2.0.0" - prop-types "^15.5.10" - -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.10.0.tgz#f25d0d7955c81968c2309aa5c9a229e045176bb7" - dependencies: - ajv "^5.2.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.0.1" - doctrine "^2.0.0" - eslint-scope "^3.7.1" - espree "^3.5.1" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^9.17.0" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" - -espree@^3.5.1: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -2506,19 +2334,13 @@ esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - dependencies: - estraverse "^4.0.0" - esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2537,9 +2359,9 @@ event-emitter@~0.3.5: d "1" es5-ext "~0.10.14" -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" events@^1.0.0: version "1.1.1" @@ -2559,10 +2381,10 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.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" + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" dependencies: - merge "^1.1.3" + merge "^1.2.0" execa@^0.7.0: version "0.7.0" @@ -2576,6 +2398,10 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -2606,11 +2432,22 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.4.3" + jest-get-type "^22.4.3" + jest-matcher-utils "^22.4.3" + jest-message-util "^22.4.3" + jest-regex-util "^22.4.3" + express@^4.13.3: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" dependencies: - accepts "~1.3.4" + accepts "~1.3.5" array-flatten "1.1.1" body-parser "1.18.2" content-disposition "0.5.2" @@ -2618,26 +2455,26 @@ express@^4.13.3: cookie "0.3.1" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.1.0" + finalhandler "1.1.1" fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~2.0.2" + proxy-addr "~2.0.3" qs "6.5.1" range-parser "~1.2.0" safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" + send "0.16.2" + serve-static "1.13.2" setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" + statuses "~1.4.0" + type-is "~1.6.16" utils-merge "1.0.1" vary "~1.1.2" @@ -2654,13 +2491,13 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.0, extend@~3.0.1: +extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" external-editor@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" @@ -2706,6 +2543,10 @@ fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -2730,12 +2571,6 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" -fb-watchman@^1.8.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" - dependencies: - bser "1.0.2" - fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" @@ -2743,8 +2578,8 @@ fb-watchman@^2.0.0: bser "^2.0.0" fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" dependencies: core-js "^1.0.0" isomorphic-fetch "^2.1.1" @@ -2752,7 +2587,7 @@ fbjs@^0.8.16: object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.9" + ua-parser-js "^0.7.18" figures@^2.0.0: version "2.0.0" @@ -2760,19 +2595,11 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -file-loader@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.5.tgz#91c25b6b6fbe56dae99f10a425fd64933b5c9daa" +file-loader@0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-0.11.2.tgz#4ff1df28af38719a6098093b88c82c71d1794a34" dependencies: loader-utils "^1.0.2" - schema-utils "^0.3.0" filename-regex@^2.0.0: version "2.0.1" @@ -2790,12 +2617,12 @@ filesize@3.5.11: resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" @@ -2808,26 +2635,18 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" dependencies: debug "2.6.9" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" parseurl "~1.3.2" - statuses "~1.3.1" + statuses "~1.4.0" unpipe "~1.0.0" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -2836,6 +2655,10 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -2849,19 +2672,23 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +follow-redirects@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291" + dependencies: + debug "^3.1.0" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2880,13 +2707,18 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" +fork-ts-checker-webpack-plugin@^0.2.8: + version "0.2.10" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.2.10.tgz#d0a4080e77e9f5d6e3b43cdce7d26658f9d250c6" dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + babel-code-frame "^6.22.0" + chalk "^1.1.3" + chokidar "^1.7.0" + lodash.endswith "^4.2.1" + lodash.isfunction "^3.0.8" + lodash.isstring "^4.0.1" + lodash.startswith "^4.2.1" + minimatch "^3.0.4" form-data@~2.3.1: version "2.3.2" @@ -2910,6 +2742,13 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + fs-extra@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" @@ -2918,6 +2757,14 @@ fs-extra@3.0.1: jsonfile "^3.0.0" universalify "^0.1.0" +fs-extra@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -2928,49 +2775,35 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -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.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" + minipass "^2.2.1" -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" dependencies: graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" -function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -function.prototype.name@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327" +fsevents@^1.0.0, fsevents@^1.1.3, fsevents@^1.2.2, fsevents@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - is-callable "^1.1.3" + nan "^2.9.2" + node-pre-gyp "^0.10.0" -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" gauge@~2.7.3: version "2.7.4" @@ -3027,6 +2860,12 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -3062,7 +2901,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^9.17.0, globals@^9.18.0: +globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3131,21 +2970,10 @@ handlebars@^4.0.3: optionalDependencies: uglify-js "^2.6" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -3171,10 +2999,6 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3207,16 +3031,10 @@ has-values@^1.0.0: kind-of "^4.0.0" has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: - inherits "^2.0.1" + function-bind "^1.1.1" hash-base@^3.0.0: version "3.0.4" @@ -3226,30 +3044,12 @@ hash-base@^3.0.0: safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + version "1.1.4" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -3262,14 +3062,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -hoek@4.x.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" - home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -3284,8 +3076,8 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + version "2.6.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.1.tgz#6e4cee78b01bb849dcf93527708c69fdbee410df" hpack.js@^2.1.6: version "2.1.6" @@ -3300,7 +3092,7 @@ 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: +html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" dependencies: @@ -3311,17 +3103,16 @@ html-entities@^1.2.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" html-minifier@^3.2.3: - version "3.5.10" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.10.tgz#8522c772c388db81aa5c26f62033302d906ea1c7" + version "3.5.18" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.18.tgz#fc8b02826cbbafc6de19a103c41c830a91cffe5a" dependencies: camel-case "3.0.x" clean-css "4.1.x" - commander "2.14.x" + commander "2.16.x" he "1.1.x" - ncname "1.0.x" param-case "2.1.x" relateurl "0.2.x" - uglify-js "3.3.x" + uglify-js "3.4.x" html-webpack-plugin@2.29.0: version "2.29.0" @@ -3334,17 +3125,6 @@ html-webpack-plugin@2.29.0: pretty-error "^2.0.2" toposort "^1.0.0" -htmlparser2@^3.9.1: - version "3.9.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" - dependencies: - domelementtype "^1.3.0" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^2.0.2" - htmlparser2@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" @@ -3358,7 +3138,7 @@ http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" -http-errors@1.6.2, http-errors@~1.6.2: +http-errors@1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: @@ -3367,9 +3147,18 @@ http-errors@1.6.2, http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-parser-js@>=0.4.0: - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" http-proxy-middleware@~0.17.4: version "0.17.4" @@ -3381,19 +3170,12 @@ http-proxy-middleware@~0.17.4: micromatch "^2.3.11" http-proxy@^1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" http-signature@~1.2.0: version "1.2.0" @@ -3407,10 +3189,16 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: +iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -3422,12 +3210,18 @@ icss-utils@^2.1.0: postcss "^6.0.1" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" -ignore@^3.3.3: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" import-lazy@^2.1.0: version "2.1.0" @@ -3440,6 +3234,13 @@ import-local@^0.1.1: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3465,7 +3266,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -3477,7 +3278,7 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -inquirer@3.3.0, inquirer@^3.0.6: +inquirer@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" dependencies: @@ -3507,8 +3308,8 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" invariant@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: loose-envify "^1.0.0" @@ -3550,10 +3351,6 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-boolean-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -3565,8 +3362,8 @@ is-builtin-module@^1.0.0: builtin-modules "^1.0.0" 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" + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10: version "1.1.0" @@ -3654,6 +3451,10 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -3683,10 +3484,6 @@ is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" -is-number-object@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" - is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -3707,19 +3504,13 @@ is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" dependencies: is-path-inside "^1.0.0" @@ -3761,10 +3552,6 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -3777,14 +3564,6 @@ 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" -is-string@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" - -is-subset@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" - is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" @@ -3844,36 +3623,36 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.0.tgz#5018c1141bb9a2a326d1a15a089f4ef54b9c4d4a" +istanbul-api@^1.1.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" dependencies: async "^2.1.4" compare-versions "^3.1.0" fileset "^2.0.2" istanbul-lib-coverage "^1.2.0" istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.0" + istanbul-lib-instrument "^1.10.1" istanbul-lib-report "^1.1.4" istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.2.0" + istanbul-reports "^1.3.0" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.2.0: +istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" istanbul-lib-hook@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" dependencies: - append-transform "^0.4.0" + append-transform "^1.0.0" -istanbul-lib-instrument@^1.10.0, istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5: - version "1.10.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.0.tgz#47f20bfed9b9cbbc45417d3c9aff37bfbacbd281" +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.8.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" @@ -3892,9 +3671,19 @@ istanbul-lib-report@^1.1.4: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" +istanbul-lib-source-maps@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.1.2" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-lib-source-maps@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" dependencies: debug "^3.1.0" istanbul-lib-coverage "^1.2.0" @@ -3902,234 +3691,282 @@ istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.4: rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.2.0.tgz#59a72413daf809b9c3203241c31abb9a48ab1bf5" +istanbul-reports@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" dependencies: handlebars "^4.0.3" -jest-changed-files@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8" +jest-changed-files@^22.2.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" + dependencies: + throat "^4.0.0" -jest-cli@^20.0.4: - version "20.0.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93" +jest-cli@^22.4.2: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90" dependencies: - ansi-escapes "^1.4.0" - callsites "^2.0.0" - chalk "^1.1.3" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" graceful-fs "^4.1.11" + import-local "^1.0.0" 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 "^20.0.3" - jest-config "^20.0.4" - jest-docblock "^20.0.3" - jest-environment-jsdom "^20.0.3" - jest-haste-map "^20.0.4" - jest-jasmine2 "^20.0.4" - jest-message-util "^20.0.3" - jest-regex-util "^20.0.3" - jest-resolve-dependencies "^20.0.3" - jest-runtime "^20.0.4" - jest-snapshot "^20.0.3" - jest-util "^20.0.3" + istanbul-api "^1.1.14" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-instrument "^1.8.0" + istanbul-lib-source-maps "^1.2.1" + jest-changed-files "^22.2.0" + jest-config "^22.4.4" + jest-environment-jsdom "^22.4.1" + jest-get-type "^22.1.0" + jest-haste-map "^22.4.2" + jest-message-util "^22.4.0" + jest-regex-util "^22.1.0" + jest-resolve-dependencies "^22.1.0" + jest-runner "^22.4.4" + jest-runtime "^22.4.4" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + jest-validate "^22.4.4" + jest-worker "^22.2.2" micromatch "^2.3.11" - node-notifier "^5.0.2" - pify "^2.3.0" + node-notifier "^5.2.1" + realpath-native "^1.0.0" + rimraf "^2.5.4" slash "^1.0.0" - string-length "^1.0.1" - throat "^3.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" which "^1.2.12" - worker-farm "^1.3.1" - yargs "^7.0.2" + yargs "^10.0.3" -jest-config@^20.0.4: - version "20.0.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea" +jest-config@^22.0.1, jest-config@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" dependencies: - chalk "^1.1.3" + chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^20.0.3" - jest-environment-node "^20.0.3" - jest-jasmine2 "^20.0.4" - jest-matcher-utils "^20.0.3" - jest-regex-util "^20.0.3" - jest-resolve "^20.0.4" - jest-validate "^20.0.3" - pretty-format "^20.0.3" - -jest-diff@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617" + jest-environment-jsdom "^22.4.1" + jest-environment-node "^22.4.1" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.4.4" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" + pretty-format "^22.4.0" + +jest-diff@^22.4.0, jest-diff@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" dependencies: - chalk "^1.1.3" + chalk "^2.0.1" diff "^3.2.0" - jest-matcher-utils "^20.0.3" - pretty-format "^20.0.3" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" -jest-docblock@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712" +jest-docblock@^22.4.0, jest-docblock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" + dependencies: + detect-newline "^2.1.0" -jest-environment-jsdom@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99" +jest-environment-jsdom@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" dependencies: - jest-mock "^20.0.3" - jest-util "^20.0.3" - jsdom "^9.12.0" + jest-mock "^22.4.3" + jest-util "^22.4.3" + jsdom "^11.5.1" -jest-environment-node@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403" +jest-environment-node@^22.4.1: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" dependencies: - jest-mock "^20.0.3" - jest-util "^20.0.3" + jest-mock "^22.4.3" + jest-util "^22.4.3" -jest-haste-map@^20.0.4: - version "20.0.5" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112" +jest-get-type@^22.1.0, jest-get-type@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + +jest-haste-map@^22.4.2: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" - jest-docblock "^20.0.3" + jest-docblock "^22.4.3" + jest-serializer "^22.4.3" + jest-worker "^22.4.3" micromatch "^2.3.11" - sane "~1.6.0" - worker-farm "^1.3.1" + sane "^2.0.0" -jest-jasmine2@^20.0.4: - version "20.0.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1" +jest-jasmine2@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" dependencies: - chalk "^1.1.3" + chalk "^2.0.1" + co "^4.6.0" + expect "^22.4.0" graceful-fs "^4.1.11" - jest-diff "^20.0.3" - jest-matcher-utils "^20.0.3" - jest-matchers "^20.0.3" - jest-message-util "^20.0.3" - jest-snapshot "^20.0.3" - once "^1.4.0" - p-map "^1.1.1" + is-generator-fn "^1.0.0" + jest-diff "^22.4.0" + jest-matcher-utils "^22.4.0" + jest-message-util "^22.4.0" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + source-map-support "^0.5.0" -jest-matcher-utils@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612" +jest-leak-detector@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" dependencies: - chalk "^1.1.3" - pretty-format "^20.0.3" + pretty-format "^22.4.3" -jest-matchers@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60" +jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" dependencies: - jest-diff "^20.0.3" - jest-matcher-utils "^20.0.3" - jest-message-util "^20.0.3" - jest-regex-util "^20.0.3" + chalk "^2.0.1" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" -jest-message-util@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c" +jest-message-util@^22.4.0, jest-message-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" dependencies: - chalk "^1.1.3" + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" micromatch "^2.3.11" slash "^1.0.0" + stack-utils "^1.0.1" -jest-mock@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59" +jest-mock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" -jest-regex-util@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762" +jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" -jest-resolve-dependencies@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a" +jest-resolve-dependencies@^22.1.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" dependencies: - jest-regex-util "^20.0.3" + jest-regex-util "^22.4.3" -jest-resolve@^20.0.4: - version "20.0.4" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5" +jest-resolve@^22.4.2: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" dependencies: browser-resolve "^1.11.2" - is-builtin-module "^1.0.0" - resolve "^1.3.2" + chalk "^2.0.1" -jest-runtime@^20.0.4: - version "20.0.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8" +jest-runner@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907" + dependencies: + exit "^0.1.2" + jest-config "^22.4.4" + jest-docblock "^22.4.0" + jest-haste-map "^22.4.2" + jest-jasmine2 "^22.4.4" + jest-leak-detector "^22.4.0" + jest-message-util "^22.4.0" + jest-runtime "^22.4.4" + jest-util "^22.4.1" + jest-worker "^22.2.2" + throat "^4.0.0" + +jest-runtime@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048" dependencies: babel-core "^6.0.0" - babel-jest "^20.0.3" - babel-plugin-istanbul "^4.0.0" - chalk "^1.1.3" + babel-jest "^22.4.4" + babel-plugin-istanbul "^4.1.5" + chalk "^2.0.1" convert-source-map "^1.4.0" + exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^20.0.4" - jest-haste-map "^20.0.4" - jest-regex-util "^20.0.3" - jest-resolve "^20.0.4" - jest-util "^20.0.3" + jest-config "^22.4.4" + jest-haste-map "^22.4.2" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" json-stable-stringify "^1.0.1" micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" strip-bom "3.0.0" - yargs "^7.0.2" + write-file-atomic "^2.1.0" + yargs "^10.0.3" -jest-snapshot@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566" +jest-serializer@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" + +jest-snapshot@^22.4.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" dependencies: - chalk "^1.1.3" - jest-diff "^20.0.3" - jest-matcher-utils "^20.0.3" - jest-util "^20.0.3" + chalk "^2.0.1" + jest-diff "^22.4.3" + jest-matcher-utils "^22.4.3" + mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^20.0.3" + pretty-format "^22.4.3" -jest-util@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad" +jest-util@^22.4.1, jest-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" dependencies: - chalk "^1.1.3" + callsites "^2.0.0" + chalk "^2.0.1" graceful-fs "^4.1.11" - jest-message-util "^20.0.3" - jest-mock "^20.0.3" - jest-validate "^20.0.3" - leven "^2.1.0" + is-ci "^1.0.10" + jest-message-util "^22.4.3" mkdirp "^0.5.1" + source-map "^0.6.0" -jest-validate@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab" +jest-validate@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" dependencies: - chalk "^1.1.3" - jest-matcher-utils "^20.0.3" + chalk "^2.0.1" + jest-config "^22.4.4" + jest-get-type "^22.1.0" leven "^2.1.0" - pretty-format "^20.0.3" + pretty-format "^22.4.0" + +jest-worker@^22.2.2, jest-worker@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" + dependencies: + merge-stream "^1.0.1" -jest@20.0.4: - version "20.0.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac" +jest@22.4.2: + version "22.4.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.2.tgz#34012834a49bf1bdd3bc783850ab44e4499afc20" dependencies: - jest-cli "^20.0.4" + import-local "^1.0.0" + jest-cli "^22.4.2" js-base64@^2.1.9: - version "2.4.3" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" + version "2.4.5" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.5.tgz#e293cd3c7c82f070d700fc7a1ca0a2e69f101f92" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" +js-yaml@^3.4.3, js-yaml@^3.7.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4145,29 +3982,36 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^9.12.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" +jsdom@^11.5.1: + version "11.11.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" dependencies: - abab "^1.0.3" - acorn "^4.0.4" - acorn-globals "^3.1.0" + abab "^1.0.4" + acorn "^5.3.0" + acorn-globals "^4.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" + cssstyle ">= 0.3.1 < 0.4.0" + data-urls "^1.0.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.2" + left-pad "^1.2.0" + nwsapi "^2.0.0" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.83.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^4.0.0" + xml-name-validator "^3.0.0" jsesc@^1.3.0: version "1.3.0" @@ -4185,6 +4029,10 @@ json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -4219,6 +4067,12 @@ jsonfile@^3.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -4232,16 +4086,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jsx-ast-utils@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" - -jsx-ast-utils@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" - dependencies: - array-includes "^3.0.3" - killable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" @@ -4282,23 +4126,21 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - dependencies: - set-getter "^0.1.0" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" dependencies: invert-kv "^1.0.0" +left-pad@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" -levn@^0.3.0, levn@~0.3.0: +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" dependencies: @@ -4324,18 +4166,11 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" -loader-fs-cache@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" - dependencies: - find-cache-dir "^0.1.1" - mkdirp "0.5.1" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@^0.2.16: +loader-utils@^0.2.16, loader-utils@~0.2.2: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: @@ -4367,22 +4202,38 @@ lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" -lodash.cond@^4.3.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" +lodash.endswith@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + +lodash.isfunction@^3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + +lodash.startswith@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c" + lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" @@ -4400,9 +4251,9 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -"lodash@>=3.5 <5", lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" loglevel@^1.4.1: version "1.6.1" @@ -4430,23 +4281,19 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" -lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" -macaddress@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" - make-dir@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" dependencies: pify "^3.0.0" @@ -4474,6 +4321,10 @@ math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + md5.js@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" @@ -4517,7 +4368,13 @@ 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: +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" @@ -4544,8 +4401,8 @@ micromatch@^2.1.5, micromatch@^2.3.11: regex-cache "^0.4.2" micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.9" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89" + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4559,7 +4416,7 @@ micromatch@^3.1.4, micromatch@^3.1.8: object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" - to-regex "^3.0.1" + to-regex "^3.0.2" miller-rabin@^4.0.0: version "4.0.1" @@ -4568,11 +4425,15 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: +"mime-db@>= 1.34.0 < 2": + version "1.34.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" + +mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: @@ -4591,8 +4452,8 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" @@ -4604,7 +4465,7 @@ minimatch@3.0.3: dependencies: brace-expansion "^1.0.0" -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -4614,7 +4475,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4622,6 +4483,34 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -4629,15 +4518,22 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -moo@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/moo/-/moo-0.4.3.tgz#3f847a26f31cf625a956a87f2b10fbc013bfd10e" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" ms@2.0.0: version "2.0.0" @@ -4658,20 +4554,19 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.3.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866" +nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" - is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -4683,29 +4578,25 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" -ncname@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" - dependencies: - xml-char-classes "^1.0.0" - -nearley@^2.7.10: - version "2.12.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.12.1.tgz#589cc3f883f5f873902b719838abd45af57b2d69" +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" dependencies: - moo "^0.4.3" - nomnom "~1.6.2" - railroad-diagrams "^1.0.0" - randexp "0.4.6" - semver "^5.4.1" + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" neo-async@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f" + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" no-case@^2.2.0: version "2.3.2" @@ -4720,9 +4611,9 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-forge@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" node-int64@^0.4.0: version "0.4.0" @@ -4756,7 +4647,7 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-notifier@^5.0.2: +node-notifier@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" dependencies: @@ -4765,28 +4656,20 @@ node-notifier@^5.0.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" +node-pre-gyp@^0.10.0: + version "0.10.2" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.2.tgz#e8945c20ef6795a20aac2b44f036eb13cf5146e3" dependencies: detect-libc "^1.0.2" - hawk "3.1.3" mkdirp "^0.5.1" + needle "^2.2.0" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.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" + tar "^4" nopt@^4.0.1: version "4.0.1" @@ -4823,6 +4706,17 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + 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" @@ -4852,11 +4746,11 @@ 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.9 < 2.0.0": - version "1.4.3" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" +nwsapi@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.4.tgz#dc79040a5f77b97716dc79565fc7fc3ef7d50570" -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -4872,21 +4766,9 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-hash@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.2.0.tgz#e96af0e96981996a1d47f88ead8f74f1ebc4422b" - -object-inspect@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.5.0.tgz#9d876c11e40f485c79215670281b767488f9bfe3" - -object-is@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" - -object-keys@^1.0.11, object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-keys@^1.0.8: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" object-visit@^1.0.0: version "1.0.1" @@ -4894,23 +4776,12 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.entries@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" dependencies: define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" + es-abstract "^1.5.1" object.omit@^2.0.0: version "2.0.1" @@ -4925,18 +4796,9 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - obuf@^1.0.0, obuf@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" on-finished@~2.3.0: version "2.3.0" @@ -4948,7 +4810,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -4960,12 +4822,18 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -opn@5.2.0, opn@^5.1.0: +opn@5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" dependencies: is-wsl "^1.1.0" +opn@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + dependencies: + is-wsl "^1.1.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -4973,7 +4841,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -4985,10 +4853,10 @@ optionator@^0.8.1, optionator@^0.8.2: wordwrap "~1.0.0" original@>=0.0.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + version "1.0.1" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz#b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190" dependencies: - url-parse "1.0.x" + url-parse "~1.4.0" os-browserify@^0.3.0: version "0.3.0" @@ -5028,8 +4896,8 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" dependencies: p-try "^1.0.0" @@ -5060,6 +4928,14 @@ pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + param-case@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" @@ -5067,8 +4943,8 @@ param-case@2.1.x: no-case "^2.2.0" parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -5095,15 +4971,9 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" -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.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - dependencies: - "@types/node" "*" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" parseurl@~1.3.2: version "1.3.2" @@ -5135,7 +5005,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -5172,8 +5042,8 @@ path-type@^2.0.0: pify "^2.0.0" pbkdf2@^3.0.3: - version "3.0.14" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5181,15 +5051,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -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: +pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -5207,21 +5073,15 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" dependencies: find-up "^2.1.0" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" portfinder@^1.0.9: version "1.0.13" @@ -5290,11 +5150,10 @@ postcss-discard-unused@^2.2.1: uniqs "^2.0.0" postcss-filter-plugins@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" + version "2.0.3" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" dependencies: postcss "^5.0.4" - uniqid "^4.0.0" postcss-flexbugs-fixes@3.2.0: version "3.2.0" @@ -5396,8 +5255,8 @@ postcss-minify-selectors@^2.0.4: postcss-selector-parser "^2.0.0" postcss-modules-extract-imports@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb" dependencies: postcss "^6.0.1" @@ -5512,12 +5371,12 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 supports-color "^3.2.3" postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13: - version "6.0.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555" + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" dependencies: - chalk "^2.3.1" + chalk "^2.4.1" source-map "^0.6.1" - supports-color "^5.2.0" + supports-color "^5.4.0" prelude-ls@~1.1.2: version "1.1.2" @@ -5542,14 +5401,14 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-format@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14" +pretty-format@^22.4.0, pretty-format@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" dependencies: - ansi-regex "^2.1.1" - ansi-styles "^3.0.0" + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" -private@^0.1.6, private@^0.1.7: +private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -5561,9 +5420,9 @@ process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" promise@8.0.1: version "8.0.1" @@ -5577,15 +5436,14 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.6.0: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" +prop-types@^15.6.0: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: - fbjs "^0.8.16" loose-envify "^1.3.1" object-assign "^4.1.1" -proxy-addr@~2.0.2: +proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" dependencies: @@ -5600,9 +5458,13 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.28" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" + public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + version "4.0.2" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" @@ -5610,6 +5472,21 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -5618,17 +5495,21 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -qs@6.5.1, qs@~6.5.1: +qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" query-string@^4.1.0: version "4.3.4" @@ -5645,37 +5526,23 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" - -querystringify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +querystringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" -raf@3.4.0, raf@^3.4.0: +raf@3.4.0: 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" - -randexp@0.4.6: - 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.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" @@ -5703,24 +5570,24 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dev-utils@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-5.0.0.tgz#425ac7c9c40c2603bc4f7ab8836c1406e96bb473" +react-dev-utils@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-5.0.1.tgz#1f396e161fe44b595db1b186a40067289bf06613" dependencies: address "1.0.3" babel-code-frame "6.26.0" chalk "1.1.3" cross-spawn "5.1.0" - detect-port-alt "1.1.5" + detect-port-alt "1.1.6" escape-string-regexp "1.0.5" filesize "3.5.11" global-modules "1.0.0" @@ -5735,9 +5602,9 @@ react-dev-utils@^5.0.0: strip-ansi "3.0.1" text-table "0.2.0" -react-dom@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044" +react-dom@^16.4.1: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.1.tgz#7f8b0223b3a5fbe205116c56deb85de32685dad6" dependencies: fbjs "^0.8.16" loose-envify "^1.1.0" @@ -5748,51 +5615,42 @@ react-error-overlay@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4" -react-reconciler@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - -react-scripts@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-1.1.1.tgz#279d449f7311fed910506987a1ade014027788a8" +react-scripts-ts@2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/react-scripts-ts/-/react-scripts-ts-2.16.0.tgz#45f831a12139c3b59d6bb729c1b6ef51e0f22908" dependencies: autoprefixer "7.1.6" - babel-core "6.26.0" - babel-eslint "7.2.3" - babel-jest "20.0.3" - babel-loader "7.1.2" + babel-jest "^22.1.0" + babel-loader "^7.1.2" babel-preset-react-app "^3.1.1" - babel-runtime "6.26.0" case-sensitive-paths-webpack-plugin "2.1.1" chalk "1.1.3" css-loader "0.28.7" dotenv "4.0.0" dotenv-expand "4.2.0" - eslint "4.10.0" - eslint-config-react-app "^2.1.0" - eslint-loader "1.9.0" - eslint-plugin-flowtype "2.39.1" - eslint-plugin-import "2.8.0" - eslint-plugin-jsx-a11y "5.1.1" - eslint-plugin-react "7.4.0" extract-text-webpack-plugin "3.0.2" - file-loader "1.1.5" + file-loader "0.11.2" + fork-ts-checker-webpack-plugin "^0.2.8" fs-extra "3.0.1" html-webpack-plugin "2.29.0" - jest "20.0.4" + jest "22.4.2" object-assign "4.1.1" postcss-flexbugs-fixes "3.2.0" postcss-loader "2.0.8" promise "8.0.1" raf "3.4.0" - react-dev-utils "^5.0.0" + react-dev-utils "^5.0.1" + resolve "1.6.0" + source-map-loader "^0.2.1" style-loader "0.19.0" sw-precache-webpack-plugin "0.11.4" + ts-jest "22.0.1" + ts-loader "^2.3.7" + tsconfig-paths-webpack-plugin "^2.0.0" + tslint "^5.7.0" + tslint-config-prettier "^1.10.0" + tslint-react "^3.2.0" + uglifyjs-webpack-plugin "^1.1.8" url-loader "0.6.2" webpack "3.8.1" webpack-dev-server "2.9.4" @@ -5801,17 +5659,9 @@ react-scripts@1.1.1: optionalDependencies: fsevents "^1.1.3" -react-test-renderer@^16.0.0-0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211" - dependencies: - fbjs "^0.8.16" - object-assign "^4.1.1" - prop-types "^15.6.0" - -react@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" +react@^16.4.1: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32" dependencies: fbjs "^0.8.16" loose-envify "^1.1.0" @@ -5848,6 +5698,18 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@1.0: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -5857,18 +5719,6 @@ readable-stream@1.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3: - version "2.3.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -5878,6 +5728,12 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +realpath-native@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" + dependencies: + util.promisify "^1.0.0" + recursive-readdir@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" @@ -5906,8 +5762,8 @@ reduce-function-call@^1.0.1: balanced-match "^0.4.2" regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" regenerator-runtime@^0.11.0: version "0.11.1" @@ -6005,36 +5861,23 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" -request@^2.79.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" +request@^2.83.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -6044,7 +5887,6 @@ request@^2.79.0: forever-agent "~0.6.1" form-data "~2.3.1" har-validator "~5.0.3" - hawk "~6.0.2" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -6054,7 +5896,6 @@ request@^2.79.0: performance-now "^2.1.0" qs "~6.5.1" safe-buffer "^5.1.1" - stringstream "~0.0.5" tough-cookie "~2.3.3" tunnel-agent "^0.6.0" uuid "^3.1.0" @@ -6071,14 +5912,7 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: +requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -6095,10 +5929,6 @@ resolve-dir@^1.0.0: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -6111,9 +5941,15 @@ resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.3.2, resolve@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" +resolve@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c" + dependencies: + path-parse "^1.0.5" + +resolve@^1.1.7, resolve@^1.3.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: path-parse "^1.0.5" @@ -6134,25 +5970,22 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: +rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" dependencies: - hash-base "^2.0.0" + hash-base "^3.0.0" inherits "^2.0.1" -rst-selector-parser@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" - dependencies: - lodash.flattendeep "^4.4.0" - nearley "^2.7.10" +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" run-async@^2.2.0: version "2.3.0" @@ -6160,6 +5993,12 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" @@ -6170,29 +6009,40 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" dependencies: ret "~0.1.10" -sane@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775" +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sane@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" dependencies: - anymatch "^1.3.0" + anymatch "^2.0.0" + capture-exit "^1.2.0" exec-sh "^0.2.0" - fb-watchman "^1.8.0" - minimatch "^3.0.2" + fb-watchman "^2.0.0" + micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" - watch "~0.10.0" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" -sax@^1.2.1, sax@~1.2.1: +sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -6202,15 +6052,22 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" +schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" selfsigned@^1.9.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.2.tgz#b4449580d99929b65b10a48389301a6592088758" + version "1.10.3" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" dependencies: - node-forge "0.7.1" + node-forge "0.7.5" semver-diff@^2.0.0: version "2.1.0" @@ -6218,18 +6075,18 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" dependencies: debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" @@ -6238,7 +6095,11 @@ send@0.16.1: ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" - statuses "~1.3.1" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" serve-index@^1.7.2: version "1.9.1" @@ -6252,14 +6113,14 @@ serve-index@^1.7.2: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.2" - send "0.16.1" + send "0.16.2" serviceworker-cache-polyfill@^4.0.0: version "4.0.0" @@ -6269,12 +6130,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" -set-getter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - dependencies: - to-object-path "^0.3.0" - set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" @@ -6310,8 +6165,8 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.10" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -6326,7 +6181,7 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shell-quote@1.6.1: +shell-quote@1.6.1, shell-quote@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" dependencies: @@ -6347,12 +6202,6 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6368,8 +6217,8 @@ snapdragon-util@^3.0.1: kind-of "^3.2.0" snapdragon@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" dependencies: base "^0.11.1" debug "^2.2.0" @@ -6378,19 +6227,7 @@ snapdragon@^0.8.1: map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" - use "^2.0.0" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - dependencies: - hoek "4.x.x" + use "^3.1.0" sockjs-client@1.1.4: version "1.1.4" @@ -6420,11 +6257,19 @@ source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" +source-map-loader@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.3.tgz#d4b0c8cd47d54edce3e6bfa0f523f452b5b0e521" + dependencies: + async "^2.5.0" + loader-utils "~0.2.2" + source-map "~0.6.1" + source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" dependencies: - atob "^2.0.0" + atob "^2.1.1" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" @@ -6436,6 +6281,13 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" +source-map-support@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -6450,7 +6302,7 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -6477,8 +6329,8 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" spdy-transport@^2.0.18: - version "2.0.20" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" dependencies: debug "^2.6.8" detect-node "^2.0.3" @@ -6510,19 +6362,30 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" dashdash "^1.12.0" getpass "^0.1.1" + safer-buffer "^2.0.2" optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" jsbn "~0.1.0" tweetnacl "~0.14.0" +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -6530,13 +6393,17 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2": +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" stream-browserify@^2.0.1: version "2.0.1" @@ -6545,25 +6412,37 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + stream-http@^2.7.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.3.3" + readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" -string-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" dependencies: - strip-ansi "^3.0.0" + astral-regex "^1.0.0" + strip-ansi "^4.0.0" string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" @@ -6573,16 +6452,16 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403" +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" dependencies: safe-buffer "~5.1.0" @@ -6590,16 +6469,6 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.4, stringstream@~0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -6632,7 +6501,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -6643,6 +6512,12 @@ style-loader@0.19.0: loader-utils "^1.0.2" schema-utils "^0.3.0" +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -6659,9 +6534,9 @@ supports-color@^4.2.1: dependencies: has-flag "^2.0.0" -supports-color@^5.2.0, supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" dependencies: has-flag "^3.0.0" @@ -6707,45 +6582,25 @@ sw-toolbox@^3.4.0: path-to-regexp "^1.0.1" serviceworker-cache-polyfill "^4.0.0" -symbol-tree@^3.2.1: +symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" -table@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" - dependencies: - ajv "^6.0.1" - ajv-keywords "^3.0.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - tapable@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" +tar@^4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" term-size@^1.2.0: version "1.2.0" @@ -6753,7 +6608,7 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -test-exclude@^4.1.1: +test-exclude@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" dependencies: @@ -6763,13 +6618,20 @@ test-exclude@^4.1.1: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" -text-table@0.2.0, text-table@~0.2.0: +text-table@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -throat@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" through@^2.3.6: version "2.3.8" @@ -6788,8 +6650,8 @@ timed-out@^4.0.0: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" timers-browserify@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae" + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" dependencies: setimmediate "^1.0.4" @@ -6824,7 +6686,7 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex@^3.0.1: +to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" dependencies: @@ -6834,18 +6696,27 @@ to-regex@^3.0.1: safe-regex "^1.1.0" toposort@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec" + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" -tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" trim-newlines@^1.0.0: version "1.0.0" @@ -6855,6 +6726,83 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" +ts-jest@22.0.1: + version "22.0.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.0.1.tgz#48942936a466c2e76e259b02e2f1356f1839afc3" + dependencies: + babel-core "^6.24.1" + babel-plugin-istanbul "^4.1.4" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-preset-jest "^22.0.1" + cpx "^1.5.0" + fs-extra "4.0.3" + jest-config "^22.0.1" + pkg-dir "^2.0.0" + source-map-support "^0.5.0" + yargs "^10.0.3" + +ts-loader@^2.3.7: + version "2.3.7" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.3.7.tgz#a9028ced473bee12f28a75f9c5b139979d33f2fc" + dependencies: + chalk "^2.0.1" + enhanced-resolve "^3.0.0" + loader-utils "^1.0.2" + semver "^5.0.1" + +tsconfig-paths-webpack-plugin@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-2.0.0.tgz#7652dc684bb3206c8e7e446831ca01cbf4d11772" + dependencies: + chalk "^2.3.0" + tsconfig-paths "^3.1.1" + +tsconfig-paths@^3.1.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.4.2.tgz#4640bffaeee3fc0ab986607edae203859156a8c3" + dependencies: + deepmerge "^2.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + strip-json-comments "^2.0.1" + +tslib@^1.8.0, tslib@^1.8.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + +tslint-config-prettier@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.13.0.tgz#189e821931ad89e0364e4e292d5c44a14e90ecd6" + +tslint-react@^3.2.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/tslint-react/-/tslint-react-3.6.0.tgz#7f462c95c4a0afaae82507f06517ff02942196a1" + dependencies: + tsutils "^2.13.1" + +tslint@^5.7.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.10.0.tgz#11e26bccb88afa02dd0d9956cae3d4540b5f54c3" + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.12.1" + +tsutils@^2.12.1, tsutils@^2.13.1: + version "2.27.2" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7" + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -6875,7 +6823,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15: +type-is@~1.6.15, type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: @@ -6886,15 +6834,26 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -ua-parser-js@^0.7.9: - version "0.7.17" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" +typescript@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + +ua-parser-js@^0.7.18: + version "0.7.18" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" -uglify-js@3.3.x, uglify-js@^3.0.13: - version "3.3.13" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.13.tgz#8a1a89eeb16e2d6a66b0db2b04cb871af3c669cf" +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" dependencies: - commander "~2.14.1" + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@3.4.x, uglify-js@^3.0.13: + version "3.4.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.3.tgz#a4fd757b6f34a95f717f7a7a0dccafcaaa60cf7f" + dependencies: + commander "~2.16.0" source-map "~0.6.1" uglify-js@^2.6, uglify-js@^2.8.29: @@ -6918,13 +6877,18 @@ uglifyjs-webpack-plugin@^0.4.6: uglify-js "^2.8.29" webpack-sources "^1.0.1" -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -underscore@~1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" +uglifyjs-webpack-plugin@^1.1.8: + version "1.2.7" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" union-value@^1.0.0: version "1.0.0" @@ -6939,16 +6903,22 @@ uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" -uniqid@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" - dependencies: - macaddress "^0.2.8" - uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -6956,8 +6926,8 @@ unique-string@^1.0.0: crypto-random-string "^1.0.0" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -6974,18 +6944,19 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -upath@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d" +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" update-notifier@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" dependencies: boxen "^1.2.1" chalk "^2.0.1" configstore "^3.0.0" import-lazy "^2.1.0" + is-ci "^1.0.10" is-installed-globally "^0.1.0" is-npm "^1.0.0" latest-version "^3.0.0" @@ -6996,6 +6967,12 @@ upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" +uri-js@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + urijs@^1.16.1: version "1.19.1" resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" @@ -7018,19 +6995,12 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - -url-parse@^1.1.8: - version "1.2.0" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986" +url-parse@^1.1.8, url-parse@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.1.tgz#4dec9dad3dc8585f862fed461d2e19bbf623df30" dependencies: - querystringify "~1.0.0" - requires-port "~1.0.0" + querystringify "^2.0.0" + requires-port "^1.0.0" url@^0.11.0: version "0.11.0" @@ -7039,24 +7009,35 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" dependencies: - define-property "^0.2.5" - isobject "^3.0.0" - lazy-cache "^2.0.2" + kind-of "^6.0.2" util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util@0.10.3, util@^0.10.3: +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" dependencies: inherits "2.0.1" +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + utila@~0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" @@ -7073,9 +7054,9 @@ uuid@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0, uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" validate-npm-package-license@^3.0.1: version "3.0.3" @@ -7089,8 +7070,8 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" vendors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" verror@1.10.0: version "1.10.0" @@ -7106,35 +7087,40 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + 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" -watch@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" +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.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed" + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" dependencies: minimalistic-assert "^1.0.0" -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: +webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -7187,7 +7173,7 @@ webpack-manifest-plugin@1.3.2: fs-extra "^0.30.0" lodash ">=3.5 <5" -webpack-sources@^1.0.1: +webpack-sources@^1.0.1, webpack-sources@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" dependencies: @@ -7232,22 +7218,31 @@ websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" -whatwg-encoding@^1.0.1: +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" dependencies: iconv-lite "0.4.19" -whatwg-fetch@2.0.3, whatwg-fetch@>=0.10.0: +whatwg-fetch@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" -whatwg-url@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" +whatwg-fetch@>=0.10.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + +whatwg-url@^6.4.0, whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" whet.extend@~0.9.9: version "0.9.9" @@ -7262,16 +7257,16 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" widest-line@^2.0.0: version "2.0.0" @@ -7295,12 +7290,11 @@ 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.4" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.4.tgz#4debbe46b40edefcc717ebde74a90b1ae1e909a1" +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" dependencies: errno "~0.1.7" - xtend "~4.0.1" wrap-ansi@^2.0.0: version "2.1.0" @@ -7313,7 +7307,7 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^2.0.0: +write-file-atomic@^2.0.0, 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: @@ -7321,23 +7315,20 @@ write-file-atomic@^2.0.0: 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" +ws@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" dependencies: - mkdirp "^0.5.1" + async-limiter "~1.0.0" + safe-buffer "~5.1.0" xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" -xml-char-classes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" - -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" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" @@ -7347,49 +7338,56 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" dependencies: camelcase "^3.0.0" -yargs-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - 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@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" decamelize "^1.1.1" + find-up "^2.1.0" get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" + os-locale "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" + string-width "^2.0.0" + which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^4.2.0" + yargs-parser "^8.1.0" -yargs@^7.0.2: - version "7.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" +yargs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -7403,7 +7401,7 @@ yargs@^7.0.2: string-width "^1.0.2" which-module "^1.0.0" y18n "^3.2.1" - yargs-parser "^5.0.0" + yargs-parser "^4.2.0" yargs@^8.0.2: version "8.0.2" From cbef5332126401306ab164e20dfe1681bc91369d Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sat, 7 Jul 2018 13:05:56 -0500 Subject: [PATCH 02/35] Adding CSS Normalize --- src/index.tsx | 3 +- src/normalize.css | 427 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 src/normalize.css diff --git a/src/index.tsx b/src/index.tsx index a7b13062..02e75b53 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,11 +1,12 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; import App from './App'; +import './normalize.css'; import './index.css'; import registerServiceWorker from './registerServiceWorker'; ReactDOM.render( - , + , document.getElementById('root') as HTMLElement ); registerServiceWorker(); diff --git a/src/normalize.css b/src/normalize.css new file mode 100644 index 00000000..9c2a167c --- /dev/null +++ b/src/normalize.css @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + + html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /** + * Remove default margin. + */ + + body { + margin: 0; + } + + /* HTML5 display definitions + ========================================================================== */ + + /** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + + article, + aside, + details, + figcaption, + figure, + footer, + header, + hgroup, + main, + menu, + nav, + section, + summary { + display: block; + } + + /** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + + audio, + canvas, + progress, + video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ + } + + /** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + + audio:not([controls]) { + display: none; + height: 0; + } + + /** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + + [hidden], + template { + display: none; + } + + /* Links + ========================================================================== */ + + /** + * Remove the gray background color from active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * Improve readability when focused and also mouse hovered in all browsers. + */ + + a:active, + a:hover { + outline: 0; + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + + abbr[title] { + border-bottom: 1px dotted; + } + + /** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + + b, + strong { + font-weight: bold; + } + + /** + * Address styling not present in Safari and Chrome. + */ + + dfn { + font-style: italic; + } + + /** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /** + * Address styling not present in IE 8/9. + */ + + mark { + background: #ff0; + color: #000; + } + + /** + * Address inconsistent and variable font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sup { + top: -0.5em; + } + + sub { + bottom: -0.25em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove border when inside `a` element in IE 8/9/10. + */ + + img { + border: 0; + } + + /** + * Correct overflow not hidden in IE 9/10/11. + */ + + svg:not(:root) { + overflow: hidden; + } + + /* Grouping content + ========================================================================== */ + + /** + * Address margin not present in IE 8/9 and Safari. + */ + + figure { + margin: 1em 40px; + } + + /** + * Address differences between Firefox and other browsers. + */ + + hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; + } + + /** + * Contain overflow in all browsers. + */ + + pre { + overflow: auto; + } + + /** + * Address odd `em`-unit font size rendering in all browsers. + */ + + code, + kbd, + pre, + samp { + font-family: monospace, monospace; + font-size: 1em; + } + + /* Forms + ========================================================================== */ + + /** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + + /** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + + button, + input, + optgroup, + select, + textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ + } + + /** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + + button { + overflow: visible; + } + + /** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + + button, + select { + text-transform: none; + } + + /** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + + button, + html input[type="button"], /* 1 */ + input[type="reset"], + input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ + } + + /** + * Re-set default cursor for disabled elements. + */ + + button[disabled], + html input[disabled] { + cursor: default; + } + + /** + * Remove inner padding and border in Firefox 4+. + */ + + button::-moz-focus-inner, + input::-moz-focus-inner { + border: 0; + padding: 0; + } + + /** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + + input { + line-height: normal; + } + + /** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + + input[type="checkbox"], + input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + + input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; + } + + /** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + + input[type="search"]::-webkit-search-cancel-button, + input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * Define consistent border, margin, and padding. + */ + + fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; + } + + /** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + + legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + + textarea { + overflow: auto; + } + + /** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + + optgroup { + font-weight: bold; + } + + /* Tables + ========================================================================== */ + + /** + * Remove most spacing between table cells. + */ + + table { + border-collapse: collapse; + border-spacing: 0; + } + + td, + th { + padding: 0; + } From 948f236d6ac0810a6ec85d242b9bc31648b95bac Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 10:59:39 -0500 Subject: [PATCH 03/35] Put CSS Reset in index.css Adding Meyer's CSS reset to the index --- src/index.css | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/index.css b/src/index.css index b4cc7250..ed11813c 100644 --- a/src/index.css +++ b/src/index.css @@ -1,5 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} body { - margin: 0; - padding: 0; - font-family: sans-serif; + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; } From 1494b63fba66b71fdf0d16c772ff0c534eaae7af Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 11:01:16 -0500 Subject: [PATCH 04/35] Adjustments of TSLint variable names rules - Don't check too strictly variable names - Ignore unused locals (due to react global import, it was always warning that it wasn't used) --- tsconfig.json | 2 +- tslint.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 1e47f905..f00e017b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,7 @@ "noImplicitAny": true, "strictNullChecks": true, "suppressImplicitAnyIndexErrors": true, - "noUnusedLocals": true + "noUnusedLocals": false }, "exclude": [ "node_modules", diff --git a/tslint.json b/tslint.json index b8a157b5..c6a98b69 100644 --- a/tslint.json +++ b/tslint.json @@ -9,11 +9,11 @@ ] }, "rules": { - "variable-name": [ true, "ban-keywords", "check-format", "allow-leading-underscore", "allow-snake-case" ], + "variable-name": [ true, "ban-keywords", "check-format", "allow-leading-underscore", "allow-snake-case", "allow-pascal-case" ], "object-literal-sort-keys": false, "jsx-boolean-value": false, "ordered-imports": false, - "curly": [true, "ignore-same-line"] + "curly": [true, "ignore-same-line"], }, "defaultSeverity": "warning" } From 76974882101122b6d659433b9c9deb3f901142fe Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 11:03:31 -0500 Subject: [PATCH 05/35] Initial Routing implementation, see routes.ts Defined two routes: - /home - /favs Default redirect to /home --- package.json | 9 +- src/App.tsx | 24 +- src/components/AppNav.tsx | 37 +++ src/components/FavsView.tsx | 5 + src/components/HomeView.tsx | 5 + src/components/Search.tsx | 7 + src/components/presentational/Header.tsx | 9 + src/components/presentational/Layout.tsx | 11 + src/index.tsx | 5 +- src/routes.ts | 18 ++ tslint.json | 2 +- yarn.lock | 363 ++++++++++++++++++++++- 12 files changed, 466 insertions(+), 29 deletions(-) create mode 100644 src/components/AppNav.tsx create mode 100644 src/components/FavsView.tsx create mode 100644 src/components/HomeView.tsx create mode 100644 src/components/Search.tsx create mode 100644 src/components/presentational/Header.tsx create mode 100644 src/components/presentational/Layout.tsx create mode 100644 src/routes.ts diff --git a/package.json b/package.json index 3f8b3d52..3c8a2216 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "dependencies": { "react": "^16.4.1", "react-dom": "^16.4.1", - "react-scripts-ts": "2.16.0" + "react-router-dom": "^4.3.1", + "react-scripts-ts": "2.16.0", + "styled-components": "^3.3.3" }, "jest": { "collectCoverageFrom": [ @@ -30,12 +32,13 @@ "jest": "react-scripts-ts test --env=jsdom --coverage" }, "devDependencies": { - "enzyme": "^3.3.0", - "enzyme-adapter-react-16": "^1.1.1", "@types/jest": "^23.1.4", "@types/node": "^10.5.2", "@types/react": "^16.4.6", "@types/react-dom": "^16.0.6", + "@types/react-router-dom": "^4.2.7", + "enzyme": "^3.3.0", + "enzyme-adapter-react-16": "^1.1.1", "typescript": "^2.9.2" } } diff --git a/src/App.tsx b/src/App.tsx index c1bc27cc..eec06753 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,20 +1,24 @@ import * as React from 'react'; import './App.css'; -import logo from './logo.svg'; +import { Switch, Route, Redirect } from 'react-router-dom'; +import ROUTES from './routes'; +import Header from './components/presentational/Header'; +import { Container } from './components/presentational/Layout'; class App extends React.Component { public render() { return ( -
-
- logo -

Welcome to React

-
-

- To get started, edit src/App.tsx and save to reload. -

-
+ +
+
+ + {ROUTES.map(({path, component, exact}) => + )} + + +
+ ); } } diff --git a/src/components/AppNav.tsx b/src/components/AppNav.tsx new file mode 100644 index 00000000..92432e75 --- /dev/null +++ b/src/components/AppNav.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import { NavLink } from 'react-router-dom'; +import ROUTES from '../routes'; +import styled from 'styled-components'; +import Search from './Search'; + +const _nav = styled.nav` + padding: 16px 0; + background-color: #2C3E50; + + ul { + display: flex; + justify-content: space-around; + } + + a { text-decoration: none; color: #FFF; } + + .active { + font-weight: bold; + color: #FC4349; + } +`; + +const LINKS = ROUTES.map(({path, content}) => +
  • {content}
  • ); +class AppNav extends React.Component { + public render() { + return (<_nav> +
      + {LINKS} + +
    + ); + } +} + +export default AppNav; diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx new file mode 100644 index 00000000..dc4e4d05 --- /dev/null +++ b/src/components/FavsView.tsx @@ -0,0 +1,5 @@ +import * as React from 'react'; + +const FavsView = (props: any) =>

    Favs View

    + +export default FavsView; \ No newline at end of file diff --git a/src/components/HomeView.tsx b/src/components/HomeView.tsx new file mode 100644 index 00000000..571d4188 --- /dev/null +++ b/src/components/HomeView.tsx @@ -0,0 +1,5 @@ +import * as React from 'react'; + +const HomeView = (props: any) =>

    Home View

    + +export default HomeView; \ No newline at end of file diff --git a/src/components/Search.tsx b/src/components/Search.tsx new file mode 100644 index 00000000..559b346b --- /dev/null +++ b/src/components/Search.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; + +const Search = (props: any) => { + return ; +} + +export default Search; \ No newline at end of file diff --git a/src/components/presentational/Header.tsx b/src/components/presentational/Header.tsx new file mode 100644 index 00000000..148a1e81 --- /dev/null +++ b/src/components/presentational/Header.tsx @@ -0,0 +1,9 @@ +import * as React from 'react'; +import AppNav from '../AppNav'; +import { Container } from './Layout'; + +const Header = (props: any) => { + return ; +} + +export default Header; \ No newline at end of file diff --git a/src/components/presentational/Layout.tsx b/src/components/presentational/Layout.tsx new file mode 100644 index 00000000..83a6cc4e --- /dev/null +++ b/src/components/presentational/Layout.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; +import styled from 'styled-components'; + +export const Container = styled.header` + width: 100%; + max-width: 960px; + margin: 0 auto; + padding: 0 20px; + display: flex; + flex-direction: column; +`; diff --git a/src/index.tsx b/src/index.tsx index 02e75b53..026bfa28 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,12 +1,15 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; +import {BrowserRouter as Router} from 'react-router-dom'; import App from './App'; import './normalize.css'; import './index.css'; import registerServiceWorker from './registerServiceWorker'; ReactDOM.render( - , + + + , document.getElementById('root') as HTMLElement ); registerServiceWorker(); diff --git a/src/routes.ts b/src/routes.ts new file mode 100644 index 00000000..13aeaf38 --- /dev/null +++ b/src/routes.ts @@ -0,0 +1,18 @@ +import HomeView from './components/HomeView'; +import FavsView from './components/FavsView'; + +const ROUTES = [ + { + path: '/home', + exact: true, + content: 'Home', + component: HomeView + }, + { + path: '/favs', + content: 'Favorites', + component: FavsView + } +]; + +export default ROUTES; \ No newline at end of file diff --git a/tslint.json b/tslint.json index c6a98b69..5cd6e545 100644 --- a/tslint.json +++ b/tslint.json @@ -13,7 +13,7 @@ "object-literal-sort-keys": false, "jsx-boolean-value": false, "ordered-imports": false, - "curly": [true, "ignore-same-line"], + "curly": [true, "ignore-same-line"] }, "defaultSeverity": "warning" } diff --git a/yarn.lock b/yarn.lock index d3620ac8..b6172f30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,10 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@types/history@*": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0" + "@types/jest@^23.1.4": version "23.1.4" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.4.tgz#71e1e2d08b1db742f479ee2795536ebc999a2419" @@ -31,6 +35,21 @@ "@types/node" "*" "@types/react" "*" +"@types/react-router-dom@^4.2.7": + version "4.2.7" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.7.tgz#9d36bfe175f916dd8d7b6b0237feed6cce376b4c" + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "4.0.28" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.28.tgz#b0445fc38613c81e92ca9ec0e08ab36697d51003" + dependencies: + "@types/history" "*" + "@types/react" "*" + "@types/react@*", "@types/react@^16.4.6": version "16.4.6" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada" @@ -1207,6 +1226,13 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.0.3: + version "5.1.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.1.0.tgz#c913e43678c7cb7c8bd16afbcddb6c5505e8f9fe" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1349,6 +1375,17 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +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 "^4.15.0" + parse5 "^3.0.1" + chokidar@^1.6.0, chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1518,6 +1555,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.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1745,6 +1786,10 @@ crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -1768,7 +1813,7 @@ css-loader@0.28.7: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" -css-select@^1.1.0: +css-select@^1.1.0, css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" dependencies: @@ -1785,6 +1830,14 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-to-react-native@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.2.1.tgz#7f3f4c95de65501b8720c87bf0caf1f39073b88e" + dependencies: + css-color-keywords "^1.0.0" + fbjs "^0.8.5" + postcss-value-parser "^3.3.0" + css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" @@ -2044,6 +2097,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-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2067,7 +2124,7 @@ dom-converter@~0.1: dependencies: utila "~0.3" -dom-serializer@0: +dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" dependencies: @@ -2084,7 +2141,7 @@ domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" -domelementtype@1: +domelementtype@1, domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" @@ -2104,6 +2161,12 @@ domhandler@2.1: dependencies: domelementtype "1" +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + dependencies: + domelementtype "1" + domutils@1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" @@ -2117,6 +2180,13 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + dependencies: + dom-serializer "0" + domelementtype "1" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -2203,10 +2273,51 @@ enhanced-resolve@^3.0.0, enhanced-resolve@^3.4.0: object-assign "^4.0.1" tapable "^0.2.7" -entities@~1.1.1: +entities@^1.1.1, entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" +enzyme-adapter-react-16@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz#a8f4278b47e082fbca14f5bfb1ee50ee650717b4" + dependencies: + enzyme-adapter-utils "^1.3.0" + lodash "^4.17.4" + object.assign "^4.0.4" + object.values "^1.0.4" + prop-types "^15.6.0" + react-reconciler "^0.7.0" + react-test-renderer "^16.0.0-0" + +enzyme-adapter-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.3.0.tgz#d6c85756826c257a8544d362cc7a67e97ea698c7" + dependencies: + lodash "^4.17.4" + object.assign "^4.0.4" + prop-types "^15.6.0" + +enzyme@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.3.0.tgz#0971abd167f2d4bf3f5bd508229e1c4b6dc50479" + dependencies: + cheerio "^1.0.0-rc.2" + function.prototype.name "^1.0.3" + has "^1.0.1" + is-boolean-object "^1.0.0" + is-callable "^1.1.3" + is-number-object "^1.0.3" + is-string "^1.0.4" + is-subset "^0.1.1" + lodash "^4.17.4" + object-inspect "^1.5.0" + object-is "^1.0.1" + object.assign "^4.1.0" + object.entries "^1.0.4" + object.values "^1.0.4" + raf "^3.4.0" + rst-selector-parser "^2.2.3" + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -2219,7 +2330,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -2577,7 +2688,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.16: +fbjs@^0.8.16, fbjs@^0.8.5: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" dependencies: @@ -2801,10 +2912,18 @@ fsevents@^1.0.0, fsevents@^1.1.3, fsevents@^1.2.2, fsevents@^1.2.3: nan "^2.9.2" node-pre-gyp "^0.10.0" -function-bind@^1.1.1: +function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +function.prototype.name@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + is-callable "^1.1.3" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2999,6 +3118,10 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3054,6 +3177,16 @@ he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" +history@^4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b" + dependencies: + invariant "^2.2.1" + loose-envify "^1.2.0" + resolve-pathname "^2.2.0" + value-equal "^0.4.0" + warning "^3.0.0" + hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -3062,6 +3195,10 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoist-non-react-statics@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -3125,6 +3262,17 @@ html-webpack-plugin@2.29.0: pretty-error "^2.0.2" toposort "^1.0.0" +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + htmlparser2@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" @@ -3307,7 +3455,7 @@ interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" -invariant@^2.2.2: +invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -3351,6 +3499,10 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-boolean-object@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -3484,6 +3636,10 @@ is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" +is-number-object@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799" + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -3564,6 +3720,14 @@ 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" +is-string@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" + +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" @@ -4214,6 +4378,10 @@ lodash.endswith@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + lodash.isfunction@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -4251,7 +4419,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0: +"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -4263,7 +4431,7 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -4578,6 +4746,15 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +nearley@^2.7.10: + version "2.13.0" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.13.0.tgz#6e7b0f4e68bfc3e74c99eaef2eda39e513143439" + dependencies: + nomnom "~1.6.2" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + semver "^5.4.1" + needle@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" @@ -4671,6 +4848,13 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +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@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -4766,7 +4950,15 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.8: +object-inspect@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + +object-is@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" + +object-keys@^1.0.11, object-keys@^1.0.8: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -4776,6 +4968,24 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.0.4, object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.entries@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -4796,6 +5006,15 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.values@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.6.1" + function-bind "^1.1.0" + has "^1.0.1" + obuf@^1.0.0, obuf@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -4975,6 +5194,12 @@ parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" +parse5@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" + dependencies: + "@types/node" "*" + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -5021,7 +5246,7 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" -path-to-regexp@^1.0.1: +path-to-regexp@^1.0.1, path-to-regexp@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" dependencies: @@ -5436,7 +5661,7 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.6.0: +prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.1: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: @@ -5530,12 +5755,23 @@ querystringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" -raf@3.4.0: +raf@3.4.0, raf@^3.4.0: 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" + +randexp@0.4.6: + 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@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" @@ -5615,6 +5851,42 @@ react-error-overlay@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4" +react-is@^16.3.1, react-is@^16.4.1: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e" + +react-reconciler@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +react-router-dom@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" + dependencies: + history "^4.7.2" + invariant "^2.2.4" + loose-envify "^1.3.1" + prop-types "^15.6.1" + react-router "^4.3.1" + warning "^4.0.1" + +react-router@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e" + dependencies: + history "^4.7.2" + hoist-non-react-statics "^2.5.0" + invariant "^2.2.4" + loose-envify "^1.3.1" + path-to-regexp "^1.7.0" + prop-types "^15.6.1" + warning "^4.0.1" + react-scripts-ts@2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/react-scripts-ts/-/react-scripts-ts-2.16.0.tgz#45f831a12139c3b59d6bb729c1b6ef51e0f22908" @@ -5659,6 +5931,15 @@ react-scripts-ts@2.16.0: optionalDependencies: fsevents "^1.1.3" +react-test-renderer@^16.0.0-0: + version "16.4.1" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70" + dependencies: + fbjs "^0.8.16" + object-assign "^4.1.1" + prop-types "^15.6.0" + react-is "^16.4.1" + react@^16.4.1: version "16.4.1" resolved "https://registry.yarnpkg.com/react/-/react-16.4.1.tgz#de51ba5764b5dbcd1f9079037b862bd26b82fe32" @@ -5933,6 +6214,10 @@ resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" +resolve-pathname@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -5983,6 +6268,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rst-selector-parser@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" + dependencies: + lodash.flattendeep "^4.4.0" + nearley "^2.7.10" + rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" @@ -6512,6 +6804,29 @@ style-loader@0.19.0: loader-utils "^1.0.2" schema-utils "^0.3.0" +styled-components@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-3.3.3.tgz#09e702055ab11f7a8eab8229b1c0d0b855095686" + dependencies: + buffer "^5.0.3" + css-to-react-native "^2.0.3" + fbjs "^0.8.16" + hoist-non-react-statics "^2.5.0" + is-plain-object "^2.0.1" + prop-types "^15.5.4" + react-is "^16.3.1" + stylis "^3.5.0" + stylis-rule-sheet "^0.0.10" + supports-color "^3.2.3" + +stylis-rule-sheet@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + +stylis@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.1.tgz#fd341d59f57f9aeb412bc14c9d8a8670b438e03b" + subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" @@ -6890,6 +7205,10 @@ uglifyjs-webpack-plugin@^1.1.8: webpack-sources "^1.1.0" worker-farm "^1.5.2" +underscore@~1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -7065,6 +7384,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +value-equal@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -7099,6 +7422,18 @@ walker@~1.0.5: 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" + +warning@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.1.tgz#66ce376b7fbfe8a887c22bdf0e7349d73d397745" + 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" From 5b50ea1c999c75e19bec494025597a7adf1bcfcc Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 11:33:06 -0500 Subject: [PATCH 06/35] TSLint Rule: ignore console logs warning --- tslint.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tslint.json b/tslint.json index 5cd6e545..59956dee 100644 --- a/tslint.json +++ b/tslint.json @@ -13,7 +13,8 @@ "object-literal-sort-keys": false, "jsx-boolean-value": false, "ordered-imports": false, - "curly": [true, "ignore-same-line"] + "curly": [true, "ignore-same-line"], + "no-console": false }, "defaultSeverity": "warning" } From 40f1d7c8a1d32e1dd93bf23a88a48dc4a7868db5 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 11:38:02 -0500 Subject: [PATCH 07/35] ADD: TSConfig downlevelIteration: true In order to enable ES5 iteration support used by Redux Saga --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index f00e017b..4419f5f9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,8 @@ "noImplicitAny": true, "strictNullChecks": true, "suppressImplicitAnyIndexErrors": true, - "noUnusedLocals": false + "noUnusedLocals": false, + "downlevelIteration": true }, "exclude": [ "node_modules", From d715db1786390c8287c7106da907f968e1bebe5f Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 11:40:28 -0500 Subject: [PATCH 08/35] Initial Redux Saga Boilerplate Adding boilerplate files for Redux Saga implementation. --- package.json | 5 ++++ src/middleware/index.ts | 9 +++++++ src/reducers/favs.ts | 1 + src/reducers/home.ts | 1 + src/reducers/index.ts | 9 +++++++ src/sagas/index.ts | 13 ++++++++++ src/store/index.ts | 29 +++++++++++++++++++++ yarn.lock | 56 ++++++++++++++++++++++++++++++++++++++--- 8 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 src/middleware/index.ts create mode 100644 src/reducers/favs.ts create mode 100644 src/reducers/home.ts create mode 100644 src/reducers/index.ts create mode 100644 src/sagas/index.ts create mode 100644 src/store/index.ts diff --git a/package.json b/package.json index 3c8a2216..20f06c04 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,15 @@ "version": "0.1.0", "private": true, "dependencies": { + "axios": "^0.18.0", "react": "^16.4.1", "react-dom": "^16.4.1", + "react-redux": "^5.0.7", "react-router-dom": "^4.3.1", "react-scripts-ts": "2.16.0", + "redux": "^4.0.0", + "redux-actions": "^2.4.0", + "redux-saga": "^0.16.0", "styled-components": "^3.3.3" }, "jest": { diff --git a/src/middleware/index.ts b/src/middleware/index.ts new file mode 100644 index 00000000..52582b13 --- /dev/null +++ b/src/middleware/index.ts @@ -0,0 +1,9 @@ +import { Action } from "redux"; + +const gifsFetcher = (store: any) => (next: any) => (action: Action) => { + const { type } = action; + // TODO: Fetch gifs + return next(action); + }; + +export default gifsFetcher; \ No newline at end of file diff --git a/src/reducers/favs.ts b/src/reducers/favs.ts new file mode 100644 index 00000000..0e8395a4 --- /dev/null +++ b/src/reducers/favs.ts @@ -0,0 +1 @@ +export default () => "OK"; \ No newline at end of file diff --git a/src/reducers/home.ts b/src/reducers/home.ts new file mode 100644 index 00000000..0e8395a4 --- /dev/null +++ b/src/reducers/home.ts @@ -0,0 +1 @@ +export default () => "OK"; \ No newline at end of file diff --git a/src/reducers/index.ts b/src/reducers/index.ts new file mode 100644 index 00000000..0247160a --- /dev/null +++ b/src/reducers/index.ts @@ -0,0 +1,9 @@ +import { combineReducers } from 'redux'; + +import home from './home'; +import favs from './favs'; + +export default combineReducers({ + home, + favs, +}); diff --git a/src/sagas/index.ts b/src/sagas/index.ts new file mode 100644 index 00000000..71044c12 --- /dev/null +++ b/src/sagas/index.ts @@ -0,0 +1,13 @@ +import { take, takeEvery } from 'redux-saga/effects'; +import { SagaIterator } from 'redux-saga'; + +function* watchGifs() { + // TODO: Implement fetching + yield takeEvery("AN_ACTION", () => console.log("Requestiong gifs...")); +} +function* rootSaga(): SagaIterator { + // TODO: implement sagas + yield* watchGifs(); +} + +export default rootSaga; \ No newline at end of file diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 00000000..6fe11600 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,29 @@ +import { createStore, applyMiddleware, compose } from 'redux'; +import createSagaMiddleware from 'redux-saga' + +import rootReducer from '../reducers'; +import gifsFetcher from '../middleware'; +import rootSaga from '../sagas/'; + + +const sagaMiddleware = createSagaMiddleware(); + +const initialState = {}; +const middleware = [ + sagaMiddleware, + gifsFetcher, +]; + +const composedEnhancers = compose( + applyMiddleware(...middleware), +); + +const store = createStore( + rootReducer, + initialState, + composedEnhancers, +); + +sagaMiddleware.run(rootSaga); + +export default store; diff --git a/yarn.lock b/yarn.lock index b6172f30..c1892be9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -371,6 +371,13 @@ aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" +axios@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + dependencies: + follow-redirects "^1.3.0" + is-buffer "^1.1.5" + babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -2794,7 +2801,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.3.0: version "1.5.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291" dependencies: @@ -3455,7 +3462,7 @@ interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" -invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -4358,6 +4365,10 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +lodash-es@^4.17.4, lodash-es@^4.17.5: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05" + lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -4419,7 +4430,7 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0: +"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -5864,6 +5875,17 @@ react-reconciler@^0.7.0: object-assign "^4.1.1" prop-types "^15.6.0" +react-redux@^5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8" + dependencies: + hoist-non-react-statics "^2.5.0" + invariant "^2.0.0" + lodash "^4.17.5" + lodash-es "^4.17.5" + loose-envify "^1.1.0" + prop-types "^15.6.0" + react-router-dom@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.3.1.tgz#4c2619fc24c4fa87c9fd18f4fb4a43fe63fbd5c6" @@ -6042,6 +6064,30 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" +reduce-reducers@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.1.5.tgz#ff77ca8068ff41007319b8b4b91533c7e0e54576" + +redux-actions@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.4.0.tgz#620df42d264af88366b4e919c46ae68da7c9ce7c" + dependencies: + invariant "^2.2.1" + lodash "^4.13.1" + lodash-es "^4.17.4" + reduce-reducers "^0.1.0" + +redux-saga@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-0.16.0.tgz#0a231db0a1489301dd980f6f2f88d8ced418f724" + +redux@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03" + dependencies: + loose-envify "^1.1.0" + symbol-observable "^1.2.0" + regenerate@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -6897,6 +6943,10 @@ sw-toolbox@^3.4.0: path-to-regexp "^1.0.1" serviceworker-cache-polyfill "^4.0.0" +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" From b988f3b2203efe9e78ee6ded61481ff4ddcc28c3 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 12:51:25 -0500 Subject: [PATCH 09/35] .gitignore .env file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d30f40ef..fbc17600 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ .env.development.local .env.test.local .env.production.local +.env npm-debug.log* yarn-debug.log* From 328279c8749ec4028f8a3dc0d57425d56c093887 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 12:53:59 -0500 Subject: [PATCH 10/35] Initial Redux markup: Wrapping app into Provider --- package.json | 2 ++ src/App.tsx | 33 ++++++++++++++++++++------------- src/index.tsx | 5 +---- yarn.lock | 11 +++++++++++ 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 20f06c04..c449babb 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { + "@types/react-redux": "^6.0.3", + "@types/redux-actions": "^2.3.0", "axios": "^0.18.0", "react": "^16.4.1", "react-dom": "^16.4.1", diff --git a/src/App.tsx b/src/App.tsx index eec06753..e5ba6212 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,26 +1,33 @@ import * as React from 'react'; -import './App.css'; - +import {BrowserRouter as Router} from 'react-router-dom'; import { Switch, Route, Redirect } from 'react-router-dom'; +import { Provider} from 'react-redux'; + +import store from './store'; import ROUTES from './routes'; import Header from './components/presentational/Header'; import { Container } from './components/presentational/Layout'; +import './App.css'; + class App extends React.Component { public render() { return ( - -
    -
    - - {ROUTES.map(({path, component, exact}) => - )} - - -
    - + + + +
    +
    + + {ROUTES.map(({path, component, exact}) => + )} + + +
    + + + ); } } - export default App; diff --git a/src/index.tsx b/src/index.tsx index 026bfa28..bf0dac8f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,15 +1,12 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; -import {BrowserRouter as Router} from 'react-router-dom'; import App from './App'; import './normalize.css'; import './index.css'; import registerServiceWorker from './registerServiceWorker'; ReactDOM.render( - - - , + , document.getElementById('root') as HTMLElement ); registerServiceWorker(); diff --git a/yarn.lock b/yarn.lock index c1892be9..571400a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,6 +35,13 @@ "@types/node" "*" "@types/react" "*" +"@types/react-redux@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.3.tgz#7e8a86cce1c453166056bce9d4eb5cab5a2cfe13" + dependencies: + "@types/react" "*" + redux "^4.0.0" + "@types/react-router-dom@^4.2.7": version "4.2.7" resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.7.tgz#9d36bfe175f916dd8d7b6b0237feed6cce376b4c" @@ -56,6 +63,10 @@ dependencies: csstype "^2.2.0" +"@types/redux-actions@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@types/redux-actions/-/redux-actions-2.3.0.tgz#d28d7913ec86ee9e20ecb33a1fed887ecb538149" + abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" From c1c7bc6e4380653b2fcc072711260a785853aec9 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 13:09:36 -0500 Subject: [PATCH 11/35] Iniital action: FETCH_TRENDING --- src/actions/gifs.ts | 7 +++++++ src/components/HomeView.tsx | 22 ++++++++++++++++++++-- src/middleware/index.ts | 13 ++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 src/actions/gifs.ts diff --git a/src/actions/gifs.ts b/src/actions/gifs.ts new file mode 100644 index 00000000..2938ade9 --- /dev/null +++ b/src/actions/gifs.ts @@ -0,0 +1,7 @@ +import { createAction } from 'redux-actions' + +export const FETCH_TRENDING = 'FETCH_TRENDING'; +export const FETCHED_TRENDING = 'FETCHED_TRENDING'; + +export const fetch_gifs = createAction(FETCH_TRENDING); +export const fetched_gifs = createAction(FETCHED_TRENDING); \ No newline at end of file diff --git a/src/components/HomeView.tsx b/src/components/HomeView.tsx index 571d4188..9a1d263d 100644 --- a/src/components/HomeView.tsx +++ b/src/components/HomeView.tsx @@ -1,5 +1,23 @@ import * as React from 'react'; +import {connect} from 'react-redux'; +import { fetch_gifs } from '../actions/gifs'; +import { bindActionCreators, ActionCreator, Dispatch } from 'redux'; -const HomeView = (props: any) =>

    Home View

    +interface IHomeViewProps { + fetch_gifs: ActionCreator +} +class HomeView extends React.Component { + public componentDidMount() { + this.props.fetch_gifs(); + } + public render() { + return

    Home View!

    + } +} -export default HomeView; \ No newline at end of file +const mapDispatchToProps = (dispatch: Dispatch) => { + return bindActionCreators({ + fetch_gifs, + }, dispatch); +}; +export default connect(null, mapDispatchToProps)(HomeView); \ No newline at end of file diff --git a/src/middleware/index.ts b/src/middleware/index.ts index 52582b13..03620a24 100644 --- a/src/middleware/index.ts +++ b/src/middleware/index.ts @@ -1,8 +1,15 @@ -import { Action } from "redux"; +import { Action, Store, Dispatch } from "redux"; +import { FETCH_TRENDING, fetched_gifs } from '../actions/gifs'; -const gifsFetcher = (store: any) => (next: any) => (action: Action) => { +function fetchGifs(dispatch: Dispatch) { + console.log("Fetching GIFs!..."); + dispatch(fetched_gifs([ "HERE SHOULD BE THE GIFS" ])); +} + +const gifsFetcher = (store: Store) => (next: any) => (action: Action) => { const { type } = action; - // TODO: Fetch gifs + if (type === FETCH_TRENDING ) fetchGifs(store.dispatch); + return next(action); }; From 3a7277f8495bc2e73367fc49b208dbb5963bdb92 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 13:43:44 -0500 Subject: [PATCH 12/35] Giphy API functions getTrending(), search() API#getTrending() API#search(query: string) --- src/api.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/api.ts diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 00000000..af671002 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,22 @@ +import axios from 'axios'; + +const API_URL = "https://api.giphy.com/v1/gifs"; +const API_KEY = process.env.REACT_APP_GIPHY_KEY; + +const API = axios.create({ baseURL: API_URL, params: { api_key: API_KEY } }); + +export function getTrending() { + return API.get('/trending'); +} + +export function search(query: string) { + return API.get('/search', { + params: { + q: query, + limit: 25, + offset: 0, + rating: 'G', + lang: 'en' + } + }); +} \ No newline at end of file From 645fd639437ed58c497ae00806a14d9b67b1a987 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 14:50:58 -0500 Subject: [PATCH 13/35] GIF interface definition Interface for a GIF Object, more details about the schema in: https://developers.giphy.com/docs/#rendition-guide --- src/types/gif.d.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/types/gif.d.ts diff --git a/src/types/gif.d.ts b/src/types/gif.d.ts new file mode 100644 index 00000000..21cee710 --- /dev/null +++ b/src/types/gif.d.ts @@ -0,0 +1,16 @@ +export interface IImageObject { + url: string + width: number + height: number +} +export interface IGIF { + id: string + slug: string + url: string + // Image Objects. See: + // https://developers.giphy.com/docs/#rendition-guide + images: { + original: IImageObject + fixed_height: IImageObject + } +} \ No newline at end of file From 332df352220ab818e1858daaef1961c143e47ced Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 14:53:58 -0500 Subject: [PATCH 14/35] Initial GIFList Component Example using raw Component State --- src/api.ts | 2 +- src/components/HomeView.tsx | 21 ++++++++++++--- src/components/presentational/FavButton.tsx | 27 +++++++++++++++++++ src/components/presentational/GIFList.tsx | 30 +++++++++++++++++++++ 4 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 src/components/presentational/FavButton.tsx create mode 100644 src/components/presentational/GIFList.tsx diff --git a/src/api.ts b/src/api.ts index af671002..a2a9dfb0 100644 --- a/src/api.ts +++ b/src/api.ts @@ -13,7 +13,7 @@ export function search(query: string) { return API.get('/search', { params: { q: query, - limit: 25, + limit: 10, offset: 0, rating: 'G', lang: 'en' diff --git a/src/components/HomeView.tsx b/src/components/HomeView.tsx index 9a1d263d..9120000a 100644 --- a/src/components/HomeView.tsx +++ b/src/components/HomeView.tsx @@ -3,15 +3,30 @@ import {connect} from 'react-redux'; import { fetch_gifs } from '../actions/gifs'; import { bindActionCreators, ActionCreator, Dispatch } from 'redux'; +import * as API from '../api'; +import GIFList from './presentational/GIFList'; +import { IGIF } from '../types/gif'; + interface IHomeViewProps { fetch_gifs: ActionCreator } -class HomeView extends React.Component { + +interface IHomeViewState { + gifs: IGIF[] +} +class HomeView extends React.Component { + public state = { + gifs: [] + } public componentDidMount() { - this.props.fetch_gifs(); + API.getTrending().then(({data}) => this.setState({gifs: data.data})); + // API.search("GOOGLE").then(({data}) => console.log(data)); } public render() { - return

    Home View!

    + return (
    +

    Home View!

    + +
    ); } } diff --git a/src/components/presentational/FavButton.tsx b/src/components/presentational/FavButton.tsx new file mode 100644 index 00000000..96f4e58d --- /dev/null +++ b/src/components/presentational/FavButton.tsx @@ -0,0 +1,27 @@ +import * as React from 'react'; +import styled from 'styled-components'; + +const _button = styled.button` + background: none; + position: absolute; + right: 10px; + top: 10px; + height: 32px; + font-size: 20px; + line-height: 32px; + color: ${(props: any) => props.active ? "#FC4349" : "#FFF"}; + opacity: 0.7; + border: none; + width: 32px; + border-radius: 50%; + background-color: rgba(0, 0, 0, 0.5); + transition: opacity 0.25s; + + :hover { + opacity: 1.0; + } +`; + +const FavButton = (props: any) => + <_button active={props.active}>♥; +export default FavButton; \ No newline at end of file diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx new file mode 100644 index 00000000..3e13c832 --- /dev/null +++ b/src/components/presentational/GIFList.tsx @@ -0,0 +1,30 @@ +import * as React from 'react'; +import { IGIF } from '../../types/gif'; +import styled from 'styled-components'; + +import FavButton from './FavButton'; + +interface IGIFListProps { + gifs: IGIF[] +} + +const _div = styled.div` + display: flex; + flex-wrap: wrap; + justify-content: space-around; +`; +function _create_item(gif: IGIF) { + return
    + + +
    +} + +const GifList = (props: IGIFListProps) => { + return ( + <_div> + {props.gifs.map(gif => _create_item(gif))} + ); +} + +export default GifList; \ No newline at end of file From f1dd63dc9823f72d421674f13ad9c087789f72d9 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 15:32:25 -0500 Subject: [PATCH 15/35] Enable Redux Chrome Extension --- package.json | 1 + src/store/index.ts | 3 ++- yarn.lock | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c449babb..32537596 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@types/react-router-dom": "^4.2.7", "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", + "redux-devtools-extension": "^2.13.5", "typescript": "^2.9.2" } } diff --git a/src/store/index.ts b/src/store/index.ts index 6fe11600..b3aa7c3b 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,5 +1,6 @@ import { createStore, applyMiddleware, compose } from 'redux'; import createSagaMiddleware from 'redux-saga' +import { composeWithDevTools } from 'redux-devtools-extension'; import rootReducer from '../reducers'; import gifsFetcher from '../middleware'; @@ -21,7 +22,7 @@ const composedEnhancers = compose( const store = createStore( rootReducer, initialState, - composedEnhancers, + composeWithDevTools(composedEnhancers), ); sagaMiddleware.run(rootSaga); diff --git a/yarn.lock b/yarn.lock index 571400a1..199d4b2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6088,6 +6088,10 @@ redux-actions@^2.4.0: lodash-es "^4.17.4" reduce-reducers "^0.1.0" +redux-devtools-extension@^2.13.5: + version "2.13.5" + resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.5.tgz#3ff34f7227acfeef3964194f5f7fc2765e5c5a39" + redux-saga@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-0.16.0.tgz#0a231db0a1489301dd980f6f2f88d8ced418f724" From 19f4f7b50c6fa64674d64e839e735a49fae64cd1 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 15:46:31 -0500 Subject: [PATCH 16/35] Extra CSS Base Styling --- src/index.css | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/index.css b/src/index.css index ed11813c..7551ea4e 100644 --- a/src/index.css +++ b/src/index.css @@ -46,3 +46,21 @@ table { border-collapse: collapse; border-spacing: 0; } + +/* Some base styles */ +html { font-size: 62.5%; } +body { +font-size: 1.5em; +line-height: 1.6; +font-weight: 400; +font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; +color: #222; } +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 2rem; + font-weight: 300; } +h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} +h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } + +/* HELPERS */ +.center { text-align: center } From bfe89fa1c66df0588a2eda4211fb650b74734dc0 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 15:48:16 -0500 Subject: [PATCH 17/35] HomeView using Redux/Saga see reduces/index.ts Implementation of FETCHED_TRENDING and FETCH_TRENDING --- src/components/HomeView.tsx | 23 +++++++++------------ src/components/presentational/GIFList.tsx | 9 +++++--- src/middleware/index.ts | 5 ++++- src/reducers/favs.ts | 1 - src/reducers/home.ts | 1 - src/reducers/index.ts | 25 ++++++++++++++++------- 6 files changed, 38 insertions(+), 26 deletions(-) delete mode 100644 src/reducers/favs.ts delete mode 100644 src/reducers/home.ts diff --git a/src/components/HomeView.tsx b/src/components/HomeView.tsx index 9120000a..d199456a 100644 --- a/src/components/HomeView.tsx +++ b/src/components/HomeView.tsx @@ -9,30 +9,27 @@ import { IGIF } from '../types/gif'; interface IHomeViewProps { fetch_gifs: ActionCreator -} - -interface IHomeViewState { gifs: IGIF[] } -class HomeView extends React.Component { - public state = { - gifs: [] - } + +class HomeView extends React.Component { public componentDidMount() { - API.getTrending().then(({data}) => this.setState({gifs: data.data})); - // API.search("GOOGLE").then(({data}) => console.log(data)); + this.props.fetch_gifs(); } public render() { return (
    -

    Home View!

    - +

    Trending GIFS

    +
    ); } } -const mapDispatchToProps = (dispatch: Dispatch) => { +function mapStateToProps(state: any) { + return { gifs: state.trending } +} +function mapDispatchToProps(dispatch: Dispatch) { return bindActionCreators({ fetch_gifs, }, dispatch); }; -export default connect(null, mapDispatchToProps)(HomeView); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(HomeView); \ No newline at end of file diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index 3e13c832..5dfe7530 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -20,11 +20,14 @@ function _create_item(gif: IGIF) { } -const GifList = (props: IGIFListProps) => { +const GIFList = (props: IGIFListProps) => { + const { gifs } = props; return ( <_div> - {props.gifs.map(gif => _create_item(gif))} + { gifs ? + gifs.map(gif => _create_item(gif)) + :

    No GIFs found!

    } ); } -export default GifList; \ No newline at end of file +export default GIFList; \ No newline at end of file diff --git a/src/middleware/index.ts b/src/middleware/index.ts index 03620a24..6bb0c7ab 100644 --- a/src/middleware/index.ts +++ b/src/middleware/index.ts @@ -1,9 +1,12 @@ import { Action, Store, Dispatch } from "redux"; import { FETCH_TRENDING, fetched_gifs } from '../actions/gifs'; +import * as API from '../api'; + function fetchGifs(dispatch: Dispatch) { console.log("Fetching GIFs!..."); - dispatch(fetched_gifs([ "HERE SHOULD BE THE GIFS" ])); + return API.getTrending() + .then(({data}) => dispatch(fetched_gifs(data))); } const gifsFetcher = (store: Store) => (next: any) => (action: Action) => { diff --git a/src/reducers/favs.ts b/src/reducers/favs.ts deleted file mode 100644 index 0e8395a4..00000000 --- a/src/reducers/favs.ts +++ /dev/null @@ -1 +0,0 @@ -export default () => "OK"; \ No newline at end of file diff --git a/src/reducers/home.ts b/src/reducers/home.ts deleted file mode 100644 index 0e8395a4..00000000 --- a/src/reducers/home.ts +++ /dev/null @@ -1 +0,0 @@ -export default () => "OK"; \ No newline at end of file diff --git a/src/reducers/index.ts b/src/reducers/index.ts index 0247160a..e3f9c9b8 100644 --- a/src/reducers/index.ts +++ b/src/reducers/index.ts @@ -1,9 +1,20 @@ -import { combineReducers } from 'redux'; +import { combineReducers, Action, Reducer } from 'redux'; +import { FETCHED_TRENDING } from '../actions/gifs'; -import home from './home'; -import favs from './favs'; +const initialState = { + trending: [], + favs: {} +} -export default combineReducers({ - home, - favs, -}); +function gifReducer(state = initialState, action: any) { + const {type, payload} = action; + + switch (type) { + case FETCHED_TRENDING: + return {...state, trending: payload.data }; + default: + return state; + } +} + +export default gifReducer; From ec566bfb8a7e7c9cad1922866bb01725f5efdca1 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 16:47:16 -0500 Subject: [PATCH 18/35] Favorite function completed --- src/actions/gifs.ts | 12 +++-- src/components/FavsView.tsx | 2 +- src/components/presentational/FavButton.tsx | 9 +++- src/components/presentational/GIFList.tsx | 51 ++++++++++++++------- src/reducers/index.ts | 15 +++++- 5 files changed, 66 insertions(+), 23 deletions(-) diff --git a/src/actions/gifs.ts b/src/actions/gifs.ts index 2938ade9..7cda6eef 100644 --- a/src/actions/gifs.ts +++ b/src/actions/gifs.ts @@ -1,7 +1,13 @@ import { createAction } from 'redux-actions' -export const FETCH_TRENDING = 'FETCH_TRENDING'; +export const FETCH_TRENDING = 'FETCH_TRENDING'; export const FETCHED_TRENDING = 'FETCHED_TRENDING'; -export const fetch_gifs = createAction(FETCH_TRENDING); -export const fetched_gifs = createAction(FETCHED_TRENDING); \ No newline at end of file +export const ADD_FAVORITE = 'ADD_FAVORITE'; +export const REMOVE_FAVORITE = 'REMOVE_FAVORITE' +export const TOGGLE_FAVORITE = 'TOGGLE_FAVORITE'; + +export const fetch_gifs = createAction(FETCH_TRENDING); +export const fetched_gifs = createAction(FETCHED_TRENDING); + +export const toggle_favorite = createAction(TOGGLE_FAVORITE, (payload: any) => payload); \ No newline at end of file diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index dc4e4d05..a1ee53ac 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -const FavsView = (props: any) =>

    Favs View

    +const FavsView = (props: any) =>

    Favs View

    export default FavsView; \ No newline at end of file diff --git a/src/components/presentational/FavButton.tsx b/src/components/presentational/FavButton.tsx index 96f4e58d..beb57e66 100644 --- a/src/components/presentational/FavButton.tsx +++ b/src/components/presentational/FavButton.tsx @@ -22,6 +22,11 @@ const _button = styled.button` } `; -const FavButton = (props: any) => - <_button active={props.active}>♥; +interface IFavButtonProps { + active: boolean + onAddFavorite?: any +} +const FavButton = (props: IFavButtonProps) => + <_button onClick={props.onAddFavorite} active={props.active}>♥; + export default FavButton; \ No newline at end of file diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index 5dfe7530..acb5074a 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -3,9 +3,15 @@ import { IGIF } from '../../types/gif'; import styled from 'styled-components'; import FavButton from './FavButton'; +import { connect } from 'react-redux'; +import { Dispatch, bindActionCreators, Action } from 'redux'; +import { toggle_favorite } from '../../actions/gifs'; +import { ActionFunctionAny } from 'redux-actions'; interface IGIFListProps { - gifs: IGIF[] + gifs: IGIF[], + favs: IGIF[], + onToggleFavorite: any } const _div = styled.div` @@ -13,21 +19,34 @@ const _div = styled.div` flex-wrap: wrap; justify-content: space-around; `; -function _create_item(gif: IGIF) { - return
    - - -
    -} -const GIFList = (props: IGIFListProps) => { - const { gifs } = props; - return ( - <_div> - { gifs ? - gifs.map(gif => _create_item(gif)) - :

    No GIFs found!

    } - ); +class GIFList extends React.Component { + public render() { + const props = this.props; + const { gifs, onToggleFavorite, favs } = props; + return ( + <_div> + { gifs ? + gifs.map(gif => { + const callback = onToggleFavorite.bind(null, gif); + const active = favs[gif.id]; + return ( +
    + + +
    ); + }) + :

    No GIFs found!

    } + ); + } } -export default GIFList; \ No newline at end of file +function mapStateToProps(state: any) { + return { favs: {...state.favs} } +} +function mapDispatchToProps(dispatch: Dispatch) { + return bindActionCreators({ + onToggleFavorite: toggle_favorite + }, dispatch); +} +export default connect(mapStateToProps, mapDispatchToProps)(GIFList); \ No newline at end of file diff --git a/src/reducers/index.ts b/src/reducers/index.ts index e3f9c9b8..b400abfb 100644 --- a/src/reducers/index.ts +++ b/src/reducers/index.ts @@ -1,5 +1,7 @@ import { combineReducers, Action, Reducer } from 'redux'; -import { FETCHED_TRENDING } from '../actions/gifs'; +import { + FETCHED_TRENDING, + TOGGLE_FAVORITE } from '../actions/gifs'; const initialState = { trending: [], @@ -9,9 +11,20 @@ const initialState = { function gifReducer(state = initialState, action: any) { const {type, payload} = action; + if (!state.favs) state.favs = {}; + switch (type) { case FETCHED_TRENDING: return {...state, trending: payload.data }; + case TOGGLE_FAVORITE: { + const { id } = payload; + const newState = {...state}; + + if (state.favs[id]) delete newState.favs[payload.id]; + else newState.favs[id] = payload; + + return newState; + } default: return state; } From 7ea9c68b5872cef9f51f172b86528a5a4ef61327 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 16:55:42 -0500 Subject: [PATCH 19/35] Favorite View completed Just convert the favs object into an array and reuse GIFList. The Fav button also works out-of-the-box :) --- src/components/FavsView.tsx | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index a1ee53ac..adf182ed 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -1,5 +1,29 @@ import * as React from 'react'; +import { IGIF } from '../types/gif'; +import GIFList from './presentational/GIFList'; +import {connect} from 'react-redux'; +import { Dispatch, bindActionCreators } from 'redux'; -const FavsView = (props: any) =>

    Favs View

    +interface IFavsView { + gifs: IGIF[] +} -export default FavsView; \ No newline at end of file +class FavsView extends React.Component { + public render() { + return (
    +

    Your favorite GIFS

    + +
    ); + } +} + +function mapStateToProps(state: any) { + const { favs } = state; + const gifs = Object.keys(favs).map(key => favs[key]); + + return { gifs } +} +function mapDispatchToProps(dispatch: Dispatch) { + return bindActionCreators({}, dispatch); +} +export default connect(mapStateToProps, mapDispatchToProps)(FavsView); \ No newline at end of file From 98dcd6f64d170a1be7762724de7d1f2c5bf08fce Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 17:10:31 -0500 Subject: [PATCH 20/35] LocalStorage implementation Use a Middleware to store in localStorage each time the state changes. --- src/middleware/autosave.ts | 12 ++++++++++++ src/reducers/index.ts | 6 +++--- src/store/index.ts | 16 ++++++++++++++-- 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 src/middleware/autosave.ts diff --git a/src/middleware/autosave.ts b/src/middleware/autosave.ts new file mode 100644 index 00000000..f608855c --- /dev/null +++ b/src/middleware/autosave.ts @@ -0,0 +1,12 @@ +import { Store, Action } from "redux"; + +const autosave = (store: Store) => (next: any) => (action: Action) => { + const nextMiddlewares = next(action); + const stateAfterReducers = store.getState(); + + localStorage.setItem('favs', JSON.stringify(stateAfterReducers.favs)); + + return nextMiddlewares; + }; + + export default autosave; diff --git a/src/reducers/index.ts b/src/reducers/index.ts index b400abfb..b852e30f 100644 --- a/src/reducers/index.ts +++ b/src/reducers/index.ts @@ -11,16 +11,16 @@ const initialState = { function gifReducer(state = initialState, action: any) { const {type, payload} = action; - if (!state.favs) state.favs = {}; + if (!state.favs) state.favs = {}; // FIX: why it wasn't loading? switch (type) { case FETCHED_TRENDING: return {...state, trending: payload.data }; case TOGGLE_FAVORITE: { - const { id } = payload; + const { id } = payload; const newState = {...state}; - if (state.favs[id]) delete newState.favs[payload.id]; + if (state.favs[id]) delete newState.favs[id]; else newState.favs[id] = payload; return newState; diff --git a/src/store/index.ts b/src/store/index.ts index b3aa7c3b..2eade455 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -5,13 +5,25 @@ import { composeWithDevTools } from 'redux-devtools-extension'; import rootReducer from '../reducers'; import gifsFetcher from '../middleware'; import rootSaga from '../sagas/'; - +import autosave from '../middleware/autosave'; const sagaMiddleware = createSagaMiddleware(); -const initialState = {}; +function _getInitialFavs() { + const data = localStorage.getItem('favs') || ""; + try { + return JSON.parse(data); + } catch(_) { + return {} + } +} + +const initialState = { + favs: _getInitialFavs() +}; const middleware = [ sagaMiddleware, + autosave, gifsFetcher, ]; From 0327be2bb5ce0055250a93e5738a1fb25df93575 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 18:12:47 -0500 Subject: [PATCH 21/35] Search functionality Implemented Search into a Saga and into the Component --- src/actions/gifs.ts | 6 +++- src/api.ts | 2 +- src/components/FavsView.tsx | 2 +- src/components/HomeView.tsx | 2 +- src/components/Search.tsx | 37 ++++++++++++++++++++--- src/components/presentational/GIFList.tsx | 5 ++- src/sagas/index.ts | 24 ++++++++++++--- src/types/{gif.d.ts => index.d.ts} | 6 ++++ 8 files changed, 69 insertions(+), 15 deletions(-) rename src/types/{gif.d.ts => index.d.ts} (79%) diff --git a/src/actions/gifs.ts b/src/actions/gifs.ts index 7cda6eef..84e71667 100644 --- a/src/actions/gifs.ts +++ b/src/actions/gifs.ts @@ -7,7 +7,11 @@ export const ADD_FAVORITE = 'ADD_FAVORITE'; export const REMOVE_FAVORITE = 'REMOVE_FAVORITE' export const TOGGLE_FAVORITE = 'TOGGLE_FAVORITE'; +export const SEARCH_TRENDING = 'SEARCH_TRENDING'; + export const fetch_gifs = createAction(FETCH_TRENDING); export const fetched_gifs = createAction(FETCHED_TRENDING); -export const toggle_favorite = createAction(TOGGLE_FAVORITE, (payload: any) => payload); \ No newline at end of file +export const toggle_favorite = createAction(TOGGLE_FAVORITE, (payload: any) => payload); + +export const search_trending = createAction(SEARCH_TRENDING, (payload: any) => payload); \ No newline at end of file diff --git a/src/api.ts b/src/api.ts index a2a9dfb0..af671002 100644 --- a/src/api.ts +++ b/src/api.ts @@ -13,7 +13,7 @@ export function search(query: string) { return API.get('/search', { params: { q: query, - limit: 10, + limit: 25, offset: 0, rating: 'G', lang: 'en' diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index adf182ed..1d3f6a11 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { IGIF } from '../types/gif'; +import { IGIF } from '../types'; import GIFList from './presentational/GIFList'; import {connect} from 'react-redux'; import { Dispatch, bindActionCreators } from 'redux'; diff --git a/src/components/HomeView.tsx b/src/components/HomeView.tsx index d199456a..84f8765b 100644 --- a/src/components/HomeView.tsx +++ b/src/components/HomeView.tsx @@ -5,7 +5,7 @@ import { bindActionCreators, ActionCreator, Dispatch } from 'redux'; import * as API from '../api'; import GIFList from './presentational/GIFList'; -import { IGIF } from '../types/gif'; +import { IGIF } from '../types'; interface IHomeViewProps { fetch_gifs: ActionCreator diff --git a/src/components/Search.tsx b/src/components/Search.tsx index 559b346b..94da2700 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -1,7 +1,36 @@ import * as React from 'react'; +import { connect } from 'react-redux'; +import { Dispatch, bindActionCreators } from 'redux'; -const Search = (props: any) => { - return ; -} +import { search_trending, fetch_gifs as fetch_gifs_action } from '../actions/gifs'; + +class Search extends React.Component { + public onSearch = (event: React.ChangeEvent) => { + const term = event.target.value; + const { search, fetch_gifs } = this.props; + + // Search bar is cleared + if (term.length === 0 || !term) fetch_gifs(); + + // Only search with at least 3 chars + if (term.length >= 3) return search(term); + } -export default Search; \ No newline at end of file + public render() { + const { query} = this.props; + return ; + } +} +function mapStateToProps(state: any) { + return { query: state.search } +} +function mapDispatchToProps(dispatch: Dispatch) { + return bindActionCreators({ + fetch_gifs: fetch_gifs_action, + search: search_trending, + }, dispatch); +} +export default connect(mapStateToProps, mapDispatchToProps)(Search); \ No newline at end of file diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index acb5074a..37f939ac 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -1,12 +1,11 @@ import * as React from 'react'; -import { IGIF } from '../../types/gif'; +import { IGIF } from '../../types'; import styled from 'styled-components'; import FavButton from './FavButton'; import { connect } from 'react-redux'; -import { Dispatch, bindActionCreators, Action } from 'redux'; +import { Dispatch, bindActionCreators } from 'redux'; import { toggle_favorite } from '../../actions/gifs'; -import { ActionFunctionAny } from 'redux-actions'; interface IGIFListProps { gifs: IGIF[], diff --git a/src/sagas/index.ts b/src/sagas/index.ts index 71044c12..d14ba76e 100644 --- a/src/sagas/index.ts +++ b/src/sagas/index.ts @@ -1,13 +1,29 @@ -import { take, takeEvery } from 'redux-saga/effects'; +import { takeLatest, takeEvery, put, all, call, Effect, TakeEffect } from 'redux-saga/effects'; import { SagaIterator } from 'redux-saga'; +import { SEARCH_TRENDING, fetched_gifs, FETCH_TRENDING, fetch_gifs } from '../actions/gifs'; +import * as API from '../api'; +import { Action } from 'redux-actions'; function* watchGifs() { // TODO: Implement fetching yield takeEvery("AN_ACTION", () => console.log("Requestiong gifs...")); } -function* rootSaga(): SagaIterator { - // TODO: implement sagas - yield* watchGifs(); + +function* searchTrending(action: Action) { + console.log('Searching in Trending...'); + const { data } = yield(call(API.search, action.payload)); + console.log(action, data); + + yield put(fetched_gifs(data)); +} + +function* watchSearchTrending() { + yield takeLatest(SEARCH_TRENDING, searchTrending); +} +function* rootSaga() { + yield all([ + watchSearchTrending(), + ]); } export default rootSaga; \ No newline at end of file diff --git a/src/types/gif.d.ts b/src/types/index.d.ts similarity index 79% rename from src/types/gif.d.ts rename to src/types/index.d.ts index 21cee710..91d6c1cd 100644 --- a/src/types/gif.d.ts +++ b/src/types/index.d.ts @@ -13,4 +13,10 @@ export interface IGIF { original: IImageObject fixed_height: IImageObject } +} + +export interface AppState { + favs: any + trending: IGIF[] + search: string } \ No newline at end of file From a8a36d13451c6d9f81c93939654610db316a6135 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Sun, 8 Jul 2018 22:54:05 -0500 Subject: [PATCH 22/35] Favs Search implemented See `reducers` and FavsSearch component --- src/actions/gifs.ts | 6 +++++- src/components/FavsSearch.tsx | 25 +++++++++++++++++++++++++ src/components/FavsView.tsx | 14 +++++++++++--- src/components/Search.tsx | 2 +- src/reducers/index.ts | 5 ++++- src/types/index.d.ts | 1 + 6 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/components/FavsSearch.tsx diff --git a/src/actions/gifs.ts b/src/actions/gifs.ts index 84e71667..3be14c39 100644 --- a/src/actions/gifs.ts +++ b/src/actions/gifs.ts @@ -9,9 +9,13 @@ export const TOGGLE_FAVORITE = 'TOGGLE_FAVORITE'; export const SEARCH_TRENDING = 'SEARCH_TRENDING'; +export const FILTER_FAVS = 'FILTER_FAVS'; + export const fetch_gifs = createAction(FETCH_TRENDING); export const fetched_gifs = createAction(FETCHED_TRENDING); export const toggle_favorite = createAction(TOGGLE_FAVORITE, (payload: any) => payload); -export const search_trending = createAction(SEARCH_TRENDING, (payload: any) => payload); \ No newline at end of file +export const search_trending = createAction(SEARCH_TRENDING, (payload: any) => payload); + +export const filter_favs = createAction(FILTER_FAVS, (payload: any) => payload); \ No newline at end of file diff --git a/src/components/FavsSearch.tsx b/src/components/FavsSearch.tsx new file mode 100644 index 00000000..e7514681 --- /dev/null +++ b/src/components/FavsSearch.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; +import { connect } from 'react-redux'; +import { Dispatch, bindActionCreators } from 'redux'; + +import { filter_favs as filter_favs_action } from '../actions/gifs'; + +class FavsSearch extends React.Component { + public onSearch = (event: React.ChangeEvent) => { + const term = event.target.value; + return this.props.filter_favs(term); + } + + public render() { + return ; + } +} + +function mapDispatchToProps(dispatch: Dispatch) { + return bindActionCreators({ + filter_favs: filter_favs_action, + }, dispatch); +} +export default connect(null, mapDispatchToProps)(FavsSearch); \ No newline at end of file diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index 1d3f6a11..e6790c7e 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -3,6 +3,7 @@ import { IGIF } from '../types'; import GIFList from './presentational/GIFList'; import {connect} from 'react-redux'; import { Dispatch, bindActionCreators } from 'redux'; +import FavsSearch from './FavsSearch'; interface IFavsView { gifs: IGIF[] @@ -12,16 +13,23 @@ class FavsView extends React.Component { public render() { return (

    Your favorite GIFS

    +
    ); } } -function mapStateToProps(state: any) { - const { favs } = state; +function filterFavs(favs: object, query: string) { const gifs = Object.keys(favs).map(key => favs[key]); - return { gifs } + // Don't filter if there is no query term + if (!query || query.length === 0) return gifs; + + return gifs.filter((gif: IGIF) => gif.title.includes(query)); +} + +function mapStateToProps(state: any) { + return { gifs: filterFavs(state.favs, state.filter_favs) } } function mapDispatchToProps(dispatch: Dispatch) { return bindActionCreators({}, dispatch); diff --git a/src/components/Search.tsx b/src/components/Search.tsx index 94da2700..0791686c 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -17,7 +17,7 @@ class Search extends React.Component { } public render() { - const { query} = this.props; + const { query } = this.props; return Date: Sun, 8 Jul 2018 23:49:44 -0500 Subject: [PATCH 23/35] General styling improvements --- src/App.css | 31 ++------------------ src/components/AppNav.tsx | 24 +++++++++++----- src/components/FavsSearch.tsx | 10 ++++++- src/components/FavsView.tsx | 11 ++++++- src/components/Search.tsx | 10 ++++++- src/components/presentational/FavButton.tsx | 6 ++-- src/components/presentational/GIFList.tsx | 32 +++++++++++++++++++-- src/components/presentational/Layout.tsx | 7 ++++- 8 files changed, 85 insertions(+), 46 deletions(-) diff --git a/src/App.css b/src/App.css index c5c6e8a6..c24c3ded 100644 --- a/src/App.css +++ b/src/App.css @@ -1,28 +1,3 @@ -.App { - text-align: center; -} - -.App-logo { - animation: App-logo-spin infinite 20s linear; - height: 80px; -} - -.App-header { - background-color: #222; - height: 150px; - padding: 20px; - color: white; -} - -.App-title { - font-size: 1.5em; -} - -.App-intro { - font-size: large; -} - -@keyframes App-logo-spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} +html { + background-color: #2C3E50; +} \ No newline at end of file diff --git a/src/components/AppNav.tsx b/src/components/AppNav.tsx index 92432e75..4c9f73dd 100644 --- a/src/components/AppNav.tsx +++ b/src/components/AppNav.tsx @@ -5,30 +5,40 @@ import styled from 'styled-components'; import Search from './Search'; const _nav = styled.nav` - padding: 16px 0; - background-color: #2C3E50; + border-bottom: 1px solid #FC4349; + margin-bottom: 1em; + color: #6DBCDB; + font-weight: bold; ul { display: flex; justify-content: space-around; + text-align: center; + align-items: center; + height: 3.5em; } - a { text-decoration: none; color: #FFF; } + li { flex: 1; } - .active { - font-weight: bold; - color: #FC4349; + a { + text-decoration: none; + color: inherit; + padding: 1em; } + + .active { color: #FC4349 } + .search-bar { flex: 1; } `; const LINKS = ROUTES.map(({path, content}) =>
  • {content}
  • ); + class AppNav extends React.Component { public render() { return (<_nav>
      {LINKS} - +
    ); } diff --git a/src/components/FavsSearch.tsx b/src/components/FavsSearch.tsx index e7514681..4f800789 100644 --- a/src/components/FavsSearch.tsx +++ b/src/components/FavsSearch.tsx @@ -4,6 +4,14 @@ import { Dispatch, bindActionCreators } from 'redux'; import { filter_favs as filter_favs_action } from '../actions/gifs'; +import styled from 'styled-components'; + +const _input = styled.input` + width: 100%; + padding: 6px; + border-radius: 20px; +`; + class FavsSearch extends React.Component { public onSearch = (event: React.ChangeEvent) => { const term = event.target.value; @@ -11,7 +19,7 @@ class FavsSearch extends React.Component { } public render() { - return ; } diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index e6790c7e..53211338 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -4,16 +4,25 @@ import GIFList from './presentational/GIFList'; import {connect} from 'react-redux'; import { Dispatch, bindActionCreators } from 'redux'; import FavsSearch from './FavsSearch'; +import styled from 'styled-components'; interface IFavsView { gifs: IGIF[] } +const _div_search = styled.div` + width: 100%; + max-width: 320px; + margin: 0 auto; +`; + class FavsView extends React.Component { public render() { return (

    Your favorite GIFS

    - + <_div_search> + +
    ); } diff --git a/src/components/Search.tsx b/src/components/Search.tsx index 0791686c..82506d3f 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -4,6 +4,14 @@ import { Dispatch, bindActionCreators } from 'redux'; import { search_trending, fetch_gifs as fetch_gifs_action } from '../actions/gifs'; +import styled from 'styled-components'; + +const _input = styled.input` + width: 80%; + padding: 6px; + border-radius: 20px; +`; + class Search extends React.Component { public onSearch = (event: React.ChangeEvent) => { const term = event.target.value; @@ -18,7 +26,7 @@ class Search extends React.Component { public render() { const { query } = this.props; - return ; diff --git a/src/components/presentational/FavButton.tsx b/src/components/presentational/FavButton.tsx index beb57e66..2a1b9486 100644 --- a/src/components/presentational/FavButton.tsx +++ b/src/components/presentational/FavButton.tsx @@ -3,18 +3,16 @@ import styled from 'styled-components'; const _button = styled.button` background: none; - position: absolute; - right: 10px; - top: 10px; height: 32px; font-size: 20px; line-height: 32px; color: ${(props: any) => props.active ? "#FC4349" : "#FFF"}; + margin: 10px; opacity: 0.7; border: none; width: 32px; border-radius: 50%; - background-color: rgba(0, 0, 0, 0.5); + /* background-color: rgba(0, 0, 0, 0.5); */ transition: opacity 0.25s; :hover { diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index 37f939ac..3cd1d68e 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -19,6 +19,29 @@ const _div = styled.div` justify-content: space-around; `; +const _gif_div = styled.div` + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + margin: 1em; +`; +const _gif_title = styled.p` + position: absolute; + top: 0px; + min-height: 32px; + text-align: center; + background-color: rgba(0,0,0, 0.5); + color: #FFF; + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + small { padding: 1em; text-align: center; } +`; + class GIFList extends React.Component { public render() { const props = this.props; @@ -30,10 +53,13 @@ class GIFList extends React.Component { const callback = onToggleFavorite.bind(null, gif); const active = favs[gif.id]; return ( -
    - + <_gif_div key={gif.id}> + <_gif_title> + {gif.title} + + -
    ); + ); }) :

    No GIFs found!

    } ); diff --git a/src/components/presentational/Layout.tsx b/src/components/presentational/Layout.tsx index 83a6cc4e..6e4fead2 100644 --- a/src/components/presentational/Layout.tsx +++ b/src/components/presentational/Layout.tsx @@ -3,9 +3,14 @@ import styled from 'styled-components'; export const Container = styled.header` width: 100%; - max-width: 960px; + max-width: 100vw; margin: 0 auto; padding: 0 20px; display: flex; + box-sizing: border-box; flex-direction: column; + background-color: #2C3E50; + color: #FFF; + + input { color: #333; } `; From d478cdef563fb5979c5d5109923390d708c73336 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Tue, 10 Jul 2018 17:15:51 -0500 Subject: [PATCH 24/35] Styling migration to lecture best practices Creation of Component*.style.ts files --- src/App.css | 3 - src/App.style.ts | 1 + src/App.tsx | 2 +- src/components/AppNav.tsx | 3 +- src/components/FavsSearch.tsx | 11 +-- src/components/FavsView.style.ts | 7 ++ src/components/FavsView.tsx | 9 +-- src/components/HomeView.tsx | 1 - src/components/Search.style.ts | 17 +++++ src/components/Search.tsx | 13 +--- .../presentational/GIFList.style.ts | 30 ++++++++ src/components/presentational/GIFList.tsx | 33 +-------- src/components/presentational/Layout.tsx | 2 - src/index.css | 66 ----------------- src/index.tsx | 1 - src/logo.svg | 7 -- src/styles/App.global.ts | 73 +++++++++++++++++++ 17 files changed, 139 insertions(+), 140 deletions(-) delete mode 100644 src/App.css create mode 100644 src/App.style.ts create mode 100644 src/components/FavsView.style.ts create mode 100644 src/components/Search.style.ts create mode 100644 src/components/presentational/GIFList.style.ts delete mode 100644 src/index.css delete mode 100644 src/logo.svg create mode 100644 src/styles/App.global.ts diff --git a/src/App.css b/src/App.css deleted file mode 100644 index c24c3ded..00000000 --- a/src/App.css +++ /dev/null @@ -1,3 +0,0 @@ -html { - background-color: #2C3E50; -} \ No newline at end of file diff --git a/src/App.style.ts b/src/App.style.ts new file mode 100644 index 00000000..f41abcdf --- /dev/null +++ b/src/App.style.ts @@ -0,0 +1 @@ +import './styles/App.global' \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index e5ba6212..0207857e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,7 +8,7 @@ import ROUTES from './routes'; import Header from './components/presentational/Header'; import { Container } from './components/presentational/Layout'; -import './App.css'; +import './App.style' class App extends React.Component { public render() { diff --git a/src/components/AppNav.tsx b/src/components/AppNav.tsx index 4c9f73dd..02689eb0 100644 --- a/src/components/AppNav.tsx +++ b/src/components/AppNav.tsx @@ -27,7 +27,6 @@ const _nav = styled.nav` } .active { color: #FC4349 } - .search-bar { flex: 1; } `; const LINKS = ROUTES.map(({path, content}) => @@ -38,7 +37,7 @@ class AppNav extends React.Component { return (<_nav>
      {LINKS} -
    • +
    ); } diff --git a/src/components/FavsSearch.tsx b/src/components/FavsSearch.tsx index 4f800789..87886ce7 100644 --- a/src/components/FavsSearch.tsx +++ b/src/components/FavsSearch.tsx @@ -3,14 +3,7 @@ import { connect } from 'react-redux'; import { Dispatch, bindActionCreators } from 'redux'; import { filter_favs as filter_favs_action } from '../actions/gifs'; - -import styled from 'styled-components'; - -const _input = styled.input` - width: 100%; - padding: 6px; - border-radius: 20px; -`; +import { SearchInput } from './Search.style'; class FavsSearch extends React.Component { public onSearch = (event: React.ChangeEvent) => { @@ -19,7 +12,7 @@ class FavsSearch extends React.Component { } public render() { - return <_input type='text' + return ; } diff --git a/src/components/FavsView.style.ts b/src/components/FavsView.style.ts new file mode 100644 index 00000000..3c77a1bf --- /dev/null +++ b/src/components/FavsView.style.ts @@ -0,0 +1,7 @@ +import styled from 'styled-components'; + +export const _div_search = styled.div` + width: 100%; + max-width: 320px; + margin: 0 auto; +`; diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index 53211338..9d95c62f 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -4,18 +4,13 @@ import GIFList from './presentational/GIFList'; import {connect} from 'react-redux'; import { Dispatch, bindActionCreators } from 'redux'; import FavsSearch from './FavsSearch'; -import styled from 'styled-components'; + +import { _div_search } from './FavsView.style' interface IFavsView { gifs: IGIF[] } -const _div_search = styled.div` - width: 100%; - max-width: 320px; - margin: 0 auto; -`; - class FavsView extends React.Component { public render() { return (
    diff --git a/src/components/HomeView.tsx b/src/components/HomeView.tsx index 84f8765b..9006586a 100644 --- a/src/components/HomeView.tsx +++ b/src/components/HomeView.tsx @@ -3,7 +3,6 @@ import {connect} from 'react-redux'; import { fetch_gifs } from '../actions/gifs'; import { bindActionCreators, ActionCreator, Dispatch } from 'redux'; -import * as API from '../api'; import GIFList from './presentational/GIFList'; import { IGIF } from '../types'; diff --git a/src/components/Search.style.ts b/src/components/Search.style.ts new file mode 100644 index 00000000..e62e6ec0 --- /dev/null +++ b/src/components/Search.style.ts @@ -0,0 +1,17 @@ +import styled from 'styled-components'; + +export const SearchInput = styled.input.attrs({ + type: 'text', + placeholder: "Search..." +})` + width: 100%; + padding: 6px; + margin: 0 auto; + box-shadow: none; + color: #333; + box-sizing: border-box; + + :focus { + outline: none; + } +` \ No newline at end of file diff --git a/src/components/Search.tsx b/src/components/Search.tsx index 82506d3f..e95e7f83 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -4,13 +4,7 @@ import { Dispatch, bindActionCreators } from 'redux'; import { search_trending, fetch_gifs as fetch_gifs_action } from '../actions/gifs'; -import styled from 'styled-components'; - -const _input = styled.input` - width: 80%; - padding: 6px; - border-radius: 20px; -`; +import { SearchInput } from './Search.style'; class Search extends React.Component { public onSearch = (event: React.ChangeEvent) => { @@ -26,10 +20,9 @@ class Search extends React.Component { public render() { const { query } = this.props; - return <_input onChange={this.onSearch} + return ; + placeholder='Search in trending...' />; } } function mapStateToProps(state: any) { diff --git a/src/components/presentational/GIFList.style.ts b/src/components/presentational/GIFList.style.ts new file mode 100644 index 00000000..7ecf3c3b --- /dev/null +++ b/src/components/presentational/GIFList.style.ts @@ -0,0 +1,30 @@ +import styled from 'styled-components'; + +export const _div = styled.div` + display: flex; + flex-wrap: wrap; + justify-content: space-around; +`; + +export const _gif_div = styled.div` + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + margin: 1em; +`; +export const _gif_title = styled.p` + position: absolute; + top: 0px; + min-height: 32px; + text-align: center; + background-color: rgba(0,0,0, 0.5); + color: #FFF; + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + + small { padding: 1em; text-align: center; } +`; diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index 3cd1d68e..ce55f1a2 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -1,47 +1,18 @@ import * as React from 'react'; import { IGIF } from '../../types'; -import styled from 'styled-components'; import FavButton from './FavButton'; import { connect } from 'react-redux'; import { Dispatch, bindActionCreators } from 'redux'; import { toggle_favorite } from '../../actions/gifs'; +import {_div, _gif_div, _gif_title} from './GIFList.style' + interface IGIFListProps { gifs: IGIF[], favs: IGIF[], onToggleFavorite: any } - -const _div = styled.div` - display: flex; - flex-wrap: wrap; - justify-content: space-around; -`; - -const _gif_div = styled.div` - position: relative; - overflow: hidden; - display: flex; - flex-direction: column; - margin: 1em; -`; -const _gif_title = styled.p` - position: absolute; - top: 0px; - min-height: 32px; - text-align: center; - background-color: rgba(0,0,0, 0.5); - color: #FFF; - width: 100%; - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - - small { padding: 1em; text-align: center; } -`; - class GIFList extends React.Component { public render() { const props = this.props; diff --git a/src/components/presentational/Layout.tsx b/src/components/presentational/Layout.tsx index 6e4fead2..1424adad 100644 --- a/src/components/presentational/Layout.tsx +++ b/src/components/presentational/Layout.tsx @@ -11,6 +11,4 @@ export const Container = styled.header` flex-direction: column; background-color: #2C3E50; color: #FFF; - - input { color: #333; } `; diff --git a/src/index.css b/src/index.css deleted file mode 100644 index 7551ea4e..00000000 --- a/src/index.css +++ /dev/null @@ -1,66 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v2.0 | 20110126 - License: none (public domain) -*/ - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} -body { - line-height: 1; -} -ol, ul { - list-style: none; -} -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -} - -/* Some base styles */ -html { font-size: 62.5%; } -body { -font-size: 1.5em; -line-height: 1.6; -font-weight: 400; -font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; -color: #222; } -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 2rem; - font-weight: 300; } -h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} -h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } - -/* HELPERS */ -.center { text-align: center } diff --git a/src/index.tsx b/src/index.tsx index bf0dac8f..ba162443 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -2,7 +2,6 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; import App from './App'; import './normalize.css'; -import './index.css'; import registerServiceWorker from './registerServiceWorker'; ReactDOM.render( diff --git a/src/logo.svg b/src/logo.svg deleted file mode 100644 index 6b60c104..00000000 --- a/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/styles/App.global.ts b/src/styles/App.global.ts new file mode 100644 index 00000000..57cf6c5a --- /dev/null +++ b/src/styles/App.global.ts @@ -0,0 +1,73 @@ +import { injectGlobal } from 'styled-components'; + +// tslint:disable-next-line +injectGlobal` + + /* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) + */ + + html, body, div, span, applet, object, iframe, + h1, h2, h3, h4, h5, h6, p, blockquote, pre, + a, abbr, acronym, address, big, cite, code, + del, dfn, em, img, ins, kbd, q, s, samp, + small, strike, strong, sub, sup, tt, var, + b, u, i, center, + dl, dt, dd, ol, ul, li, + fieldset, form, label, legend, + table, caption, tbody, tfoot, thead, tr, th, td, + article, aside, canvas, details, embed, + figure, figcaption, footer, header, hgroup, + menu, nav, output, ruby, section, summary, + time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + } + /* HTML5 display-role reset for older browsers */ + article, aside, details, figcaption, figure, + footer, header, hgroup, menu, nav, section { + display: block; + } + body { + line-height: 1; + } + ol, ul { + list-style: none; + } + blockquote, q { + quotes: none; + } + blockquote:before, blockquote:after, + q:before, q:after { + content: ''; + content: none; + } + table { + border-collapse: collapse; + border-spacing: 0; + } + + /* Some base styles */ + html { font-size: 62.5%; background-color: #2C3E50; } + body { + font-size: 1.5em; + line-height: 1.6; + font-weight: 400; + font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #222; } + h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 2rem; + font-weight: 300; } + h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} + h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } + + /* HELPERS */ + .center { text-align: center } + +` From dc9b9e431461651a116a4476840f37ed7808cf7e Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Wed, 11 Jul 2018 01:24:43 -0500 Subject: [PATCH 25/35] Initial tests for FavButton.tsx and App.tsx --- .gitignore | 1 + package.json | 21 +- src/App.test.tsx | 9 - .../presentational/FavButton.style.ts | 20 + src/components/presentational/FavButton.tsx | 27 +- src/setupTests.js | 4 - src/setupTests.ts | 14 + src/test/App.test.tsx | 7 + src/test/FavButton.test.tsx | 23 + src/test/Header.test.tsx | 7 + src/test/testA.test.js | 10 - yarn.lock | 579 ++++++++++++++---- 12 files changed, 562 insertions(+), 160 deletions(-) delete mode 100644 src/App.test.tsx create mode 100644 src/components/presentational/FavButton.style.ts delete mode 100644 src/setupTests.js create mode 100644 src/setupTests.ts create mode 100644 src/test/App.test.tsx create mode 100644 src/test/FavButton.test.tsx create mode 100644 src/test/Header.test.tsx delete mode 100644 src/test/testA.test.js diff --git a/.gitignore b/.gitignore index fbc17600..5dcb2856 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +.vscode/ diff --git a/package.json b/package.json index 32537596..0dc87c68 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,9 @@ "jest": { "collectCoverageFrom": [ "**/src/**/*.{ts,tsx}", - "!**/src/registerServiceWorker.{ts,tsx}" + "!**/src/registerServiceWorker.{ts,tsx}", + "!**/src/setupTests.{js,ts}", + "!**/src/**/*.d.{ts,tsx}" ], "coverageThreshold": { "global": { @@ -33,20 +35,31 @@ "scripts": { "start": "react-scripts-ts start", "build": "react-scripts-ts build", - "test": "yarn lint && react-scripts-ts test --env=jsdom", + "test": "yarn lint && yarn jest", "eject": "react-scripts-ts eject", "lint": "tslint -p tsconfig.json -c tslint.json", - "jest": "react-scripts-ts test --env=jsdom --coverage" + "jest": "react-scripts-ts test --env=jsdom --watchAll --coverage" }, "devDependencies": { - "@types/jest": "^23.1.4", + "@types/enzyme": "^3.1.11", + "@types/enzyme-adapter-react-16": "^1.0.2", + "@types/jest": "^23.1.5", "@types/node": "^10.5.2", "@types/react": "^16.4.6", "@types/react-dom": "^16.0.6", "@types/react-router-dom": "^4.2.7", + "@types/react-test-renderer": "^16.0.1", "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", + "jest": "^23.4.0", + "jest-enzyme": "^6.0.2", + "jest-styled-components": "^5.0.1", + "react-test-renderer": "^16.4.1", "redux-devtools-extension": "^2.13.5", + "ts-jest": "^22.4.6", "typescript": "^2.9.2" + }, + "resolutions": { + "jest": "^23.4.0" } } diff --git a/src/App.test.tsx b/src/App.test.tsx deleted file mode 100644 index e0f09ab5..00000000 --- a/src/App.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import * as React from 'react'; -import * as ReactDOM from 'react-dom'; -import App from './App'; - -it('renders without crashing', () => { - const div = document.createElement('div'); - ReactDOM.render(, div); - ReactDOM.unmountComponentAtNode(div); -}); diff --git a/src/components/presentational/FavButton.style.ts b/src/components/presentational/FavButton.style.ts new file mode 100644 index 00000000..048ecfa0 --- /dev/null +++ b/src/components/presentational/FavButton.style.ts @@ -0,0 +1,20 @@ +import styled from "styled-components"; + +export default styled.button` + background: none; + height: 32px; + font-size: 20px; + line-height: 32px; + color: ${(props: any) => props.active ? "#FC4349" : "#FFF"}; + margin: 10px; + opacity: 0.7; + border: none; + width: 32px; + border-radius: 50%; + /* background-color: rgba(0, 0, 0, 0.5); */ + transition: opacity 0.25s; + + :hover { + opacity: 1.0; + } +`; diff --git a/src/components/presentational/FavButton.tsx b/src/components/presentational/FavButton.tsx index 2a1b9486..fc7f7b6a 100644 --- a/src/components/presentational/FavButton.tsx +++ b/src/components/presentational/FavButton.tsx @@ -1,30 +1,13 @@ import * as React from 'react'; -import styled from 'styled-components'; - -const _button = styled.button` - background: none; - height: 32px; - font-size: 20px; - line-height: 32px; - color: ${(props: any) => props.active ? "#FC4349" : "#FFF"}; - margin: 10px; - opacity: 0.7; - border: none; - width: 32px; - border-radius: 50%; - /* background-color: rgba(0, 0, 0, 0.5); */ - transition: opacity 0.25s; - - :hover { - opacity: 1.0; - } -`; +import FavButtonStyled from './FavButton.style'; interface IFavButtonProps { - active: boolean + active?: boolean onAddFavorite?: any } + const FavButton = (props: IFavButtonProps) => - <_button onClick={props.onAddFavorite} active={props.active}>♥; + ; export default FavButton; \ No newline at end of file diff --git a/src/setupTests.js b/src/setupTests.js deleted file mode 100644 index 85ad18cf..00000000 --- a/src/setupTests.js +++ /dev/null @@ -1,4 +0,0 @@ -import Adapter from 'enzyme-adapter-react-16'; -import Enzyme from 'enzyme'; - -Enzyme.configure({ adapter: new Adapter() }); diff --git a/src/setupTests.ts b/src/setupTests.ts new file mode 100644 index 00000000..6239dada --- /dev/null +++ b/src/setupTests.ts @@ -0,0 +1,14 @@ +import * as Enzyme from 'enzyme'; +import * as Adapter from 'enzyme-adapter-react-16'; +import 'jest-enzyme'; +import 'jest-styled-components' + +Enzyme.configure({ adapter: new Adapter() }); + +const localStorageMock = { + getItem: jest.fn(), + setItem: jest.fn(), + clear: jest.fn() +}; + +(global as any).localStorage = localStorageMock; \ No newline at end of file diff --git a/src/test/App.test.tsx b/src/test/App.test.tsx new file mode 100644 index 00000000..5d1d4882 --- /dev/null +++ b/src/test/App.test.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; +import { shallow } from 'enzyme'; +import App from '../App'; + +it('renders without crashing', () => { + shallow(); +}); diff --git a/src/test/FavButton.test.tsx b/src/test/FavButton.test.tsx new file mode 100644 index 00000000..cc9ce0e0 --- /dev/null +++ b/src/test/FavButton.test.tsx @@ -0,0 +1,23 @@ +import * as React from 'react'; +import 'jest-enzyme'; +import 'jest-styled-components' +import { shallow, mount } from 'enzyme'; +import FavButton from '../components/presentational/FavButton'; + +describe('FavButton', () => { + it('renders withouth crashing', () => { + shallow(); + }); + + describe('heart icon', () => { + it('contains a white heart', () => { + const wrapper = mount(); + expect(wrapper).toHaveText("♥"); + expect(wrapper).toHaveStyleRule('color', '#FFF'); + }); + it('contains a red heart when active', () => { + const wrapper = mount(); + expect(wrapper).not.toHaveStyleRule('color', '#FFF'); + }); + }); +}); \ No newline at end of file diff --git a/src/test/Header.test.tsx b/src/test/Header.test.tsx new file mode 100644 index 00000000..5f1b8aab --- /dev/null +++ b/src/test/Header.test.tsx @@ -0,0 +1,7 @@ +import * as React from 'react'; +import { shallow } from 'enzyme'; +import Header from '../components/presentational/Header'; + +it('renders without crashing', () => { + shallow(
    ); +}); diff --git a/src/test/testA.test.js b/src/test/testA.test.js deleted file mode 100644 index 9da7def2..00000000 --- a/src/test/testA.test.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -const ABC = ({ children }) =>
    {children}
    ; - -describe('test', () => { - it('will work', () => { - const component = shallow(hola); - expect(component.text()).toBe('hola'); - }); -}); diff --git a/yarn.lock b/yarn.lock index 199d4b2e..7e73756f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,13 +16,30 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@types/cheerio@*": + version "0.22.8" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.8.tgz#5702f74f78b73e13f1eb1bd435c2c9de61a250d4" + +"@types/enzyme-adapter-react-16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.2.tgz#15ae37c64d6221a6f4b3a4aacc357cf773859de4" + dependencies: + "@types/enzyme" "*" + +"@types/enzyme@*", "@types/enzyme@^3.1.11": + version "3.1.11" + resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.11.tgz#0a059d2fe2c686f024ada911d24473cdb2e13903" + dependencies: + "@types/cheerio" "*" + "@types/react" "*" + "@types/history@*": version "4.6.2" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0" -"@types/jest@^23.1.4": - version "23.1.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.4.tgz#71e1e2d08b1db742f479ee2795536ebc999a2419" +"@types/jest@^23.1.5": + version "23.1.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.5.tgz#e31be003956e1fa8c860124d99bea9ae327ae37b" "@types/node@*", "@types/node@^10.5.2": version "10.5.2" @@ -57,6 +74,12 @@ "@types/history" "*" "@types/react" "*" +"@types/react-test-renderer@^16.0.1": + version "16.0.1" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-16.0.1.tgz#36ee8c4fe33c61d460ad0e7bc42a2d0ddcc775a1" + dependencies: + "@types/react" "*" + "@types/react@*", "@types/react@^16.4.6": version "16.4.6" resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada" @@ -397,7 +420,7 @@ babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, bab esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0: +babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -543,13 +566,20 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@^22.1.0, babel-jest@^22.4.4: +babel-jest@^22.1.0: version "22.4.4" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d" dependencies: babel-plugin-istanbul "^4.1.5" babel-preset-jest "^22.4.4" +babel-jest@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.0.tgz#22c34c392e2176f6a4c367992a7fcff69d2e8557" + dependencies: + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" + babel-loader@^7.1.2: version "7.1.5" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" @@ -578,7 +608,7 @@ babel-plugin-dynamic-import-node@1.1.0: babel-template "^6.26.0" babel-types "^6.26.0" -babel-plugin-istanbul@^4.1.4, babel-plugin-istanbul@^4.1.5: +babel-plugin-istanbul@^4.1.4, babel-plugin-istanbul@^4.1.5, babel-plugin-istanbul@^4.1.6: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" dependencies: @@ -591,6 +621,10 @@ babel-plugin-jest-hoist@^22.4.4: version "22.4.4" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" +babel-plugin-jest-hoist@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" + 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" @@ -724,7 +758,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.2: version "6.26.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" dependencies: @@ -924,13 +958,20 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" -babel-preset-jest@^22.0.1, babel-preset-jest@^22.4.4: +babel-preset-jest@^22.0.1, babel-preset-jest@^22.4.3, babel-preset-jest@^22.4.4: version "22.4.4" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" dependencies: babel-plugin-jest-hoist "^22.4.4" babel-plugin-syntax-object-rest-spread "^6.13.0" +babel-preset-jest@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" + dependencies: + babel-plugin-jest-hoist "^23.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-preset-react-app@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.2.tgz#49ba3681b917c4e5c73a5249d3ef4c48fae064e2" @@ -989,7 +1030,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -1003,7 +1044,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -1146,7 +1187,7 @@ browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" -browser-resolve@^1.11.2: +browser-resolve@^1.11.2, browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" dependencies: @@ -1453,6 +1494,10 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circular-json-es6@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/circular-json-es6/-/circular-json-es6-2.0.2.tgz#e4f4a093e49fb4b6aba1157365746112a78bd344" + clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -1516,6 +1561,10 @@ clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" +clorox@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clorox/-/clorox-1.0.3.tgz#6fa63653f280c33d69f548fb14d239ddcfa1590d" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1860,6 +1909,15 @@ css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" +css@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.3.tgz#f861f4ba61e79bedc962aa548e5780fd95cbc6be" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.5.1" + urix "^0.1.0" + cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" @@ -1976,6 +2034,12 @@ decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" +deep-equal-ident@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal-ident/-/deep-equal-ident-1.1.1.tgz#06f4b89e53710cd6cea4a7781c7a956642de8dc9" + dependencies: + lodash.isequal "^3.0" + deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -2315,6 +2379,19 @@ enzyme-adapter-utils@^1.3.0: object.assign "^4.0.4" prop-types "^15.6.0" +enzyme-matchers@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/enzyme-matchers/-/enzyme-matchers-6.0.2.tgz#794d4e43254daaa0fffd3a591e5869fc861deeb2" + dependencies: + circular-json-es6 "^2.0.1" + deep-equal-ident "^1.1.1" + +enzyme-to-json@^3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.3.4.tgz#67c6040e931182f183418af2eb9f4323258aa77f" + dependencies: + lodash "^4.17.4" + enzyme@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.3.0.tgz#0971abd167f2d4bf3f5bd508229e1c4b6dc50479" @@ -2572,6 +2649,17 @@ expect@^22.4.0: jest-message-util "^22.4.3" jest-regex-util "^22.4.3" +expect@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.4.0.tgz#6da4ecc99c1471253e7288338983ad1ebadb60c3" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^23.2.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.2.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + express@^4.13.3: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" @@ -2894,6 +2982,14 @@ fs-extra@4.0.3: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -3805,7 +3901,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.14: +istanbul-api@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" dependencies: @@ -3822,7 +3918,7 @@ istanbul-api@^1.1.14: mkdirp "^0.5.1" once "^1.4.0" -istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: +istanbul-lib-coverage@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" @@ -3832,7 +3928,7 @@ istanbul-lib-hook@^1.2.0: dependencies: append-transform "^1.0.0" -istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.8.0: +istanbul-lib-instrument@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" dependencies: @@ -3853,16 +3949,6 @@ istanbul-lib-report@^1.1.4: path-parse "^1.0.5" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.1.2" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - istanbul-lib-source-maps@^1.2.4: version "1.2.5" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" @@ -3879,15 +3965,15 @@ istanbul-reports@^1.3.0: dependencies: handlebars "^4.0.3" -jest-changed-files@^22.2.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" +jest-changed-files@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.0.tgz#f1b304f98c235af5d9a31ec524262c5e4de3c6ff" dependencies: throat "^4.0.0" -jest-cli@^22.4.2: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90" +jest-cli@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.0.tgz#d1fdd1dbc41d69ae8bd43d0070ce23988eacd86f" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -3896,35 +3982,37 @@ jest-cli@^22.4.2: graceful-fs "^4.1.11" import-local "^1.0.0" is-ci "^1.0.10" - istanbul-api "^1.1.14" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-instrument "^1.8.0" - istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^22.2.0" - jest-config "^22.4.4" - jest-environment-jsdom "^22.4.1" + istanbul-api "^1.3.1" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-source-maps "^1.2.4" + jest-changed-files "^23.4.0" + jest-config "^23.4.0" + jest-environment-jsdom "^23.4.0" jest-get-type "^22.1.0" - jest-haste-map "^22.4.2" - jest-message-util "^22.4.0" - jest-regex-util "^22.1.0" - jest-resolve-dependencies "^22.1.0" - jest-runner "^22.4.4" - jest-runtime "^22.4.4" - jest-snapshot "^22.4.0" - jest-util "^22.4.1" - jest-validate "^22.4.4" - jest-worker "^22.2.2" + jest-haste-map "^23.4.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.4.0" + jest-runner "^23.4.0" + jest-runtime "^23.4.0" + jest-snapshot "^23.4.0" + jest-util "^23.4.0" + jest-validate "^23.4.0" + jest-watcher "^23.4.0" + jest-worker "^23.2.0" micromatch "^2.3.11" node-notifier "^5.2.1" + prompts "^0.1.9" realpath-native "^1.0.0" rimraf "^2.5.4" slash "^1.0.0" string-length "^2.0.0" strip-ansi "^4.0.0" which "^1.2.12" - yargs "^10.0.3" + yargs "^11.0.0" -jest-config@^22.0.1, jest-config@^22.4.4: +jest-config@^22.0.1, jest-config@^22.4.3, jest-config@^22.4.4: version "22.4.4" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" dependencies: @@ -3940,6 +4028,24 @@ jest-config@^22.0.1, jest-config@^22.4.4: jest-validate "^22.4.4" pretty-format "^22.4.0" +jest-config@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.0.tgz#79ccf8d68aa0e48f9e3beb81b83aa5875c63fa3f" + dependencies: + babel-core "^6.0.0" + babel-jest "^23.4.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" + jest-get-type "^22.1.0" + jest-jasmine2 "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.4.0" + jest-util "^23.4.0" + jest-validate "^23.4.0" + pretty-format "^23.2.0" + jest-diff@^22.4.0, jest-diff@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" @@ -3949,12 +4055,34 @@ jest-diff@^22.4.0, jest-diff@^22.4.3: jest-get-type "^22.4.3" pretty-format "^22.4.3" -jest-docblock@^22.4.0, jest-docblock@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" +jest-diff@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.2.0.tgz#9f2cf4b51e12c791550200abc16b47130af1062a" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^23.2.0" + +jest-docblock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" dependencies: detect-newline "^2.1.0" +jest-each@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.4.0.tgz#2fa9edd89daa1a4edc9ff9bf6062a36b71345143" + dependencies: + chalk "^2.0.1" + pretty-format "^23.2.0" + +jest-environment-enzyme@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-enzyme/-/jest-environment-enzyme-6.0.2.tgz#890526622d5de8a820a1849d2684f03bc006e0ef" + dependencies: + jest-environment-jsdom "^22.4.1" + jest-environment-jsdom@^22.4.1: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" @@ -3963,6 +4091,14 @@ jest-environment-jsdom@^22.4.1: jest-util "^22.4.3" jsdom "^11.5.1" +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" + jest-environment-node@^22.4.1: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" @@ -3970,19 +4106,34 @@ jest-environment-node@^22.4.1: jest-mock "^22.4.3" jest-util "^22.4.3" +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + +jest-enzyme@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/jest-enzyme/-/jest-enzyme-6.0.2.tgz#bc464169de6c2d50602e02bbc9464460507fb295" + dependencies: + enzyme-matchers "^6.0.2" + enzyme-to-json "^3.3.0" + jest-environment-enzyme "^6.0.2" + jest-get-type@^22.1.0, jest-get-type@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" -jest-haste-map@^22.4.2: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" +jest-haste-map@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.0.tgz#f2a0eaa41af766cd5101e6c291fdc6435c93ee1c" dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" - jest-docblock "^22.4.3" - jest-serializer "^22.4.3" - jest-worker "^22.4.3" + jest-docblock "^23.2.0" + jest-serializer "^23.0.1" + jest-worker "^23.2.0" micromatch "^2.3.11" sane "^2.0.0" @@ -4002,11 +4153,27 @@ jest-jasmine2@^22.4.4: jest-util "^22.4.1" source-map-support "^0.5.0" -jest-leak-detector@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" +jest-jasmine2@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.0.tgz#17ce539fe608ef898d6986518144acf270beca8f" dependencies: - pretty-format "^22.4.3" + chalk "^2.0.1" + co "^4.6.0" + expect "^23.4.0" + is-generator-fn "^1.0.0" + jest-diff "^23.2.0" + jest-each "^23.4.0" + jest-matcher-utils "^23.2.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.4.0" + jest-util "^23.4.0" + pretty-format "^23.2.0" + +jest-leak-detector@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz#c289d961dc638f14357d4ef96e0431ecc1aa377d" + dependencies: + pretty-format "^23.2.0" jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: version "22.4.3" @@ -4016,6 +4183,14 @@ jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: jest-get-type "^22.4.3" pretty-format "^22.4.3" +jest-matcher-utils@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz#4d4981f23213e939e3cedf23dc34c747b5ae1913" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^23.2.0" + jest-message-util@^22.4.0, jest-message-util@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" @@ -4026,19 +4201,38 @@ jest-message-util@^22.4.0, jest-message-util@^22.4.3: slash "^1.0.0" stack-utils "^1.0.1" +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + jest-mock@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" -jest-resolve-dependencies@^22.1.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + +jest-resolve-dependencies@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.0.tgz#e73efce70262a6e2bf5263d0b23009a098678620" dependencies: - jest-regex-util "^22.4.3" + jest-regex-util "^23.3.0" + jest-snapshot "^23.4.0" jest-resolve@^22.4.2: version "22.4.3" @@ -4047,50 +4241,61 @@ jest-resolve@^22.4.2: browser-resolve "^1.11.2" chalk "^2.0.1" -jest-runner@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907" +jest-resolve@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.0.tgz#b4061dbcd6391b5e445d5fd84c9dad5ff1ff5662" + dependencies: + browser-resolve "^1.11.3" + chalk "^2.0.1" + realpath-native "^1.0.0" + +jest-runner@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.0.tgz#1859b211a264ea5a43b7a3022e1199067c4dfe57" dependencies: exit "^0.1.2" - jest-config "^22.4.4" - jest-docblock "^22.4.0" - jest-haste-map "^22.4.2" - jest-jasmine2 "^22.4.4" - jest-leak-detector "^22.4.0" - jest-message-util "^22.4.0" - jest-runtime "^22.4.4" - jest-util "^22.4.1" - jest-worker "^22.2.2" + graceful-fs "^4.1.11" + jest-config "^23.4.0" + jest-docblock "^23.2.0" + jest-haste-map "^23.4.0" + jest-jasmine2 "^23.4.0" + jest-leak-detector "^23.2.0" + jest-message-util "^23.4.0" + jest-runtime "^23.4.0" + jest-util "^23.4.0" + jest-worker "^23.2.0" + source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048" +jest-runtime@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.0.tgz#c30ef619def587b93bad4a4938da9accb9936b4d" dependencies: babel-core "^6.0.0" - babel-jest "^22.4.4" - babel-plugin-istanbul "^4.1.5" + babel-plugin-istanbul "^4.1.6" chalk "^2.0.1" convert-source-map "^1.4.0" exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.11" - jest-config "^22.4.4" - jest-haste-map "^22.4.2" - jest-regex-util "^22.1.0" - jest-resolve "^22.4.2" - jest-util "^22.4.1" - jest-validate "^22.4.4" - json-stable-stringify "^1.0.1" + jest-config "^23.4.0" + jest-haste-map "^23.4.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.4.0" + jest-snapshot "^23.4.0" + jest-util "^23.4.0" + jest-validate "^23.4.0" micromatch "^2.3.11" realpath-native "^1.0.0" slash "^1.0.0" strip-bom "3.0.0" write-file-atomic "^2.1.0" - yargs "^10.0.3" + yargs "^11.0.0" -jest-serializer@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" +jest-serializer@^23.0.1: + version "23.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" jest-snapshot@^22.4.0: version "22.4.3" @@ -4103,6 +4308,28 @@ jest-snapshot@^22.4.0: natural-compare "^1.4.0" pretty-format "^22.4.3" +jest-snapshot@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.0.tgz#7463d0357cabdfe1c63994d5e32f707d1033d616" + dependencies: + babel-traverse "^6.0.0" + babel-types "^6.0.0" + chalk "^2.0.1" + jest-diff "^23.2.0" + jest-matcher-utils "^23.2.0" + jest-message-util "^23.4.0" + jest-resolve "^23.4.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^23.2.0" + semver "^5.5.0" + +jest-styled-components@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jest-styled-components/-/jest-styled-components-5.0.1.tgz#386c5a161a0f5e783444d624bfc18c6d228d1277" + dependencies: + css "^2.2.1" + jest-util@^22.4.1, jest-util@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" @@ -4115,6 +4342,19 @@ jest-util@^22.4.1, jest-util@^22.4.3: mkdirp "^0.5.1" source-map "^0.6.0" +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" + jest-validate@^22.4.4: version "22.4.4" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" @@ -4125,18 +4365,35 @@ jest-validate@^22.4.4: leven "^2.1.0" pretty-format "^22.4.0" -jest-worker@^22.2.2, jest-worker@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" +jest-validate@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.4.0.tgz#d96eede01ef03ac909c009e9c8e455197d48c201" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.2.0" + +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + string-length "^2.0.0" + +jest-worker@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" dependencies: merge-stream "^1.0.1" -jest@22.4.2: - version "22.4.2" - resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.2.tgz#34012834a49bf1bdd3bc783850ab44e4499afc20" +jest@22.4.2, jest@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.0.tgz#ebce63f6529c27c646d80c610866f0306f66dcbf" dependencies: import-local "^1.0.0" - jest-cli "^22.4.2" + jest-cli "^23.4.0" js-base64@^2.1.9: version "2.4.5" @@ -4219,12 +4476,6 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4380,6 +4631,22 @@ lodash-es@^4.17.4, lodash-es@^4.17.5: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05" +lodash._baseisequal@^3.0.0: + version "3.0.7" + resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1" + dependencies: + lodash.isarray "^3.0.0" + lodash.istypedarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -4404,6 +4671,21 @@ lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isequal@^3.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-3.0.4.tgz#1c35eb3b6ef0cd1ff51743e3ea3cf7fdffdacb64" + dependencies: + lodash._baseisequal "^3.0.0" + lodash._bindcallback "^3.0.0" + lodash.isfunction@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -4412,6 +4694,18 @@ lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" +lodash.istypedarray@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -5655,6 +5949,13 @@ pretty-format@^22.4.0, pretty-format@^22.4.3: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +pretty-format@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.2.0.tgz#3b0aaa63c018a53583373c1cb3a5d96cc5e83017" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -5683,6 +5984,13 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +prompts@^0.1.9: + version "0.1.11" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.11.tgz#fdfac72f61d2887f4eaf2e65e748a9d9ef87206f" + dependencies: + clorox "^1.0.3" + sisteransi "^0.1.1" + prop-types@^15.5.4, prop-types@^15.6.0, prop-types@^15.6.1: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" @@ -5964,7 +6272,7 @@ react-scripts-ts@2.16.0: optionalDependencies: fsevents "^1.1.3" -react-test-renderer@^16.0.0-0: +react-test-renderer@^16.0.0-0, react-test-renderer@^16.4.1: version "16.4.1" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.1.tgz#f2fb30c2c7b517db6e5b10ed20bb6b0a7ccd8d70" dependencies: @@ -6428,7 +6736,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -6551,6 +6859,10 @@ 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" +sisteransi@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -6618,7 +6930,7 @@ source-map-loader@^0.2.1: loader-utils "~0.2.2" source-map "~0.6.1" -source-map-resolve@^0.5.0: +source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" dependencies: @@ -6634,7 +6946,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.0: +source-map-support@^0.5.0, source-map-support@^0.5.5, source-map-support@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" dependencies: @@ -6649,6 +6961,12 @@ source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, sourc version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map@^0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" @@ -7121,6 +7439,22 @@ ts-jest@22.0.1: source-map-support "^0.5.0" yargs "^10.0.3" +ts-jest@^22.4.6: + version "22.4.6" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.4.6.tgz#a5d7f5e8b809626d1f4143209d301287472ec344" + dependencies: + babel-core "^6.26.3" + babel-plugin-istanbul "^4.1.6" + babel-plugin-transform-es2015-modules-commonjs "^6.26.2" + babel-preset-jest "^22.4.3" + cpx "^1.5.0" + fs-extra "6.0.0" + jest-config "^22.4.3" + lodash "^4.17.10" + pkg-dir "^2.0.0" + source-map-support "^0.5.5" + yargs "^11.0.0" + ts-loader@^2.3.7: version "2.3.7" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-2.3.7.tgz#a9028ced473bee12f28a75f9c5b139979d33f2fc" @@ -7768,6 +8102,12 @@ yargs-parser@^8.1.0: dependencies: camelcase "^4.1.0" +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + dependencies: + camelcase "^4.1.0" + yargs@^10.0.3: version "10.1.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" @@ -7785,6 +8125,23 @@ yargs@^10.0.3: y18n "^3.2.1" yargs-parser "^8.1.0" +yargs@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^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 "^9.0.2" + yargs@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" From 101e772a25a9e5eca0bf76e41b73494ce532eb02 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 00:00:07 -0500 Subject: [PATCH 26/35] FavButton tests --- images.d.ts | 2 ++ package.json | 3 ++ src/components/AppNav.style.ts | 29 ++++++++++++++++ src/components/AppNav.tsx | 33 +++---------------- src/test/FavButton.test.tsx | 5 +++ .../__snapshots__/FavButton.test.tsx.snap | 7 ++++ src/types/index.d.ts | 10 ++++-- yarn.lock | 18 +++++++++- 8 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 src/components/AppNav.style.ts create mode 100644 src/test/__snapshots__/FavButton.test.tsx.snap diff --git a/images.d.ts b/images.d.ts index 397cc9b3..289fc650 100644 --- a/images.d.ts +++ b/images.d.ts @@ -1,3 +1,5 @@ declare module '*.svg' declare module '*.png' declare module '*.jpg' + +declare module '*.json' \ No newline at end of file diff --git a/package.json b/package.json index 0dc87c68..ac8fcc49 100644 --- a/package.json +++ b/package.json @@ -49,13 +49,16 @@ "@types/react-dom": "^16.0.6", "@types/react-router-dom": "^4.2.7", "@types/react-test-renderer": "^16.0.1", + "@types/redux-mock-store": "^1.0.0", "enzyme": "^3.3.0", "enzyme-adapter-react-16": "^1.1.1", + "enzyme-to-json": "^3.3.4", "jest": "^23.4.0", "jest-enzyme": "^6.0.2", "jest-styled-components": "^5.0.1", "react-test-renderer": "^16.4.1", "redux-devtools-extension": "^2.13.5", + "redux-mock-store": "^1.5.3", "ts-jest": "^22.4.6", "typescript": "^2.9.2" }, diff --git a/src/components/AppNav.style.ts b/src/components/AppNav.style.ts new file mode 100644 index 00000000..9a92e70a --- /dev/null +++ b/src/components/AppNav.style.ts @@ -0,0 +1,29 @@ +import styled from 'styled-components'; +import { NavLink as RouterNavLink } from 'react-router-dom'; + +export const StyledNav = styled.nav` + border-bottom: 1px solid #FC4349; + margin-bottom: 1em; + color: #6DBCDB; + font-weight: bold; + + ul { + display: flex; + justify-content: space-around; + text-align: center; + align-items: center; + height: 3.5em; + } + + li { flex: 1; } + + a { + text-decoration: none; + color: inherit; + padding: 1em; + } +`; + +export const NavLink = styled(RouterNavLink)` + &.active { color: #FC4349; } +` diff --git a/src/components/AppNav.tsx b/src/components/AppNav.tsx index 02689eb0..c2baa1d6 100644 --- a/src/components/AppNav.tsx +++ b/src/components/AppNav.tsx @@ -1,45 +1,20 @@ import * as React from 'react'; -import { NavLink } from 'react-router-dom'; import ROUTES from '../routes'; -import styled from 'styled-components'; import Search from './Search'; -const _nav = styled.nav` - border-bottom: 1px solid #FC4349; - margin-bottom: 1em; - color: #6DBCDB; - font-weight: bold; - - ul { - display: flex; - justify-content: space-around; - text-align: center; - align-items: center; - height: 3.5em; - } - - li { flex: 1; } - - a { - text-decoration: none; - color: inherit; - padding: 1em; - } - - .active { color: #FC4349 } -`; +import { StyledNav, NavLink } from './AppNav.style' const LINKS = ROUTES.map(({path, content}) => -
  • {content}
  • ); +
  • {content}
  • ); class AppNav extends React.Component { public render() { - return (<_nav> + return (
      {LINKS}
    - ); +
    ); } } diff --git a/src/test/FavButton.test.tsx b/src/test/FavButton.test.tsx index cc9ce0e0..2848392e 100644 --- a/src/test/FavButton.test.tsx +++ b/src/test/FavButton.test.tsx @@ -9,6 +9,11 @@ describe('FavButton', () => { shallow(); }); + it('matches snapshot', () => { + const wrapper = shallow() + expect(wrapper).toMatchSnapshot() + }); + describe('heart icon', () => { it('contains a white heart', () => { const wrapper = mount(); diff --git a/src/test/__snapshots__/FavButton.test.tsx.snap b/src/test/__snapshots__/FavButton.test.tsx.snap new file mode 100644 index 00000000..cf1e9b29 --- /dev/null +++ b/src/test/__snapshots__/FavButton.test.tsx.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`FavButton matches snapshot 1`] = ` + + ♥ + +`; diff --git a/src/types/index.d.ts b/src/types/index.d.ts index 3f1246cc..1f1be8bd 100644 --- a/src/types/index.d.ts +++ b/src/types/index.d.ts @@ -16,8 +16,12 @@ export interface IGIF { title: string } +export interface FavsCollection { + [id: string]: IGIF +} export interface AppState { - favs: any - trending: IGIF[] - search: string + readonly favs: FavsCollection + readonly trending: IGIF[] + readonly search: string + readonly filter_favs: string } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 7e73756f..55b63c64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -90,6 +90,12 @@ version "2.3.0" resolved "https://registry.yarnpkg.com/@types/redux-actions/-/redux-actions-2.3.0.tgz#d28d7913ec86ee9e20ecb33a1fed887ecb538149" +"@types/redux-mock-store@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/redux-mock-store/-/redux-mock-store-1.0.0.tgz#e06bad2b4ca004bdd371f432c3e48a92c1857ed9" + dependencies: + redux "^4.0.0" + abab@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -2386,7 +2392,7 @@ enzyme-matchers@^6.0.2: circular-json-es6 "^2.0.1" deep-equal-ident "^1.1.1" -enzyme-to-json@^3.3.0: +enzyme-to-json@^3.3.0, enzyme-to-json@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.3.4.tgz#67c6040e931182f183418af2eb9f4323258aa77f" dependencies: @@ -4690,6 +4696,10 @@ lodash.isfunction@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" @@ -6400,6 +6410,12 @@ redux-devtools-extension@^2.13.5: version "2.13.5" resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.5.tgz#3ff34f7227acfeef3964194f5f7fc2765e5c5a39" +redux-mock-store@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.3.tgz#1f10528949b7ce8056c2532624f7cafa98576c6d" + dependencies: + lodash.isplainobject "^4.0.6" + redux-saga@^0.16.0: version "0.16.0" resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-0.16.0.tgz#0a231db0a1489301dd980f6f2f88d8ced418f724" From 711a11bfef27d26de559dfabc2f383df38155d28 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 00:00:24 -0500 Subject: [PATCH 27/35] GIFList tests --- src/components/presentational/GIFList.tsx | 47 +- src/test/GIFList.test.tsx | 38 + src/test/GIFS.json | 4805 ++++++++++++++++++ src/test/__snapshots__/GIFList.test.tsx.snap | 11 + 4 files changed, 4876 insertions(+), 25 deletions(-) create mode 100644 src/test/GIFList.test.tsx create mode 100644 src/test/GIFS.json create mode 100644 src/test/__snapshots__/GIFList.test.tsx.snap diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index ce55f1a2..3f883a8f 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { IGIF } from '../../types'; +import { IGIF, FavsCollection } from '../../types'; import FavButton from './FavButton'; import { connect } from 'react-redux'; @@ -9,32 +9,29 @@ import { toggle_favorite } from '../../actions/gifs'; import {_div, _gif_div, _gif_title} from './GIFList.style' interface IGIFListProps { - gifs: IGIF[], - favs: IGIF[], + gifs: IGIF[] + favs: FavsCollection onToggleFavorite: any } -class GIFList extends React.Component { - public render() { - const props = this.props; - const { gifs, onToggleFavorite, favs } = props; - return ( - <_div> - { gifs ? - gifs.map(gif => { - const callback = onToggleFavorite.bind(null, gif); - const active = favs[gif.id]; - return ( - <_gif_div key={gif.id}> - <_gif_title> - {gif.title} - - - - ); - }) - :

    No GIFs found!

    } - ); - } +export const GIFList = (props: IGIFListProps) => { + const { gifs, onToggleFavorite, favs } = props; + return ( + <_div> + { gifs ? + gifs.map(gif => { + const callback = onToggleFavorite.bind(null, gif); + const active = favs[gif.id] !== undefined; + return ( + <_gif_div key={gif.id}> + <_gif_title> + {gif.title} + + + + ); + }) + :

    No GIFs found!

    } + ); } function mapStateToProps(state: any) { diff --git a/src/test/GIFList.test.tsx b/src/test/GIFList.test.tsx new file mode 100644 index 00000000..fcb29329 --- /dev/null +++ b/src/test/GIFList.test.tsx @@ -0,0 +1,38 @@ +import * as React from 'react'; +import 'jest-enzyme'; +import 'jest-styled-components' +import configureStore from 'redux-mock-store' +import { shallow, mount, ShallowWrapper } from 'enzyme'; +import { GIFList } from '../components/presentational/GIFList'; +import { AppState } from '../types'; +import * as GIFS from './GIFS.json' + +describe('GIFList', () => { + const mockStore = configureStore(); + const initialState = { trending: GIFS as string[] } + let store; + + it('renders withouth crashing', () => { + store = mockStore(initialState); + const state = store.getState() as AppState; + const onToggle = jest.fn(); + const wrapper = mount(); + expect(wrapper).toMatchSnapshot(); + }); + + describe('with empty GIFS', () => { + it('matches snapshot', () => { + store = mockStore({}); + const state = store.getState() as AppState; + const onToggle = jest.fn(); + const wrapper = mount(); + expect(wrapper).toMatchSnapshot(); + }); + }); +}); \ No newline at end of file diff --git a/src/test/GIFS.json b/src/test/GIFS.json new file mode 100644 index 00000000..d90b9590 --- /dev/null +++ b/src/test/GIFS.json @@ -0,0 +1,4805 @@ +[ + { + "type": "gif", + "id": "1oKPKBGn5yTHxflC61", + "slug": "ctv-amazing-race-amazingracecanada-1oKPKBGn5yTHxflC61", + "url": "https://giphy.com/gifs/ctv-amazing-race-amazingracecanada-1oKPKBGn5yTHxflC61", + "bitly_gif_url": "https://gph.is/2zsyCFY", + "bitly_url": "https://gph.is/2zsyCFY", + "embed_url": "https://giphy.com/embed/1oKPKBGn5yTHxflC61", + "username": "ctv", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-07-11 01:09:12", + "trending_datetime": "2018-07-12 02:45:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/default3.gif", + "banner_url": "https://media.giphy.com/headers/ctv/hl2axCpopeoO.jpg", + "profile_url": "https://giphy.com/ctv/", + "username": "ctv", + "display_name": "CTV", + "guid": "U29jaWFsLk1lZGlhQGJlbGxtZWRpYS5jYQ" + }, + "images": { + "fixed_height_still": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200_s.gif", + "width": "356", + "height": "200", + "size": "47820" + }, + "original_still": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy_s.gif", + "width": "480", + "height": "270", + "size": "87852" + }, + "fixed_width": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200w.gif", + "width": "200", + "height": "113", + "size": "253382", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200w.mp4", + "mp4_size": "55688", + "webp": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200w.webp", + "webp_size": "84694" + }, + "fixed_height_small_still": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100_s.gif", + "width": "178", + "height": "100", + "size": "14447" + }, + "fixed_height_downsampled": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200_d.gif", + "width": "356", + "height": "200", + "size": "291315", + "webp": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200_d.webp", + "webp_size": "73974" + }, + "preview": { + "width": "194", + "height": "108", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy-preview.mp4", + "mp4_size": "34901" + }, + "fixed_height_small": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100.gif", + "width": "178", + "height": "100", + "size": "209232", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100.mp4", + "mp4_size": "49314", + "webp": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100.webp", + "webp_size": "73034" + }, + "downsized_still": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy-downsized_s.gif", + "width": "480", + "height": "270", + "size": "87852" + }, + "downsized": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy.gif", + "width": "480", + "height": "270", + "size": "1395758" + }, + "downsized_large": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy.gif", + "width": "480", + "height": "270", + "size": "1395758" + }, + "fixed_width_small_still": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100w_s.gif", + "width": "100", + "height": "57", + "size": "6037" + }, + "preview_webp": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy-preview.webp", + "width": "174", + "height": "98", + "size": "49946" + }, + "fixed_width_still": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200w_s.gif", + "width": "200", + "height": "113", + "size": "17412" + }, + "fixed_width_small": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100w.gif", + "width": "100", + "height": "57", + "size": "80057", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100w.mp4", + "mp4_size": "23055", + "webp": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/100w.webp", + "webp_size": "32578" + }, + "downsized_small": { + "width": "388", + "height": "218", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy-downsized-small.mp4", + "mp4_size": "91424" + }, + "fixed_width_downsampled": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200w_d.gif", + "width": "200", + "height": "113", + "size": "103587", + "webp": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200w_d.webp", + "webp_size": "33950" + }, + "downsized_medium": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy.gif", + "width": "480", + "height": "270", + "size": "1395758" + }, + "original": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy.gif", + "width": "480", + "height": "270", + "size": "1395758", + "frames": "15", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy.mp4", + "mp4_size": "194920", + "webp": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy.webp", + "webp_size": "332286", + "hash": "71b54c5313f5d387401fcc7058a51502" + }, + "fixed_height": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200.gif", + "width": "356", + "height": "200", + "size": "716194", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200.mp4", + "mp4_size": "123445", + "webp": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/200.webp", + "webp_size": "184968" + }, + "looping": { + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy-loop.mp4", + "mp4_size": "3025379" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy.mp4", + "mp4_size": "194920" + }, + "preview_gif": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/giphy-preview.gif", + "width": "107", + "height": "60", + "size": "49272" + }, + "480w_still": { + "url": "https://media1.giphy.com/media/1oKPKBGn5yTHxflC61/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "amazing race GIF by CTV", + "_score": 0 + }, + { + "type": "gif", + "id": "2rACoX3oXJX1kZceZZ", + "slug": "loveconnectionfox-2rACoX3oXJX1kZceZZ", + "url": "https://giphy.com/gifs/loveconnectionfox-2rACoX3oXJX1kZceZZ", + "bitly_gif_url": "https://gph.is/2JcwwcF", + "bitly_url": "https://gph.is/2JcwwcF", + "embed_url": "https://giphy.com/embed/2rACoX3oXJX1kZceZZ", + "username": "loveconnectionfox", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-07-11 02:06:27", + "trending_datetime": "2018-07-12 02:30:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/loveconnectionfox/MfToNl4LYXMo.png", + "banner_url": "https://media.giphy.com/headers/loveconnectionfox/WFXnraLoD1To.png", + "profile_url": "https://giphy.com/loveconnectionfox/", + "username": "loveconnectionfox", + "display_name": "", + "guid": "ZmJjc29jaWFsMisxOUBnbWFpbC5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200_s.gif", + "width": "356", + "height": "200", + "size": "40570" + }, + "original_still": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy_s.gif", + "width": "480", + "height": "270", + "size": "69832" + }, + "fixed_width": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200w.gif", + "width": "200", + "height": "113", + "size": "836633", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200w.mp4", + "mp4_size": "65735", + "webp": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200w.webp", + "webp_size": "384096" + }, + "fixed_height_small_still": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100_s.gif", + "width": "178", + "height": "100", + "size": "11905" + }, + "fixed_height_downsampled": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200_d.gif", + "width": "356", + "height": "200", + "size": "235467", + "webp": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200_d.webp", + "webp_size": "51712" + }, + "preview": { + "width": "384", + "height": "216", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy-preview.mp4", + "mp4_size": "28214" + }, + "fixed_height_small": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100.gif", + "width": "178", + "height": "100", + "size": "704618", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100.mp4", + "mp4_size": "61399", + "webp": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100.webp", + "webp_size": "327852" + }, + "downsized_still": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy-downsized_s.gif", + "width": "384", + "height": "216", + "size": "51520" + }, + "downsized": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy-downsized.gif", + "width": "384", + "height": "216", + "size": "1783687" + }, + "downsized_large": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy.gif", + "width": "480", + "height": "270", + "size": "4533921" + }, + "fixed_width_small_still": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100w_s.gif", + "width": "100", + "height": "57", + "size": "5112" + }, + "preview_webp": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy-preview.webp", + "width": "228", + "height": "128", + "size": "47740" + }, + "fixed_width_still": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200w_s.gif", + "width": "200", + "height": "113", + "size": "14284" + }, + "fixed_width_small": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100w.gif", + "width": "100", + "height": "57", + "size": "230224", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100w.mp4", + "mp4_size": "25435", + "webp": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/100w.webp", + "webp_size": "150254" + }, + "downsized_small": { + "width": "324", + "height": "182", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy-downsized-small.mp4", + "mp4_size": "75395" + }, + "fixed_width_downsampled": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200w_d.gif", + "width": "200", + "height": "113", + "size": "82798", + "webp": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200w_d.webp", + "webp_size": "23516" + }, + "downsized_medium": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy.gif", + "width": "480", + "height": "270", + "size": "4533921" + }, + "original": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy.gif", + "width": "480", + "height": "270", + "size": "4533921", + "frames": "100", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy.mp4", + "mp4_size": "249735", + "webp": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy.webp", + "webp_size": "1410392", + "hash": "b59c304bdb1c0af70d325b1eb70e5b5c" + }, + "fixed_height": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200.gif", + "width": "356", + "height": "200", + "size": "2561317", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200.mp4", + "mp4_size": "157537", + "webp": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/200.webp", + "webp_size": "844470" + }, + "looping": { + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy-loop.mp4", + "mp4_size": "1639490" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy.mp4", + "mp4_size": "249735" + }, + "preview_gif": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/giphy-preview.gif", + "width": "148", + "height": "83", + "size": "49797" + }, + "480w_still": { + "url": "https://media3.giphy.com/media/2rACoX3oXJX1kZceZZ/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "andy cohen fox GIF by loveconnectionfox", + "_score": 0 + }, + { + "type": "gif", + "id": "1rRPDrBQ0dBkkXa4wV", + "slug": "laugh-laughing-chris-evans-1rRPDrBQ0dBkkXa4wV", + "url": "https://giphy.com/gifs/laugh-laughing-chris-evans-1rRPDrBQ0dBkkXa4wV", + "bitly_gif_url": "https://gph.is/2NK4A3l", + "bitly_url": "https://gph.is/2NK4A3l", + "embed_url": "https://giphy.com/embed/1rRPDrBQ0dBkkXa4wV", + "username": "", + "source": "https://imgur.com/gallery/KPuCGRl", + "rating": "g", + "content_url": "", + "source_tld": "imgur.com", + "source_post_url": "https://imgur.com/gallery/KPuCGRl", + "is_sticker": 0, + "import_datetime": "2018-07-11 14:27:30", + "trending_datetime": "2018-07-12 02:15:01", + "images": { + "fixed_height_still": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200_s.gif", + "width": "470", + "height": "200", + "size": "38727" + }, + "original_still": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy_s.gif", + "width": "700", + "height": "298", + "size": "38567" + }, + "fixed_width": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200w.gif", + "width": "200", + "height": "85", + "size": "658215", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200w.mp4", + "mp4_size": "84569", + "webp": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200w.webp", + "webp_size": "249688" + }, + "fixed_height_small_still": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100_s.gif", + "width": "235", + "height": "100", + "size": "10974" + }, + "fixed_height_downsampled": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200_d.gif", + "width": "470", + "height": "200", + "size": "229511", + "webp": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200_d.webp", + "webp_size": "45312" + }, + "preview": { + "width": "370", + "height": "156", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy-preview.mp4", + "mp4_size": "38357" + }, + "fixed_height_small": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100.gif", + "width": "235", + "height": "100", + "size": "918280", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100.mp4", + "mp4_size": "105632", + "webp": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100.webp", + "webp_size": "320330" + }, + "downsized_still": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy-downsized_s.gif", + "width": "421", + "height": "179", + "size": "34234" + }, + "downsized": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy-downsized.gif", + "width": "421", + "height": "179", + "size": "1393317" + }, + "downsized_large": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy.gif", + "width": "700", + "height": "298", + "size": "3844000" + }, + "fixed_width_small_still": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100w_s.gif", + "width": "100", + "height": "43", + "size": "2973" + }, + "preview_webp": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy-preview.webp", + "width": "317", + "height": "135", + "size": "49544" + }, + "fixed_width_still": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200w_s.gif", + "width": "200", + "height": "85", + "size": "8159" + }, + "fixed_width_small": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100w.gif", + "width": "100", + "height": "43", + "size": "190316", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100w.mp4", + "mp4_size": "28945", + "webp": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/100w.webp", + "webp_size": "105704" + }, + "downsized_small": { + "width": "280", + "height": "118", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy-downsized-small.mp4", + "mp4_size": "73359" + }, + "fixed_width_downsampled": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200w_d.gif", + "width": "200", + "height": "85", + "size": "42165", + "webp": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200w_d.webp", + "webp_size": "12058" + }, + "downsized_medium": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy.gif", + "width": "700", + "height": "298", + "size": "3844000" + }, + "original": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy.gif", + "width": "700", + "height": "298", + "size": "3844000", + "frames": "135", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy.mp4", + "mp4_size": "378859", + "webp": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy.webp", + "webp_size": "2178094", + "hash": "3f458cbc55630c507e07b692eed49d2d" + }, + "fixed_height": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200.gif", + "width": "470", + "height": "200", + "size": "3123915", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200.mp4", + "mp4_size": "329781", + "webp": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/200.webp", + "webp_size": "908340" + }, + "looping": { + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy-loop.mp4", + "mp4_size": "1069381" + }, + "original_mp4": { + "width": "480", + "height": "204", + "mp4": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy.mp4", + "mp4_size": "378859" + }, + "preview_gif": { + "url": "https://media1.giphy.com/media/1rRPDrBQ0dBkkXa4wV/giphy-preview.gif", + "width": "190", + "height": "81", + "size": "49106" + }, + "480w_still": { + "url": "https://media0.giphy.com/media/1rRPDrBQ0dBkkXa4wV/480w_s.jpg", + "width": "480", + "height": "204" + } + }, + "title": "chris evans lol GIF", + "_score": 0 + }, + { + "type": "gif", + "id": "fVevz86bolcva0VTCS", + "slug": "ballinthefamily-season-3-episode-4-fVevz86bolcva0VTCS", + "url": "https://giphy.com/gifs/ballinthefamily-season-3-episode-4-fVevz86bolcva0VTCS", + "bitly_gif_url": "https://gph.is/2KMwgag", + "bitly_url": "https://gph.is/2KMwgag", + "embed_url": "https://giphy.com/embed/fVevz86bolcva0VTCS", + "username": "ballinthefamily", + "source": "https://www.facebook.com/ballinthefamily", + "rating": "g", + "content_url": "", + "source_tld": "www.facebook.com", + "source_post_url": "https://www.facebook.com/ballinthefamily", + "is_sticker": 0, + "import_datetime": "2018-07-10 17:56:35", + "trending_datetime": "2018-07-12 02:00:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/ballinthefamily/6Q8aNyB7D6RY.gif", + "banner_url": "https://media.giphy.com/headers/ballinthefamily/IdjFyI3xVGf3.jpg", + "profile_url": "https://giphy.com/ballinthefamily/", + "username": "ballinthefamily", + "display_name": "Ball in the Family", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200_s.gif", + "width": "200", + "height": "200", + "size": "16055" + }, + "original_still": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy_s.gif", + "width": "480", + "height": "480", + "size": "59844" + }, + "fixed_width": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200w.gif", + "width": "200", + "height": "200", + "size": "163506", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200w.mp4", + "mp4_size": "15137", + "webp": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200w.webp", + "webp_size": "51602" + }, + "fixed_height_small_still": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100_s.gif", + "width": "100", + "height": "100", + "size": "5970" + }, + "fixed_height_downsampled": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200_d.gif", + "width": "200", + "height": "200", + "size": "90439", + "webp": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200_d.webp", + "webp_size": "24118" + }, + "preview": { + "width": "430", + "height": "430", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy-preview.mp4", + "mp4_size": "23669" + }, + "fixed_height_small": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100.gif", + "width": "100", + "height": "100", + "size": "51929", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100.mp4", + "mp4_size": "6728", + "webp": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100.webp", + "webp_size": "24378" + }, + "downsized_still": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy-downsized_s.gif", + "width": "480", + "height": "480", + "size": "59844" + }, + "downsized": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy.gif", + "width": "480", + "height": "480", + "size": "789390" + }, + "downsized_large": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy.gif", + "width": "480", + "height": "480", + "size": "789390" + }, + "fixed_width_small_still": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100w_s.gif", + "width": "100", + "height": "100", + "size": "5970" + }, + "preview_webp": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy-preview.webp", + "width": "355", + "height": "355", + "size": "49644" + }, + "fixed_width_still": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200w_s.gif", + "width": "200", + "height": "200", + "size": "16055" + }, + "fixed_width_small": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100w.gif", + "width": "100", + "height": "100", + "size": "51929", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100w.mp4", + "mp4_size": "6728", + "webp": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/100w.webp", + "webp_size": "24378" + }, + "downsized_small": { + "width": "480", + "height": "480", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy-downsized-small.mp4", + "mp4_size": "62205" + }, + "fixed_width_downsampled": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200w_d.gif", + "width": "200", + "height": "200", + "size": "90439", + "webp": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200w_d.webp", + "webp_size": "24118" + }, + "downsized_medium": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy.gif", + "width": "480", + "height": "480", + "size": "789390" + }, + "original": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy.gif", + "width": "480", + "height": "480", + "size": "789390", + "frames": "13", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy.mp4", + "mp4_size": "62205", + "webp": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy.webp", + "webp_size": "141228", + "hash": "f22808e683a2a65f22776b78694be2cd" + }, + "fixed_height": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200.gif", + "width": "200", + "height": "200", + "size": "163506", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200.mp4", + "mp4_size": "15137", + "webp": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/200.webp", + "webp_size": "51602" + }, + "looping": { + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy-loop.mp4", + "mp4_size": "1775849" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy.mp4", + "mp4_size": "62205" + }, + "preview_gif": { + "url": "https://media1.giphy.com/media/fVevz86bolcva0VTCS/giphy-preview.gif", + "width": "151", + "height": "151", + "size": "48965" + }, + "480w_still": { + "url": "https://media4.giphy.com/media/fVevz86bolcva0VTCS/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "season 3 facebook watch GIF by Ball in the Family", + "_score": 0 + }, + { + "type": "gif", + "id": "l46C5CCrtPuTKAmUU", + "slug": "hot-fart-wrecked-l46C5CCrtPuTKAmUU", + "url": "https://giphy.com/gifs/hot-fart-wrecked-l46C5CCrtPuTKAmUU", + "bitly_gif_url": "https://gph.is/299cctA", + "bitly_url": "https://gph.is/299cctA", + "embed_url": "https://giphy.com/embed/l46C5CCrtPuTKAmUU", + "username": "wreckedtbs", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2016-06-27 19:00:21", + "trending_datetime": "2018-07-11 15:20:03", + "user": { + "avatar_url": "https://media.giphy.com/avatars/wreckedtbs/nOypcSqNMJ9j.jpg", + "banner_url": "", + "profile_url": "https://giphy.com/wreckedtbs/", + "username": "wreckedtbs", + "display_name": "Wrecked", + "guid": "dGJzLndyZWNrZWRAZ21haWwuY29t" + }, + "images": { + "fixed_height_still": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200_s.gif", + "width": "356", + "height": "200" + }, + "original_still": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy_s.gif", + "width": "500", + "height": "281" + }, + "fixed_width": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200w.gif", + "width": "200", + "height": "112", + "size": "334844", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200w.mp4", + "mp4_size": "23702", + "webp": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200w.webp", + "webp_size": "159258" + }, + "fixed_height_small_still": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100_s.gif", + "width": "178", + "height": "100" + }, + "fixed_height_downsampled": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200_d.gif", + "width": "356", + "height": "200", + "size": "224084", + "webp": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200_d.webp", + "webp_size": "81060" + }, + "preview": { + "width": "368", + "height": "206", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy-preview.mp4", + "mp4_size": "34899" + }, + "fixed_height_small": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100.gif", + "width": "178", + "height": "100", + "size": "280066", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100.mp4", + "mp4_size": "21472", + "webp": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100.webp", + "webp_size": "138696" + }, + "downsized_still": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy-downsized_s.gif", + "width": "250", + "height": "140", + "size": "20962" + }, + "downsized": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy-downsized.gif", + "width": "250", + "height": "140", + "size": "524574" + }, + "downsized_large": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy.gif", + "width": "500", + "height": "281", + "size": "2130213" + }, + "fixed_width_small_still": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100w_s.gif", + "width": "100", + "height": "56" + }, + "preview_webp": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy-preview.webp", + "width": "189", + "height": "106", + "size": "49294" + }, + "fixed_width_still": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200w_s.gif", + "width": "200", + "height": "112" + }, + "fixed_width_small": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100w.gif", + "width": "100", + "height": "56", + "size": "96671", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100w.mp4", + "mp4_size": "10651", + "webp": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/100w.webp", + "webp_size": "59810" + }, + "downsized_small": { + "width": "500", + "height": "280", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy-downsized-small.mp4", + "mp4_size": "125602" + }, + "fixed_width_downsampled": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200w_d.gif", + "width": "200", + "height": "112", + "size": "76429", + "webp": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200w_d.webp", + "webp_size": "32726" + }, + "downsized_medium": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy.gif", + "width": "500", + "height": "281", + "size": "2130213" + }, + "original": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy.gif", + "width": "500", + "height": "281", + "size": "2130213", + "frames": "29", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy.mp4", + "mp4_size": "88084", + "webp": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy.webp", + "webp_size": "799190" + }, + "fixed_height": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200.gif", + "width": "356", + "height": "200", + "size": "1007418", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200.mp4", + "mp4_size": "55151", + "webp": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/200.webp", + "webp_size": "393142" + }, + "looping": { + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy-loop.mp4", + "mp4_size": "619622" + }, + "original_mp4": { + "width": "480", + "height": "268", + "mp4": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy.mp4", + "mp4_size": "88084" + }, + "preview_gif": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/giphy-preview.gif", + "width": "144", + "height": "81", + "size": "49399" + }, + "480w_still": { + "url": "https://media1.giphy.com/media/l46C5CCrtPuTKAmUU/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "hot dog days GIF by Wrecked", + "_score": 0 + }, + { + "type": "gif", + "id": "RobBVDLdA7Qas", + "slug": "realitytvgifs-rhobh-wine-taylor-armstrong-RobBVDLdA7Qas", + "url": "https://giphy.com/gifs/realitytvgifs-rhobh-wine-taylor-armstrong-RobBVDLdA7Qas", + "bitly_gif_url": "https://gph.is/1rovCcR", + "bitly_url": "https://gph.is/1rovCcR", + "embed_url": "https://giphy.com/embed/RobBVDLdA7Qas", + "username": "realitytvgifs", + "source": "https://realitytvgifs.tumblr.com/post/100550296997/requested-by-brandiglanville", + "rating": "pg", + "content_url": "", + "source_tld": "realitytvgifs.tumblr.com", + "source_post_url": "https://realitytvgifs.tumblr.com/post/100550296997/requested-by-brandiglanville", + "is_sticker": 0, + "import_datetime": "2014-10-21 01:59:29", + "trending_datetime": "2018-07-12 01:30:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/realitytvgifs/sdANtS453YMz.png", + "banner_url": "", + "profile_url": "https://giphy.com/realitytvgifs/", + "username": "realitytvgifs", + "display_name": "T. Kyle", + "guid": "dGt5bGVtYWNtYWhvbkBnbWFpbC5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/200_s.gif", + "width": "356", + "height": "200" + }, + "original_still": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy_s.gif", + "width": "450", + "height": "253" + }, + "fixed_width": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/200w.gif", + "width": "200", + "height": "112", + "size": "521440", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/200w.mp4", + "mp4_size": "41510", + "webp": "https://media3.giphy.com/media/RobBVDLdA7Qas/200w.webp", + "webp_size": "200260" + }, + "fixed_height_small_still": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/100_s.gif", + "width": "178", + "height": "100" + }, + "fixed_height_downsampled": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/200_d.gif", + "width": "356", + "height": "200", + "size": "297902", + "webp": "https://media3.giphy.com/media/RobBVDLdA7Qas/200_d.webp", + "webp_size": "93038" + }, + "preview": { + "width": "270", + "height": "150", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy-preview.mp4", + "mp4_size": "44650" + }, + "fixed_height_small": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/100.gif", + "width": "178", + "height": "100", + "size": "436203", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/100.mp4", + "mp4_size": "37437", + "webp": "https://media3.giphy.com/media/RobBVDLdA7Qas/100.webp", + "webp_size": "178664" + }, + "downsized_still": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy_s.gif", + "width": "450", + "height": "253" + }, + "downsized": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy.gif", + "width": "450", + "height": "253", + "size": "1991178" + }, + "downsized_large": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy.gif", + "width": "450", + "height": "253", + "size": "1991178" + }, + "fixed_width_small_still": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/100w_s.gif", + "width": "100", + "height": "56" + }, + "preview_webp": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy-preview.webp", + "width": "171", + "height": "96", + "size": "47646" + }, + "fixed_width_still": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/200w_s.gif", + "width": "200", + "height": "112" + }, + "fixed_width_small": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/100w.gif", + "width": "100", + "height": "56", + "size": "150085", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/100w.mp4", + "mp4_size": "16796", + "webp": "https://media3.giphy.com/media/RobBVDLdA7Qas/100w.webp", + "webp_size": "73786" + }, + "downsized_small": { + "width": "450", + "height": "252", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy-downsized-small.mp4", + "mp4_size": "187991" + }, + "fixed_width_downsampled": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/200w_d.gif", + "width": "200", + "height": "112", + "size": "97051", + "webp": "https://media3.giphy.com/media/RobBVDLdA7Qas/200w_d.webp", + "webp_size": "36066" + }, + "downsized_medium": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy.gif", + "width": "450", + "height": "253", + "size": "1991178" + }, + "original": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy.gif", + "width": "450", + "height": "253", + "size": "1991178", + "frames": "34", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy.mp4", + "mp4_size": "166344", + "webp": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy.webp", + "webp_size": "897234" + }, + "fixed_height": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/200.gif", + "width": "356", + "height": "200", + "size": "1599039", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/200.mp4", + "mp4_size": "96150", + "webp": "https://media3.giphy.com/media/RobBVDLdA7Qas/200.webp", + "webp_size": "525416" + }, + "looping": { + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy-loop.mp4", + "mp4_size": "1078749" + }, + "original_mp4": { + "width": "480", + "height": "268", + "mp4": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy.mp4", + "mp4_size": "166344" + }, + "preview_gif": { + "url": "https://media3.giphy.com/media/RobBVDLdA7Qas/giphy-preview.gif", + "width": "110", + "height": "62", + "size": "47655" + }, + "480w_still": { + "url": "https://media2.giphy.com/media/RobBVDLdA7Qas/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "white wine laughing GIF by T. Kyle", + "_score": 0 + }, + { + "type": "gif", + "id": "dilBP4FslWpm8", + "slug": "good-morning-well-dilBP4FslWpm8", + "url": "https://giphy.com/gifs/good-morning-well-dilBP4FslWpm8", + "bitly_gif_url": "https://gph.is/1xhALdB", + "bitly_url": "https://gph.is/1xhALdB", + "embed_url": "https://giphy.com/embed/dilBP4FslWpm8", + "username": "good-morning", + "source": "https://www.gifbay.com/gif/well_good_morning-156807/", + "rating": "g", + "content_url": "", + "source_tld": "www.gifbay.com", + "source_post_url": "https://www.gifbay.com/gif/well_good_morning-156807/", + "is_sticker": 0, + "import_datetime": "2014-11-07 18:27:09", + "trending_datetime": "2018-07-12 01:15:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/good-morning/mBgOAyM6ww8i.gif", + "banner_url": "", + "profile_url": "https://giphy.com/good-morning/", + "username": "good-morning", + "display_name": "", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/200_s.gif", + "width": "250", + "height": "200" + }, + "original_still": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy_s.gif", + "width": "245", + "height": "196" + }, + "fixed_width": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/200w.gif", + "width": "200", + "height": "160", + "size": "558771", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/200w.mp4", + "mp4_size": "39553", + "webp": "https://media1.giphy.com/media/dilBP4FslWpm8/200w.webp", + "webp_size": "277122" + }, + "fixed_height_small_still": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/100_s.gif", + "width": "125", + "height": "100" + }, + "fixed_height_downsampled": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/200_d.gif", + "width": "250", + "height": "200", + "size": "210075", + "webp": "https://media1.giphy.com/media/dilBP4FslWpm8/200_d.webp", + "webp_size": "101850" + }, + "preview": { + "width": "154", + "height": "122", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy-preview.mp4", + "mp4_size": "33672" + }, + "fixed_height_small": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/100.gif", + "width": "125", + "height": "100", + "size": "235084", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/100.mp4", + "mp4_size": "22154", + "webp": "https://media1.giphy.com/media/dilBP4FslWpm8/100.webp", + "webp_size": "128238" + }, + "downsized_still": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy-downsized_s.gif", + "width": "245", + "height": "196", + "size": "23446" + }, + "downsized": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy-downsized.gif", + "width": "245", + "height": "196", + "size": "567755" + }, + "downsized_large": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy.gif", + "width": "245", + "height": "196", + "size": "567755" + }, + "fixed_width_small_still": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/100w_s.gif", + "width": "100", + "height": "80" + }, + "preview_webp": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy-preview.webp", + "width": "120", + "height": "96", + "size": "48408" + }, + "fixed_width_still": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/200w_s.gif", + "width": "200", + "height": "160" + }, + "fixed_width_small": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/100w.gif", + "width": "100", + "height": "80", + "size": "156078", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/100w.mp4", + "mp4_size": "16069", + "webp": "https://media1.giphy.com/media/dilBP4FslWpm8/100w.webp", + "webp_size": "89394" + }, + "downsized_small": { + "width": "244", + "height": "196", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy-downsized-small.mp4", + "mp4_size": "124941" + }, + "fixed_width_downsampled": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/200w_d.gif", + "width": "200", + "height": "160", + "size": "141162", + "webp": "https://media1.giphy.com/media/dilBP4FslWpm8/200w_d.webp", + "webp_size": "69186" + }, + "downsized_medium": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy.gif", + "width": "245", + "height": "196", + "size": "567755" + }, + "original": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy.gif", + "width": "245", + "height": "196", + "size": "567755", + "frames": "24", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy.mp4", + "mp4_size": "248791", + "webp": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy.webp", + "webp_size": "437924" + }, + "fixed_height": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/200.gif", + "width": "250", + "height": "200", + "size": "831559", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/200.mp4", + "mp4_size": "58160", + "webp": "https://media1.giphy.com/media/dilBP4FslWpm8/200.webp", + "webp_size": "407920" + }, + "looping": { + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy-loop.mp4", + "mp4_size": "2568929" + }, + "original_mp4": { + "width": "480", + "height": "384", + "mp4": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy.mp4", + "mp4_size": "248791" + }, + "preview_gif": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/giphy-preview.gif", + "width": "85", + "height": "68", + "size": "48414" + }, + "480w_still": { + "url": "https://media1.giphy.com/media/dilBP4FslWpm8/480w_s.jpg", + "width": "480", + "height": "384" + } + }, + "title": "whatsapp status GIF by good-morning", + "_score": 0 + }, + { + "type": "gif", + "id": "xT1XGWbE0XiBDX2T8Q", + "slug": "maury-maury-face-xT1XGWbE0XiBDX2T8Q", + "url": "https://giphy.com/gifs/maury-maury-face-xT1XGWbE0XiBDX2T8Q", + "bitly_gif_url": "https://gph.is/1reY7S2", + "bitly_url": "https://gph.is/1reY7S2", + "embed_url": "https://giphy.com/embed/xT1XGWbE0XiBDX2T8Q", + "username": "maury", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2016-04-26 12:58:51", + "trending_datetime": "2018-07-12 01:00:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/maury/CCfmmNrjL4h5.jpg", + "banner_url": "https://media.giphy.com/headers/maury/zJtPxFr5Aupk.jpg", + "profile_url": "https://giphy.com/maury/", + "username": "maury", + "display_name": "The Maury Show", + "guid": "QW5kcmV3LlJvdGUrbWF1cnlAbmJjdW5pLmNvbQ" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200_s.gif", + "width": "356", + "height": "200" + }, + "original_still": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy_s.gif", + "width": "480", + "height": "270" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200w.gif", + "width": "200", + "height": "113", + "size": "423876", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200w.mp4", + "mp4_size": "22743", + "webp": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200w.webp", + "webp_size": "159986" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100_s.gif", + "width": "178", + "height": "100" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200_d.gif", + "width": "356", + "height": "200", + "size": "285227", + "webp": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200_d.webp", + "webp_size": "73538" + }, + "preview": { + "width": "258", + "height": "144", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy-preview.mp4", + "mp4_size": "26452" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100.gif", + "width": "178", + "height": "100", + "size": "357434", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100.mp4", + "mp4_size": "20303", + "webp": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100.webp", + "webp_size": "138072" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy-downsized_s.gif", + "width": "250", + "height": "140", + "size": "24480" + }, + "downsized": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy-downsized.gif", + "width": "250", + "height": "140", + "size": "640595" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy.gif", + "width": "480", + "height": "270", + "size": "2325265" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100w_s.gif", + "width": "100", + "height": "56" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy-preview.webp", + "width": "196", + "height": "110", + "size": "49678" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200w_s.gif", + "width": "200", + "height": "113" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100w.gif", + "width": "100", + "height": "56", + "size": "118688", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100w.mp4", + "mp4_size": "10247", + "webp": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/100w.webp", + "webp_size": "60926" + }, + "downsized_small": { + "width": "480", + "height": "270", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy-downsized-small.mp4", + "mp4_size": "109525" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200w_d.gif", + "width": "200", + "height": "113", + "size": "100893", + "webp": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200w_d.webp", + "webp_size": "33102" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy.gif", + "width": "480", + "height": "270", + "size": "2325265" + }, + "original": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy.gif", + "width": "480", + "height": "270", + "size": "2325265", + "frames": "29", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy.mp4", + "mp4_size": "102608", + "webp": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy.webp", + "webp_size": "601376" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200.gif", + "width": "356", + "height": "200", + "size": "1287110", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200.mp4", + "mp4_size": "51550", + "webp": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/200.webp", + "webp_size": "355742" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy-loop.mp4", + "mp4_size": "825052" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy.mp4", + "mp4_size": "102608" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/giphy-preview.gif", + "width": "116", + "height": "65", + "size": "47634" + }, + "480w_still": { + "url": "https://media0.giphy.com/media/xT1XGWbE0XiBDX2T8Q/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "oh no GIF by The Maury Show", + "_score": 0 + }, + { + "type": "gif", + "id": "65OKKACyaw6FwwbuRt", + "slug": "ballinthefamily-season-3-episode-5-65OKKACyaw6FwwbuRt", + "url": "https://giphy.com/gifs/ballinthefamily-season-3-episode-5-65OKKACyaw6FwwbuRt", + "bitly_gif_url": "https://gph.is/2L9M82M", + "bitly_url": "https://gph.is/2L9M82M", + "embed_url": "https://giphy.com/embed/65OKKACyaw6FwwbuRt", + "username": "ballinthefamily", + "source": "https://www.facebook.com/ballinthefamily", + "rating": "g", + "content_url": "", + "source_tld": "www.facebook.com", + "source_post_url": "https://www.facebook.com/ballinthefamily", + "is_sticker": 0, + "import_datetime": "2018-07-10 18:55:01", + "trending_datetime": "2018-07-12 00:45:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/ballinthefamily/6Q8aNyB7D6RY.gif", + "banner_url": "https://media.giphy.com/headers/ballinthefamily/IdjFyI3xVGf3.jpg", + "profile_url": "https://giphy.com/ballinthefamily/", + "username": "ballinthefamily", + "display_name": "Ball in the Family", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200_s.gif", + "width": "200", + "height": "200", + "size": "13979" + }, + "original_still": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy_s.gif", + "width": "480", + "height": "480", + "size": "53631" + }, + "fixed_width": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200w.gif", + "width": "200", + "height": "200", + "size": "417661", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200w.mp4", + "mp4_size": "53081", + "webp": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200w.webp", + "webp_size": "131812" + }, + "fixed_height_small_still": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100_s.gif", + "width": "100", + "height": "100", + "size": "5254" + }, + "fixed_height_downsampled": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200_d.gif", + "width": "200", + "height": "200", + "size": "78691", + "webp": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200_d.webp", + "webp_size": "30402" + }, + "preview": { + "width": "236", + "height": "236", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy-preview.mp4", + "mp4_size": "33983" + }, + "fixed_height_small": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100.gif", + "width": "100", + "height": "100", + "size": "153239", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100.mp4", + "mp4_size": "20893", + "webp": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100.webp", + "webp_size": "56370" + }, + "downsized_still": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy-downsized_s.gif", + "width": "480", + "height": "480", + "size": "53631" + }, + "downsized": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy.gif", + "width": "480", + "height": "480", + "size": "1658226" + }, + "downsized_large": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy.gif", + "width": "480", + "height": "480", + "size": "1658226" + }, + "fixed_width_small_still": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100w_s.gif", + "width": "100", + "height": "100", + "size": "5254" + }, + "preview_webp": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy-preview.webp", + "width": "204", + "height": "204", + "size": "49030" + }, + "fixed_width_still": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200w_s.gif", + "width": "200", + "height": "200", + "size": "13979" + }, + "fixed_width_small": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100w.gif", + "width": "100", + "height": "100", + "size": "153239", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100w.mp4", + "mp4_size": "20893", + "webp": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/100w.webp", + "webp_size": "56370" + }, + "downsized_small": { + "width": "432", + "height": "432", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy-downsized-small.mp4", + "mp4_size": "86291" + }, + "fixed_width_downsampled": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200w_d.gif", + "width": "200", + "height": "200", + "size": "78691", + "webp": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200w_d.webp", + "webp_size": "30402" + }, + "downsized_medium": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy.gif", + "width": "480", + "height": "480", + "size": "1658226" + }, + "original": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy.gif", + "width": "480", + "height": "480", + "size": "1658226", + "frames": "31", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy.mp4", + "mp4_size": "206386", + "webp": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy.webp", + "webp_size": "377910", + "hash": "cb77fbfbee176f164deb75bb6e093bc9" + }, + "fixed_height": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200.gif", + "width": "200", + "height": "200", + "size": "417661", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200.mp4", + "mp4_size": "53081", + "webp": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/200.webp", + "webp_size": "131812" + }, + "looping": { + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy-loop.mp4", + "mp4_size": "2493398" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy.mp4", + "mp4_size": "206386" + }, + "preview_gif": { + "url": "https://media2.giphy.com/media/65OKKACyaw6FwwbuRt/giphy-preview.gif", + "width": "118", + "height": "118", + "size": "49144" + }, + "480w_still": { + "url": "https://media4.giphy.com/media/65OKKACyaw6FwwbuRt/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "season 3 omg GIF by Ball in the Family", + "_score": 0 + }, + { + "type": "gif", + "id": "323XtMJCe8AZ6QPxMP", + "slug": "nbcmarlon-season-2-nbc-323XtMJCe8AZ6QPxMP", + "url": "https://giphy.com/gifs/nbcmarlon-season-2-nbc-323XtMJCe8AZ6QPxMP", + "bitly_gif_url": "https://gph.is/2ulDW88", + "bitly_url": "https://gph.is/2ulDW88", + "embed_url": "https://giphy.com/embed/323XtMJCe8AZ6QPxMP", + "username": "nbcmarlon", + "source": "nbc.com/marlon", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "nbc.com/marlon", + "is_sticker": 0, + "import_datetime": "2018-07-09 23:33:38", + "trending_datetime": "2018-07-12 00:30:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/nbcmarlon/JcFwZTr8xC1R.jpg", + "banner_url": "https://media.giphy.com/headers/nbcmarlon/5shCz6JIQUFs.gif", + "profile_url": "https://giphy.com/nbcmarlon/", + "username": "nbcmarlon", + "display_name": "Marlon", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200_s.gif", + "width": "356", + "height": "200", + "size": "42459" + }, + "original_still": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy_s.gif", + "width": "500", + "height": "281", + "size": "85514" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200w.gif", + "width": "200", + "height": "112", + "size": "271309", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200w.mp4", + "mp4_size": "82529", + "webp": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200w.webp", + "webp_size": "209236" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100_s.gif", + "width": "178", + "height": "100", + "size": "13165" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200_d.gif", + "width": "356", + "height": "200", + "size": "240666", + "webp": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200_d.webp", + "webp_size": "139904" + }, + "preview": { + "width": "236", + "height": "132", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy-preview.mp4", + "mp4_size": "40999" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100.gif", + "width": "178", + "height": "100", + "size": "228319", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100.mp4", + "mp4_size": "72109", + "webp": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100.webp", + "webp_size": "175920" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy-downsized_s.gif", + "width": "500", + "height": "281", + "size": "85514" + }, + "downsized": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy.gif", + "width": "500", + "height": "281", + "size": "1744166" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy.gif", + "width": "500", + "height": "281", + "size": "1744166" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100w_s.gif", + "width": "100", + "height": "56", + "size": "5641" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy-preview.webp", + "width": "133", + "height": "75", + "size": "48350" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200w_s.gif", + "width": "200", + "height": "112", + "size": "15549" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100w.gif", + "width": "100", + "height": "56", + "size": "74060", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100w.mp4", + "mp4_size": "26766", + "webp": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/100w.webp", + "webp_size": "67132" + }, + "downsized_small": { + "width": "268", + "height": "150", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy-downsized-small.mp4", + "mp4_size": "78369" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200w_d.gif", + "width": "200", + "height": "112", + "size": "80459", + "webp": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200w_d.webp", + "webp_size": "53006" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy.gif", + "width": "500", + "height": "281", + "size": "1744166" + }, + "original": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy.gif", + "width": "500", + "height": "281", + "size": "1744166", + "frames": "24", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy.mp4", + "mp4_size": "467128", + "webp": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy.webp", + "webp_size": "1088232", + "hash": "81c0672438da4c90894981688f256967" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200.gif", + "width": "356", + "height": "200", + "size": "863264", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200.mp4", + "mp4_size": "228328", + "webp": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/200.webp", + "webp_size": "556476" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy-loop.mp4", + "mp4_size": "2947244" + }, + "original_mp4": { + "width": "480", + "height": "268", + "mp4": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy.mp4", + "mp4_size": "467128" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/323XtMJCe8AZ6QPxMP/giphy-preview.gif", + "width": "121", + "height": "68", + "size": "49525" + }, + "480w_still": { + "url": "https://media4.giphy.com/media/323XtMJCe8AZ6QPxMP/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "season 2 nbc GIF by Marlon", + "_score": 0 + }, + { + "type": "gif", + "id": "9V5mtff0N5dhZ0nFur", + "slug": "thegongshow-season-2-episode-9V5mtff0N5dhZ0nFur", + "url": "https://giphy.com/gifs/thegongshow-season-2-episode-9V5mtff0N5dhZ0nFur", + "bitly_gif_url": "https://gph.is/2MWaOgn", + "bitly_url": "https://gph.is/2MWaOgn", + "embed_url": "https://giphy.com/embed/9V5mtff0N5dhZ0nFur", + "username": "thegongshow", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-25 13:21:30", + "trending_datetime": "2018-07-11 15:19:07", + "user": { + "avatar_url": "https://media.giphy.com/avatars/thegongshow/cDZATOZOCi74.jpg", + "banner_url": "https://media.giphy.com/headers/thegongshow/5GkSLxZJE6bR.jpg", + "profile_url": "https://giphy.com/thegongshow/", + "username": "thegongshow", + "display_name": "The Gong Show", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200_s.gif", + "width": "356", + "height": "200", + "size": "41797" + }, + "original_still": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy_s.gif", + "width": "480", + "height": "270", + "size": "67505" + }, + "fixed_width": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200w.gif", + "width": "200", + "height": "112", + "size": "558441", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200w.mp4", + "mp4_size": "60418", + "webp": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200w.webp", + "webp_size": "139138" + }, + "fixed_height_small_still": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100_s.gif", + "width": "178", + "height": "100", + "size": "13566" + }, + "fixed_height_downsampled": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200_d.gif", + "width": "356", + "height": "200", + "size": "253890", + "webp": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200_d.webp", + "webp_size": "49102" + }, + "preview": { + "width": "384", + "height": "216", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-preview.mp4", + "mp4_size": "31009" + }, + "fixed_height_small": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100.gif", + "width": "178", + "height": "100", + "size": "358514", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100.mp4", + "mp4_size": "59317", + "webp": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100.webp", + "webp_size": "124972" + }, + "downsized_still": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-downsized_s.gif", + "width": "384", + "height": "216", + "size": "46423" + }, + "downsized": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-downsized.gif", + "width": "384", + "height": "216", + "size": "1426080" + }, + "downsized_large": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy.gif", + "width": "480", + "height": "270", + "size": "2132149" + }, + "fixed_width_small_still": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100w_s.gif", + "width": "100", + "height": "56", + "size": "5775" + }, + "preview_webp": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-preview.webp", + "width": "229", + "height": "129", + "size": "49236" + }, + "fixed_width_still": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200w_s.gif", + "width": "200", + "height": "112", + "size": "16377" + }, + "fixed_width_small": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100w.gif", + "width": "100", + "height": "56", + "size": "122422", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100w.mp4", + "mp4_size": "26599", + "webp": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/100w.webp", + "webp_size": "59964" + }, + "downsized_small": { + "width": "432", + "height": "242", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-downsized-small.mp4", + "mp4_size": "84444" + }, + "fixed_width_downsampled": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200w_d.gif", + "width": "200", + "height": "112", + "size": "95602", + "webp": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200w_d.webp", + "webp_size": "23170" + }, + "downsized_medium": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy.gif", + "width": "480", + "height": "270", + "size": "2132149" + }, + "original": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy.gif", + "width": "480", + "height": "270", + "size": "2132149", + "frames": "36", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy.mp4", + "mp4_size": "208936", + "webp": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy.webp", + "webp_size": "415418", + "hash": "d63b47d3ea91c69451b6cb6837433d5d" + }, + "fixed_height": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200.gif", + "width": "356", + "height": "200", + "size": "1478363", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200.mp4", + "mp4_size": "138784", + "webp": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/200.webp", + "webp_size": "292106" + }, + "hd": { + "width": "1280", + "height": "720", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-hd.mp4", + "mp4_size": "972062" + }, + "looping": { + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-loop.mp4", + "mp4_size": "1205485" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy.mp4", + "mp4_size": "208936" + }, + "preview_gif": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/giphy-preview.gif", + "width": "137", + "height": "77", + "size": "49982" + }, + "480w_still": { + "url": "https://media3.giphy.com/media/9V5mtff0N5dhZ0nFur/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "season 2 abc GIF by The Gong Show", + "_score": 0 + }, + { + "type": "gif", + "id": "ZwErXdw2Ei3Ouqrb9V", + "slug": "kochstrasse-cute-illustration-ZwErXdw2Ei3Ouqrb9V", + "url": "https://giphy.com/gifs/kochstrasse-cute-illustration-ZwErXdw2Ei3Ouqrb9V", + "bitly_gif_url": "https://gph.is/2IJ7L7T", + "bitly_url": "https://gph.is/2IJ7L7T", + "embed_url": "https://giphy.com/embed/ZwErXdw2Ei3Ouqrb9V", + "username": "kochstrasse", + "source": "https://www.kochstrasse.de", + "rating": "g", + "content_url": "", + "source_tld": "www.kochstrasse.de", + "source_post_url": "https://www.kochstrasse.de", + "is_sticker": 0, + "import_datetime": "2018-07-01 18:05:12", + "trending_datetime": "2018-07-11 15:18:52", + "user": { + "avatar_url": "https://media.giphy.com/avatars/kochstrasse/1gJe8WAJW3PW.gif", + "banner_url": "https://media.giphy.com/headers/kochstrasse/xLhS70oCI3qt.gif", + "profile_url": "https://giphy.com/kochstrasse/", + "username": "kochstrasse", + "display_name": "Kochstrasse™", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200_s.gif", + "width": "200", + "height": "200", + "size": "3874" + }, + "original_still": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy_s.gif", + "width": "360", + "height": "360", + "size": "8155" + }, + "fixed_width": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200w.gif", + "width": "200", + "height": "200", + "size": "71390", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200w.mp4", + "mp4_size": "33048", + "webp": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200w.webp", + "webp_size": "84170" + }, + "fixed_height_small_still": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100_s.gif", + "width": "100", + "height": "100", + "size": "1732" + }, + "fixed_height_downsampled": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200_d.gif", + "width": "200", + "height": "200", + "size": "15049", + "webp": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200_d.webp", + "webp_size": "14548" + }, + "preview": { + "width": "360", + "height": "360", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy-preview.mp4", + "mp4_size": "32960" + }, + "fixed_height_small": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100.gif", + "width": "100", + "height": "100", + "size": "26611", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100.mp4", + "mp4_size": "15677", + "webp": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100.webp", + "webp_size": "34988" + }, + "downsized_still": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy-downsized_s.gif", + "width": "360", + "height": "360", + "size": "8155" + }, + "downsized": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy-downsized.gif", + "width": "360", + "height": "360", + "size": "89010" + }, + "downsized_large": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy.gif", + "width": "360", + "height": "360", + "size": "297864" + }, + "fixed_width_small_still": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100w_s.gif", + "width": "100", + "height": "100", + "size": "1732" + }, + "preview_webp": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy-preview.webp", + "width": "360", + "height": "360", + "size": "41308" + }, + "fixed_width_still": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200w_s.gif", + "width": "200", + "height": "200", + "size": "3874" + }, + "fixed_width_small": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100w.gif", + "width": "100", + "height": "100", + "size": "26611", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100w.mp4", + "mp4_size": "15677", + "webp": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/100w.webp", + "webp_size": "34988" + }, + "downsized_small": { + "width": "360", + "height": "360", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy-downsized-small.mp4", + "mp4_size": "77025" + }, + "fixed_width_downsampled": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200w_d.gif", + "width": "200", + "height": "200", + "size": "15049", + "webp": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200w_d.webp", + "webp_size": "14548" + }, + "downsized_medium": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy.gif", + "width": "360", + "height": "360", + "size": "297864" + }, + "original": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy.gif", + "width": "360", + "height": "360", + "size": "297864", + "frames": "132", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy.mp4", + "mp4_size": "87053", + "webp": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy.webp", + "webp_size": "165972", + "hash": "23852dbe12877990a3c063aaf09a52cd" + }, + "fixed_height": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200.gif", + "width": "200", + "height": "200", + "size": "71390", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200.mp4", + "mp4_size": "33048", + "webp": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/200.webp", + "webp_size": "84170" + }, + "looping": { + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy-loop.mp4", + "mp4_size": "345504" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy.mp4", + "mp4_size": "87053" + }, + "preview_gif": { + "url": "https://media3.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/giphy-preview.gif", + "width": "360", + "height": "360", + "size": "40873" + }, + "480w_still": { + "url": "https://media2.giphy.com/media/ZwErXdw2Ei3Ouqrb9V/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "illustration abc GIF by Kochstrasse™", + "_score": 0 + }, + { + "type": "gif", + "id": "2SYwqrDoNjRogYgfHn", + "slug": "ballinthefamily-season-3-episode-5-2SYwqrDoNjRogYgfHn", + "url": "https://giphy.com/gifs/ballinthefamily-season-3-episode-5-2SYwqrDoNjRogYgfHn", + "bitly_gif_url": "https://gph.is/2u9XLjv", + "bitly_url": "https://gph.is/2u9XLjv", + "embed_url": "https://giphy.com/embed/2SYwqrDoNjRogYgfHn", + "username": "ballinthefamily", + "source": "https://www.facebook.com/ballinthefamily", + "rating": "g", + "content_url": "", + "source_tld": "www.facebook.com", + "source_post_url": "https://www.facebook.com/ballinthefamily", + "is_sticker": 0, + "import_datetime": "2018-07-10 19:02:54", + "trending_datetime": "2018-07-11 23:45:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/ballinthefamily/6Q8aNyB7D6RY.gif", + "banner_url": "https://media.giphy.com/headers/ballinthefamily/IdjFyI3xVGf3.jpg", + "profile_url": "https://giphy.com/ballinthefamily/", + "username": "ballinthefamily", + "display_name": "Ball in the Family", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200_s.gif", + "width": "200", + "height": "200", + "size": "19031" + }, + "original_still": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy_s.gif", + "width": "480", + "height": "480", + "size": "66764" + }, + "fixed_width": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200w.gif", + "width": "200", + "height": "200", + "size": "1451193", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200w.mp4", + "mp4_size": "142885", + "webp": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200w.webp", + "webp_size": "362388" + }, + "fixed_height_small_still": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100_s.gif", + "width": "100", + "height": "100", + "size": "7218" + }, + "fixed_height_downsampled": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200_d.gif", + "width": "200", + "height": "200", + "size": "141208", + "webp": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200_d.webp", + "webp_size": "47654" + }, + "preview": { + "width": "240", + "height": "240", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-preview.mp4", + "mp4_size": "43960" + }, + "fixed_height_small": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100.gif", + "width": "100", + "height": "100", + "size": "506376", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100.mp4", + "mp4_size": "56273", + "webp": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100.webp", + "webp_size": "158726" + }, + "downsized_still": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-downsized_s.gif", + "width": "222", + "height": "222", + "size": "19592" + }, + "downsized": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-downsized.gif", + "width": "222", + "height": "222", + "size": "1567677" + }, + "downsized_large": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy.gif", + "width": "480", + "height": "480", + "size": "5917184" + }, + "fixed_width_small_still": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100w_s.gif", + "width": "100", + "height": "100", + "size": "7218" + }, + "preview_webp": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-preview.webp", + "width": "220", + "height": "220", + "size": "49942" + }, + "fixed_width_still": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200w_s.gif", + "width": "200", + "height": "200", + "size": "19031" + }, + "fixed_width_small": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100w.gif", + "width": "100", + "height": "100", + "size": "506376", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100w.mp4", + "mp4_size": "47860", + "webp": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/100w.webp", + "webp_size": "158726" + }, + "downsized_small": { + "width": "272", + "height": "272", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-downsized-small.mp4", + "mp4_size": "120063" + }, + "fixed_width_downsampled": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200w_d.gif", + "width": "200", + "height": "200", + "size": "141208", + "webp": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200w_d.webp", + "webp_size": "47654" + }, + "downsized_medium": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-downsized-medium.gif", + "width": "384", + "height": "384", + "size": "4003475" + }, + "original": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy.gif", + "width": "480", + "height": "480", + "size": "5917184", + "frames": "64", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy.mp4", + "mp4_size": "617546", + "webp": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy.webp", + "webp_size": "1090808", + "hash": "1fb4d16c346c75a7ed9840e430227259" + }, + "fixed_height": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200.gif", + "width": "200", + "height": "200", + "size": "1451193", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200.mp4", + "mp4_size": "142885", + "webp": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/200.webp", + "webp_size": "362388" + }, + "looping": { + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-loop.mp4", + "mp4_size": "3627465" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy.mp4", + "mp4_size": "617546" + }, + "preview_gif": { + "url": "https://media3.giphy.com/media/2SYwqrDoNjRogYgfHn/giphy-preview.gif", + "width": "94", + "height": "94", + "size": "49334" + }, + "480w_still": { + "url": "https://media4.giphy.com/media/2SYwqrDoNjRogYgfHn/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "season 3 tina GIF by Ball in the Family", + "_score": 0 + }, + { + "type": "gif", + "id": "1poW0ORMkzctC7lIzL", + "slug": "maroon5-maroon-5-cardi-b-1poW0ORMkzctC7lIzL", + "url": "https://giphy.com/gifs/maroon5-maroon-5-cardi-b-1poW0ORMkzctC7lIzL", + "bitly_gif_url": "https://gph.is/2kDmp70", + "bitly_url": "https://gph.is/2kDmp70", + "embed_url": "https://giphy.com/embed/1poW0ORMkzctC7lIzL", + "username": "maroon5", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-01 15:19:59", + "trending_datetime": "2018-07-11 15:12:17", + "user": { + "avatar_url": "https://media.giphy.com/avatars/maroon5/PEbr2UyzWosE.jpg", + "banner_url": "https://media.giphy.com/headers/maroon5/SWw8125Em2NK.jpg", + "profile_url": "https://giphy.com/maroon5/", + "username": "maroon5", + "display_name": "Maroon 5", + "guid": "ZnJlZGRpZSttYXJvb241QGNhbWFuYWdlbWVudC5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200_s.gif", + "width": "356", + "height": "200", + "size": "37160" + }, + "original_still": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy_s.gif", + "width": "480", + "height": "270", + "size": "59363" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200w.gif", + "width": "200", + "height": "112", + "size": "1108418", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200w.mp4", + "mp4_size": "190805", + "webp": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200w.webp", + "webp_size": "285392" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100_s.gif", + "width": "178", + "height": "100", + "size": "11954" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200_d.gif", + "width": "356", + "height": "200", + "size": "245775", + "webp": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200_d.webp", + "webp_size": "50370" + }, + "preview": { + "width": "295", + "height": "166", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-preview.mp4", + "mp4_size": "46664" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100.gif", + "width": "178", + "height": "100", + "size": "885675", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100.mp4", + "mp4_size": "177285", + "webp": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100.webp", + "webp_size": "237414" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-downsized_s.gif", + "width": "271", + "height": "152", + "size": "24724" + }, + "downsized": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-downsized.gif", + "width": "271", + "height": "152", + "size": "1419171" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy.gif", + "width": "480", + "height": "270", + "size": "5161404" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100w_s.gif", + "width": "100", + "height": "56", + "size": "5103" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-preview.webp", + "width": "251", + "height": "141", + "size": "49758" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200w_s.gif", + "width": "200", + "height": "112", + "size": "14706" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100w.gif", + "width": "100", + "height": "56", + "size": "343823", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100w.mp4", + "mp4_size": "47583", + "webp": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/100w.webp", + "webp_size": "116114" + }, + "downsized_small": { + "width": "259", + "height": "146", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-downsized-small.mp4", + "mp4_size": "174049" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200w_d.gif", + "width": "200", + "height": "112", + "size": "93308", + "webp": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200w_d.webp", + "webp_size": "22830" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-downsized-medium.gif", + "width": "384", + "height": "216", + "size": "3215741" + }, + "original": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy.gif", + "width": "480", + "height": "270", + "size": "5161404", + "frames": "73", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy.mp4", + "mp4_size": "679105", + "webp": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy.webp", + "webp_size": "921732", + "hash": "a5dc844f4ec83279697896ce096ec851" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200.gif", + "width": "356", + "height": "200", + "size": "2915666", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200.mp4", + "mp4_size": "444880", + "webp": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/200.webp", + "webp_size": "625778" + }, + "hd": { + "width": "1920", + "height": "1080", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-hd.mp4", + "mp4_size": "5608188" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-loop.mp4", + "mp4_size": "1934166" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy.mp4", + "mp4_size": "679105" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/1poW0ORMkzctC7lIzL/giphy-preview.gif", + "width": "121", + "height": "68", + "size": "49705" + }, + "480w_still": { + "url": "https://media3.giphy.com/media/1poW0ORMkzctC7lIzL/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "cardi b GIF by Maroon 5", + "_score": 0 + }, + { + "type": "gif", + "id": "3d63Yehj2h3S8iLKc2", + "slug": "maroon5-maroon-5-cardi-b-3d63Yehj2h3S8iLKc2", + "url": "https://giphy.com/gifs/maroon5-maroon-5-cardi-b-3d63Yehj2h3S8iLKc2", + "bitly_gif_url": "https://gph.is/2kHMkdS", + "bitly_url": "https://gph.is/2kHMkdS", + "embed_url": "https://giphy.com/embed/3d63Yehj2h3S8iLKc2", + "username": "maroon5", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-01 15:18:59", + "trending_datetime": "2018-07-11 23:15:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/maroon5/PEbr2UyzWosE.jpg", + "banner_url": "https://media.giphy.com/headers/maroon5/SWw8125Em2NK.jpg", + "profile_url": "https://giphy.com/maroon5/", + "username": "maroon5", + "display_name": "Maroon 5", + "guid": "ZnJlZGRpZSttYXJvb241QGNhbWFuYWdlbWVudC5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200_s.gif", + "width": "356", + "height": "200", + "size": "40516" + }, + "original_still": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy_s.gif", + "width": "480", + "height": "270", + "size": "64266" + }, + "fixed_width": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200w.gif", + "width": "200", + "height": "112", + "size": "615152", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200w.mp4", + "mp4_size": "73047", + "webp": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200w.webp", + "webp_size": "201770" + }, + "fixed_height_small_still": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100_s.gif", + "width": "178", + "height": "100", + "size": "13240" + }, + "fixed_height_downsampled": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200_d.gif", + "width": "356", + "height": "200", + "size": "271905", + "webp": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200_d.webp", + "webp_size": "53604" + }, + "preview": { + "width": "384", + "height": "216", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-preview.mp4", + "mp4_size": "30320" + }, + "fixed_height_small": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100.gif", + "width": "178", + "height": "100", + "size": "491661", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100.mp4", + "mp4_size": "64954", + "webp": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100.webp", + "webp_size": "172596" + }, + "downsized_still": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-downsized_s.gif", + "width": "384", + "height": "216", + "size": "44507" + }, + "downsized": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-downsized.gif", + "width": "384", + "height": "216", + "size": "1889321" + }, + "downsized_large": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy.gif", + "width": "480", + "height": "270", + "size": "2961049" + }, + "fixed_width_small_still": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100w_s.gif", + "width": "100", + "height": "56", + "size": "5491" + }, + "preview_webp": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-preview.webp", + "width": "228", + "height": "128", + "size": "48952" + }, + "fixed_width_still": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200w_s.gif", + "width": "200", + "height": "112", + "size": "15962" + }, + "fixed_width_small": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100w.gif", + "width": "100", + "height": "56", + "size": "170740", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100w.mp4", + "mp4_size": "30347", + "webp": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/100w.webp", + "webp_size": "79502" + }, + "downsized_small": { + "width": "430", + "height": "242", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-downsized-small.mp4", + "mp4_size": "97572" + }, + "fixed_width_downsampled": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200w_d.gif", + "width": "200", + "height": "112", + "size": "99898", + "webp": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200w_d.webp", + "webp_size": "24718" + }, + "downsized_medium": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy.gif", + "width": "480", + "height": "270", + "size": "2961049" + }, + "original": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy.gif", + "width": "480", + "height": "270", + "size": "2961049", + "frames": "49", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy.mp4", + "mp4_size": "233857", + "webp": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy.webp", + "webp_size": "615186", + "hash": "21046def8f88c7afeb8d937276587627" + }, + "fixed_height": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200.gif", + "width": "356", + "height": "200", + "size": "1771052", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200.mp4", + "mp4_size": "159342", + "webp": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/200.webp", + "webp_size": "433738" + }, + "hd": { + "width": "1920", + "height": "1080", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-hd.mp4", + "mp4_size": "2220658" + }, + "looping": { + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-loop.mp4", + "mp4_size": "1026280" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy.mp4", + "mp4_size": "233857" + }, + "preview_gif": { + "url": "https://media1.giphy.com/media/3d63Yehj2h3S8iLKc2/giphy-preview.gif", + "width": "110", + "height": "62", + "size": "49413" + }, + "480w_still": { + "url": "https://media3.giphy.com/media/3d63Yehj2h3S8iLKc2/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "cardi b GIF by Maroon 5", + "_score": 0 + }, + { + "type": "gif", + "id": "5bu6K7m9RSENK1Jorq", + "slug": "maroon5-maroon-5-cardi-b-5bu6K7m9RSENK1Jorq", + "url": "https://giphy.com/gifs/maroon5-maroon-5-cardi-b-5bu6K7m9RSENK1Jorq", + "bitly_gif_url": "https://gph.is/2LMEVWO", + "bitly_url": "https://gph.is/2LMEVWO", + "embed_url": "https://giphy.com/embed/5bu6K7m9RSENK1Jorq", + "username": "maroon5", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-01 15:23:39", + "trending_datetime": "2018-07-11 23:00:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/maroon5/PEbr2UyzWosE.jpg", + "banner_url": "https://media.giphy.com/headers/maroon5/SWw8125Em2NK.jpg", + "profile_url": "https://giphy.com/maroon5/", + "username": "maroon5", + "display_name": "Maroon 5", + "guid": "ZnJlZGRpZSttYXJvb241QGNhbWFuYWdlbWVudC5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200_s.gif", + "width": "356", + "height": "200", + "size": "37206" + }, + "original_still": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy_s.gif", + "width": "480", + "height": "270", + "size": "57332" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200w.gif", + "width": "200", + "height": "112", + "size": "1032532", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200w.mp4", + "mp4_size": "90809", + "webp": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200w.webp", + "webp_size": "193046" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100_s.gif", + "width": "178", + "height": "100", + "size": "12356" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200_d.gif", + "width": "356", + "height": "200", + "size": "231565", + "webp": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200_d.webp", + "webp_size": "32448" + }, + "preview": { + "width": "384", + "height": "216", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-preview.mp4", + "mp4_size": "34024" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100.gif", + "width": "178", + "height": "100", + "size": "819405", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100.mp4", + "mp4_size": "87111", + "webp": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100.webp", + "webp_size": "167344" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-downsized_s.gif", + "width": "281", + "height": "158", + "size": "26772" + }, + "downsized": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-downsized.gif", + "width": "281", + "height": "158", + "size": "1423791" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy.gif", + "width": "480", + "height": "270", + "size": "4677699" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100w_s.gif", + "width": "100", + "height": "56", + "size": "5343" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-preview.webp", + "width": "341", + "height": "192", + "size": "49226" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200w_s.gif", + "width": "200", + "height": "112", + "size": "15044" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100w.gif", + "width": "100", + "height": "56", + "size": "308074", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100w.mp4", + "mp4_size": "41107", + "webp": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/100w.webp", + "webp_size": "81952" + }, + "downsized_small": { + "width": "384", + "height": "216", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-downsized-small.mp4", + "mp4_size": "120863" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200w_d.gif", + "width": "200", + "height": "112", + "size": "88889", + "webp": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200w_d.webp", + "webp_size": "15590" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy.gif", + "width": "480", + "height": "270", + "size": "4677699" + }, + "original": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy.gif", + "width": "480", + "height": "270", + "size": "4677699", + "frames": "73", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy.mp4", + "mp4_size": "306670", + "webp": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy.webp", + "webp_size": "585192", + "hash": "41cf3951d5411c72971a5a499b89053f" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200.gif", + "width": "356", + "height": "200", + "size": "2844608", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200.mp4", + "mp4_size": "211395", + "webp": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/200.webp", + "webp_size": "406386" + }, + "hd": { + "width": "1920", + "height": "1080", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-hd.mp4", + "mp4_size": "3610232" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-loop.mp4", + "mp4_size": "897360" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy.mp4", + "mp4_size": "306670" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/5bu6K7m9RSENK1Jorq/giphy-preview.gif", + "width": "123", + "height": "69", + "size": "49799" + }, + "480w_still": { + "url": "https://media4.giphy.com/media/5bu6K7m9RSENK1Jorq/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "cardi b GIF by Maroon 5", + "_score": 0 + }, + { + "type": "gif", + "id": "Ph83zh3vp39652AxX9", + "slug": "maroon5-maroon-5-cardi-b-Ph83zh3vp39652AxX9", + "url": "https://giphy.com/gifs/maroon5-maroon-5-cardi-b-Ph83zh3vp39652AxX9", + "bitly_gif_url": "https://gph.is/2LcYxSU", + "bitly_url": "https://gph.is/2LcYxSU", + "embed_url": "https://giphy.com/embed/Ph83zh3vp39652AxX9", + "username": "maroon5", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-01 15:20:49", + "trending_datetime": "2018-07-11 22:45:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/maroon5/PEbr2UyzWosE.jpg", + "banner_url": "https://media.giphy.com/headers/maroon5/SWw8125Em2NK.jpg", + "profile_url": "https://giphy.com/maroon5/", + "username": "maroon5", + "display_name": "Maroon 5", + "guid": "ZnJlZGRpZSttYXJvb241QGNhbWFuYWdlbWVudC5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200_s.gif", + "width": "356", + "height": "200", + "size": "35856" + }, + "original_still": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy_s.gif", + "width": "480", + "height": "270", + "size": "56765" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200w.gif", + "width": "200", + "height": "112", + "size": "266155", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200w.mp4", + "mp4_size": "46197", + "webp": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200w.webp", + "webp_size": "58430" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100_s.gif", + "width": "178", + "height": "100", + "size": "11737" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200_d.gif", + "width": "356", + "height": "200", + "size": "213987", + "webp": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200_d.webp", + "webp_size": "40604" + }, + "preview": { + "width": "259", + "height": "146", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy-preview.mp4", + "mp4_size": "34678" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100.gif", + "width": "178", + "height": "100", + "size": "203132", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100.mp4", + "mp4_size": "42622", + "webp": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100.webp", + "webp_size": "49300" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy-downsized_s.gif", + "width": "480", + "height": "270", + "size": "56765" + }, + "downsized": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy.gif", + "width": "480", + "height": "270", + "size": "1148776" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy.gif", + "width": "480", + "height": "270", + "size": "1148776" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100w_s.gif", + "width": "100", + "height": "56", + "size": "5076" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy-preview.webp", + "width": "299", + "height": "168", + "size": "49884" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200w_s.gif", + "width": "200", + "height": "112", + "size": "14261" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100w.gif", + "width": "100", + "height": "56", + "size": "79295", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100w.mp4", + "mp4_size": "19940", + "webp": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/100w.webp", + "webp_size": "24616" + }, + "downsized_small": { + "width": "480", + "height": "270", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy-downsized-small.mp4", + "mp4_size": "168258" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200w_d.gif", + "width": "200", + "height": "112", + "size": "80857", + "webp": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200w_d.webp", + "webp_size": "18578" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy.gif", + "width": "480", + "height": "270", + "size": "1148776" + }, + "original": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy.gif", + "width": "480", + "height": "270", + "size": "1148776", + "frames": "19", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy.mp4", + "mp4_size": "168258", + "webp": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy.webp", + "webp_size": "190314", + "hash": "2f149b9765c1f23ecf25f58fb1f91b05" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200.gif", + "width": "356", + "height": "200", + "size": "712106", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200.mp4", + "mp4_size": "109131", + "webp": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/200.webp", + "webp_size": "129556" + }, + "hd": { + "width": "1920", + "height": "1080", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy-hd.mp4", + "mp4_size": "1500802" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy-loop.mp4", + "mp4_size": "1804443" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy.mp4", + "mp4_size": "168258" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/Ph83zh3vp39652AxX9/giphy-preview.gif", + "width": "128", + "height": "72", + "size": "48551" + }, + "480w_still": { + "url": "https://media2.giphy.com/media/Ph83zh3vp39652AxX9/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "cardi b GIF by Maroon 5", + "_score": 0 + }, + { + "type": "gif", + "id": "QMJgdNgjPBpwMOkvJv", + "slug": "maroon5-maroon-5-cardi-b-QMJgdNgjPBpwMOkvJv", + "url": "https://giphy.com/gifs/maroon5-maroon-5-cardi-b-QMJgdNgjPBpwMOkvJv", + "bitly_gif_url": "https://gph.is/2HcREOZ", + "bitly_url": "https://gph.is/2HcREOZ", + "embed_url": "https://giphy.com/embed/QMJgdNgjPBpwMOkvJv", + "username": "maroon5", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-01 15:22:09", + "trending_datetime": "2018-07-11 15:11:58", + "user": { + "avatar_url": "https://media.giphy.com/avatars/maroon5/PEbr2UyzWosE.jpg", + "banner_url": "https://media.giphy.com/headers/maroon5/SWw8125Em2NK.jpg", + "profile_url": "https://giphy.com/maroon5/", + "username": "maroon5", + "display_name": "Maroon 5", + "guid": "ZnJlZGRpZSttYXJvb241QGNhbWFuYWdlbWVudC5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200_s.gif", + "width": "356", + "height": "200", + "size": "33137" + }, + "original_still": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy_s.gif", + "width": "480", + "height": "270", + "size": "55018" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200w.gif", + "width": "200", + "height": "112", + "size": "1165082", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200w.mp4", + "mp4_size": "212040", + "webp": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200w.webp", + "webp_size": "306522" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100_s.gif", + "width": "178", + "height": "100", + "size": "10941" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200_d.gif", + "width": "356", + "height": "200", + "size": "248055", + "webp": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200_d.webp", + "webp_size": "55498" + }, + "preview": { + "width": "263", + "height": "148", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-preview.mp4", + "mp4_size": "46925" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100.gif", + "width": "178", + "height": "100", + "size": "883174", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100.mp4", + "mp4_size": "196950", + "webp": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100.webp", + "webp_size": "259070" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-downsized_s.gif", + "width": "261", + "height": "147", + "size": "21571" + }, + "downsized": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-downsized.gif", + "width": "261", + "height": "147", + "size": "1401782" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy.gif", + "width": "480", + "height": "270", + "size": "5426904" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100w_s.gif", + "width": "100", + "height": "56", + "size": "4780" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-preview.webp", + "width": "256", + "height": "144", + "size": "46834" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200w_s.gif", + "width": "200", + "height": "112", + "size": "13546" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100w.gif", + "width": "100", + "height": "56", + "size": "332575", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100w.mp4", + "mp4_size": "47642", + "webp": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/100w.webp", + "webp_size": "121276" + }, + "downsized_small": { + "width": "238", + "height": "134", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-downsized-small.mp4", + "mp4_size": "164715" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200w_d.gif", + "width": "200", + "height": "112", + "size": "93381", + "webp": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200w_d.webp", + "webp_size": "24920" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-downsized-medium.gif", + "width": "384", + "height": "216", + "size": "3371200" + }, + "original": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy.gif", + "width": "480", + "height": "270", + "size": "5426904", + "frames": "73", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy.mp4", + "mp4_size": "794852", + "webp": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy.webp", + "webp_size": "1025594", + "hash": "88ab4ddeb3db162911c8f1a42f9ab04e" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200.gif", + "width": "356", + "height": "200", + "size": "3181067", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200.mp4", + "mp4_size": "509222", + "webp": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/200.webp", + "webp_size": "688130" + }, + "hd": { + "width": "1920", + "height": "1080", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-hd.mp4", + "mp4_size": "6491910" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-loop.mp4", + "mp4_size": "2228862" + }, + "original_mp4": { + "width": "480", + "height": "270", + "mp4": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy.mp4", + "mp4_size": "794852" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/QMJgdNgjPBpwMOkvJv/giphy-preview.gif", + "width": "123", + "height": "69", + "size": "49915" + }, + "480w_still": { + "url": "https://media3.giphy.com/media/QMJgdNgjPBpwMOkvJv/480w_s.jpg", + "width": "480", + "height": "270" + } + }, + "title": "cardi b GIF by Maroon 5", + "_score": 0 + }, + { + "type": "gif", + "id": "3beHyPG9DSsdfDd2zp", + "slug": "music-video-rock-lenny-3beHyPG9DSsdfDd2zp", + "url": "https://giphy.com/gifs/music-video-rock-lenny-3beHyPG9DSsdfDd2zp", + "bitly_gif_url": "https://gph.is/2N7SYqG", + "bitly_url": "https://gph.is/2N7SYqG", + "embed_url": "https://giphy.com/embed/3beHyPG9DSsdfDd2zp", + "username": "lennykravitzofficial", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-29 19:10:39", + "trending_datetime": "2018-07-11 22:15:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/LennyKravitzOfficial/pNjTDhoDTywb.jpg", + "banner_url": "", + "profile_url": "https://giphy.com/lennykravitzofficial/", + "username": "lennykravitzofficial", + "display_name": "Lenny Kravitz", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200_s.gif", + "width": "200", + "height": "200", + "size": "32112" + }, + "original_still": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy_s.gif", + "width": "480", + "height": "480", + "size": "137227" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200w.gif", + "width": "200", + "height": "200", + "size": "2103801", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200w.mp4", + "mp4_size": "303410", + "webp": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200w.webp", + "webp_size": "455140" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100_s.gif", + "width": "100", + "height": "100", + "size": "10425" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200_d.gif", + "width": "200", + "height": "200", + "size": "190175", + "webp": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200_d.webp", + "webp_size": "42302" + }, + "preview": { + "width": "232", + "height": "232", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-preview.mp4", + "mp4_size": "41499" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100.gif", + "width": "100", + "height": "100", + "size": "587153", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100.mp4", + "mp4_size": "129537", + "webp": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100.webp", + "webp_size": "196066" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-downsized_s.gif", + "width": "192", + "height": "192", + "size": "31955" + }, + "downsized": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-downsized.gif", + "width": "192", + "height": "192", + "size": "1578076" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-downsized-large.gif", + "width": "384", + "height": "384", + "size": "6077513" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100w_s.gif", + "width": "100", + "height": "100", + "size": "10425" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-preview.webp", + "width": "159", + "height": "159", + "size": "49134" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200w_s.gif", + "width": "200", + "height": "200", + "size": "32112" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100w.gif", + "width": "100", + "height": "100", + "size": "587153", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100w.mp4", + "mp4_size": "48750", + "webp": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/100w.webp", + "webp_size": "196066" + }, + "downsized_small": { + "width": "220", + "height": "220", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-downsized-small.mp4", + "mp4_size": "193529" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200w_d.gif", + "width": "200", + "height": "200", + "size": "190175", + "webp": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200w_d.webp", + "webp_size": "42302" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-downsized-medium.gif", + "width": "276", + "height": "276", + "size": "3343150" + }, + "original": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy.gif", + "width": "480", + "height": "480", + "size": "9398829", + "frames": "68", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy.mp4", + "mp4_size": "951421", + "webp": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy.webp", + "webp_size": "1417338", + "hash": "bb4341c0eb5c62235cd567926a242312" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200.gif", + "width": "200", + "height": "200", + "size": "2103801", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200.mp4", + "mp4_size": "303410", + "webp": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/200.webp", + "webp_size": "455140" + }, + "hd": { + "width": "1200", + "height": "1200", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-hd.mp4", + "mp4_size": "3787285" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-loop.mp4", + "mp4_size": "2938120" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy.mp4", + "mp4_size": "951421" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/3beHyPG9DSsdfDd2zp/giphy-preview.gif", + "width": "85", + "height": "85", + "size": "49709" + }, + "480w_still": { + "url": "https://media1.giphy.com/media/3beHyPG9DSsdfDd2zp/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "it ain't over music video GIF by Lenny Kravitz", + "_score": 0 + }, + { + "type": "gif", + "id": "d1RNodjx7ps9zfqCcO", + "slug": "music-video-rock-lenny-d1RNodjx7ps9zfqCcO", + "url": "https://giphy.com/gifs/music-video-rock-lenny-d1RNodjx7ps9zfqCcO", + "bitly_gif_url": "https://gph.is/2lH2sN7", + "bitly_url": "https://gph.is/2lH2sN7", + "embed_url": "https://giphy.com/embed/d1RNodjx7ps9zfqCcO", + "username": "lennykravitzofficial", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-29 19:07:55", + "trending_datetime": "2018-07-11 22:00:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/LennyKravitzOfficial/pNjTDhoDTywb.jpg", + "banner_url": "", + "profile_url": "https://giphy.com/lennykravitzofficial/", + "username": "lennykravitzofficial", + "display_name": "Lenny Kravitz", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200_s.gif", + "width": "200", + "height": "200", + "size": "28564" + }, + "original_still": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy_s.gif", + "width": "480", + "height": "480", + "size": "122713" + }, + "fixed_width": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200w.gif", + "width": "200", + "height": "200", + "size": "2420422", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200w.mp4", + "mp4_size": "243125", + "webp": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200w.webp", + "webp_size": "706642" + }, + "fixed_height_small_still": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100_s.gif", + "width": "100", + "height": "100", + "size": "9248" + }, + "fixed_height_downsampled": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200_d.gif", + "width": "200", + "height": "200", + "size": "167111", + "webp": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200_d.webp", + "webp_size": "46358" + }, + "preview": { + "width": "290", + "height": "290", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-preview.mp4", + "mp4_size": "31302" + }, + "fixed_height_small": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100.gif", + "width": "100", + "height": "100", + "size": "698309", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100.mp4", + "mp4_size": "113027", + "webp": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100.webp", + "webp_size": "275586" + }, + "downsized_still": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-downsized_s.gif", + "width": "227", + "height": "227", + "size": "37007" + }, + "downsized": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-downsized.gif", + "width": "227", + "height": "227", + "size": "1479867" + }, + "downsized_large": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-downsized-large.gif", + "width": "384", + "height": "384", + "size": "7306874" + }, + "fixed_width_small_still": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100w_s.gif", + "width": "100", + "height": "100", + "size": "9248" + }, + "preview_webp": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-preview.webp", + "width": "139", + "height": "139", + "size": "49092" + }, + "fixed_width_still": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200w_s.gif", + "width": "200", + "height": "200", + "size": "28564" + }, + "fixed_width_small": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100w.gif", + "width": "100", + "height": "100", + "size": "698309", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100w.mp4", + "mp4_size": "48248", + "webp": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/100w.webp", + "webp_size": "275586" + }, + "downsized_small": { + "width": "234", + "height": "234", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-downsized-small.mp4", + "mp4_size": "148225" + }, + "fixed_width_downsampled": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200w_d.gif", + "width": "200", + "height": "200", + "size": "167111", + "webp": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200w_d.webp", + "webp_size": "46358" + }, + "downsized_medium": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-downsized-medium.gif", + "width": "271", + "height": "271", + "size": "3453042" + }, + "original": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy.gif", + "width": "480", + "height": "480", + "size": "11546453", + "frames": "90", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy.mp4", + "mp4_size": "837200", + "webp": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy.webp", + "webp_size": "2206964", + "hash": "e4fd4850ef8bfe029c8382b40b43afa3" + }, + "fixed_height": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200.gif", + "width": "200", + "height": "200", + "size": "2420422", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200.mp4", + "mp4_size": "243125", + "webp": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/200.webp", + "webp_size": "706642" + }, + "hd": { + "width": "1200", + "height": "1200", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-hd.mp4", + "mp4_size": "3502154" + }, + "looping": { + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-loop.mp4", + "mp4_size": "1941828" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy.mp4", + "mp4_size": "837200" + }, + "preview_gif": { + "url": "https://media3.giphy.com/media/d1RNodjx7ps9zfqCcO/giphy-preview.gif", + "width": "81", + "height": "81", + "size": "48106" + }, + "480w_still": { + "url": "https://media1.giphy.com/media/d1RNodjx7ps9zfqCcO/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "it ain't over music video GIF by Lenny Kravitz", + "_score": 0 + }, + { + "type": "gif", + "id": "vx2sQEjMHD6pUAFCX9", + "slug": "music-video-rock-lenny-vx2sQEjMHD6pUAFCX9", + "url": "https://giphy.com/gifs/music-video-rock-lenny-vx2sQEjMHD6pUAFCX9", + "bitly_gif_url": "https://gph.is/2yUngKt", + "bitly_url": "https://gph.is/2yUngKt", + "embed_url": "https://giphy.com/embed/vx2sQEjMHD6pUAFCX9", + "username": "lennykravitzofficial", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-29 19:11:00", + "trending_datetime": "2018-07-11 15:11:19", + "user": { + "avatar_url": "https://media.giphy.com/avatars/LennyKravitzOfficial/pNjTDhoDTywb.jpg", + "banner_url": "", + "profile_url": "https://giphy.com/lennykravitzofficial/", + "username": "lennykravitzofficial", + "display_name": "Lenny Kravitz", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200_s.gif", + "width": "200", + "height": "200", + "size": "24379" + }, + "original_still": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy_s.gif", + "width": "480", + "height": "480", + "size": "83501" + }, + "fixed_width": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200w.gif", + "width": "200", + "height": "200", + "size": "2063721", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200w.mp4", + "mp4_size": "185558", + "webp": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200w.webp", + "webp_size": "213254" + }, + "fixed_height_small_still": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100_s.gif", + "width": "100", + "height": "100", + "size": "8675" + }, + "fixed_height_downsampled": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200_d.gif", + "width": "200", + "height": "200", + "size": "109798", + "webp": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200_d.webp", + "webp_size": "10688" + }, + "preview": { + "width": "384", + "height": "384", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-preview.mp4", + "mp4_size": "26433" + }, + "fixed_height_small": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100.gif", + "width": "100", + "height": "100", + "size": "668773", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100.mp4", + "mp4_size": "79621", + "webp": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100.webp", + "webp_size": "106018" + }, + "downsized_still": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-downsized_s.gif", + "width": "301", + "height": "301", + "size": "47251" + }, + "downsized": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-downsized.gif", + "width": "301", + "height": "301", + "size": "1555257" + }, + "downsized_large": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy.gif", + "width": "480", + "height": "480", + "size": "7405596" + }, + "fixed_width_small_still": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100w_s.gif", + "width": "100", + "height": "100", + "size": "8675" + }, + "preview_webp": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-preview.webp", + "width": "480", + "height": "480", + "size": "45798" + }, + "fixed_width_still": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200w_s.gif", + "width": "200", + "height": "200", + "size": "24379" + }, + "fixed_width_small": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100w.gif", + "width": "100", + "height": "100", + "size": "668773", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100w.mp4", + "mp4_size": "46589", + "webp": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/100w.webp", + "webp_size": "106018" + }, + "downsized_small": { + "width": "274", + "height": "274", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-downsized-small.mp4", + "mp4_size": "166108" + }, + "fixed_width_downsampled": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200w_d.gif", + "width": "200", + "height": "200", + "size": "109798", + "webp": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200w_d.webp", + "webp_size": "10688" + }, + "downsized_medium": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-downsized-medium.gif", + "width": "480", + "height": "480", + "size": "3676426" + }, + "original": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy.gif", + "width": "480", + "height": "480", + "size": "7405596", + "frames": "135", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy.mp4", + "mp4_size": "610418", + "webp": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy.webp", + "webp_size": "548874", + "hash": "c59b559d231aab8f5cac27899a561a15" + }, + "fixed_height": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200.gif", + "width": "200", + "height": "200", + "size": "2063721", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200.mp4", + "mp4_size": "185558", + "webp": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/200.webp", + "webp_size": "213254" + }, + "hd": { + "width": "1200", + "height": "1200", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-hd.mp4", + "mp4_size": "2340995" + }, + "looping": { + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-loop.mp4", + "mp4_size": "952362" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy.mp4", + "mp4_size": "610418" + }, + "preview_gif": { + "url": "https://media1.giphy.com/media/vx2sQEjMHD6pUAFCX9/giphy-preview.gif", + "width": "101", + "height": "101", + "size": "48913" + }, + "480w_still": { + "url": "https://media3.giphy.com/media/vx2sQEjMHD6pUAFCX9/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "it ain't over music video GIF by Lenny Kravitz", + "_score": 0 + }, + { + "type": "gif", + "id": "bbB45UPcelAL9qUVsl", + "slug": "music-video-rock-lenny-bbB45UPcelAL9qUVsl", + "url": "https://giphy.com/gifs/music-video-rock-lenny-bbB45UPcelAL9qUVsl", + "bitly_gif_url": "https://gph.is/2NasjK0", + "bitly_url": "https://gph.is/2NasjK0", + "embed_url": "https://giphy.com/embed/bbB45UPcelAL9qUVsl", + "username": "lennykravitzofficial", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-29 19:10:20", + "trending_datetime": "2018-07-11 21:30:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/LennyKravitzOfficial/pNjTDhoDTywb.jpg", + "banner_url": "", + "profile_url": "https://giphy.com/lennykravitzofficial/", + "username": "lennykravitzofficial", + "display_name": "Lenny Kravitz", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200_s.gif", + "width": "200", + "height": "200", + "size": "30700" + }, + "original_still": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy_s.gif", + "width": "480", + "height": "480", + "size": "130119" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200w.gif", + "width": "200", + "height": "200", + "size": "2101697", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200w.mp4", + "mp4_size": "327264", + "webp": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200w.webp", + "webp_size": "406708" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100_s.gif", + "width": "100", + "height": "100", + "size": "10030" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200_d.gif", + "width": "200", + "height": "200", + "size": "186004", + "webp": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200_d.webp", + "webp_size": "35442" + }, + "preview": { + "width": "234", + "height": "234", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-preview.mp4", + "mp4_size": "45164" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100.gif", + "width": "100", + "height": "100", + "size": "601815", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100.mp4", + "mp4_size": "133651", + "webp": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100.webp", + "webp_size": "176230" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-downsized_s.gif", + "width": "192", + "height": "192", + "size": "30621" + }, + "downsized": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-downsized.gif", + "width": "192", + "height": "192", + "size": "1550040" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-downsized-large.gif", + "width": "384", + "height": "384", + "size": "5951714" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100w_s.gif", + "width": "100", + "height": "100", + "size": "10030" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-preview.webp", + "width": "176", + "height": "176", + "size": "46994" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200w_s.gif", + "width": "200", + "height": "200", + "size": "30700" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100w.gif", + "width": "100", + "height": "100", + "size": "601815", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100w.mp4", + "mp4_size": "48818", + "webp": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/100w.webp", + "webp_size": "176230" + }, + "downsized_small": { + "width": "168", + "height": "168", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-downsized-small.mp4", + "mp4_size": "179612" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200w_d.gif", + "width": "200", + "height": "200", + "size": "186004", + "webp": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200w_d.webp", + "webp_size": "35442" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-downsized-medium.gif", + "width": "280", + "height": "280", + "size": "3383200" + }, + "original": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy.gif", + "width": "480", + "height": "480", + "size": "9185110", + "frames": "69", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy.mp4", + "mp4_size": "1016285", + "webp": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy.webp", + "webp_size": "1204160", + "hash": "0ba11abbbe49c9aa9a6ca502f1fbdd39" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200.gif", + "width": "200", + "height": "200", + "size": "2101697", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200.mp4", + "mp4_size": "327264", + "webp": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/200.webp", + "webp_size": "406708" + }, + "hd": { + "width": "1200", + "height": "1200", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-hd.mp4", + "mp4_size": "4123365" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-loop.mp4", + "mp4_size": "3096524" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy.mp4", + "mp4_size": "1016285" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/bbB45UPcelAL9qUVsl/giphy-preview.gif", + "width": "85", + "height": "85", + "size": "48373" + }, + "480w_still": { + "url": "https://media1.giphy.com/media/bbB45UPcelAL9qUVsl/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "it ain't over music video GIF by Lenny Kravitz", + "_score": 0 + }, + { + "type": "gif", + "id": "AsA9u7Iup0UVsQKclk", + "slug": "music-video-rock-lenny-AsA9u7Iup0UVsQKclk", + "url": "https://giphy.com/gifs/music-video-rock-lenny-AsA9u7Iup0UVsQKclk", + "bitly_gif_url": "https://gph.is/2tMiOHO", + "bitly_url": "https://gph.is/2tMiOHO", + "embed_url": "https://giphy.com/embed/AsA9u7Iup0UVsQKclk", + "username": "lennykravitzofficial", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2018-06-29 19:04:51", + "trending_datetime": "2018-07-11 21:15:01", + "user": { + "avatar_url": "https://media.giphy.com/avatars/LennyKravitzOfficial/pNjTDhoDTywb.jpg", + "banner_url": "", + "profile_url": "https://giphy.com/lennykravitzofficial/", + "username": "lennykravitzofficial", + "display_name": "Lenny Kravitz", + "guid": "" + }, + "images": { + "fixed_height_still": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200_s.gif", + "width": "200", + "height": "200", + "size": "27079" + }, + "original_still": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy_s.gif", + "width": "480", + "height": "480", + "size": "101648" + }, + "fixed_width": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200w.gif", + "width": "200", + "height": "200", + "size": "3301272", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200w.mp4", + "mp4_size": "390887", + "webp": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200w.webp", + "webp_size": "456610" + }, + "fixed_height_small_still": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100_s.gif", + "width": "100", + "height": "100", + "size": "9163" + }, + "fixed_height_downsampled": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200_d.gif", + "width": "200", + "height": "200", + "size": "162731", + "webp": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200_d.webp", + "webp_size": "22384" + }, + "preview": { + "width": "276", + "height": "276", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-preview.mp4", + "mp4_size": "38963" + }, + "fixed_height_small": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100.gif", + "width": "100", + "height": "100", + "size": "997123", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100.mp4", + "mp4_size": "167295", + "webp": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100.webp", + "webp_size": "225060" + }, + "downsized_still": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-downsized_s.gif", + "width": "208", + "height": "208", + "size": "29955" + }, + "downsized": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-downsized.gif", + "width": "208", + "height": "208", + "size": "1693492" + }, + "downsized_large": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-downsized-large.gif", + "width": "384", + "height": "384", + "size": "7856058" + }, + "fixed_width_small_still": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100w_s.gif", + "width": "100", + "height": "100", + "size": "9163" + }, + "preview_webp": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-preview.webp", + "width": "280", + "height": "280", + "size": "49964" + }, + "fixed_width_still": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200w_s.gif", + "width": "200", + "height": "200", + "size": "27079" + }, + "fixed_width_small": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100w.gif", + "width": "100", + "height": "100", + "size": "997123", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100w.mp4", + "mp4_size": "46793", + "webp": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/100w.webp", + "webp_size": "225060" + }, + "downsized_small": { + "width": "152", + "height": "152", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-downsized-small.mp4", + "mp4_size": "182867" + }, + "fixed_width_downsampled": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200w_d.gif", + "width": "200", + "height": "200", + "size": "162731", + "webp": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200w_d.webp", + "webp_size": "22384" + }, + "downsized_medium": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-downsized-medium.gif", + "width": "384", + "height": "384", + "size": "4914759" + }, + "original": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy.gif", + "width": "480", + "height": "480", + "size": "14139046", + "frames": "124", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy.mp4", + "mp4_size": "1236474", + "webp": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy.webp", + "webp_size": "1133090", + "hash": "0b95b1b6131420cab735f562189f69a3" + }, + "fixed_height": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200.gif", + "width": "200", + "height": "200", + "size": "3301272", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200.mp4", + "mp4_size": "390887", + "webp": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/200.webp", + "webp_size": "456610" + }, + "hd": { + "width": "1200", + "height": "1200", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-hd.mp4", + "mp4_size": "4469240" + }, + "looping": { + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-loop.mp4", + "mp4_size": "2076445" + }, + "original_mp4": { + "width": "480", + "height": "480", + "mp4": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy.mp4", + "mp4_size": "1236474" + }, + "preview_gif": { + "url": "https://media0.giphy.com/media/AsA9u7Iup0UVsQKclk/giphy-preview.gif", + "width": "82", + "height": "82", + "size": "48014" + }, + "480w_still": { + "url": "https://media1.giphy.com/media/AsA9u7Iup0UVsQKclk/480w_s.jpg", + "width": "480", + "height": "480" + } + }, + "title": "it ain't over music video GIF by Lenny Kravitz", + "_score": 0 + }, + { + "type": "gif", + "id": "3o6wrCGevaM9E0Jlo4", + "slug": "gilmoregirls-netflix-gilmore-girls-3o6wrCGevaM9E0Jlo4", + "url": "https://giphy.com/gifs/gilmoregirls-netflix-gilmore-girls-3o6wrCGevaM9E0Jlo4", + "bitly_gif_url": "https://gph.is/2frLVIC", + "bitly_url": "https://gph.is/2frLVIC", + "embed_url": "https://giphy.com/embed/3o6wrCGevaM9E0Jlo4", + "username": "gilmoregirls", + "source": "", + "rating": "g", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2016-11-11 19:28:43", + "trending_datetime": "2018-07-11 21:00:01", + "user": { + "avatar_url": "https://media.giphy.com/channel_assets/gilmoregirls/Z7UIgXCANSoA.png", + "banner_url": "https://media.giphy.com/channel_assets/netflixgg/OnO4LqQZkJMa.png", + "profile_url": "https://giphy.com/gilmoregirls/", + "username": "gilmoregirls", + "display_name": "Gilmore Girls ", + "guid": "ZGF2aWRAcmFscGhhbmRjby5jb20" + }, + "images": { + "fixed_height_still": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200_s.gif", + "width": "268", + "height": "200", + "size": "39524" + }, + "original_still": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy_s.gif", + "width": "480", + "height": "358", + "size": "100763" + }, + "fixed_width": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200w.gif", + "width": "200", + "height": "150", + "size": "413103", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200w.mp4", + "mp4_size": "19580", + "webp": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200w.webp", + "webp_size": "203298" + }, + "fixed_height_small_still": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100_s.gif", + "width": "134", + "height": "100", + "size": "12282" + }, + "fixed_height_downsampled": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200_d.gif", + "width": "268", + "height": "200", + "size": "208264", + "webp": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200_d.webp", + "webp_size": "52494" + }, + "preview": { + "width": "384", + "height": "286", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy-preview.mp4", + "mp4_size": "20643" + }, + "fixed_height_small": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100.gif", + "width": "134", + "height": "100", + "size": "203953", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100.mp4", + "mp4_size": "12020", + "webp": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100.webp", + "webp_size": "117570" + }, + "downsized_still": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy-downsized_s.gif", + "width": "480", + "height": "358", + "size": "100763" + }, + "downsized": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy-downsized.gif", + "width": "480", + "height": "358", + "size": "1910861" + }, + "downsized_large": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy.gif", + "width": "480", + "height": "358", + "size": "1910861" + }, + "fixed_width_small_still": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100w_s.gif", + "width": "100", + "height": "75", + "size": "7810" + }, + "preview_webp": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy-preview.webp", + "width": "197", + "height": "147", + "size": "48874" + }, + "fixed_width_still": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200w_s.gif", + "width": "200", + "height": "150", + "size": "24338" + }, + "fixed_width_small": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100w.gif", + "width": "100", + "height": "75", + "size": "120306", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100w.mp4", + "mp4_size": "8083", + "webp": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/100w.webp", + "webp_size": "78944" + }, + "downsized_small": { + "width": "480", + "height": "358", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy-downsized-small.mp4", + "mp4_size": "72770" + }, + "fixed_width_downsampled": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200w_d.gif", + "width": "200", + "height": "150", + "size": "125735", + "webp": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200w_d.webp", + "webp_size": "34604" + }, + "downsized_medium": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy.gif", + "width": "480", + "height": "358", + "size": "1910861" + }, + "original": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy.gif", + "width": "480", + "height": "358", + "size": "1910861", + "frames": "38", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy.mp4", + "mp4_size": "72770", + "webp": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy.webp", + "webp_size": "588324", + "hash": "33c019cafc67a8716729b475e3dac140" + }, + "fixed_height": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200.gif", + "width": "268", + "height": "200", + "size": "706486", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200.mp4", + "mp4_size": "28759", + "webp": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/200.webp", + "webp_size": "295266" + }, + "looping": { + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy-loop.mp4", + "mp4_size": "450594" + }, + "original_mp4": { + "width": "480", + "height": "358", + "mp4": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy.mp4", + "mp4_size": "72770" + }, + "preview_gif": { + "url": "https://media2.giphy.com/media/3o6wrCGevaM9E0Jlo4/giphy-preview.gif", + "width": "134", + "height": "100", + "size": "47370" + }, + "480w_still": { + "url": "https://media4.giphy.com/media/3o6wrCGevaM9E0Jlo4/480w_s.jpg", + "width": "480", + "height": "358" + } + }, + "title": "season 3 netflix GIF by Gilmore Girls ", + "_score": 0 + }, + { + "type": "gif", + "id": "3o6gE0ad4RlMefMd2w", + "slug": "sporzaredactie-spain-euro-2016-sporza-3o6gE0ad4RlMefMd2w", + "url": "https://giphy.com/gifs/sporzaredactie-spain-euro-2016-sporza-3o6gE0ad4RlMefMd2w", + "bitly_gif_url": "https://gph.is/28Tdt7V", + "bitly_url": "https://gph.is/28Tdt7V", + "embed_url": "https://giphy.com/embed/3o6gE0ad4RlMefMd2w", + "username": "sporzaredactie", + "source": "", + "rating": "pg", + "content_url": "", + "source_tld": "", + "source_post_url": "", + "is_sticker": 0, + "import_datetime": "2016-06-21 20:50:03", + "trending_datetime": "2016-06-22 07:30:03", + "user": { + "avatar_url": "https://media1.giphy.com/avatars/sporzaredactie/e3oxkvg1wYNm.png", + "avatar": "https://media1.giphy.com/avatars/sporzaredactie/e3oxkvg1wYNm.png", + "banner_url": "https://media1.giphy.com/headers/sporzaredactie/gtUML7UmiYBt.png", + "banner_image": "https://media1.giphy.com/headers/sporzaredactie/gtUML7UmiYBt.png", + "profile_url": "https://giphy.com/sporzaredactie/", + "username": "sporzaredactie", + "display_name": "Sporza" + }, + "images": { + "fixed_height_still": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200_s.gif", + "width": "362", + "height": "200" + }, + "original_still": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy_s.gif", + "width": "480", + "height": "265" + }, + "fixed_width": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200w.gif", + "width": "200", + "height": "110", + "size": "489827", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200w.mp4", + "mp4_size": "40202", + "webp": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200w.webp", + "webp_size": "193962" + }, + "fixed_height_small_still": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100_s.gif", + "width": "181", + "height": "100" + }, + "fixed_height_downsampled": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200_d.gif", + "width": "362", + "height": "200", + "size": "219040", + "webp": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200_d.webp", + "webp_size": "70958" + }, + "preview": { + "width": "208", + "height": "114", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy-preview.mp4", + "mp4_size": "34755" + }, + "fixed_height_small": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100.gif", + "width": "181", + "height": "100", + "size": "439660", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100.mp4", + "mp4_size": "35268", + "webp": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100.webp", + "webp_size": "175680" + }, + "downsized_still": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy-downsized_s.gif", + "width": "250", + "height": "138", + "size": "16776" + }, + "downsized": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy-downsized.gif", + "width": "250", + "height": "138", + "size": "716619" + }, + "downsized_large": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy.gif", + "width": "480", + "height": "265", + "size": "2766141" + }, + "fixed_width_small_still": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100w_s.gif", + "width": "100", + "height": "55" + }, + "preview_webp": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy-preview.webp", + "width": "235", + "height": "130", + "size": "49158" + }, + "fixed_width_still": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200w_s.gif", + "width": "200", + "height": "110" + }, + "fixed_width_small": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100w.gif", + "width": "100", + "height": "55", + "size": "163546", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100w.mp4", + "mp4_size": "16618", + "webp": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/100w.webp", + "webp_size": "75228" + }, + "downsized_small": { + "width": "480", + "height": "264", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy-downsized-small.mp4", + "mp4_size": "169786" + }, + "fixed_width_downsampled": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200w_d.gif", + "width": "200", + "height": "110", + "size": "74028", + "webp": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200w_d.webp", + "webp_size": "27558" + }, + "downsized_medium": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy.gif", + "width": "480", + "height": "265", + "size": "2766141" + }, + "original": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy.gif", + "width": "480", + "height": "265", + "size": "2766141", + "frames": "42", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy.mp4", + "mp4_size": "169153", + "webp": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy.webp", + "webp_size": "893470" + }, + "fixed_height": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200.gif", + "width": "362", + "height": "200", + "size": "1467152", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200.mp4", + "mp4_size": "92593", + "webp": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/200.webp", + "webp_size": "500924" + }, + "looping": { + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy-loop.mp4", + "mp4_size": "1319381" + }, + "original_mp4": { + "width": "480", + "height": "264", + "mp4": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy.mp4", + "mp4_size": "169153" + }, + "preview_gif": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/giphy-preview.gif", + "width": "136", + "height": "75", + "size": "49965" + }, + "480w_still": { + "url": "https://media3.giphy.com/media/3o6gE0ad4RlMefMd2w/480w_s.jpg", + "width": "480", + "height": "265" + } + }, + "title": "excited euro 2016 GIF by Sporza", + "_score": 0 + } + ] \ No newline at end of file diff --git a/src/test/__snapshots__/GIFList.test.tsx.snap b/src/test/__snapshots__/GIFList.test.tsx.snap new file mode 100644 index 00000000..dc329a63 --- /dev/null +++ b/src/test/__snapshots__/GIFList.test.tsx.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`GIFList renders withouth crashing 1`] = ` + +

    + No GIFs found! +

    +
    +`; + +exports[`GIFList with empty GIFS matches snapshot 1`] = ``; From 470aeeff44197a21588a9dbfaa43496402674f49 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 00:00:33 -0500 Subject: [PATCH 28/35] API Tests --- src/test/api.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/api.test.ts diff --git a/src/test/api.test.ts b/src/test/api.test.ts new file mode 100644 index 00000000..176656e6 --- /dev/null +++ b/src/test/api.test.ts @@ -0,0 +1,17 @@ +import axios from 'axios'; +import 'ts-jest' +import { search, getTrending } from '../api' + +// jest.mock('axios'); + +describe('API', () => { + it('#getTrending', async () => { + // axios.get.mockResolvedValue(false); + const data = await getTrending(); + expect(data).toBeDefined(); + }); + it('#search', async () => { + const data = await search('goku'); + expect(data).toBeDefined(); + }); +}); \ No newline at end of file From b7e684a34cc96295a0cb46eef417c2a0f54383d2 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 00:00:43 -0500 Subject: [PATCH 29/35] Search tests --- src/test/Search.test.tsx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/test/Search.test.tsx diff --git a/src/test/Search.test.tsx b/src/test/Search.test.tsx new file mode 100644 index 00000000..98de4a41 --- /dev/null +++ b/src/test/Search.test.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import 'jest-enzyme'; +import 'jest-styled-components' +import configureStore from 'redux-mock-store' +import { shallow, mount, ShallowWrapper } from 'enzyme'; +import { AppState } from '../types'; +import * as GIFS from './GIFS.json' +import Search from '../components/Search'; + +describe('GIFList', () => { + const mockStore = configureStore(); + const initialState = { trending: GIFS as string[] } + let store; + + it('renders withouth crashing', () => { + store = mockStore(initialState); + const state = store.getState() as AppState; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); +}); \ No newline at end of file From 645d33008dfe2307ba5cf053d871362a1e81831c Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 00:25:00 -0500 Subject: [PATCH 30/35] Fixed static typing --- package.json | 1 + src/components/FavsView.tsx | 20 ++++++------ src/components/presentational/GIFList.tsx | 2 +- yarn.lock | 39 +++++++++++++++++++++++ 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index ac8fcc49..c8080816 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "jest": "react-scripts-ts test --env=jsdom --watchAll --coverage" }, "devDependencies": { + "@types/babel-core": "^6.25.5", "@types/enzyme": "^3.1.11", "@types/enzyme-adapter-react-16": "^1.0.2", "@types/jest": "^23.1.5", diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index 9d95c62f..7ff3d23f 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -7,20 +7,18 @@ import FavsSearch from './FavsSearch'; import { _div_search } from './FavsView.style' -interface IFavsView { +interface IFavsViewProps { gifs: IGIF[] } -class FavsView extends React.Component { - public render() { - return (
    -

    Your favorite GIFS

    - <_div_search> - - - -
    ); - } +const FavsView = (props: IFavsViewProps) => { + return (
    +

    Your favorite GIFS

    + <_div_search> + + + +
    ); } function filterFavs(favs: object, query: string) { diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index 3f883a8f..9a87ca26 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -13,7 +13,7 @@ interface IGIFListProps { favs: FavsCollection onToggleFavorite: any } -export const GIFList = (props: IGIFListProps) => { +export const GIFList: React.SFC = (props) => { const { gifs, onToggleFavorite, favs } = props; return ( <_div> diff --git a/yarn.lock b/yarn.lock index 55b63c64..15abeeb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,45 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@types/babel-core@^6.25.5": + version "6.25.5" + resolved "https://registry.yarnpkg.com/@types/babel-core/-/babel-core-6.25.5.tgz#7598b1287c2cb5a8e9150d60e4d4a8f2dbe29982" + dependencies: + "@types/babel-generator" "*" + "@types/babel-template" "*" + "@types/babel-traverse" "*" + "@types/babel-types" "*" + "@types/babylon" "*" + +"@types/babel-generator@*": + version "6.25.2" + resolved "https://registry.yarnpkg.com/@types/babel-generator/-/babel-generator-6.25.2.tgz#fa13653ec2d34a4037be9c34dec32ae75bea04cc" + dependencies: + "@types/babel-types" "*" + +"@types/babel-template@*": + version "6.25.1" + resolved "https://registry.yarnpkg.com/@types/babel-template/-/babel-template-6.25.1.tgz#03e23a893c16bab2ec00200ab51feccf488cae78" + dependencies: + "@types/babel-types" "*" + "@types/babylon" "*" + +"@types/babel-traverse@*": + version "6.25.4" + resolved "https://registry.yarnpkg.com/@types/babel-traverse/-/babel-traverse-6.25.4.tgz#269af6a25c80419b635c8fa29ae42b0d5ce2418c" + dependencies: + "@types/babel-types" "*" + +"@types/babel-types@*": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.4.tgz#bfd5b0d0d1ba13e351dff65b6e52783b816826c8" + +"@types/babylon@*": + version "6.16.3" + resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb" + dependencies: + "@types/babel-types" "*" + "@types/cheerio@*": version "0.22.8" resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.8.tgz#5702f74f78b73e13f1eb1bd435c2c9de61a250d4" From c2526756d7622acddb8b09c6d7cad3716c166cd1 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 00:49:55 -0500 Subject: [PATCH 31/35] Improved test for GIFList --- src/components/presentational/GIFList.tsx | 2 +- src/test/GIFList.test.tsx | 29 +- src/test/__snapshots__/GIFList.test.tsx.snap | 10671 ++++++++++++++++- 3 files changed, 10678 insertions(+), 24 deletions(-) diff --git a/src/components/presentational/GIFList.tsx b/src/components/presentational/GIFList.tsx index 9a87ca26..cda01a19 100644 --- a/src/components/presentational/GIFList.tsx +++ b/src/components/presentational/GIFList.tsx @@ -17,7 +17,7 @@ export const GIFList: React.SFC = (props) => { const { gifs, onToggleFavorite, favs } = props; return ( <_div> - { gifs ? + { gifs && gifs.length > 0 ? gifs.map(gif => { const callback = onToggleFavorite.bind(null, gif); const active = favs[gif.id] !== undefined; diff --git a/src/test/GIFList.test.tsx b/src/test/GIFList.test.tsx index fcb29329..b422f9fc 100644 --- a/src/test/GIFList.test.tsx +++ b/src/test/GIFList.test.tsx @@ -2,10 +2,10 @@ import * as React from 'react'; import 'jest-enzyme'; import 'jest-styled-components' import configureStore from 'redux-mock-store' -import { shallow, mount, ShallowWrapper } from 'enzyme'; -import { GIFList } from '../components/presentational/GIFList'; -import { AppState } from '../types'; +import { mount } from 'enzyme'; +import GIFList from '../components/presentational/GIFList'; import * as GIFS from './GIFS.json' +import { Provider } from 'react-redux'; describe('GIFList', () => { const mockStore = configureStore(); @@ -14,25 +14,20 @@ describe('GIFList', () => { it('renders withouth crashing', () => { store = mockStore(initialState); - const state = store.getState() as AppState; - const onToggle = jest.fn(); - const wrapper = mount(); + const wrapper = mount( + + ); expect(wrapper).toMatchSnapshot(); }); describe('with empty GIFS', () => { - it('matches snapshot', () => { - store = mockStore({}); - const state = store.getState() as AppState; - const onToggle = jest.fn(); - const wrapper = mount(); + it('it displays an message', () => { + store = mockStore(initialState); + const wrapper = mount( + + ); expect(wrapper).toMatchSnapshot(); + expect(wrapper).toHaveText('No GIFs found!'); }); }); }); \ No newline at end of file diff --git a/src/test/__snapshots__/GIFList.test.tsx.snap b/src/test/__snapshots__/GIFList.test.tsx.snap index dc329a63..f1654289 100644 --- a/src/test/__snapshots__/GIFList.test.tsx.snap +++ b/src/test/__snapshots__/GIFList.test.tsx.snap @@ -1,11 +1,10670 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`GIFList renders withouth crashing 1`] = ` - -

    - No GIFs found! -

    -
    +.c3 { + background: none; + height: 32px; + font-size: 20px; + line-height: 32px; + color: #FFF; + margin: 10px; + opacity: 0.7; + border: none; + width: 32px; + border-radius: 50%; + -webkit-transition: opacity 0.25s; + transition: opacity 0.25s; +} + +.c3:hover { + opacity: 1.0; +} + +.c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: space-around; + -webkit-justify-content: space-around; + -ms-flex-pack: space-around; + justify-content: space-around; +} + +.c1 { + position: relative; + overflow: hidden; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + margin: 1em; +} + +.c2 { + position: absolute; + top: 0px; + min-height: 32px; + text-align: center; + background-color: rgba(0,0,0,0.5); + color: #FFF; + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.c2 small { + padding: 1em; + text-align: center; +} + + + + + +
    + +
    + +

    + + amazing race GIF by CTV + + + + + + +

    +
    + +
    +
    + +
    + +

    + + andy cohen fox GIF by loveconnectionfox + + + + + + +

    +
    + +
    +
    + +
    + +

    + + chris evans lol GIF + + + + + + +

    +
    + +
    +
    + +
    + +

    + + season 3 facebook watch GIF by Ball in the Family + + + + + + +

    +
    + +
    +
    + +
    + +

    + + hot dog days GIF by Wrecked + + + + + + +

    +
    + +
    +
    + +
    + +

    + + white wine laughing GIF by T. Kyle + + + + + + +

    +
    + +
    +
    + +
    + +

    + + whatsapp status GIF by good-morning + + + + + + +

    +
    + +
    +
    + +
    + +

    + + oh no GIF by The Maury Show + + + + + + +

    +
    + +
    +
    + +
    + +

    + + season 3 omg GIF by Ball in the Family + + + + + + +

    +
    + +
    +
    + +
    + +

    + + season 2 nbc GIF by Marlon + + + + + + +

    +
    + +
    +
    + +
    + +

    + + season 2 abc GIF by The Gong Show + + + + + + +

    +
    + +
    +
    + +
    + +

    + + illustration abc GIF by Kochstrasse™ + + + + + + +

    +
    + +
    +
    + +
    + +

    + + season 3 tina GIF by Ball in the Family + + + + + + +

    +
    + +
    +
    + +
    + +

    + + cardi b GIF by Maroon 5 + + + + + + +

    +
    + +
    +
    + +
    + +

    + + cardi b GIF by Maroon 5 + + + + + + +

    +
    + +
    +
    + +
    + +

    + + cardi b GIF by Maroon 5 + + + + + + +

    +
    + +
    +
    + +
    + +

    + + cardi b GIF by Maroon 5 + + + + + + +

    +
    + +
    +
    + +
    + +

    + + cardi b GIF by Maroon 5 + + + + + + +

    +
    + +
    +
    + +
    + +

    + + it ain't over music video GIF by Lenny Kravitz + + + + + + +

    +
    + +
    +
    + +
    + +

    + + it ain't over music video GIF by Lenny Kravitz + + + + + + +

    +
    + +
    +
    + +
    + +

    + + it ain't over music video GIF by Lenny Kravitz + + + + + + +

    +
    + +
    +
    + +
    + +

    + + it ain't over music video GIF by Lenny Kravitz + + + + + + +

    +
    + +
    +
    + +
    + +

    + + it ain't over music video GIF by Lenny Kravitz + + + + + + +

    +
    + +
    +
    + +
    + +

    + + season 3 netflix GIF by Gilmore Girls + + + + + + +

    +
    + +
    +
    + +
    + +

    + + excited euro 2016 GIF by Sporza + + + + + + +

    +
    + +
    +
    +
    +
    +
    +
    +
    `; -exports[`GIFList with empty GIFS matches snapshot 1`] = ``; +exports[`GIFList with empty GIFS it displays an message 1`] = ` +.c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: space-around; + -webkit-justify-content: space-around; + -ms-flex-pack: space-around; + justify-content: space-around; +} + + + + + +
    +

    + No GIFs found! +

    +
    +
    +
    +
    +
    +`; From 28d0b9175d79f52615214e90c6ec465a025fd586 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 00:53:49 -0500 Subject: [PATCH 32/35] Ignore src/index.tsx due to be boilerplate --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index c8080816..31b32a00 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "**/src/**/*.{ts,tsx}", "!**/src/registerServiceWorker.{ts,tsx}", "!**/src/setupTests.{js,ts}", + "!**/src/index.tsx", "!**/src/**/*.d.{ts,tsx}" ], "coverageThreshold": { From 45a775df3b8c3fc9844e7292108c4d77aeb3a64a Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 03:26:19 -0500 Subject: [PATCH 33/35] Improved Search test --- src/components/Search.tsx | 7 +- src/test/Search.test.tsx | 88 +++++++++++++++++--- src/test/__snapshots__/Search.test.tsx.snap | 91 +++++++++++++++++++++ 3 files changed, 173 insertions(+), 13 deletions(-) create mode 100644 src/test/__snapshots__/Search.test.tsx.snap diff --git a/src/components/Search.tsx b/src/components/Search.tsx index e95e7f83..56bb174a 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -1,18 +1,18 @@ import * as React from 'react'; import { connect } from 'react-redux'; -import { Dispatch, bindActionCreators } from 'redux'; +import { Dispatch, bindActionCreators, Store, ActionCreator } from 'redux'; import { search_trending, fetch_gifs as fetch_gifs_action } from '../actions/gifs'; import { SearchInput } from './Search.style'; -class Search extends React.Component { +export class Search extends React.Component { public onSearch = (event: React.ChangeEvent) => { const term = event.target.value; const { search, fetch_gifs } = this.props; // Search bar is cleared - if (term.length === 0 || !term) fetch_gifs(); + if (term.length === 0 || !term) return fetch_gifs(); // Only search with at least 3 chars if (term.length >= 3) return search(term); @@ -34,4 +34,5 @@ function mapDispatchToProps(dispatch: Dispatch) { search: search_trending, }, dispatch); } + export default connect(mapStateToProps, mapDispatchToProps)(Search); \ No newline at end of file diff --git a/src/test/Search.test.tsx b/src/test/Search.test.tsx index 98de4a41..b5c4675a 100644 --- a/src/test/Search.test.tsx +++ b/src/test/Search.test.tsx @@ -2,20 +2,88 @@ import * as React from 'react'; import 'jest-enzyme'; import 'jest-styled-components' import configureStore from 'redux-mock-store' -import { shallow, mount, ShallowWrapper } from 'enzyme'; -import { AppState } from '../types'; -import * as GIFS from './GIFS.json' -import Search from '../components/Search'; +import { mount, shallow, render } from 'enzyme'; +import SearchContainer, { Search } from '../components/Search'; +import { Provider } from 'react-redux'; -describe('GIFList', () => { +describe('Search', () => { const mockStore = configureStore(); - const initialState = { trending: GIFS as string[] } - let store; + let store: any; + + beforeEach(() => { + store = mockStore(); + }) it('renders withouth crashing', () => { - store = mockStore(initialState); - const state = store.getState() as AppState; - const wrapper = shallow(); + const wrapper = mount( ); + expect(wrapper).toMatchSnapshot(); + }); + + it('renders with the given query as value', () => { + const QUERY = 'Game of Thrones'; + store = mockStore({ search: QUERY }) + + const wrapper = mount( + + ); expect(wrapper).toMatchSnapshot(); + expect(wrapper.find('input')).toHaveValue(QUERY); + }); + + describe('when clearing the text input', () => { + it('dispatches the fetch_gifs action', () => { + const fetch_gifs_fn = jest.fn(); + const search_fn = jest.fn(); + + const event = { target: { value: '' } } + + const wrapper = mount( + + ) + + wrapper.find('Search').simulate('change', event); + + expect(search_fn).not.toHaveBeenCalled(); + expect(fetch_gifs_fn).toHaveBeenCalled(); + }); + }); + + describe('when typing less than 3 characters', () => { + it('does not call any action', () => { + const fetch_gifs_fn = jest.fn(); + const search_fn = jest.fn(); + + const event = { target: { value: 'dr' } } + + const wrapper = mount( + + ); + + wrapper.find('Search').simulate('change', event); + + expect(search_fn).not.toHaveBeenCalled(); + expect(fetch_gifs_fn).not.toHaveBeenCalled(); + }); + }); + + describe('when typing more than 3 characters', () => { + it('dispatches the search action', () => { + const QUERY = 'dragon ball'; + + const fetch_gifs_fn = jest.fn(); + const search_fn = jest.fn(); + + const event = { target: { value: QUERY } } + + const wrapper = mount( + + ); + + wrapper.find('Search').simulate('change', event); + + expect(search_fn).toHaveBeenCalledWith(QUERY); + expect(fetch_gifs_fn).not.toHaveBeenCalled(); + }); }); }); \ No newline at end of file diff --git a/src/test/__snapshots__/Search.test.tsx.snap b/src/test/__snapshots__/Search.test.tsx.snap new file mode 100644 index 00000000..0dc3b2b2 --- /dev/null +++ b/src/test/__snapshots__/Search.test.tsx.snap @@ -0,0 +1,91 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Search renders with the given query as value 1`] = ` +.c0 { + width: 100%; + padding: 6px; + margin: 0 auto; + box-shadow: none; + color: #333; + box-sizing: border-box; +} + +.c0:focus { + outline: none; +} + + + + + + + + + + +`; + +exports[`Search renders withouth crashing 1`] = ` +.c0 { + width: 100%; + padding: 6px; + margin: 0 auto; + box-shadow: none; + color: #333; + box-sizing: border-box; +} + +.c0:focus { + outline: none; +} + + + + + + +`; From 14c3e86a0bbe55f68a70770d1a3d536fd96938b8 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 03:34:39 -0500 Subject: [PATCH 34/35] FavsView.tsx tested - Test rendering the favorites in the store - Test rendering only those who match the filter --- src/components/FavsView.tsx | 7 +- src/test/FavsView.test.tsx | 43 + src/test/__snapshots__/FavsView.test.tsx.snap | 4894 +++++++++++++++++ 3 files changed, 4939 insertions(+), 5 deletions(-) create mode 100644 src/test/FavsView.test.tsx create mode 100644 src/test/__snapshots__/FavsView.test.tsx.snap diff --git a/src/components/FavsView.tsx b/src/components/FavsView.tsx index 7ff3d23f..ac50f89b 100644 --- a/src/components/FavsView.tsx +++ b/src/components/FavsView.tsx @@ -11,7 +11,7 @@ interface IFavsViewProps { gifs: IGIF[] } -const FavsView = (props: IFavsViewProps) => { +export const FavsView = (props: IFavsViewProps) => { return (

    Your favorite GIFS

    <_div_search> @@ -33,7 +33,4 @@ function filterFavs(favs: object, query: string) { function mapStateToProps(state: any) { return { gifs: filterFavs(state.favs, state.filter_favs) } } -function mapDispatchToProps(dispatch: Dispatch) { - return bindActionCreators({}, dispatch); -} -export default connect(mapStateToProps, mapDispatchToProps)(FavsView); \ No newline at end of file +export default connect(mapStateToProps)(FavsView); \ No newline at end of file diff --git a/src/test/FavsView.test.tsx b/src/test/FavsView.test.tsx new file mode 100644 index 00000000..e059689b --- /dev/null +++ b/src/test/FavsView.test.tsx @@ -0,0 +1,43 @@ +import * as React from 'react'; +import 'jest-enzyme' + +import { Provider } from 'react-redux'; +import { mount, shallow } from 'enzyme'; +import FavsView from '../components/FavsView'; +import configureStore from 'redux-mock-store' + +import * as GIFS from './GIFS.json' + +const FAVS = {} +for(let i = 0; i < 6; FAVS[GIFS[i].id] = GIFS[i++]); + +describe('FavsSearch', () => { + let store: any; + const mockStore = configureStore(); + it('renders without crashing', () => { + store = mockStore({ favs: FAVS }); + const wrapper = mount( + + ); + expect(wrapper).toMatchSnapshot(); + }); + + it('contains the favorites in the store', () => { + store = mockStore({ favs: FAVS }); + const wrapper = mount( + + ); + expect(wrapper.find('img').length).toBe(6); + }); + + describe('when filtering favs', () => { + store = mockStore({ + favs: FAVS, + filter_favs: 'amazing' + }); + const wrapper = mount( + + ); + expect(wrapper.find('img').length).toBe(1); + }); +}); \ No newline at end of file diff --git a/src/test/__snapshots__/FavsView.test.tsx.snap b/src/test/__snapshots__/FavsView.test.tsx.snap new file mode 100644 index 00000000..ec73a4e9 --- /dev/null +++ b/src/test/__snapshots__/FavsView.test.tsx.snap @@ -0,0 +1,4894 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`FavsSearch renders without crashing 1`] = ` +.c5 { + background: none; + height: 32px; + font-size: 20px; + line-height: 32px; + color: #FC4349; + margin: 10px; + opacity: 0.7; + border: none; + width: 32px; + border-radius: 50%; + -webkit-transition: opacity 0.25s; + transition: opacity 0.25s; +} + +.c5:hover { + opacity: 1.0; +} + +.c2 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-pack: space-around; + -webkit-justify-content: space-around; + -ms-flex-pack: space-around; + justify-content: space-around; +} + +.c3 { + position: relative; + overflow: hidden; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + margin: 1em; +} + +.c4 { + position: absolute; + top: 0px; + min-height: 32px; + text-align: center; + background-color: rgba(0,0,0,0.5); + color: #FFF; + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.c4 small { + padding: 1em; + text-align: center; +} + +.c1 { + width: 100%; + padding: 6px; + margin: 0 auto; + box-shadow: none; + color: #333; + box-sizing: border-box; +} + +.c1:focus { + outline: none; +} + +.c0 { + width: 100%; + max-width: 320px; + margin: 0 auto; +} + + + + +
    +

    + Your favorite GIFS +

    + +
    + + + + + + + +
    +
    + + + +
    + +
    + +

    + + amazing race GIF by CTV + + + + + + +

    +
    + +
    +
    + +
    + +

    + + andy cohen fox GIF by loveconnectionfox + + + + + + +

    +
    + +
    +
    + +
    + +

    + + chris evans lol GIF + + + + + + +

    +
    + +
    +
    + +
    + +

    + + season 3 facebook watch GIF by Ball in the Family + + + + + + +

    +
    + +
    +
    + +
    + +

    + + hot dog days GIF by Wrecked + + + + + + +

    +
    + +
    +
    + +
    + +

    + + white wine laughing GIF by T. Kyle + + + + + + +

    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +`; From 0f2fd6cf10aa9f3d088926c4decf39b296cb49c4 Mon Sep 17 00:00:00 2001 From: Fernando Gomez Date: Thu, 12 Jul 2018 03:47:51 -0500 Subject: [PATCH 35/35] Redux Action Creators testing --- src/test/actions/gifs.test.ts | 50 +++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/test/actions/gifs.test.ts diff --git a/src/test/actions/gifs.test.ts b/src/test/actions/gifs.test.ts new file mode 100644 index 00000000..e916f743 --- /dev/null +++ b/src/test/actions/gifs.test.ts @@ -0,0 +1,50 @@ +import * as Actions from '../../actions/gifs' +import * as GIFS from '../GIFS.json' + +describe('actions > create an action to', () => { + + it('filter the favorites', () => { + const payload = 'dragon'; + const expectedAction = { + type: Actions.FILTER_FAVS, + payload + } + expect(Actions.filter_favs(payload)) + .toEqual(expectedAction) + }) + + it('toggle as favorite a GIF', () => { + const payload = GIFS[0]; + const expectedAction = { + type: Actions.TOGGLE_FAVORITE, + payload + } + expect(Actions.toggle_favorite(payload)) + .toEqual(expectedAction) + }) + + it('search in the trending GIFS', () => { + const payload = 'All might'; + const expectedAction = { + type: Actions.SEARCH_TRENDING, + payload + } + expect(Actions.search_trending(payload)) + .toEqual(expectedAction) + }) + + describe('fetch gifs from Trending API', () => { + + it('starts fetching', () => { + const expectedAction = { type: Actions.FETCH_TRENDING } + expect(Actions.fetch_gifs()) + .toEqual(expectedAction) + }) + + it('notify when fetch is done', () => { + const expectedAction = { type: Actions.FETCHED_TRENDING } + expect(Actions.fetched_gifs()) + .toEqual(expectedAction) + }) + }); +})