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}

+ +
+ ); + } +} 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}

+ +
+ ); +} 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"