diff --git a/README.md b/README.md
index 6283394..0aab0c1 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,18 @@
## Bridge Lesson Slides
-This repository will hold all slides for content related to bridge modules. This is very early stages,
+This repository will hold all slides for content related to bridge modules. This is very early stages,
and can change at any time!
To see ALL slides, https://bridge-school.github.io/bridge-slides-spectacle/
+## Development
+
+To run the local Spectacle server, simply run:
+
+```
+yarn && yarn start
+```
+
+## License
+
This work is licensed under a [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/).
diff --git a/src/slideDecks.js b/src/slideDecks.js
index c91f5ac..4d1adb8 100644
--- a/src/slideDecks.js
+++ b/src/slideDecks.js
@@ -17,6 +17,7 @@ import {
reactPropsSlideSet,
lifecycleSlideSet,
reactStateSlideSet,
+ reactHooksSlideSet,
reduxIntroSet,
reduxThunksIntroSet,
unitTestingIntroSet,
@@ -58,6 +59,7 @@ const reactSlideList = [
...classComponentSlideSet,
...lifecycleSlideSet,
...reactStateSlideSet,
+ ...reactHooksSlideSet,
];
// REDUX
diff --git a/src/slides/index.js b/src/slides/index.js
index 86b738d..a120532 100644
--- a/src/slides/index.js
+++ b/src/slides/index.js
@@ -16,6 +16,7 @@ export * from './react-components-intro/components-intro';
export * from './react-function-component/function-component';
export * from './react-class-component/class-component';
export * from './react-props/props';
+export * from './react-hooks/hooks';
export * from './react-component-lifecycle/lifecycle';
export * from './react-state/react-state';
export * from './redux-intro/redux-intro';
diff --git a/src/slides/react-hooks/hooks.js b/src/slides/react-hooks/hooks.js
new file mode 100644
index 0000000..4db6172
--- /dev/null
+++ b/src/slides/react-hooks/hooks.js
@@ -0,0 +1,65 @@
+import { ListSlideMaker, BasicCodeSlideMaker } from '../../tools';
+
+// import code examples with raw loader for BasicCodeSlideMaker
+import * as hooksClassExample from '!raw-loader!./react-hooks-class.example';
+import * as hooksFunctionExample from '!raw-loader!./react-hooks-function.example';
+
+// pushing to an array to avoid re-numbering slides when adding content
+// in between existing slides
+const slides = [];
+
+slides.push(
+ ListSlideMaker(`Intro to React Hooks`, [
+ `Hooks are a feature available in React 16.8.0 and later that let you use things like State without Classes`,
+ `You will recognize them as always starting with 'use' and always called at the top level of a Function Component`,
+ `Hooks enable you to use Functions in place of Classes for Components`,
+ ]),
+);
+
+slides.push(
+ ListSlideMaker(`The ✌️Rules Again`, [
+ `Always call Hooks in the top level of a function, not in a loop or an if statement for example`,
+ `Always call Hooks from Function Components`,
+ ]),
+);
+
+slides.push(
+ ListSlideMaker(`Completely Opt-in!`, [
+ `Hooks don't replace your current React knowledge, but they provide more direct access to things like State and Lifecycle`,
+ `100% backwards compatible with your current code`,
+ `No need to rewrite Classes, but you can start creating small components with Hooks today!`,
+ ]),
+);
+
+slides.push(
+ ListSlideMaker(`Our First Hook: useState`, [
+ `useState is a function provided by React that lets you interact with local state`,
+ `It returns an array with two values: the current state and a way to change it (like this.setState)`,
+ `useState also takes an initial state as a parameter`,
+ `You can destructure the array: const [count, setCount] = useState(0)`,
+ `Let's take a look at a simple Class Component and then how it could be a Function with Hooks`,
+ ]),
+);
+
+slides.push(BasicCodeSlideMaker(hooksClassExample, 24));
+
+slides.push(BasicCodeSlideMaker(hooksFunctionExample, 34));
+
+slides.push(
+ ListSlideMaker(`What Have We Done?`, [
+ `We have less, more readable code to accomplish the same thing`,
+ `"Readable" meaning setCount explains what it does better than this.setState`,
+ `We used Hooks!`,
+ ]),
+);
+
+slides.push(
+ ListSlideMaker(`Learning More About Hooks`, [
+ `Official docs: https://reactjs.org/docs/hooks-intro.html`,
+ `Check out useEffect next! https://reactjs.org/docs/hooks-effect.html`,
+ `Great examples of custom Hooks: https://usehooks.com/`,
+ `Try to recreate some of your Class Components using Hooks!`,
+ ]),
+);
+
+export const reactHooksSlideSet = [...slides];
diff --git a/src/slides/react-hooks/react-hooks-class.example.js b/src/slides/react-hooks/react-hooks-class.example.js
new file mode 100644
index 0000000..4c3f78f
--- /dev/null
+++ b/src/slides/react-hooks/react-hooks-class.example.js
@@ -0,0 +1,16 @@
+import React, { Component } from 'react';
+
+class Counter extends Component {
+ state = {
+ count: 0,
+ };
+ render() {
+ const { count } = this.state;
+ return (
+
+ {count}
+ this.setState({ count: count + 1 })}>Plus Plus
+
+ );
+ }
+}
diff --git a/src/slides/react-hooks/react-hooks-function.example.js b/src/slides/react-hooks/react-hooks-function.example.js
new file mode 100644
index 0000000..c7b26ec
--- /dev/null
+++ b/src/slides/react-hooks/react-hooks-function.example.js
@@ -0,0 +1,12 @@
+import React, { useState } from 'react';
+
+function Counter() {
+ // or const Counter = () => {
+ const [count, setCount] = useState(0);
+ return (
+
+ {count}
+ setCount(count + 1)}>Plus Plus
+
+ );
+}
diff --git a/yarn.lock b/yarn.lock
index 7f47db3..d4a3773 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -44,6 +44,11 @@ acorn-dynamic-import@^3.0.0:
dependencies:
acorn "^5.0.0"
+acorn-dynamic-import@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
+ integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==
+
acorn-globals@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
@@ -62,6 +67,11 @@ acorn-jsx@^4.1.1:
dependencies:
acorn "^5.0.3"
+acorn-jsx@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e"
+ integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==
+
acorn@^3.0.4:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
@@ -74,6 +84,11 @@ acorn@^5.0.0, acorn@^5.0.3, acorn@^5.4.0, acorn@^5.4.1:
version "5.5.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298"
+acorn@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
+ integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
+
address@1.0.3, address@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
@@ -162,6 +177,13 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0:
dependencies:
color-convert "^1.9.0"
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
anymatch@^1.3.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
@@ -1220,6 +1242,20 @@ buble@^0.19.3:
os-homedir "^1.0.1"
vlq "^1.0.0"
+buble@^0.19.4:
+ version "0.19.7"
+ resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.7.tgz#1dfd080ab688101aad5388d3304bc82601a244fd"
+ integrity sha512-YLgWxX/l+NnfotydBlxqCMPR4FREE4ubuHphALz0FxQ7u2hp3BzxTKQ4nKpapOaRJfEm1gukC68KnT2OymRK0g==
+ dependencies:
+ acorn "^6.1.1"
+ acorn-dynamic-import "^4.0.0"
+ acorn-jsx "^5.0.1"
+ chalk "^2.4.2"
+ magic-string "^0.25.2"
+ minimist "^1.2.0"
+ os-homedir "^1.0.1"
+ regexpu-core "^4.5.4"
+
buffer-indexof@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
@@ -1350,6 +1386,15 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1:
escape-string-regexp "^1.0.5"
supports-color "^5.2.0"
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
chardet@^0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
@@ -1694,6 +1739,14 @@ 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"
+create-react-context@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3"
+ integrity sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==
+ dependencies:
+ fbjs "^0.8.0"
+ gud "^1.0.0"
+
cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
@@ -2683,6 +2736,19 @@ fb-watchman@^2.0.0:
dependencies:
bser "^2.0.0"
+fbjs@^0.8.0:
+ version "0.8.17"
+ resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
+ integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
+ dependencies:
+ core-js "^1.0.0"
+ isomorphic-fetch "^2.1.1"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.18"
+
fbjs@^0.8.16:
version "0.8.16"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
@@ -3040,6 +3106,11 @@ growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+gud@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
+ integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
+
gzip-size@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
@@ -4236,6 +4307,13 @@ magic-string@^0.22.4:
dependencies:
vlq "^0.2.1"
+magic-string@^0.25.2:
+ version "0.25.2"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9"
+ integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==
+ dependencies:
+ sourcemap-codec "^1.4.4"
+
make-dir@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b"
@@ -5215,7 +5293,7 @@ pretty-format@^20.0.3:
ansi-regex "^2.1.1"
ansi-styles "^3.0.0"
-prismjs@1.6.0, prismjs@^1.6.0:
+prismjs@1.6, prismjs@1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.6.0.tgz#118d95fb7a66dba2272e343b345f5236659db365"
optionalDependencies:
@@ -5434,14 +5512,16 @@ react-error-overlay@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-3.0.0.tgz#c2bc8f4d91f1375b3dad6d75265d51cd5eeaf655"
-react-live@^1.8.0-2:
- version "1.10.1"
- resolved "https://registry.yarnpkg.com/react-live/-/react-live-1.10.1.tgz#3736be3e8281e455b3cca781506813c55abed011"
+react-live@^1.11.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/react-live/-/react-live-1.12.0.tgz#2876d4e913331002b66dfa73cf58051376bc2518"
+ integrity sha512-zFEpY01fJORF0IiyONqvjwPLBBDp155Ive6tU8ZmetmT2p4XWUKHstnlu4Cayia+n7iu58Owytztu43yvSin8g==
dependencies:
buble "^0.19.3"
core-js "^2.4.1"
+ create-react-context "^0.2.3"
dom-iterator "^1.0.0"
- prismjs "^1.6.0"
+ prismjs "1.6"
prop-types "^15.5.8"
unescape "^0.2.0"
@@ -5611,10 +5691,22 @@ redux@^3.0.4:
loose-envify "^1.1.0"
symbol-observable "^1.0.3"
+regenerate-unicode-properties@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662"
+ integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==
+ dependencies:
+ regenerate "^1.4.0"
+
regenerate@^1.2.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
+regenerate@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+ integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+
regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
@@ -5649,6 +5741,18 @@ regexpu-core@^2.0.0:
regjsgen "^0.2.0"
regjsparser "^0.1.4"
+regexpu-core@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae"
+ integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^8.0.2"
+ regjsgen "^0.5.0"
+ regjsparser "^0.6.0"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.1.0"
+
registry-auth-token@^3.0.1:
version "3.3.2"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20"
@@ -5666,12 +5770,24 @@ regjsgen@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+regjsgen@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd"
+ integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==
+
regjsparser@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
dependencies:
jsesc "~0.5.0"
+regjsparser@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c"
+ integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==
+ dependencies:
+ jsesc "~0.5.0"
+
relateurl@0.2.x:
version "0.2.7"
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
@@ -6046,6 +6162,11 @@ 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"
+sourcemap-codec@^1.4.4:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f"
+ integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==
+
spdx-correct@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
@@ -6102,9 +6223,10 @@ spectacle-code-slide@^0.5.2:
lodash.padstart "^4.2.0"
prop-types "^15.6.0"
-spectacle@^4.0.0:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/spectacle/-/spectacle-4.0.5.tgz#463cd879f5c5d0c5056f7af65de623d3b1d3e7b2"
+spectacle@^4.4.1:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/spectacle/-/spectacle-4.4.1.tgz#dad39f91f46c46d6ecf02a948c9b960f4aac6b96"
+ integrity sha512-71NR+la7PGvPb48aszCtrG14g/v5m0/H0JH9TeyGKll7HNRzqOP+qr8eUsISOXl4Y7YH9216IoMsp89iQlcKww==
dependencies:
deep-object-diff "^1.0.4"
emotion "^8.0.8"
@@ -6112,9 +6234,9 @@ spectacle@^4.0.0:
lodash "^4.17.4"
marksy "^6.0.2"
normalize.css "^7.0.0"
- prismjs "^1.6.0"
+ prismjs "1.6.0"
react-emotion "^8.0.8"
- react-live "^1.8.0-2"
+ react-live "^1.11.0"
react-redux "^5.0.5"
react-transition-group "1.2.1"
react-typography "^0.16.5"
@@ -6274,6 +6396,13 @@ supports-color@^5.2.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
svgo@^0.7.0:
version "0.7.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
@@ -6495,6 +6624,11 @@ 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.18:
+ version "0.7.19"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b"
+ integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==
+
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"
@@ -6535,6 +6669,29 @@ unescape@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/unescape/-/unescape-0.2.0.tgz#b78b9b60c86f1629df181bf53eee3bc8d6367ddf"
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+ integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277"
+ integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57"
+ integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==
+
uniq@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"