diff --git a/README.md b/README.md index a5b93ae35..8949f31a1 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,133 @@ -# janis -Frontend for [joplin](https://github.com/cityofaustin/joplin). +# 🌻 Janis ☮️ -## Run locally +Janis is the codename for the software that renders [https://alpha.austin.gov](alpha.austin.gov) for web browsers. It is a working prototype of static site generation front-end and decoupled CMS architecture. -#### As a React App: +Janis uses data provided by the CMS API service, [Joplin](https://github.com/cityofaustin/joplin), along with the React components to generate a static-progressive website. + +## Table of Contents +- [Getting Started](#getting-started) +- [Project Info](#project-info) +- [Design](#design) +- [Frameworks and Libraries Used](#frameworks-and-libraries-used) + - [React-Static](#react-static) + - [Storybook](#storybook) +- [Browser Compatibility](#browser-compatibility) +- [Other Documentation for Developers](#other-documentation-for-developers) + - [Adding dependencies via yarn](#adding-dependencies-via-yarn) + - [Updating translation export via yarn](#updating-translation-export-via-yarn) + - [Static build scripts](#static-build-scripts) + - [Sass Code Style Guidelines](#sass-code-style-guidelines) + - [Accessibility Guidelines](#accessibility-guidelines) + +## Getting Started + +In order to run Janis locally you need to [install Docker](https://docs.docker.com/install/#supported-platforms). Our team uses Docker for Mac. + +Once Docker is installed and you've cloned the code from this repository, you can run the "serve-local" Shell script below to spin up a Docker container and install dependencies within a virtualized environment that replicates the production environment in our Heroku deployment. + +#### As a React App (Developer Mode): ``` ./scripts/serve-local.sh ``` Your react app should be running at http://localhost:3000/ -## Adding dependencies via yarn +**As a static build** +To run the site locally as a static build, the way it works in production, see the [Static build scripts](#static-build-scripts) section below. + + +## Project Info + +This work began under the Austin Digital Services Discovery Project. Design, Technology, and Innovation Fellows worked in partnership between two City departments, Communications Public Information and Communications and Technology Management. + +We set out to learn what’s working for other government service providers, then embark on an iterative research, prototyping, and testing process to identify new designs, methods, and technologies. + +More high level information about the project from content strategy, user research and design, and development teams is continually updated on [our project page](http://projects.austintexas.io/projects/austin-digital-services-discovery/about/what-we-are-doing/). + +## Design + +Current design mockups are stored in Google Drive as Sketch Files: +https://drive.google.com/drive/u/1/folders/1Xg6739ixhIDrb7MdJAnO4_zCRu3kDmZQ + + +## Frameworks and Libraries Used + +Here are some high-level notes about the open source technologies we are using for this project. + +For more information about the concepts and architectural decisions guiding this work, take a break from this README and check out some of what we have written on Medium and our project page: + +- https://medium.com/civiqueso/open-source-city-cms-part-1-607a58b32356 +- http://projects.austintexas.io/projects/austin-digital-services-discovery/about/Dev/ +- http://projects.austintexas.io/projects/austin-digital-services-discovery/our-technical-approach/open-by-default/ + +### React-Static + +This project uses [React-Static](https://github.com/nozzle/react-static) as a base framework for building static-progressive React applications and websites. It's designed with considerations for SEO, site performance, and user/developer experience. + +### Storybook + +- Storybook is a development environment for UI components. It allows you to browse a component library, view the different states of each component, and interactively develop and test components. +- To run Storybooks locally: + - `./scripts/serve-storybook.sh` + - open http://localhost:6006/ + +## Browser Compatibility + +Following the lead of other government digital services groups ([USWDS](https://github.com/uswds/uswds/issues/2071), [UK GDS](https://gds.blog.gov.uk/2012/01/25/support-for-browsers/)), we're committing to support browsers that represent > 2% of all site traffic recorded in Google Analytics for visitors to austintexas.gov. + +Based on data from 1/1/2018 to 4/16/2018 these are the browsers with > 2% of all site traffic that we commit to support. This list will be reevaluated again when we drop the `alpha.` subdomain. + +- Safari 10 and above +- Chrome 63 and above +- Internet Explorer 11 and above +- Edge 16 and above +- Firefox 58 and above + +Here are Google Analytics screenshots from data range 1/1/2018 to 4/16/2018. + +#### Top Browsers as of 2018-04-16 +![Top Browsers as of 2018-04-16](./docs/images/2018-04-16-top-browsers.png) + +#### Top Browsers by version number as of 2018-04-16 +![Top Browsers by version number as of 2018-04-16](./docs/images/2018-04-16-top-browsers-by-version.png) + +As this project moves forward, we hope to implement even more comprehensive Browser Support guidelines following the examples of other government agencies like the [cfpb](https://github.com/cfpb/development/blob/master/guides/browser-support.md). + +### Manual Testing with BrowserStack + +Our team uses BrowserStack to manually check for device and browser compatibility. Our checklist of devices includes (subject to update): + +**Mobile** +- iPhone 6S Safari & Chrome +- Galaxy S7 Chrome & Samsung Internet +- Galaxy Note8 Chrome +- Google Pixel Chrome + +**Tablet** +- iPad 4 Safari +- Windows Tablet IE 11 +- Kindle Fire HDX 7 + +**Desktop** +- Windows 7 + - IE 11 + - Firefox 57 + - Chrome 63 +- Windows 10 + - Edge 16 + - IE 11 + - Chrome 63 + - Firefox 57 +- MacOS + - Safari 11 + - Chrome 63 + - Firefox 57 + +--- + +## Other Documentation for Developers + + +### Adding dependencies via yarn This will update your container's yarn.lock and package.json files. Your local host machine's yarn.lock and package.json files will also be updated via mounted docker volumes. These local files are versioned and should be checked into git. @@ -21,9 +139,9 @@ docker exec --interactive --tty janis yarn add ``` Note: if you're running the docker container built by serve-build.sh you'll have to update the container name from `janis` to `janis-build` in the above command. -___ -## Updating translation export via yarn + +### Updating translation export via yarn All static translations live in src/js/i18n/locales/ directory. These files are versioned and built from the auto-generated default.json file (within that directory) via [babel-plugin-react-intl](https://github.com/yahoo/babel-plugin-react-intl). @@ -34,17 +152,18 @@ docker exec --interactive --tty janis yarn run build-langs ``` Note: if you're running the docker container built by serve-build.sh you'll have to update the container name from `janis` to `janis-build` in the above command. -___ - -## Design assets +### Static build script -Current design mockups are stored in Google Drive as Sketch Files: -https://drive.google.com/drive/u/1/folders/1Xg6739ixhIDrb7MdJAnO4_zCRu3kDmZQ +Since we use React-Static as our framework to render our React components as a static progressive website, it's important for us to be able to test the final static build locally. In order to do this, we have a script. ---- +**To build and serve** +``` +./scripts/serve-build.sh +``` +Your site will be running on http://localhost:8080/ -## SASS Regime Guidelines (WIP) +### Sass Code Style Guidelines We're using a modified form of the 7-1 pattern, and BEM for CSS naming and organization - our css file structure and js file structure should be congruent. @@ -57,39 +176,24 @@ We're using a modified form of the 7-1 pattern, and BEM for CSS naming and organ - class names which are not js components but have multiple words should be separated by a - EX. `coa-Footer__body-text` -Resources: +Sass/BEM Resources: - http://vanseodesign.com/css/sass-directory-structures/ - http://getbem.com/introduction/ ---- -## Accessibility Guidelines (WIP) +### Accessibility Guidelines -- When we use `target="_blank"` on an anchor tag, we should add `aria-label="Opens in new window"` and `rel="noopener noreferrer"` for [security](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/) +One advantage for using React components is that we can write reusable HTML-rendering modules that never forget about proper attribute tagging and ARIA labels. -a11y Resources: +For example, we learned that when we use `target="_blank"` on an anchor tag, we should add `aria-label="Opens in new window"` and `rel="noopener noreferrer"` for [security](https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/). Now we have a reusable `` component. + +more a11y Resources: - http://wave.webaim.org/ - https://www.w3.org/WAI/WCAG20/quickref/ - [Accessibility section of "Front-End Checklist"](https://github.com/thedaviddias/Front-End-Checklist#accessibility) - https://cfpb.github.io/design-manual/best-practices/accessibility-best-practices.html +- https://github.com/cfpb/development/blob/master/guides/accessibility.md - https://developers.google.com/web/fundamentals/accessibility/how-to-review - [How we’ve made GOV.UK Elements even more accessible](https://accessibility.blog.gov.uk/2018/02/28/how-weve-made-gov-uk-elements-even-more-accessible/) and https://accessibility.blog.gov.uk/ in general - https://accessibility.18f.gov/ - https://developer.mozilla.org/en-US/docs/Learn/Accessibility - ---- - -## React-Static - -This project uses React-Static to generate static pages from a react app. - -TODO: more on this decision + evaluation - ---- - -## Storybook - -- Storybook is a development environment for UI components. It allows you to browse a component library, view the different states of each component, and interactively develop and test components. -- To run Storybooks locally: - - `./scripts/serve-storybook.sh` - - open http://localhost:6006/ diff --git a/docs/images/2018-04-16-top-browsers-by-version.png b/docs/images/2018-04-16-top-browsers-by-version.png new file mode 100644 index 000000000..770776a2b Binary files /dev/null and b/docs/images/2018-04-16-top-browsers-by-version.png differ diff --git a/docs/images/2018-04-16-top-browsers.png b/docs/images/2018-04-16-top-browsers.png new file mode 100644 index 000000000..a081eb735 Binary files /dev/null and b/docs/images/2018-04-16-top-browsers.png differ diff --git a/package.json b/package.json index 7432ff3f0..64bf4d806 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,11 @@ "license": "MIT", "dependencies": { "axios": "^0.17.1", + "babel-polyfill": "^6.26.0", "browser-locale": "^1.0.3", "flexboxgrid-sass": "https://github.com/hugeinc/flexboxgrid-sass.git", "graphql-request": "^1.4.1", + "intl": "^1.2.5", "js-cookie": "^2.2.0", "lodash": "^4.17.4", "moment": "^2.20.1", diff --git a/src/index.js b/src/index.js index f7495be52..e18aa36de 100644 --- a/src/index.js +++ b/src/index.js @@ -20,6 +20,12 @@ if (typeof document !== 'undefined') { ) } + // Include Intl API polyfill + // https://www.npmjs.com/package/intl + if (!global.Intl) { + global.Intl = require('intl'); + } + // Render! render(App) diff --git a/static.config.js b/static.config.js index 72e7cd7da..776ab0176 100644 --- a/static.config.js +++ b/static.config.js @@ -174,4 +174,14 @@ export default { return allRoutes; }, + webpack: (config, { stage }) => { + // Include babel poyfill for IE 11 and below + // https://github.com/nozzle/react-static/blob/811ebe1b5a5b8e24fffec99fcdb3375818383711/docs/concepts.md#browser-support + if (stage === 'prod') { + config.entry = ['babel-polyfill', config.entry] + } else if (stage === 'dev') { + config.entry = ['babel-polyfill', ...config.entry] + } + return config + }, } diff --git a/yarn.lock b/yarn.lock index 1128a52f4..922ae73a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -390,6 +390,10 @@ address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + airbnb-js-shims@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-1.4.1.tgz#cc3e8eb8d35877f9d0fdc6583e26b0ee75b98ad0" @@ -668,6 +672,10 @@ array.prototype.flatten@^1.2.0: es-abstract "^1.10.0" function-bind "^1.1.1" +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -1985,6 +1993,10 @@ babylon@^6.17.0, babylon@^6.17.3, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -1993,6 +2005,10 @@ balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + base64-js@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" @@ -2001,6 +2017,10 @@ base64-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -2029,6 +2049,12 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" @@ -2043,6 +2069,10 @@ bl@^1.0.0: dependencies: readable-stream "^2.0.5" +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -2395,6 +2425,10 @@ caller-path@^0.1.0: dependencies: callsites "^0.2.0" +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" @@ -2576,6 +2610,10 @@ 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.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" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2806,10 +2844,18 @@ commoner@~0.10.3: q "^1.1.2" recast "^0.11.17" -component-emitter@^1.2.1: +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + compressible@~2.0.11: version "2.0.12" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" @@ -3225,7 +3271,7 @@ debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6. dependencies: ms "2.0.0" -debug@^3.1.0: +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: @@ -3662,6 +3708,43 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +engine.io-client@~3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary2 "~1.0.2" + +engine.io@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.0.tgz#54332506f42f2edc71690d2f2a42349359f3bf7d" + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + enhanced-resolve@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" @@ -5007,10 +5090,20 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-binary2@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98" + dependencies: + isarray "2.0.1" + has-color@~0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -5575,6 +5668,10 @@ intl-relativeformat@^2.0.0: dependencies: intl-messageformat "^2.0.0" +intl@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/intl/-/intl-1.2.5.tgz#82244a2190c4e419f8371f5aa34daa3420e2abde" + invariant@^2.1.1, invariant@^2.2.0, invariant@^2.2.1, invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -5633,6 +5730,12 @@ is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-ci@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + dependencies: + ci-info "^1.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -5897,6 +6000,10 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6997,6 +7104,10 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -7291,6 +7402,18 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -8229,9 +8352,9 @@ react-split-pane@^0.1.74: prop-types "^15.5.10" react-style-proptype "^3.0.0" -react-static@^5.6.8: - version "5.6.8" - resolved "https://registry.yarnpkg.com/react-static/-/react-static-5.6.8.tgz#c635c5356cf54aa4fdbc5b044e6eb35042bf6a48" +react-static@^5.7.1: + version "5.8.1" + resolved "https://registry.yarnpkg.com/react-static/-/react-static-5.8.1.tgz#6f665029980d385263a067b2d17008178356e7f5" dependencies: "@types/react" "^16.0.18" "@types/react-helmet" "^5.0.3" @@ -8295,8 +8418,11 @@ react-static@^5.6.8: serve "^6.4.10" shorthash "^0.0.2" slash "^1.0.0" + socket.io "^2.1.0" + socket.io-client "^2.1.0" style-loader "^0.19.0" swimmer "^1.1.1" + update-notifier "^2.4.0" url-loader "^0.6.1" webpack "^3.6.0" webpack-bundle-analyzer "^2.9.0" @@ -9299,6 +9425,48 @@ sntp@2.x.x: dependencies: hoek "4.x.x" +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + +socket.io-client@2.1.0, socket.io-client@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.0.tgz#0d0b21d460dc4ed36e57085136f2be0137ff20ff" + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.2.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.2.0" + to-array "0.1.4" + +socket.io-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.0.tgz#de77161795b6303e7aefc982ea04acb0cec17395" + dependencies: + debug "~3.1.0" + engine.io "~3.2.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.1.0" + socket.io-parser "~3.2.0" + sockjs-client@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" @@ -9861,6 +10029,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -10120,6 +10292,21 @@ update-notifier@^2.1.0, update-notifier@^2.3.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +update-notifier@^2.4.0: + 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" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" @@ -10549,6 +10736,14 @@ ws@^4.0.0: safe-buffer "~5.1.0" ultron "~1.1.0" +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.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" @@ -10557,6 +10752,10 @@ 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" +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -10671,3 +10870,7 @@ yauzl@^2.4.2: dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.0.1" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"