diff --git a/.travis.yml b/.travis.yml index 4a0391b4cbc..f75281e2ff7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,7 @@ _deploy_s3: &deploy_s3 skip_cleanup: true access_key_id: $AWS_ACCESS_KEY_ID secret_access_key: $AWS_SECRET_ACCESS_KEY + region: us-east-2 acl: public_read on: repo: Opentrons/opentrons @@ -33,6 +34,7 @@ _app_stage_build: &app_stage_build deploy: - # deploy Opentrons App to S3 <<: *deploy_s3 + region: us-east-1 local-dir: app-shell/dist/publish bucket: $OT_APP_DEPLOY_BUCKET upload-dir: $OT_APP_DEPLOY_FOLDER @@ -88,7 +90,7 @@ jobs: # test, build, and upload for JavaScript projects - stage: test - name: 'JS unit tests; build/deploy Protocol Designer, Components Library' + name: 'JS unit tests; build Protocol Designer, Labware Library, Components Library' # node version pulled from .nvmrc language: node_js install: @@ -98,19 +100,25 @@ jobs: - make lint-js lint-css - make -C components - make -C protocol-designer + - make -C labware-library after_success: - make coverage deploy: - - # deploy protocol designer to S3 + - # upload protocol designer artifacts to S3 <<: *deploy_s3 - region: us-east-2 dot_match: true local-dir: protocol-designer/dist bucket: $OT_PD_DEPLOY_BUCKET upload-dir: $TRAVIS_BRANCH - - # deploy components library to S3 + + - # upload labware library artifacts to S3 + <<: *deploy_s3 + local-dir: labware-library/dist + bucket: $OT_LL_DEPLOY_BUCKET + upload-dir: $TRAVIS_BRANCH + + - # upload components library artifacts to S3 <<: *deploy_s3 - # TODO(mc, 2018-03-26): why is this region not default? region: us-west-2 local-dir: components/dist bucket: opentrons-components @@ -160,19 +168,25 @@ env: - OT_TAG: $TRAVIS_TAG - OT_PD_COMMIT_HASH: $TRAVIS_COMMIT + # TODO(mc, 2019-03-13): move to Travis settings - OT_CI_TEMP_S3_PATH: s3://opentrons-ci/temp/$OT_BUILD + # TODO(mc, 2019-03-13): move to Travis settings - OT_APP_DEPLOY_BUCKET: opentrons-app - OT_APP_DEPLOY_FOLDER: builds # GITHUB_TOKEN + # TODO(mc, 2019-03-13): move to Travis settings - secure: f/W7kN4gOvVpIanTQh9QtCwiXOk5UrRnUPo2ZU1Qk8zaFVbNj2za2A1xGKMqSyfZKw7guqIwTjWgc/aF9lxRtfU+5fkedJQdxDi5r7jZFxpqmpZOlhyXVY8WAWNqavEkefQInPlpHVAL8M2eV+Pi1cO9FsMhdyy/Wk7qA2nOiA8//9pFRB+0jgSbe1yqIF5DPyL0kbibd3EwmQvuQtnn25qqJXjneenhL6spflLCrnUjq1N/iOlcGd94eBUtk8RaBtMEjOb2D0Mb0DWKMsppoXg4/mZDus6s/PlmBwUJKNCuRtDiEUn5brE14q3OQh/FkDoXMRl69VND2mYp1LOeh5fgLSu6P+YToyHrh4lhXaRAul6l3JmXuoDC3k8hOAr8rPbtiwH7wGY2eRNv59vUejdXof4KHbAN6FTIH934tTe4uvBH79hRMoFY51pHRe6UiC39e/3hwl0pVKLjkV/40wfdEeYA7xhTZQVux+FAfk2krmggokxGEhbAQhWoyRX/wlH2XfEgassGskJ9SbuumNPNOLmEV9OOISFaXoYqVn+SPXy8mN1Pl2sLfaPFtnmmiY20t6yWsHsmfwi+41lv8n0vwCOGq521suDeNyiFhOH2AqG7xm6nHbIv+CiWt2ntKXgV233J17usvfr1zSK07PMDMlV2lvJx3CXj3hA4Yb4= # OT_APP_MIXPANEL_ID - - secure: "T0h/KyXFRS4jsaor2sRLlKaUFxVmIH5LXArVLYi6I3Wz45SXvQuiH+gUic775rBLdpI8d+TgxCWyUPm1AJTCvCdaMr5PW/xyHeTT4qz0MKT1nThrO2Vi5cKWAUbZV6P8d8m9EBsJlvhgp7egLymS4K5zaotV07v6OK0qVJWiFo+Zj/ufQhQikIUaKOdNafKAqN4bSO/yqD6i9av/EOzkOJwIk2hnEMlCphZ/X2T81IXjw7toV0jjGL60tkL6lcULwDosrvJkb5+dr4AcUjwpb6tzexde2OfA7EyMN4BdIHXsAzKcqcxP0LVXoRqC2C2OyNITVHPci/r/kbqJOka9iGPn7BmUddjbhHb97nBygNDBZIS+U/W5nalO4ZLWe4RzgN85y5lFOdY9X0n8ZwkNwGKBxqueAdfmbPtkpYd5n0g9GMohRWO2wAb4ttY8Uw3x+OG75tmru37i6qO5Gl5VCo8ERIH8bAdEtzTB2Nna413Hm1ld4NmZFMGHfBL7scgyugAKoxgBebEIrTgtKQ6hBuVXWznS0E1bCoas9anR72UsXQol7MWxAmngv+We0ywBOG2qHRnKWwgUEp91R3OEIkH0ain9coPvX0e1mchvhuxiRvMlDZ9DU/narUpMol+/CslyHAMlRr8scNk2MAgNfRIhgEsrbbOrszVbgHtoFPE=" + # TODO(mc, 2019-03-13): move to Travis settings + - secure: 'T0h/KyXFRS4jsaor2sRLlKaUFxVmIH5LXArVLYi6I3Wz45SXvQuiH+gUic775rBLdpI8d+TgxCWyUPm1AJTCvCdaMr5PW/xyHeTT4qz0MKT1nThrO2Vi5cKWAUbZV6P8d8m9EBsJlvhgp7egLymS4K5zaotV07v6OK0qVJWiFo+Zj/ufQhQikIUaKOdNafKAqN4bSO/yqD6i9av/EOzkOJwIk2hnEMlCphZ/X2T81IXjw7toV0jjGL60tkL6lcULwDosrvJkb5+dr4AcUjwpb6tzexde2OfA7EyMN4BdIHXsAzKcqcxP0LVXoRqC2C2OyNITVHPci/r/kbqJOka9iGPn7BmUddjbhHb97nBygNDBZIS+U/W5nalO4ZLWe4RzgN85y5lFOdY9X0n8ZwkNwGKBxqueAdfmbPtkpYd5n0g9GMohRWO2wAb4ttY8Uw3x+OG75tmru37i6qO5Gl5VCo8ERIH8bAdEtzTB2Nna413Hm1ld4NmZFMGHfBL7scgyugAKoxgBebEIrTgtKQ6hBuVXWznS0E1bCoas9anR72UsXQol7MWxAmngv+We0ywBOG2qHRnKWwgUEp91R3OEIkH0ain9coPvX0e1mchvhuxiRvMlDZ9DU/narUpMol+/CslyHAMlRr8scNk2MAgNfRIhgEsrbbOrszVbgHtoFPE=' # OT_APP_INTERCOM_ID - - secure: "B+OLp0ZNWX6T9BFFGdNYA6vmXYJH0KXFGdyrEKHh0bFC4BnbPbbhN1SFp50Au+uMY1lzIhnihrkLpabie89N8HfHVuvTf27KDGP2vUrs7Vnnf+goSb2PrtcFcRNDjOM5bKQAWNfrjDVUBYkDWWL+zkS9ms6+mF+E8keCDGeMacPSus6NNK1v8+i9yK1/lJHYHxA353BkU73iP2SdrZ3IFuysEG8DVj9wBl7fXYOHrP2Dzw/ZQYzQOiagPYGAPoyMDcbr0Pnq1wu9sPADbPAA+UFOq0LfNTLDd8iP6EZuahwVIhldKBFOuT15YmbHG2c00Hepjl9V72d2FwnkXWcbKf/tgOrgCO+mDgYXtwE7rVfBQdhCZGgfxY7w8MTmNNm/WRrFhLBVvLpRGmVprIrA0fTJVUUo5O+YUHXuSAWwE2OPM3MfXj4Qdy656mTg6A/FWRuE1IZffhr/YhfcHiW6VG/W5t5wF5dzR1so4QILcL+aU2wfoHaFQ+c25ejoo7aPaY4D1bbQl0AtpQMJLtMSUH8X7xJGkVgc3mbwFdpvHNAhh2rhtOJtftwhTXSZ0WLfcJLl4Hj2F/6IqZj/DvTO5xMjuqdTigFVJzUSFdG6C61Af5C49v+ag9hqTHyQ59kOIFoKeyW4SPmqQIm7ZSVs1h3wCkmtZVOHWSV+n41JJ/I=" + # TODO(mc, 2019-03-13): move to Travis settings + - secure: 'B+OLp0ZNWX6T9BFFGdNYA6vmXYJH0KXFGdyrEKHh0bFC4BnbPbbhN1SFp50Au+uMY1lzIhnihrkLpabie89N8HfHVuvTf27KDGP2vUrs7Vnnf+goSb2PrtcFcRNDjOM5bKQAWNfrjDVUBYkDWWL+zkS9ms6+mF+E8keCDGeMacPSus6NNK1v8+i9yK1/lJHYHxA353BkU73iP2SdrZ3IFuysEG8DVj9wBl7fXYOHrP2Dzw/ZQYzQOiagPYGAPoyMDcbr0Pnq1wu9sPADbPAA+UFOq0LfNTLDd8iP6EZuahwVIhldKBFOuT15YmbHG2c00Hepjl9V72d2FwnkXWcbKf/tgOrgCO+mDgYXtwE7rVfBQdhCZGgfxY7w8MTmNNm/WRrFhLBVvLpRGmVprIrA0fTJVUUo5O+YUHXuSAWwE2OPM3MfXj4Qdy656mTg6A/FWRuE1IZffhr/YhfcHiW6VG/W5t5wF5dzR1so4QILcL+aU2wfoHaFQ+c25ejoo7aPaY4D1bbQl0AtpQMJLtMSUH8X7xJGkVgc3mbwFdpvHNAhh2rhtOJtftwhTXSZ0WLfcJLl4Hj2F/6IqZj/DvTO5xMjuqdTigFVJzUSFdG6C61Af5C49v+ag9hqTHyQ59kOIFoKeyW4SPmqQIm7ZSVs1h3wCkmtZVOHWSV+n41JJ/I=' # OT_PD_FULLSTORY_ORG - - secure: "N/WWTWYdEPF7UfWIefSnOIKYVj9/q8ti7kCiB9DNfeKIsjJwsmg6S5yrwn6N4B/9ZMSp0yswo442n09CvH4jMG99BodXdYxg3JhuJ5dxWReAUTWO0PTiyihWeFhd2sbQ3VZa+o85OoFWFHO8UCXqcG//iUZ4l05t9DY5CGUBsPnyJTptsjPCb+CFUc+xkckv9RBfhLeyGBDWodJVfjU4xb124f5MBVF67OlHJ20HmbuH/kRNLDXSiRW4BD9UIXyWrIaPZHW612dX6inETz0vhUOJbUftgn8kdpjjBqa1394TjnjW5fey1n73KH4KpaDPZeGJ5GnYRpk9Wvw7uQkWH7xjkXbFq6cqd0vIWWS5uYmdsMsNDjUtTyELqG01rj813jbmcItuzK2tAcuQ5kBPwikLsHYeQY/68GKlws9POd444YQXXiTYgCoHgYq8O3nxaLoMZBgabFq6Rtz0xJb3Hu99PkU6flI4hgT82RZGf32PgYSKznaGps9DGf2as8FU+wui/So89eQwkDyhirzGvC31OlRHdZitjWYvI27nGgiPWheuZR5zAtf6tJeZaZ1N/PZGBwJW6ykfjG+vyRep/IIW5r0ujnBcmgxT7USVpW0E45QolZBS75t29kkTxP0/EHLMavv7QqP3LNpDJpptPrMQ8mLINxlB7FCQ2AQLbDY=" + # TODO(mc, 2019-03-13): move to Travis settings + - secure: 'N/WWTWYdEPF7UfWIefSnOIKYVj9/q8ti7kCiB9DNfeKIsjJwsmg6S5yrwn6N4B/9ZMSp0yswo442n09CvH4jMG99BodXdYxg3JhuJ5dxWReAUTWO0PTiyihWeFhd2sbQ3VZa+o85OoFWFHO8UCXqcG//iUZ4l05t9DY5CGUBsPnyJTptsjPCb+CFUc+xkckv9RBfhLeyGBDWodJVfjU4xb124f5MBVF67OlHJ20HmbuH/kRNLDXSiRW4BD9UIXyWrIaPZHW612dX6inETz0vhUOJbUftgn8kdpjjBqa1394TjnjW5fey1n73KH4KpaDPZeGJ5GnYRpk9Wvw7uQkWH7xjkXbFq6cqd0vIWWS5uYmdsMsNDjUtTyELqG01rj813jbmcItuzK2tAcuQ5kBPwikLsHYeQY/68GKlws9POd444YQXXiTYgCoHgYq8O3nxaLoMZBgabFq6Rtz0xJb3Hu99PkU6flI4hgT82RZGf32PgYSKznaGps9DGf2as8FU+wui/So89eQwkDyhirzGvC31OlRHdZitjWYvI27nGgiPWheuZR5zAtf6tJeZaZ1N/PZGBwJW6ykfjG+vyRep/IIW5r0ujnBcmgxT7USVpW0E45QolZBS75t29kkTxP0/EHLMavv7QqP3LNpDJpptPrMQ8mLINxlB7FCQ2AQLbDY=' diff --git a/babel.config.js b/babel.config.js index d230b660a40..3ac9e986fd4 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,11 +1,21 @@ 'use strict' -const PRESET_ENV_NO_MODULES = ['@babel/preset-env', {modules: false}] +const PRESET_ENV_NO_MODULES = [ + '@babel/preset-env', + { + modules: false, + // TODO(mc, 2019-03-13): uncomment this line to enable babel polyfill + // useBuiltIns: 'usage', + }, +] + const PRESET_ENV_CJS_MODULES = ['@babel/preset-env', {modules: 'commonjs'}] module.exports = { env: { production: { + // TODO(mc, 2019-03-13): add '@babel/plugin-transform-runtime' + // along with useBuiltIns TODO above plugins: ['babel-plugin-unassert'], }, development: { @@ -19,6 +29,7 @@ module.exports = { '@babel/plugin-proposal-object-rest-spread', '@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-optional-chaining', + '@babel/plugin-syntax-dynamic-import', ], presets: ['@babel/preset-flow', '@babel/preset-react', PRESET_ENV_NO_MODULES], overrides: [ diff --git a/labware-library/Makefile b/labware-library/Makefile new file mode 100644 index 00000000000..bdc99dfba8c --- /dev/null +++ b/labware-library/Makefile @@ -0,0 +1,30 @@ +# opentrons labware-library makefile + +SHELL := /bin/bash + +# add node_modules/.bin to PATH +PATH := $(shell cd .. && yarn bin):$(PATH) + +.PHONY: all +all: clean dist + +.PHONY: clean +clean: + shx rm -rf dist + +# production assets +.PHONY: dist +dist: export NODE_ENV := production +dist: + webpack --profile + +# development assets server +.PHONY: dev +dev: export NODE_ENV := development +dev: + webpack-dev-server --hot + +# production assets server +.PHONY: serve +serve: all + node ../scripts/serve-static dist diff --git a/labware-library/README.md b/labware-library/README.md new file mode 100644 index 00000000000..97cd9c12951 --- /dev/null +++ b/labware-library/README.md @@ -0,0 +1,83 @@ +# labware library + + + +> Library of standard labware for use with your OT-2 + +The Labware Library is an app for OT-2 users to discover, learn about, and use the labware the OT-2 supports. + +## development setup + +### setup + +Follow the top-level [contributing guide][contributing] to set your repository up for development. + +```shell +cd opentrons +make install +``` + +### common tasks + +Unit tests, linting, and typechecking are all run from the repository level Makefile. The contributing guide has more details. + +```shell +# run unit-tests, lints, and typechecks +make test-js lint-js check-js + +# run unit-tests in watch mode +make test-js watch=true +``` + +[contributing]: ../CONTRIBUTING.md + +### labware-library tasks + +This directory's Makefile has the following set of labware-library specific development tasks defined. + +```shell +# default task: build production artifacts +# these three commands are identical +make -C labware-library +make -C labware-library all +make -C labware-library clean dist + +# start a hot-reloading development server +# (optional) specify port with PORT; default is 8080 +make -C labware-library dev +make -C labware-library dev PORT=8081 + +# build production assets and serve them +# (optional) specify port with PORT; default is 9090 +make -C labware-library serve +make -C labware-library serve PORT=9091 +``` + +### webpack setup + +This project (along with our other front-end projects) uses [webpack][] to generate artifacts. + +- Extends our [base webpack config][base-config] +- Entry point is [`labware-library/src/index.js`][entry] +- [Handlebars][] HTML template is [`labware-library/src/index.hbs`][template] + - At template build time, JS entry is run via [prerender-loader][] + - DOM output from JS is then inserted into HTML output +- Global CSS is [`labware-library/src/global.css`][global-style] + - All other CSS is used via [CSS Modules][] +- All artifacts will be output to `labware-library/dist` + +[handlebars]: https://handlebarsjs.com/ +[css modules]: https://github.com/css-modules/css-modules +[prerender-loader]: https://github.com/GoogleChromeLabs/prerender-loader +[base-config]: ../webpack-config +[entry]: ./src/index.js +[template]: ./src/index.hbs +[global-style]: ./src/global.css + +### environment variables + +Certain environment variables, when set, will affect the artifact output. + +| variable | value | description | +| -------- | ----------------------------- | ------------------------------------------- | +| NODE_ENV | production, development, test | Optimizes output for a specific environment | diff --git a/labware-library/package.json b/labware-library/package.json new file mode 100644 index 00000000000..76bb595ec57 --- /dev/null +++ b/labware-library/package.json @@ -0,0 +1,21 @@ +{ + "name": "@opentrons/labware-library", + "productName": "Labware Library", + "version": "3.7.0", + "description": "Opentrons standard labware library", + "main": "src/index.js", + "repository": { + "type": "git", + "url": "https://github.com/Opentrons/opentrons.git", + "directory": "labware-library" + }, + "author": { + "name": "Opentrons Labworks", + "email": "engineering@opentrons.com" + }, + "license": "Apache-2.0", + "dependencies": { + "@opentrons/components": "3.7.0", + "react-hot-loader": "^4.8.0" + } +} diff --git a/labware-library/src/components/App/__tests__/App.test.js b/labware-library/src/components/App/__tests__/App.test.js new file mode 100644 index 00000000000..57a86c56836 --- /dev/null +++ b/labware-library/src/components/App/__tests__/App.test.js @@ -0,0 +1,12 @@ +// app tests +import React from 'react' +import Renderer from 'react-test-renderer' + +import {App} from '..' + +describe('App', () => { + test('component renders', () => { + const tree = Renderer.create().toJSON() + expect(tree).toMatchSnapshot() + }) +}) diff --git a/labware-library/src/components/App/__tests__/__snapshots__/App.test.js.snap b/labware-library/src/components/App/__tests__/__snapshots__/App.test.js.snap new file mode 100644 index 00000000000..1b92568a56a --- /dev/null +++ b/labware-library/src/components/App/__tests__/__snapshots__/App.test.js.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`App component renders 1`] = ` +

+ Opentrons Labware Library +

+`; diff --git a/labware-library/src/components/App/index.js b/labware-library/src/components/App/index.js new file mode 100644 index 00000000000..fb9051005df --- /dev/null +++ b/labware-library/src/components/App/index.js @@ -0,0 +1,12 @@ +// @flow +// main application wrapper component +import * as React from 'react' +import {hot} from 'react-hot-loader/root' + +import styles from './styles.css' + +export function App () { + return

Opentrons Labware Library

+} + +export default hot(App) diff --git a/labware-library/src/components/App/styles.css b/labware-library/src/components/App/styles.css new file mode 100644 index 00000000000..239c5c74bbc --- /dev/null +++ b/labware-library/src/components/App/styles.css @@ -0,0 +1,6 @@ +/* app styles */ +@import '@opentrons/components'; + +.title { + @apply --font-huge-dark; +} diff --git a/labware-library/src/global.css b/labware-library/src/global.css new file mode 100644 index 00000000000..82b73435aa0 --- /dev/null +++ b/labware-library/src/global.css @@ -0,0 +1,6 @@ +/* + * global styles +*/ + +@import url('https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,800'); +@import './styles/reset.css'; diff --git a/labware-library/src/index.hbs b/labware-library/src/index.hbs new file mode 100644 index 00000000000..84264568c10 --- /dev/null +++ b/labware-library/src/index.hbs @@ -0,0 +1,14 @@ + + + + + + + + {{htmlWebpackPlugin.options.title}} + + + +
+ + diff --git a/labware-library/src/index.js b/labware-library/src/index.js new file mode 100644 index 00000000000..6087c923d9a --- /dev/null +++ b/labware-library/src/index.js @@ -0,0 +1,20 @@ +// @flow +// labware library entry +import * as React from 'react' + +import './global.css' +import App from './components/App' + +render() + +export default function render () { + const $root = document.getElementById('root') + + if (!$root) { + throw new Error('fatal: #root not found') + } + + return Promise.all([import('react-dom')]).then(([{default: ReactDom}]) => { + ReactDom.hydrate(, $root) + }) +} diff --git a/labware-library/src/styles/reset.css b/labware-library/src/styles/reset.css new file mode 100644 index 00000000000..e1a62c9a128 --- /dev/null +++ b/labware-library/src/styles/reset.css @@ -0,0 +1,60 @@ +/* + * basic CSS reset + * TODO(mc, 2019-03-12): copied from Opentrons/opentrons-website; merge somehow +*/ + +/* use border-box because it's more sane */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +/* prevent adjustments of font size after mobile orientation changes */ +html { + text-size-adjust: 100%; +} + +/* remove margin from body and set sane font-size + line-height */ +body { + margin: 0; + font-size: 16px; + line-height: 1; + font-family: 'Open Sans', sans-serif; +} + +/* ensure
works in IE 9, 10, and 11 */ +main { + display: block; +} + +/* make images responsive */ +img { + max-width: 100%; + border-style: none; +} + +/* strip margin and padding from text elements */ +h1, +h2, +h3, +h4, +h5, +h6, +p, +ul, +ol { + margin: 0; + padding: 0; +} + +/* no list style by default */ +ul, +ol { + list-style: none; +} + +/* no underline on links by default */ +a { + text-decoration: none; +} diff --git a/labware-library/webpack.config.js b/labware-library/webpack.config.js new file mode 100644 index 00000000000..aac8db98d99 --- /dev/null +++ b/labware-library/webpack.config.js @@ -0,0 +1,46 @@ +'use strict' + +const path = require('path') +const merge = require('webpack-merge') +const HtmlWebpackPlugin = require('html-webpack-plugin') + +const {baseConfig} = require('@opentrons/webpack-config') +const pkg = require('./package.json') + +const JS_ENTRY = path.join(__dirname, './src/index.js') +const HTML_ENTRY = path.join(__dirname, './src/index.hbs') +const OUT_PATH = path.join(__dirname, 'dist') + +// TODO(mc, 2019-03-13): we won't need to replace entry to avoid including +// react-hot-loader/patch once monorepo is updated to react-hot-loader@4 +module.exports = merge.strategy({entry: 'replace'})(baseConfig, { + entry: JS_ENTRY, + + output: { + path: OUT_PATH, + }, + + module: { + rules: [ + // process HTML template with prerender-loader to have our app + // statically compiled at build time into the HTML output + { + test: HTML_ENTRY, + use: { + loader: 'prerender-loader', + // prerender-loader expects relative path (absolute doesn't work) + options: {entry: path.relative(__dirname, JS_ENTRY)}, + }, + }, + ], + }, + + plugins: [ + new HtmlWebpackPlugin({ + template: HTML_ENTRY, + title: pkg.productName, + description: pkg.description, + author: pkg.author.name, + }), + ], +}) diff --git a/package.json b/package.json index 9c36c342ea3..c2f070abaaa 100755 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "components", "discovery-client", "labware-designer", + "labware-library", "protocol-designer", "protocol-library-kludge", "shared-data", @@ -25,7 +26,9 @@ "@babel/plugin-proposal-class-properties": "^7.2.1", "@babel/plugin-proposal-object-rest-spread": "^7.2.0", "@babel/plugin-proposal-optional-chaining": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-runtime": "^7.3.4", "@babel/preset-env": "^7.2.0", "@babel/preset-flow": "^7.0.0", "@babel/preset-react": "^7.0.0", @@ -52,6 +55,7 @@ "eslint-plugin-promise": "^3.6.0", "eslint-plugin-react": "^7.11.1", "eslint-plugin-standard": "^3.0.1", + "express": "^4.16.4", "file-loader": "^2.0.0", "flow-bin": "^0.82.0", "flow-copy-source": "^2.0.2", @@ -72,6 +76,7 @@ "postcss-cssnext": "^3.0.2", "postcss-import": "^11.0.0", "postcss-loader": "^3.0.0", + "prerender-loader": "^1.3.0", "react": "^16.6.3", "react-dom": "^16.6.3", "react-styleguidist": "^8.0.1", @@ -88,7 +93,7 @@ "webpack": "^4.23.0", "webpack-bundle-analyzer": "^3.0.3", "webpack-cli": "^3.1.2", - "webpack-dev-server": "^3.1.10", + "webpack-dev-server": "^3.2.1", "webpack-merge": "^4.1.4", "worker-loader": "^2.0.0", "ws": "3.1.0" diff --git a/protocol-designer/Makefile b/protocol-designer/Makefile index 7cc453a05d5..0303c52bc9b 100644 --- a/protocol-designer/Makefile +++ b/protocol-designer/Makefile @@ -35,3 +35,8 @@ build: dev: export NODE_ENV := development dev: webpack-dev-server --hot + +# production assets server +.PHONY: serve +serve: all + node ../scripts/serve-static dist diff --git a/scripts/serve-static.js b/scripts/serve-static.js new file mode 100644 index 00000000000..f60d9dece93 --- /dev/null +++ b/scripts/serve-static.js @@ -0,0 +1,21 @@ +'use strict' + +const assert = require('assert') +const path = require('path') +const express = require('express') + +const USAGE = 'node ./scripts/serve-static ' +assert(process.argv[2], USAGE) + +const content = path.resolve(process.cwd(), process.argv[2]) +const port = process.env.PORT || 9090 +const app = express() + +app.use(express.static(content)) +app + .listen(port) + .once('listening', () => console.log(`Listening on http://localhost:${port}`)) + .once('error', error => { + console.error(error) + process.exit(1) + }) diff --git a/webpack-config/lib/base-config.js b/webpack-config/lib/base-config.js index da891bd1578..3d61cb16356 100644 --- a/webpack-config/lib/base-config.js +++ b/webpack-config/lib/base-config.js @@ -9,11 +9,12 @@ const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin') const TerserPlugin = require('terser-webpack-plugin') const rules = require('./rules') -const {DEV_MODE, ENABLE_ANALYZER} = require('./env') +const {DEV_MODE, ENABLE_ANALYZER, DEFAULT_PORT} = require('./env') module.exports = { target: 'web', + // TODO(mc, 2019-03-12): react-hot-loader@4 no longer needs this entry entry: DEV_MODE ? ['react-hot-loader/patch'] : [], output: { @@ -71,5 +72,6 @@ module.exports = { devServer: { historyApiFallback: true, + port: DEFAULT_PORT, }, } diff --git a/webpack-config/lib/env.js b/webpack-config/lib/env.js index c6f270db3fc..720d1011a98 100644 --- a/webpack-config/lib/env.js +++ b/webpack-config/lib/env.js @@ -13,4 +13,5 @@ const parseEnvVariable = name => { module.exports = { DEV_MODE: parseEnvVariable('NODE_ENV') !== 'production', ENABLE_ANALYZER: !!parseEnvVariable('ANALYZER'), + DEFAULT_PORT: parseEnvVariable('PORT'), } diff --git a/yarn.lock b/yarn.lock index 821960a6340..1134d977403 100644 --- a/yarn.lock +++ b/yarn.lock @@ -350,6 +350,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-dynamic-import@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" @@ -570,6 +577,16 @@ dependencies: regenerator-transform "^0.13.3" +"@babel/plugin-transform-runtime@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.3.4.tgz#57805ac8c1798d102ecd75c03b024a5b3ea9b431" + integrity sha512-PaoARuztAdd5MgeVjAxnIDAIUet5KpogqaefQvPOmPYCxYoaPhautxDh3aO8a4xHsKgT/b9gSxR0BKK1MIewPA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + "@babel/plugin-transform-shorthand-properties@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" @@ -4040,13 +4057,13 @@ debug@3.1.0, debug@^3.0.0, debug@^3.1.0: dependencies: ms "2.0.0" -debug@^3.2.5: +debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" dependencies: ms "^2.1.1" -debug@^4.1.0: +debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" dependencies: @@ -4121,6 +4138,14 @@ default-gateway@^2.6.0: execa "^0.10.0" ip-regex "^2.1.0" +default-gateway@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + 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" @@ -4243,6 +4268,11 @@ detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + 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" @@ -5044,6 +5074,11 @@ 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" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + events@1.1.1, events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -5101,6 +5136,19 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execall@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" @@ -5192,7 +5240,7 @@ express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" -express@^4.16.3: +express@^4.16.3, express@^4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" dependencies: @@ -5350,7 +5398,7 @@ 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" -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -5657,6 +5705,13 @@ fn-name@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" +follow-redirects@^1.0.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" + integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== + dependencies: + debug "^3.2.6" + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -5910,6 +5965,13 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -6157,6 +6219,11 @@ handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + handlebars-loader@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/handlebars-loader/-/handlebars-loader-1.7.0.tgz#4f750bc62c350fb922e52d8564d667887e909723" @@ -6406,6 +6473,13 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.3.2" +hoist-non-react-statics@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + dependencies: + react-is "^16.7.0" + 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" @@ -6559,6 +6633,16 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" +http-proxy-middleware@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + http-proxy-middleware@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" @@ -6575,6 +6659,15 @@ http-proxy@^1.16.2: eventemitter3 "1.x.x" requires-port "1.x.x" +http-proxy@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -6822,6 +6915,14 @@ internal-ip@^3.0.1: default-gateway "^2.6.0" ipaddr.js "^1.5.2" +internal-ip@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.2.0.tgz#46e81b638d84c338e5c67e42b1a17db67d0814fa" + integrity sha512-ZY8Rk+hlvFeuMmG5uH1MXhhdeMntmIaxaInvAmzMq/SHV8rv4Kh+6GiQNNDQd0wZFrcO+FiTBo8lui/osKOyJw== + dependencies: + default-gateway "^4.0.1" + ipaddr.js "^1.9.0" + interpret@^1.0.0, interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -6871,6 +6972,11 @@ ipaddr.js@^1.5.2: version "1.8.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" +ipaddr.js@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -7760,7 +7866,7 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^11.5.1: +jsdom@^11.11.0, jsdom@^11.5.1: version "11.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" dependencies: @@ -8502,7 +8608,7 @@ memoize-one@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906" -memory-fs@^0.4.0, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" dependencies: @@ -9285,6 +9391,11 @@ obuf@^1.0.0, obuf@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" +obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -10517,6 +10628,14 @@ prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" +prerender-loader@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/prerender-loader/-/prerender-loader-1.3.0.tgz#524c386c16579270109f277f7e1a94df298c8a9e" + integrity sha512-j5a7vl7QjLiNL2+7ATHiTHIcV18xf8hDJUbkl66svHfuCMd7QV/0Iwu1Yp8JcRNt7UEKSxgJQ35WZSOaRCQhZQ== + dependencies: + jsdom "^11.11.0" + loader-utils "^1.1.0" + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -10956,6 +11075,21 @@ react-hot-loader@^3.0.0-beta.7: redbox-react "^1.3.6" source-map "^0.6.1" +react-hot-loader@^4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.8.0.tgz#0b7c7dd9407415e23eb8246fdd28b0b839f54cb6" + integrity sha512-HY9F0vITYSVmXhAR6tPkMk240nxmoH8+0rca9iO2B82KVguiCiBJkieS0Wb4CeSIzLWecYx3iOcq8dcbnp0bxA== + dependencies: + fast-levenshtein "^2.0.6" + global "^4.3.0" + hoist-non-react-statics "^3.3.0" + loader-utils "^1.1.0" + lodash "^4.17.11" + prop-types "^15.6.1" + react-lifecycles-compat "^3.0.4" + shallowequal "^1.0.2" + source-map "^0.7.3" + react-icon-base@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.0.tgz#a196e33fdf1e7aaa1fda3aefbb68bdad9e82a79d" @@ -10976,6 +11110,11 @@ react-is@^16.3.2: version "16.6.3" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.6.3.tgz#d2d7462fcfcbe6ec0da56ad69047e47e56e7eac0" +react-is@^16.7.0: + version "16.8.4" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2" + integrity sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA== + react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -11296,6 +11435,15 @@ readable-stream@^2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.6: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d" + integrity sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -12179,6 +12327,11 @@ semver@^5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" +semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -12304,7 +12457,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shallowequal@^1.1.0: +shallowequal@^1.0.2, shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -12508,7 +12661,7 @@ 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" -source-map@^0.7.2: +source-map@^0.7.2, source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" @@ -12580,6 +12733,18 @@ spdy-transport@^2.0.18: safe-buffer "^5.0.1" wbuf "^1.7.2" +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + spdy@^3.4.1: version "3.4.7" resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" @@ -12591,6 +12756,17 @@ spdy@^3.4.1: select-hose "^2.0.0" spdy-transport "^2.0.18" +spdy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" + integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + specificity@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.3.2.tgz#99e6511eceef0f8d9b57924937aac2cb13d13c42" @@ -12783,6 +12959,13 @@ string_decoder@^1.0.0, string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -12991,6 +13174,13 @@ supports-color@^5.4.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" @@ -13826,7 +14016,7 @@ utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -14031,6 +14221,13 @@ wbuf@^1.1.0, wbuf@^1.7.2: dependencies: minimalistic-assert "^1.0.0" +wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -14086,6 +14283,16 @@ webpack-dev-middleware@3.4.0: range-parser "^1.0.3" webpack-log "^2.0.0" +webpack-dev-middleware@^3.5.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.1.tgz#91f2531218a633a99189f7de36045a331a4b9cd4" + integrity sha512-XQmemun8QJexMEvNFbD2BIg4eSKrmSIMrTfnl2nql2Sc6OGAYFyb8rwuYrCjl/IiEYYuyTEiimMscu7EXji/Dw== + dependencies: + memory-fs "^0.4.1" + mime "^2.3.1" + range-parser "^1.0.3" + webpack-log "^2.0.0" + webpack-dev-server@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz#507411bee727ee8d2fdffdc621b66a64ab3dea2b" @@ -14119,6 +14326,42 @@ webpack-dev-server@^3.1.10: webpack-log "^2.0.0" yargs "12.0.2" +webpack-dev-server@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz#1b45ce3ecfc55b6ebe5e36dab2777c02bc508c4e" + integrity sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^4.1.1" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "^0.19.1" + import-local "^2.0.0" + internal-ip "^4.2.0" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + schema-utils "^1.0.0" + selfsigned "^1.9.1" + semver "^5.6.0" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.3.0" + spdy "^4.0.0" + strip-ansi "^3.0.0" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.5.1" + webpack-log "^2.0.0" + yargs "12.0.2" + webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"