diff --git a/.babelrc b/.babelrc index 78fcb4c5..5a40860c 100644 --- a/.babelrc +++ b/.babelrc @@ -2,34 +2,35 @@ "env": { "development": { "presets": [ - [ "es2015", { "modules": false } ], - "stage-2", - "react" + "@babel/preset-env", + "@babel/preset-react" ], "plugins": [ + "styled-components", "react-hot-loader/babel", - "transform-object-rest-spread" + "@babel/plugin-proposal-object-rest-spread" ] }, "production": { "presets": [ - [ "es2015"], - "stage-2", - "react" + "@babel/preset-env", + "@babel/preset-react" ], "plugins": [ - "transform-object-rest-spread" + "styled-components", + "@babel/plugin-proposal-object-rest-spread" ] }, "test": { "presets": [ - "es2015", - "stage-2", - "react" + "@babel/preset-env", + "@babel/preset-react" ], "plugins": [ + "styled-components", "react-hot-loader/babel", - "transform-object-rest-spread" + "@babel/plugin-proposal-object-rest-spread", + "@babel/plugin-transform-runtime" ] } } diff --git a/.eslintignore b/.eslintignore index e6211842..3c3629e6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1 @@ -coverage/** -node_modules/** -dist/** -src/index.html +node_modules diff --git a/.eslintrc b/.eslintrc index 39302288..d2af44ec 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,27 +4,23 @@ "standard", "standard-react" ], - "plugins": [ - "babel", - "react", - "promise" - ], - "env": { - "browser" : true - }, "globals": { - "__DEV__" : false, - "__TEST__" : false, - "__PROD__" : false, - "__COVERAGE__" : false, - "__DEFAULT_PROJECT__" : false, - "nw" : false + "THREE": "readonly" }, + "env": { + "browser" : true, + "jest/globals": true + }, + "plugins": [ + "jest" + ], "rules": { "key-spacing" : 0, "jsx-quotes" : [2, "prefer-single"], "max-len" : [2, 120, 2], "object-curly-spacing" : [2, "always"], - "no-var" : 2 + "no-var" : 2, + "comma-dangle" : [2, "always-multiline"], + "no-console" : [2, { "allow": ["warn", "error"] }] } } diff --git a/build/icon.icns b/build/icon.icns new file mode 100644 index 00000000..03167640 Binary files /dev/null and b/build/icon.icns differ diff --git a/build/icon.ico b/build/icon.ico new file mode 100644 index 00000000..667247ac Binary files /dev/null and b/build/icon.ico differ diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 00000000..3c43fecd Binary files /dev/null and b/build/icon.png differ diff --git a/config/webpack.custom.config.js b/config/webpack.custom.config.js index d0090926..f423b692 100644 --- a/config/webpack.custom.config.js +++ b/config/webpack.custom.config.js @@ -1,33 +1,12 @@ -const tryRequire = require('try-require') - const config = { module: { rules: [ { test: /\.icon\.txt$/, - use: 'svg-inline-loader?classPrefix' - } - ] - } -} - -if (process.env.NODE_ENV === 'development') { - const devConfig = tryRequire('./dev.config.js', require) - let devServerOptions = {} - - if (devConfig && devConfig.defaultProject) { - const defaultProject = require(devConfig.defaultProject) - const sketchesPath = defaultProject.project.sketchesPath - - if (sketchesPath) { - devServerOptions = { - contentBase: sketchesPath, - watchContentBase: true - } - } - } - - config.devServer = devServerOptions + use: 'svg-inline-loader?classPrefix', + }, + ], + }, } module.exports = config diff --git a/docs/dev/index.md b/docs/dev/index.md index 8e382b66..3a250060 100644 --- a/docs/dev/index.md +++ b/docs/dev/index.md @@ -8,8 +8,11 @@ It is best practice to create a project folder outside of Hedron. This is advant Inside the project folder, you'll want to have a "sketches" folder, this is what you'll point Hedron to. +## Sketches Directory +This directory contains sketch folders. Sketch folders can be grouped into directories to keep things neat, with as many levels of organisation as you need. However, you can't have a sketch folder inside another sketch folder. + ## Sketch -Sketches together in the sketches directory. A sketch is itself directory with two required files: +Sketches live in the sketches directory. A sketch is itself a directory with two required files: - config.js - index.js @@ -22,14 +25,20 @@ This is where the params and shots are defined. module.exports = { // Default title when sketch is loaded in (can be changed by user) defaultTitle: 'Solid', + // Category and author can be used as a way to organise sketches based on the user's settings + category: 'Simple', + author: 'Laurence Ipsum', // Params are values between 0 and 1 that can be manipulated by the user // these values are sent to the sketch every frame // e.g. Speed, scale, colour params: [ { key: 'rotSpeedX', // needs to be unique - title: 'Rotation Speed X', // should be human - defaultValue: 0 // must be between 0 and 1 + defaultValue: 0, // must be between 0 and 1 + title: 'Rotation Speed X', // optional, should be human, if not provided defaults to the key + defaultMin: 0, // optional, the value passed to the sketch when the param is at it's lowest value, if not provided defaults to 0 + defaultMax: 1, // optional, the value passed to the sketch when the param is at it's highest value, if not provided defaults to 1 + hidden: false, // optional, some params may want to be hidden in the UI, if they are controlled programatically by the sketch. Defaults to false. }, ], // Shots are single functions that can fire, as opposed to values that change @@ -45,14 +54,14 @@ module.exports = { ## index.js -This is where the actual sketch is held. You can `require` other modules from here, so don't feel restricted to a single file. +This is where the actual sketch is held. `THREE` is available as a global variable and it's strongly advised you use this rather than import the library yourself, to prevent unexpected behaviour. For convenience, `THREE.GLTFLoader` and `THREE.OrbitControls` are available too. + +You can `require` other modules from here, so don't feel restricted to a single file. ### Very basic example This is the minimum you need to do in order to use Hedron. ```javascript -const THREE = require('three') - class MyFirstSketch { constructor () { // Create a cube, add it to the root of the scene @@ -82,11 +91,6 @@ A polyhedron that can spin on all axes. The user can change the speed of the rot The user can change the scale. The user can also click on "shapeshift" and the geometry changes. **/ -/** HEDRON TIP ** - Hedron uses three.js, so you'll need that :) -**/ -const THREE = require('three') - /** HEDRON TIP ** Hedron sketches must be a class **/ @@ -97,17 +101,17 @@ class Solid { scene - This is the THREE object for the scene. You can also access the THREE renderer using scene.renderer + params - The sketch params when the sketch first initialises + meta - This is an object with meta data that might be useful. It has the following properties: sketchesFolder - The path to the sketches folder on your computer. Useful if you need to link to a resource such as an image. - - params - The sketch params when the sketch first initialises **/ - constructor (scene, meta, params) { + constructor (scene, params, meta) { /** HEDRON TIP ** Must define a "root" property as a THREE.Group or THREE.Object3D Hedron looks for this and will add it to the scene. **/ - this.root = new THREE.Group() + this.root = new THREE.Group() // THREE is a global var so no need to import /** HEDRON TIP ** It's good practice to not manipulate the root object @@ -235,6 +239,13 @@ class Solid { module.exports = Solid ``` +## Reloading sketches / Auto reload +If you have the "Watch sketches" setting enabled, Hedron will automatically refresh your sketches. However, if you don't have this enabled or something went wrong with the file watch (e.g. your sketch imports a file outside of its own folder) you'll need to click "Reload File" to see changes made to sketch files. + +This refresh will remove the sketch from the scene, import any new params or shots, remove and old params and shots, and then add the new sketch back into the scene. + +**Please note: File change detection may not work with all text editors. (e.g. Atom on OSX is reported to be inconsistent).** + ## Hedron dev config You can get extra functionality by adding `dev.config.js` to `/config` (from the root directory of the Hedron repo). @@ -246,10 +257,4 @@ module.exports = { } ``` -Setting `defaultProject` to the path of a saved project (e.g. `/Users/alex/Desktop/foo.json`) can help improve your workflow when developing: -* The project will load automatically on load/restart -* The project sketches folder will be watched for changes, triggering a restart - -## Reimporting - -If you've already got a project going with some sketches and then make edits to a sketch, Hedron automatically loads in the new content. However, if you've made changes to `config.js`, you'll need to "reimport" to see the new params and shots. Do this by clicking the button at the bottom of the view for that sketch. +Setting `defaultProject` to the path of a saved project (e.g. `/Users/alex/Desktop/foo.json`) can help improve your workflow when developing by automatically loading that project when the app compiles. This is particularly useful when developing Hedron itself, so that you can test changes made to the app immediately, without having to manually load in a project each time. \ No newline at end of file diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 62f01219..40bc6d3f 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -5,18 +5,19 @@ Here is a quick overview of how to use Hedron. ## Sketches Sketches are created with [three.js](https://github.com/mrdoob/three.js/). They are a Javascript module that exports a single [THREE.Group](https://threejs.org/docs/#api/objects/Group), to be placed in the main scene. The different aspects of a sketch can be controlled using "params" and "shots". -### Adding and removing sketches Many sketches can be added to the same Hedron scene. These can be multiple instances of the same sketch, or different types of sketches. In order to add sketches, click on the "+" in the right sidebar. If you're starting from scratch, you'll need to tell Hedron where your sketch folder is. To remove a sketch, click the delete button at the bottom of the view for that sketch. +Use the dropdown menu on the Add Sketch scene to organise your sketches. If the author of the sketch has provided the correct meta data, you'll be able to organise based on category or author. Otherwise you can organise based on the folder structure of your sketches. + ### Switching between sketches You can switch between different sketches that are already added to Hedron using the right sidebar. ## Params -Params are the variables of a sketch. They are always a value between 0 and 1 (although more types of param are [planned](https://github.com/nudibranchrecords/hedron/issues/13)). The simplest way to control a param is to click and drag the value bar. +Params are the variables of a sketch. They default to a value between 0 and 1 (although more types of param are [planned](https://github.com/nudibranchrecords/hedron/issues/13)). The simplest way to control a param is to click and drag the value bar. ### Adding an input to a param The real power of Hedron is the ability to link different inputs to a param. This can be audio, LFO or MIDI. @@ -35,6 +36,15 @@ Some things to note: - Adding a MIDI input will involve a "MIDI learn" step - MIDI inputs are always active, they do not have an active/disabled state + +### Editing the range of a param +Params can have their range extended or decreased, this can be useful if you want to change the range for a particular instance of a sketch, but not affect all other instances of the sketch, or change the default range of the script + +To edit the range of a param: + + 1. Open the param by clicking on the area below the value bar + 2. Open the advanced options by clicking "Advanced" + 3. Edit the minimum/maximum fields, the fields update when you press Enter or the field loses focus ## Shots Shots are functions that the sketch has exposed for the user to have fun with. These could be things such as explosions, pre scripted animations, etc. The simplest way to control a shot is to click on the hit area for that shot. @@ -46,8 +56,12 @@ Shots have a very similar system to adding inputs as params, so please refer to - MIDI should be a "note on" type control - Instead of LFO, shots have a "sequencer". The rows of the sequencer are **one beat** (quarter note) split into 8. Click on each step for when you want the shot to fire. -## Reimporting shots and params -If you've already got a project going with some sketches and then make edits to a sketch, Hedron automatically loads in the new content. However, if you've made changes to config.js, you'll need to "reimport" to see the new params and shots. Do this by clicking the button at the bottom of the view for that sketch. +## Reloading sketches / Auto reload +If you have the "Watch sketches" setting enabled, Hedron will automatically refresh your sketches. However, if you don't have this enabled or something went wrong with the file watch (e.g. your sketch imports a file outside of its own folder) you'll need to click "Reload File" to see changes made to sketch files. + +This refresh will remove the sketch from the scene, import any new params or shots, remove and old params and shots, and then add the new sketch back into the scene. + +**Please note: File change detection may not work with all text editors. (e.g. Atom on OSX is reported to be inconsistent).** ## Macros Macros make it possible to control many params at once. To start using macros, click on "Macros" on the right sidebar. @@ -68,9 +82,6 @@ Improvements to macros are [planned](https://github.com/nudibranchrecords/hedron ## MIDI Devices Midi devices display on the left hand side, underneath the preview. -### MIDI Banks -You can change the current bank you are using for each device using the list of numbers next to that device. When assigning MIDI anywhere, it will default to the current bank you are on for that device. - ## MIDI Clock By default, MIDI clock is generated by Hedron. @@ -79,6 +90,15 @@ By default, MIDI clock is generated by Hedron. - You can manually edit the generated clock BPM, or disable it completely in the settings. (Project > Settings) - If you have an external MIDI clock connected, Hedron will detect it automatically. You should disable the generated clock if you are using an external one. +## Audio Parameters +By clicking on the audio level bars left of the clock controls you can edit parameters to change the shaping of the incoming audio. The controls affect the audio as follows. + +- **Levels Falloff** - This is the amount that the value passed on to the parameters gets reduced by each frame, when this number is low the value will quickly jump up with a sound, but take time to come back down to zero. +- **Levels Smoothing** - This is how much the prior frames value will be blended with the current incoming audio value, adding smoothing will cause quick changes in volume, up or down, to change more slowly. When this number is at 0 there is no smoothing, and at 1 it will lock the current value of the audio levels. +- **Levels Power** - This value controls a power function with an exponent between .5 and 3. When this parameter is low it will cause low audio levels to get boosted higher when this parameter is high, low levels will be passed through even lower, causing only values that were high to begin with to remain high. +- **Normalize Levels** - This causes each frequency band to be normalized based on it's highest and lowest recorded values, this will help the parameters connected to audio move within their full range, as often the low end tends to be louder while the high end is quieter. +- **Normalized Range Falloff** - This is how much the recorded high and low of each frequency band decreases/increases respectively each frame. + ## Other features * Save or load using "Project > Save/Load/Save As..." diff --git a/example-projects/logo/project.json b/example-projects/logo/project.json new file mode 100644 index 00000000..cfc051d9 --- /dev/null +++ b/example-projects/logo/project.json @@ -0,0 +1 @@ +{"nodes":{"sceneCrossfader":{"id":"sceneCrossfader","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Scene Crossfader","type":"param"},"viewerMode":{"id":"viewerMode","value":"mix","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Viewer Mode","type":"select","options":[{"value":"mix","label":"Mix"},{"value":"A","label":"A"},{"value":"B","label":"B"}]},"sketchOrganization":{"id":"sketchOrganization","value":"category","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Sketch Organization","type":"select","options":[{"value":"folder","label":"Folder"},{"value":"category","label":"Category"},{"value":"author","label":"Author"}]},"audioLevelsFalloff":{"id":"audioLevelsFalloff","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Falloff","type":"param"},"audioLevelsPower":{"id":"audioLevelsPower","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Power","type":"param","min":0.5,"max":3},"audioLevelsSmoothing":{"id":"audioLevelsSmoothing","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Smoothing","type":"param"},"audioNormalizeLevels":{"id":"audioNormalizeLevels","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalize Levels","type":"param"},"audioNormalizeRangeFalloff":{"id":"audioNormalizeRangeFalloff","value":0.01,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalized Range Falloff","type":"param"},"rjqn7il":{"id":"rjqn7il","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"my3oidf","channel":"A"}},"title":"Add to A"},"m6ihkvn":{"id":"m6ihkvn","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"my3oidf","channel":"B"}},"title":"Add to B"},"kg3hs2g":{"id":"kg3hs2g","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"my3oidf","type":"active"}},"title":"Add to Active"},"l4woei9":{"id":"l4woei9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"my3oidf","type":"opposite"}},"title":"Add to Opposite"},"d6eqgoc":{"id":"d6eqgoc","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"my3oidf"}},"title":"Clear"},"x70b7a7":{"id":"x70b7a7","value":0.984375,"inputLinkIds":["8d95yni"],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Color H","type":"param","key":"colorH","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1,"openedLinkId":"8d95yni","activeInputLinkId":"8d95yni"},"gqe9l6k":{"id":"gqe9l6k","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Color S","type":"param","key":"colorS","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"t4fg79j":{"id":"t4fg79j","value":0.5333333333333334,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Color L","type":"param","key":"colorL","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"l3l9rfx":{"id":"l3l9rfx","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Ambient Light Intensity","type":"param","key":"aInt","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"akwo8gq":{"id":"akwo8gq","value":0.20435495535553758,"inputLinkIds":["j1aa7vr"],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Point Light Intensity","type":"param","key":"pInt","hidden":false,"min":0,"max":5,"defaultMin":0,"defaultMax":5,"openedLinkId":"j1aa7vr","activeInputLinkId":"j1aa7vr"},"1oalgep":{"id":"1oalgep","value":0.10674157303370786,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Logo Rot Speed X","type":"param","key":"logoRotSpeedX","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"iuy1yvb":{"id":"iuy1yvb","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Logo Rot Speed Y","type":"param","key":"logoRotSpeedY","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"d1d4b7a":{"id":"d1d4b7a","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Logo Rot Speed Z","type":"param","key":"logoRotSpeedZ","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"wbueg73":{"id":"wbueg73","value":0.8015122861711951,"inputLinkIds":["qb3cv58"],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Logo Scale","type":"param","key":"logoScale","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1,"openedLinkId":"qb3cv58","activeInputLinkId":"qb3cv58"},"ek4e1ei":{"id":"ek4e1ei","value":0.35736361778716497,"inputLinkIds":["jljjpbq"],"shotCount":0,"connectedMacroIds":[],"sketchId":"fba6j4h","title":"Sphere Scale","type":"param","key":"sphereScale","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1,"openedLinkId":"jljjpbq","activeInputLinkId":"jljjpbq"},"4d0xd1q":{"id":"4d0xd1q","value":0,"inputLinkIds":[],"shotCount":8,"connectedMacroIds":[],"type":"shot","title":"Reset Logo Rot","method":"resetLogoRot","sketchId":"fba6j4h"},"5e531k6":{"id":"5e531k6","value":"noise","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"fba6j4h","parentNodeId":"cia76fe"},"f9j8sx8":{"id":"f9j8sx8","value":8,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"fba6j4h","parentNodeId":"cia76fe"},"glx9og4":{"id":"glx9og4","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"fba6j4h","parentNodeId":"cia76fe"},"5q2k1l9":{"id":"5q2k1l9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"fba6j4h","parentNodeId":"cia76fe"},"00iur8p":{"id":"00iur8p","value":"noise","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"fba6j4h","parentNodeId":"80adxo4"},"u1fhvdr":{"id":"u1fhvdr","value":8,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"fba6j4h","parentNodeId":"80adxo4"},"gmud9yb":{"id":"gmud9yb","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"fba6j4h","parentNodeId":"80adxo4"},"h8dqnsw":{"id":"h8dqnsw","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"fba6j4h","parentNodeId":"80adxo4"},"hehj24t":{"id":"hehj24t","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"fba6j4h","parentNodeId":"y68xjvq"},"oaifano":{"id":"oaifano","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"fba6j4h","parentNodeId":"y68xjvq"},"vnvumqu":{"id":"vnvumqu","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"fba6j4h","parentNodeId":"y68xjvq"},"c55ub4q":{"id":"c55ub4q","value":-1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"fba6j4h","parentNodeId":"y68xjvq"},"ixxvkm9":{"id":"ixxvkm9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"qb3cv58","sketchId":"fba6j4h","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"85epqm4":{"id":"85epqm4","value":0.6384615384615384,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"qb3cv58","sketchId":"fba6j4h","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"uq4ut6n":{"id":"uq4ut6n","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"qb3cv58","sketchId":"fba6j4h","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"1qxoa7w":{"id":"1qxoa7w","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"fba6j4h","parentNodeId":"qb3cv58"},"2sbvovl":{"id":"2sbvovl","value":0.125,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"fba6j4h","parentNodeId":"qb3cv58"},"o4m5lcq":{"id":"o4m5lcq","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"fba6j4h","parentNodeId":"qb3cv58"},"6b82hew":{"id":"6b82hew","value":-1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"fba6j4h","parentNodeId":"qb3cv58"},"un0x0ew":{"id":"un0x0ew","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"wbueg73","linkId":"qb3cv58"}},"sketchId":"fba6j4h","parentNodeId":"qb3cv58"},"qb3cv58":{"id":"qb3cv58","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"lfo","type":"inputLink","input":{"id":"lfo"},"nodeId":"wbueg73","sketchId":"fba6j4h","parentNodeId":"wbueg73","nodeType":"param","modifierIds":["ixxvkm9","85epqm4","uq4ut6n"],"lfoOptionIds":["1qxoa7w","2sbvovl","o4m5lcq","6b82hew"],"midiOptionIds":[],"audioOptionIds":[],"linkableActions":{"toggleActivate":"un0x0ew"},"linkType":"node","animOptionIds":[]},"xhhrpgq":{"id":"xhhrpgq","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"8d95yni","sketchId":"fba6j4h","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"mqtidc3":{"id":"mqtidc3","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"8d95yni","sketchId":"fba6j4h","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"7m9pnex":{"id":"7m9pnex","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"8d95yni","sketchId":"fba6j4h","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"qvl42fo":{"id":"qvl42fo","value":"sawtooth","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"fba6j4h","parentNodeId":"8d95yni"},"qadv4kd":{"id":"qadv4kd","value":0.125,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"fba6j4h","parentNodeId":"8d95yni"},"rw4kc0t":{"id":"rw4kc0t","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"fba6j4h","parentNodeId":"8d95yni"},"yasaxhj":{"id":"yasaxhj","value":-1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"fba6j4h","parentNodeId":"8d95yni"},"6ojb4sj":{"id":"6ojb4sj","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"x70b7a7","linkId":"8d95yni"}},"sketchId":"fba6j4h","parentNodeId":"8d95yni"},"8d95yni":{"id":"8d95yni","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"lfo","type":"inputLink","input":{"id":"lfo"},"nodeId":"x70b7a7","sketchId":"fba6j4h","parentNodeId":"x70b7a7","nodeType":"param","modifierIds":["xhhrpgq","mqtidc3","7m9pnex"],"lfoOptionIds":["qvl42fo","qadv4kd","rw4kc0t","yasaxhj"],"midiOptionIds":[],"audioOptionIds":[],"linkableActions":{"toggleActivate":"6ojb4sj"},"linkType":"node","animOptionIds":[]},"2rplgq1":{"id":"2rplgq1","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"j1aa7vr","sketchId":"fba6j4h","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"c6gd8g6":{"id":"c6gd8g6","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"j1aa7vr","sketchId":"fba6j4h","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"5kwbcea":{"id":"5kwbcea","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"j1aa7vr","sketchId":"fba6j4h","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"tua0kl9":{"id":"tua0kl9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Audio Band","key":"audioBand","type":"select","subNode":true,"options":[{"value":0,"label":"Low"},{"value":1,"label":"Low-Mid"},{"value":2,"label":"Mid"},{"value":3,"label":"High"}],"sketchId":"fba6j4h","parentNodeId":"j1aa7vr"},"s2k21pb":{"id":"s2k21pb","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"akwo8gq","linkId":"j1aa7vr"}},"sketchId":"fba6j4h","parentNodeId":"j1aa7vr"},"j1aa7vr":{"id":"j1aa7vr","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"audio","type":"inputLink","input":{"id":"audio"},"nodeId":"akwo8gq","sketchId":"fba6j4h","parentNodeId":"akwo8gq","nodeType":"param","modifierIds":["2rplgq1","c6gd8g6","5kwbcea"],"lfoOptionIds":[],"midiOptionIds":[],"audioOptionIds":["tua0kl9"],"linkableActions":{"toggleActivate":"s2k21pb"},"linkType":"node","animOptionIds":[]},"lt26b9h":{"id":"lt26b9h","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"jljjpbq","sketchId":"fba6j4h","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"vp9wpol":{"id":"vp9wpol","value":0.19230769230769232,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"jljjpbq","sketchId":"fba6j4h","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"ndir5pi":{"id":"ndir5pi","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"jljjpbq","sketchId":"fba6j4h","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"v80a9i2":{"id":"v80a9i2","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Audio Band","key":"audioBand","type":"select","subNode":true,"options":[{"value":0,"label":"Low"},{"value":1,"label":"Low-Mid"},{"value":2,"label":"Mid"},{"value":3,"label":"High"}],"sketchId":"fba6j4h","parentNodeId":"jljjpbq"},"fsgci77":{"id":"fsgci77","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"ek4e1ei","linkId":"jljjpbq"}},"sketchId":"fba6j4h","parentNodeId":"jljjpbq"},"jljjpbq":{"id":"jljjpbq","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"audio","type":"inputLink","input":{"id":"audio"},"nodeId":"ek4e1ei","sketchId":"fba6j4h","parentNodeId":"ek4e1ei","nodeType":"param","modifierIds":["lt26b9h","vp9wpol","ndir5pi"],"lfoOptionIds":[],"midiOptionIds":[],"audioOptionIds":["v80a9i2"],"linkableActions":{"toggleActivate":"fsgci77"},"linkType":"node","animOptionIds":[]}},"scenes":{"items":{"my3oidf":{"id":"my3oidf","title":"New Scene","selectedSketchId":"fba6j4h","sketchIds":["fba6j4h"],"linkableActionIds":{"addToA":"rjqn7il","addToB":"m6ihkvn","addToActive":"kg3hs2g","addToOpposite":"l4woei9","clear":"d6eqgoc"}}},"currentSceneId":"my3oidf","channels":{"A":"my3oidf","B":false}},"sketches":{"fba6j4h":{"title":"Hedron Logo","moduleId":"logo","paramIds":["x70b7a7","gqe9l6k","t4fg79j","l3l9rfx","akwo8gq","1oalgep","iuy1yvb","d1d4b7a","wbueg73","ek4e1ei"],"shotIds":["4d0xd1q"],"openedNodeId":"akwo8gq"}},"project":{"errors":[],"errorPopup":false},"inputs":{"audio":{"value":[0.20435495535553758,0.04498548016230807,0.05956725196519405,0.15775958682669192],"assignedLinkIds":["j1aa7vr","jljjpbq"]},"lfo":{"value":311.875,"assignedLinkIds":["qb3cv58","8d95yni"]}},"inputLinks":{"nodeIds":[null,null]},"macros":{"learningId":false,"nodeIds":[]},"ui":{"panelWidths":{"left":55.92621526473667},"isEditing":false,"openedNode":false,"auxOpen":[],"addSketchOpen":{}},"router":{"location":{"pathname":"/scenes/view","search":"","hash":"","key":"n5ofl9"}},"settings":{"clockGenerated":true,"clockBpm":120,"aspectW":16,"aspectH":9,"antialias":true,"throttledFPS":60,"watchSketchesDir":true},"form":{}} diff --git a/example-projects/logo/sketches/logo/config.js b/example-projects/logo/sketches/logo/config.js new file mode 100644 index 00000000..579d9e9c --- /dev/null +++ b/example-projects/logo/sketches/logo/config.js @@ -0,0 +1,64 @@ +module.exports = { + defaultTitle: 'Hedron Logo', + params: [ + { + key: 'colorH', + title: 'Color H', + defaultValue: 0.5, + }, + { + key: 'colorS', + title: 'Color S', + defaultValue: 0.5, + }, + { + key: 'colorL', + title: 'Color L', + defaultValue: 0.5, + }, + { + key: 'aInt', + title: 'Ambient Light Intensity', + defaultValue: 0.1, + }, + { + key: 'pInt', + title: 'Point Light Intensity', + defaultValue: 0.5, + defaultMin: 0, + defaultMax: 5, + }, + { + key: 'logoRotSpeedX', + title: 'Logo Rot Speed X', + defaultValue: 0, + }, + { + key: 'logoRotSpeedY', + title: 'Logo Rot Speed Y', + defaultValue: 0, + }, + { + key: 'logoRotSpeedZ', + title: 'Logo Rot Speed Z', + defaultValue: 0, + }, + { + key: 'logoScale', + title: 'Logo Scale', + defaultValue: 0.7, + }, + { + key: 'sphereScale', + title: 'Sphere Scale', + defaultValue: 1, + }, + ], + shots: [ + { + method: 'resetLogoRot', + title: 'Reset Logo Rot', + }, + ], +} + diff --git a/example-projects/logo/sketches/logo/hedron-logo.glb b/example-projects/logo/sketches/logo/hedron-logo.glb new file mode 100644 index 00000000..480e782b Binary files /dev/null and b/example-projects/logo/sketches/logo/hedron-logo.glb differ diff --git a/example-projects/logo/sketches/logo/index.js b/example-projects/logo/sketches/logo/index.js new file mode 100644 index 00000000..535fa88d --- /dev/null +++ b/example-projects/logo/sketches/logo/index.js @@ -0,0 +1,65 @@ +const loader = new THREE.GLTFLoader() + +class Logo { + constructor (scene) { + this.root = new THREE.Group() + + // Add lights + this.aLight = new THREE.AmbientLight(null, 0.2) + this.pLight = new THREE.PointLight(null, 3, 10) + this.root.add(this.pLight) + this.root.add(this.aLight) + + // Add inner sphere + const sphereGeom = new THREE.IcosahedronBufferGeometry(1, 3) + const sphereMat = new THREE.MeshBasicMaterial() + this.sphere = new THREE.Mesh(sphereGeom, sphereMat) + this.root.add(this.sphere) + + // Load logo model + loader.load(`${__dirname}/hedron-logo.glb`, obj => { + this.model = obj.scene.getObjectByName('Hedron') + this.root.add(this.model) + + const s = 0.75 + this.model.scale.set(s, s, s) + this.model.material = new THREE.MeshStandardMaterial({ color: 0xffffff }) + + this.resetLogoRot() + }) + } + + resetLogoRot () { + this.model.rotation.set(0.15, 0, 0) + } + + update (p, t, f) { + if (!this.model) return + + let s + + // Adjust colour of sphere and lighting + this.pLight.color.setHSL(p.colorH, p.colorS, p.colorL) + this.aLight.color.setHSL(p.colorH, p.colorS, p.colorL) + this.sphere.material.color.setHSL(p.colorH, p.colorS, p.colorL) + + // Intensity of lighting + this.aLight.intensity = p.aInt + this.pLight.intensity = p.pInt + + // Logo Rotation + this.model.rotation.x += p.logoRotSpeedX * f * 0.3 + this.model.rotation.y += p.logoRotSpeedY * f * 0.3 + this.model.rotation.z += p.logoRotSpeedZ * f * 0.3 + + // Logo Scale + s = p.logoScale + this.model.scale.set(s, s, s) + + // Inner sphere scale + s = p.sphereScale + this.sphere.scale.set(s, s, s) + } +} + +module.exports = Logo diff --git a/example-projects/package.json b/example-projects/package.json deleted file mode 100644 index 46126345..00000000 --- a/example-projects/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "example-projects", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "^17.2.0", - "glslify": "^6.3.1", - "lodash": "^4.17.11", - "three": "^0.97.0", - "three-addons": "^1.2.0" - } -} diff --git a/example-projects/simple/project.json b/example-projects/simple/project.json index 76241a19..15d08ab6 100644 --- a/example-projects/simple/project.json +++ b/example-projects/simple/project.json @@ -1 +1 @@ -{"nodes":{"sceneCrossfader":{"id":"sceneCrossfader","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Scene Crossfader","type":"param"},"viewerMode":{"id":"viewerMode","value":"mix","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Viewer Mode","type":"select","options":[{"value":"mix","label":"Mix"},{"value":"A","label":"A"},{"value":"B","label":"B"}]},"audioNormalizeLevels":{"id":"audioNormalizeLevels","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalize Levels","type":"param"},"audioLevelsFalloff":{"id":"audioLevelsFalloff","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Falloff","type":"param"},"45g3as2":{"id":"45g3as2","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Opacity","type":"param","key":"opacity"},"h7fpyqn":{"id":"h7fpyqn","value":0.4322033898305085,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Speed","type":"param","key":"speed"},"o8gbvq5":{"id":"o8gbvq5","value":0.9364406779661018,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color H","type":"param","key":"colorH"},"naxbdhq":{"id":"naxbdhq","value":0.5932203389830508,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color S","type":"param","key":"colorS"},"r8qk46i":{"id":"r8qk46i","value":0.3177966101694915,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color L","type":"param","key":"colorL"},"sbh5yrw":{"id":"sbh5yrw","value":0.07530120481927711,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rotation Speed X","type":"param","key":"rotSpeedX"},"9ng7lh7":{"id":"9ng7lh7","value":0.07228915662650602,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rotation Speed Y","type":"param","key":"rotSpeedY"},"xjm5dq4":{"id":"xjm5dq4","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rotation Speed Z","type":"param","key":"rotSpeedZ"},"sawiymq":{"id":"sawiymq","value":0.7259036144578314,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Scale","type":"param","key":"scale"},"icyqnmx":{"id":"icyqnmx","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Mesh Index","type":"param","key":"meshIndex"},"7uuhp0s":{"id":"7uuhp0s","value":0,"inputLinkIds":["tu8qxqi"],"shotCount":376,"connectedMacroIds":[],"type":"shot","title":"Shape Shift","method":"shapeShift","sketchId":"h92ajqd","openedLinkId":"tu8qxqi","activeInputLinkId":"tu8qxqi"},"7plnjjb":{"id":"7plnjjb","value":0.12349397590361445,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rotation Speed X","type":"param","key":"rotSpeedX"},"1wws3h0":{"id":"1wws3h0","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rotation Speed Y","type":"param","key":"rotSpeedY"},"i6hh1f7":{"id":"i6hh1f7","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rotation Speed Z","type":"param","key":"rotSpeedZ"},"1shut4q":{"id":"1shut4q","value":0.4080240748240045,"inputLinkIds":["5rc2e8o"],"shotCount":0,"connectedMacroIds":[],"title":"Scale","type":"param","key":"scale","openedLinkId":"5rc2e8o","activeInputLinkId":"5rc2e8o"},"76ngsl0":{"id":"76ngsl0","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Mesh Index","type":"param","key":"meshIndex"},"v8n5jhq":{"id":"v8n5jhq","value":0,"inputLinkIds":[],"shotCount":5,"connectedMacroIds":[],"type":"shot","title":"Shape Shift","method":"shapeShift","sketchId":"mfv9isa"},"1303jlf":{"id":"1303jlf","value":[1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"iwv1pma":{"id":"iwv1pma","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"s9hm2yg":{"id":"s9hm2yg","value":0.3967254901960784,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"gain","title":"Gain","passToNext":false,"type":"audio","subNode":true},"29opahl":{"id":"29opahl","value":0.04901960784313725,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Lower Range","passToNext":true,"subNode":true},"07kdgfe":{"id":"07kdgfe","value":0.5294117647058824,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Upper Range","passToNext":false,"subNode":true}},"scenes":{"items":{"164edsk":{"id":"164edsk","title":"Solids","selectedSketchId":"mfv9isa","sketchIds":["gk1f9u4","h92ajqd","mfv9isa"],"linkableActionIds":{"addToA":"0dtydkk","addToB":"ocqrvbr","addToActive":"2ig94id","addToOpposite":"g70l9wa","clear":"9efnr9i"}},"1wm69ts":{"id":"1wm69ts","title":"Stars","selectedSketchId":"dy60hv7","sketchIds":["dy60hv7"],"linkableActionIds":{"addToA":"shpkh9g","addToB":"b6r2j19","addToActive":"gfly1ij","addToOpposite":"xd35dxw","clear":"897881h"}}},"currentSceneId":"164edsk","channels":{"A":"164edsk","B":"1wm69ts"}},"sketches":{"dy60hv7":{"title":"Stars","moduleId":"stars","paramIds":["45g3as2","h7fpyqn"],"shotIds":[],"openedNodes":{}},"gk1f9u4":{"title":"Env","moduleId":"env","paramIds":["o8gbvq5","naxbdhq","r8qk46i"],"shotIds":[],"openedNodes":{}},"h92ajqd":{"title":"Outer","moduleId":"solid","paramIds":["sbh5yrw","9ng7lh7","xjm5dq4","sawiymq","icyqnmx"],"shotIds":["7uuhp0s"],"openedNodes":{"shot":"7uuhp0s"}},"mfv9isa":{"title":"Inner","moduleId":"solid","paramIds":["7plnjjb","1wws3h0","i6hh1f7","1shut4q","76ngsl0"],"shotIds":["v8n5jhq"],"openedNodes":{"param":"1shut4q"}}},"project":{"filePath":"/Users/alex/Sites/GitHub/hedron/example-projects/simple/project.json","sketchesPath":"/Users/alex/Sites/GitHub/hedron/example-projects/simple/sketches","errors":["Sketches failed to load: Failed to load sketch folder: No sketches found","Failed to initiate sketches: Cannot read property 'Module' of undefined"],"errorPopup":false},"inputs":{"audio_0":{"value":0.7133311680963218,"assignedLinkIds":[]},"audio_1":{"value":0.6279030375158221,"assignedLinkIds":["5rc2e8o"]},"audio_2":{"value":0.2696383858655107,"assignedLinkIds":[]},"audio_3":{"value":0.1761536218916207,"assignedLinkIds":[]},"lfo":{"value":731.0833333333334,"assignedLinkIds":[]},"seq-step":{"assignedLinkIds":["tu8qxqi"],"value":24}},"inputLinks":{"tu8qxqi":{"title":"seq-step","input":{"id":"seq-step"},"id":"tu8qxqi","nodeId":"7uuhp0s","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"jig7je8"},"sequencerGridId":"1303jlf","linkType":"node"},"5rc2e8o":{"title":"audio_1","input":{"id":"audio_1","type":"audio"},"id":"5rc2e8o","nodeId":"1shut4q","nodeType":"param","modifierIds":["iwv1pma","s9hm2yg","29opahl","07kdgfe"],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"nhkcid6"},"linkType":"node"}},"linkableActions":{"0dtydkk":{"id":"0dtydkk","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"164edsk","channel":"A"}},"inputLinkIds":[]},"ocqrvbr":{"id":"ocqrvbr","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"164edsk","channel":"B"}},"inputLinkIds":[]},"2ig94id":{"id":"2ig94id","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"164edsk","type":"active"}},"inputLinkIds":[]},"g70l9wa":{"id":"g70l9wa","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"164edsk","type":"opposite"}},"inputLinkIds":[]},"9efnr9i":{"id":"9efnr9i","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"164edsk"}},"inputLinkIds":[]},"shpkh9g":{"id":"shpkh9g","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"1wm69ts","channel":"A"}},"inputLinkIds":[]},"b6r2j19":{"id":"b6r2j19","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"1wm69ts","channel":"B"}},"inputLinkIds":[]},"gfly1ij":{"id":"gfly1ij","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"1wm69ts","type":"active"}},"inputLinkIds":[]},"xd35dxw":{"id":"xd35dxw","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"1wm69ts","type":"opposite"}},"inputLinkIds":[]},"897881h":{"id":"897881h","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"1wm69ts"}},"inputLinkIds":[]},"jig7je8":{"id":"jig7je8","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"7uuhp0s","linkId":"tu8qxqi"}},"inputLinkIds":[]},"nhkcid6":{"id":"nhkcid6","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"1shut4q","linkId":"5rc2e8o"}},"inputLinkIds":[]}},"macros":{"learningId":false,"items":{}},"ui":{"panelWidths":{"left":50},"isEditing":false,"openedNode":false},"router":{"location":{"pathname":"/scenes/view","search":"","hash":"","key":"90d7lh"}},"settings":{"clockGenerated":true,"clockBpm":120,"aspectW":16,"aspectH":9,"antialias":false,"throttledFPS":60},"form":{}} +{"nodes":{"sceneCrossfader":{"id":"sceneCrossfader","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Scene Crossfader","type":"param"},"viewerMode":{"id":"viewerMode","value":"mix","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Viewer Mode","type":"select","options":[{"value":"mix","label":"Mix"},{"value":"A","label":"A"},{"value":"B","label":"B"}]},"sketchOrganization":{"id":"sketchOrganization","value":"category","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Sketch Organization","type":"select","options":[{"value":"folder","label":"Folder"},{"value":"category","label":"Category"},{"value":"author","label":"Author"}]},"audioLevelsFalloff":{"id":"audioLevelsFalloff","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Falloff","type":"param"},"audioLevelsPower":{"id":"audioLevelsPower","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Power","type":"param","min":0.5,"max":3},"audioLevelsSmoothing":{"id":"audioLevelsSmoothing","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Smoothing","type":"param"},"audioNormalizeLevels":{"id":"audioNormalizeLevels","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalize Levels","type":"param"},"audioNormalizeRangeFalloff":{"id":"audioNormalizeRangeFalloff","value":0.01,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalized Range Falloff","type":"param"},"h1n8xw8":{"id":"h1n8xw8","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"f1vwqkk","channel":"A"}},"title":"Add to A"},"wa2fvtb":{"id":"wa2fvtb","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"f1vwqkk","channel":"B"}},"title":"Add to B"},"n25blwi":{"id":"n25blwi","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"f1vwqkk","type":"active"}},"title":"Add to Active"},"817xlww":{"id":"817xlww","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"f1vwqkk","type":"opposite"}},"title":"Add to Opposite"},"2ag66pm":{"id":"2ag66pm","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"f1vwqkk"}},"title":"Clear"},"g7tllci":{"id":"g7tllci","value":0.546875,"inputLinkIds":["99r0oju"],"shotCount":0,"connectedMacroIds":[],"sketchId":"qpvup3p","title":"BG Color H","type":"param","key":"colorH","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1,"openedLinkId":"99r0oju","activeInputLinkId":"99r0oju"},"uh7mfhv":{"id":"uh7mfhv","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"qpvup3p","title":"BG Color S","type":"param","key":"colorS","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"sjwc7eq":{"id":"sjwc7eq","value":0.282258064516129,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"qpvup3p","title":"BG Color L","type":"param","key":"colorL","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"6besnyv":{"id":"6besnyv","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"et6x5w5","title":"Rotation Speed X","type":"param","key":"rotSpeedX","hidden":false,"min":-1,"max":1,"defaultMin":-1,"defaultMax":1},"cbo90q9":{"id":"cbo90q9","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"et6x5w5","title":"Rotation Speed Y","type":"param","key":"rotSpeedY","hidden":false,"min":-1,"max":1,"defaultMin":-1,"defaultMax":1},"51up7yl":{"id":"51up7yl","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"et6x5w5","title":"Rotation Speed Z","type":"param","key":"rotSpeedZ","hidden":false,"min":-1,"max":1,"defaultMin":-1,"defaultMax":1},"h11xydx":{"id":"h11xydx","value":0.17162741744380222,"inputLinkIds":["ocp36ke"],"shotCount":0,"connectedMacroIds":[],"sketchId":"et6x5w5","title":"Scale","type":"param","key":"scale","hidden":false,"min":0.00001,"max":4,"defaultMin":0.00001,"defaultMax":4,"openedLinkId":"ocp36ke","activeInputLinkId":"ocp36ke"},"ryf0wbv":{"id":"ryf0wbv","value":2,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"et6x5w5","title":"Mesh Index","type":"param","key":"meshIndex","hidden":true,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"l93f69i":{"id":"l93f69i","value":0,"inputLinkIds":[],"shotCount":2,"connectedMacroIds":[],"type":"shot","title":"Shape Shift","method":"shapeShift","sketchId":"et6x5w5"},"8du7bgf":{"id":"8du7bgf","value":0.5564516129032258,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"1r9rs1x","title":"Rotation Speed X","type":"param","key":"rotSpeedX","hidden":false,"min":-1,"max":1,"defaultMin":-1,"defaultMax":1},"339ae0r":{"id":"339ae0r","value":0.6451612903225806,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"1r9rs1x","title":"Rotation Speed Y","type":"param","key":"rotSpeedY","hidden":false,"min":-1,"max":1,"defaultMin":-1,"defaultMax":1},"ll3hb6r":{"id":"ll3hb6r","value":0.564516129032258,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"1r9rs1x","title":"Rotation Speed Z","type":"param","key":"rotSpeedZ","hidden":false,"min":-1,"max":1,"defaultMin":-1,"defaultMax":1},"e3gnt24":{"id":"e3gnt24","value":0.75,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"1r9rs1x","title":"Scale","type":"param","key":"scale","hidden":false,"min":0.00001,"max":4,"defaultMin":0.00001,"defaultMax":4},"xkxsl9s":{"id":"xkxsl9s","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"1r9rs1x","title":"Mesh Index","type":"param","key":"meshIndex","hidden":true,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"gl7anr9":{"id":"gl7anr9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Shape Shift","method":"shapeShift","sketchId":"1r9rs1x"},"1lpiok9":{"id":"1lpiok9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"99r0oju","sketchId":"qpvup3p","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"9w03vvc":{"id":"9w03vvc","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"99r0oju","sketchId":"qpvup3p","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"n5djtdo":{"id":"n5djtdo","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"99r0oju","sketchId":"qpvup3p","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"up32bx4":{"id":"up32bx4","value":"sawtooth","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"qpvup3p","parentNodeId":"99r0oju"},"3jbdter":{"id":"3jbdter","value":0.03125,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"qpvup3p","parentNodeId":"99r0oju"},"yj1ralg":{"id":"yj1ralg","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"qpvup3p","parentNodeId":"99r0oju"},"buk5mgf":{"id":"buk5mgf","value":-1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"qpvup3p","parentNodeId":"99r0oju"},"we2weuw":{"id":"we2weuw","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"g7tllci","linkId":"99r0oju"}},"sketchId":"qpvup3p","parentNodeId":"99r0oju"},"99r0oju":{"id":"99r0oju","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"lfo","type":"inputLink","input":{"id":"lfo"},"nodeId":"g7tllci","sketchId":"qpvup3p","parentNodeId":"g7tllci","nodeType":"param","modifierIds":["1lpiok9","9w03vvc","n5djtdo"],"lfoOptionIds":["up32bx4","3jbdter","yj1ralg","buk5mgf"],"midiOptionIds":[],"audioOptionIds":[],"linkableActions":{"toggleActivate":"we2weuw"},"linkType":"node","animOptionIds":[]},"ctirwnh":{"id":"ctirwnh","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"ocp36ke","sketchId":"et6x5w5","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"oe77dmx":{"id":"oe77dmx","value":0.16304347826086957,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"ocp36ke","sketchId":"et6x5w5","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"pe39gql":{"id":"pe39gql","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"ocp36ke","sketchId":"et6x5w5","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"gtaq5hi":{"id":"gtaq5hi","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Audio Band","key":"audioBand","type":"select","subNode":true,"options":[{"value":0,"label":"Low"},{"value":1,"label":"Low-Mid"},{"value":2,"label":"Mid"},{"value":3,"label":"High"}],"sketchId":"et6x5w5","parentNodeId":"ocp36ke"},"kbgo5mx":{"id":"kbgo5mx","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"h11xydx","linkId":"ocp36ke"}},"sketchId":"et6x5w5","parentNodeId":"ocp36ke"},"ocp36ke":{"id":"ocp36ke","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"audio","type":"inputLink","input":{"id":"audio"},"nodeId":"h11xydx","sketchId":"et6x5w5","parentNodeId":"h11xydx","nodeType":"param","modifierIds":["ctirwnh","oe77dmx","pe39gql"],"lfoOptionIds":[],"midiOptionIds":[],"audioOptionIds":["gtaq5hi"],"linkableActions":{"toggleActivate":"kbgo5mx"},"linkType":"node","animOptionIds":[]},"qf8hp3x":{"id":"qf8hp3x","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"p8bqii3","channel":"A"}},"title":"Add to A"},"xp62tyb":{"id":"xp62tyb","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"p8bqii3","channel":"B"}},"title":"Add to B"},"3agbd9u":{"id":"3agbd9u","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"p8bqii3","type":"active"}},"title":"Add to Active"},"cci8c70":{"id":"cci8c70","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"p8bqii3","type":"opposite"}},"title":"Add to Opposite"},"uloot60":{"id":"uloot60","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"p8bqii3"}},"title":"Clear"},"tlx02j4":{"id":"tlx02j4","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"tahpywu","title":"Opacity","type":"param","key":"opacity","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"re1ihmk":{"id":"re1ihmk","value":0.1015625,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"tahpywu","title":"Speed","type":"param","key":"speed","hidden":false,"min":-1,"max":1,"defaultMin":-1,"defaultMax":1}},"scenes":{"items":{"f1vwqkk":{"id":"f1vwqkk","title":"Geoms","selectedSketchId":"qpvup3p","sketchIds":["qpvup3p","et6x5w5","1r9rs1x"],"linkableActionIds":{"addToA":"h1n8xw8","addToB":"wa2fvtb","addToActive":"n25blwi","addToOpposite":"817xlww","clear":"2ag66pm"}},"p8bqii3":{"id":"p8bqii3","title":"Stars","selectedSketchId":"tahpywu","sketchIds":["tahpywu"],"linkableActionIds":{"addToA":"qf8hp3x","addToB":"xp62tyb","addToActive":"3agbd9u","addToOpposite":"cci8c70","clear":"uloot60"}}},"currentSceneId":"f1vwqkk","channels":{"A":"f1vwqkk","B":"p8bqii3"}},"sketches":{"qpvup3p":{"title":"Env","moduleId":"env","paramIds":["g7tllci","uh7mfhv","sjwc7eq"],"shotIds":[],"openedNodeId":"g7tllci"},"et6x5w5":{"title":"Inner","moduleId":"solid","paramIds":["6besnyv","cbo90q9","51up7yl","h11xydx","ryf0wbv"],"shotIds":["l93f69i"]},"1r9rs1x":{"title":"Outer","moduleId":"solid","paramIds":["8du7bgf","339ae0r","ll3hb6r","e3gnt24","xkxsl9s"],"shotIds":["gl7anr9"],"openedNodeId":"339ae0r"},"tahpywu":{"title":"Stars","moduleId":"stars","paramIds":["tlx02j4","re1ihmk"],"shotIds":[]}},"project":{"errors":[],"errorPopup":false},"inputs":{"audio":{"value":[0.18182960663259443,0.01025613512765978,0,0],"assignedLinkIds":["ocp36ke"]},"lfo":{"value":305.5,"assignedLinkIds":["99r0oju"]}},"inputLinks":{"nodeIds":[null]},"macros":{"learningId":false,"nodeIds":[]},"ui":{"panelWidths":{"left":50},"isEditing":false,"openedNode":false,"auxOpen":["sketchcat_simple"],"addSketchOpen":{}},"router":{"location":{"pathname":"/scenes/view","search":"","hash":"","key":"klskb5"}},"settings":{"clockGenerated":true,"clockBpm":120,"aspectW":16,"aspectH":9,"antialias":false,"throttledFPS":60,"watchSketchesDir":true},"form":{}} diff --git a/example-projects/simple/sketches/env/config.js b/example-projects/simple/sketches/env/config.js index 2750142a..a58994b0 100644 --- a/example-projects/simple/sketches/env/config.js +++ b/example-projects/simple/sketches/env/config.js @@ -1,20 +1,21 @@ module.exports = { defaultTitle: 'Env', + category:'simple', params: [ { key: 'colorH', title: 'BG Color H', - defaultValue: 0 + defaultValue: 0, }, { key: 'colorS', title: 'BG Color S', - defaultValue: 0 + defaultValue: 0, }, { key: 'colorL', title: 'BG Color L', - defaultValue: 0 - } - ] + defaultValue: 0, + }, + ], } diff --git a/example-projects/simple/sketches/env/index.js b/example-projects/simple/sketches/env/index.js index 545cd17b..9e98f445 100644 --- a/example-projects/simple/sketches/env/index.js +++ b/example-projects/simple/sketches/env/index.js @@ -1,5 +1,3 @@ -const THREE = require('three') - class Env { constructor (scene) { this.scene = scene.scene diff --git a/example-projects/simple/sketches/solid/config.js b/example-projects/simple/sketches/solid/config.js index 983de09f..3ec61cf2 100644 --- a/example-projects/simple/sketches/solid/config.js +++ b/example-projects/simple/sketches/solid/config.js @@ -5,6 +5,8 @@ module.exports = { // Default title when sketch is loaded in (can be changed by user) defaultTitle: 'Solid', + // Collapsable category for this sketch to be grouped under + category:'simple', // Params are values between 0 and 1 that can be manipulated by the user // these values are sent to the sketch every frame // e.g. Speed, scale, colour @@ -12,35 +14,46 @@ module.exports = { { key: 'rotSpeedX', // needs to be unique title: 'Rotation Speed X', // should be human - defaultValue: 0 // must be between 0 and 1 + defaultValue: 0.5, // must be between 0 and 1 + defaultMin: -1, + defaultMax: 1, }, { key: 'rotSpeedY', title: 'Rotation Speed Y', - defaultValue: 0 + defaultValue: 0.5, + defaultMin: -1, + defaultMax: 1, }, { key: 'rotSpeedZ', title: 'Rotation Speed Z', - defaultValue: 0 + defaultValue: 0.5, + defaultMin: -1, + defaultMax: 1, }, { key: 'scale', title: 'Scale', - defaultValue: 0.5 + defaultValue: 0.5, + defaultMin: 0.00001, + defaultMax: 4, }, { key: 'meshIndex', title: 'Mesh Index', - defaultValue: 0 - } + defaultValue: 0, + // meshIndex is changed by the shapeShift shot and not something + // the user needs to view/edit, so we set hidden:true + hidden: true, + }, ], // Shots are single functions that can fire, as opposed to values that change // e.g. Explosions, Pre-defined animations shots: [ { method: 'shapeShift', // needs to be unique - title: 'Shape Shift' // should be human - } - ] + title: 'Shape Shift', // should be human + }, + ], } diff --git a/example-projects/simple/sketches/solid/index.js b/example-projects/simple/sketches/solid/index.js index eec0143d..14bc5230 100644 --- a/example-projects/simple/sketches/solid/index.js +++ b/example-projects/simple/sketches/solid/index.js @@ -4,11 +4,6 @@ A polyhedron that can spin on all axes. The user can change the speed of the rot The user can change the scale. The user can also click on "shapeshift" and the geometry changes. **/ -/** HEDRON TIP ** - Hedron uses three.js, so you'll need that :) -**/ -const THREE = require('three') - /** HEDRON TIP ** Hedron sketches must be a class **/ @@ -25,12 +20,12 @@ class Solid { params - The sketch params when the sketch first initialises **/ - constructor (scene, meta, params) { + constructor (scene, params, meta) { /** HEDRON TIP ** Must define a "root" property as a THREE.Group or THREE.Object3D Hedron looks for this and will add it to the scene. **/ - this.root = new THREE.Group() + this.root = new THREE.Group() // THREE is a global var, so no need to import /** HEDRON TIP ** It's good practice to not manipulate the root object @@ -47,7 +42,7 @@ class Solid { const mat = new THREE.MeshBasicMaterial( { wireframe: true, color: 0xffffff } ) - const size = 300 + const size = 1 // Array geometries (the platonic solids!) const geoms = [ @@ -55,7 +50,7 @@ class Solid { new THREE.BoxGeometry(size, size, size), new THREE.OctahedronGeometry(size), new THREE.TetrahedronGeometry(size), - new THREE.DodecahedronGeometry(size) + new THREE.DodecahedronGeometry(size), ] // Loop through meshes @@ -104,7 +99,6 @@ class Solid { this.group.rotation.z += params.rotSpeedZ * baseSpeed * frameDiff // Change scale using params.scale - params.scale = Math.max(params.scale * 4, 0.00001) this.group.scale.set(params.scale, params.scale, params.scale) } @@ -148,6 +142,7 @@ class Solid { Use the destructor method to do anything when the sketch is deleted **/ destructor () { + // eslint-disable-next-line no-console console.log('Solid sketch deleted!') } } diff --git a/example-projects/simple/sketches/stars/config.js b/example-projects/simple/sketches/stars/config.js index 6959d4a8..8203134d 100644 --- a/example-projects/simple/sketches/stars/config.js +++ b/example-projects/simple/sketches/stars/config.js @@ -1,17 +1,20 @@ module.exports = { defaultTitle: 'Stars', + category:'simple', params: [ { title: 'Opacity', key: 'opacity', - defaultValue: 1 + defaultValue: 1, }, { title: 'Speed', key: 'speed', - defaultValue: 0.5 - } + defaultValue: 0.5, + defaultMin: -1, + defaultMax: 1, + }, ], shots: [ - ] + ], } diff --git a/example-projects/simple/sketches/stars/index.js b/example-projects/simple/sketches/stars/index.js index fa062c44..ba6f6c4b 100644 --- a/example-projects/simple/sketches/stars/index.js +++ b/example-projects/simple/sketches/stars/index.js @@ -1,8 +1,6 @@ /** HEDRON TIP ** Look in "example-projects/simple/sketches/solid" for info on how to create sketches **/ -const THREE = require('three') - const range = 10000 const particleCount = 1800 @@ -17,11 +15,11 @@ class Stars { this.material = new THREE.PointsMaterial({ color: 0xFFFFFF, size: 10, - transparent: true + transparent: true, }) // now create the individual particles - for (var p = 0; p < particleCount; p++) { + for (let p = 0; p < particleCount; p++) { // create a particle with random position const pX = randomInRange() const pY = randomInRange() @@ -35,9 +33,9 @@ class Stars { // create the particle system this.particleSystem = new THREE.Points( - this.particles, - this.material - ) + this.particles, + this.material + ) // add it to the scene this.root.add(this.particleSystem) @@ -63,7 +61,7 @@ class Stars { } // and the position - particle.z += particle.velocity.z * ((p.speed * 2) - 1) + particle.z += particle.velocity.z * p.speed // flag to the particle system // that we've changed its vertices. diff --git a/example-projects/trig/project.json b/example-projects/trig/project.json index 7e2a6419..519309a7 100644 --- a/example-projects/trig/project.json +++ b/example-projects/trig/project.json @@ -1 +1 @@ -{"nodes":{"sceneCrossfader":{"id":"sceneCrossfader","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Scene Crossfader","type":"param"},"viewerMode":{"id":"viewerMode","value":"mix","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Viewer Mode","type":"select","options":[{"value":"mix","label":"Mix"},{"value":"A","label":"A"},{"value":"B","label":"B"}]},"audioNormalizeLevels":{"id":"audioNormalizeLevels","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalize Levels","type":"param"},"audioLevelsFalloff":{"id":"audioLevelsFalloff","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Falloff","type":"param"},"4127fmo":{"id":"4127fmo","value":0.004277569313096086,"inputLinkIds":["26gjlp1"],"shotCount":0,"connectedMacroIds":[],"title":"Pos X","type":"param","key":"posX","openedLinkId":"26gjlp1","activeInputLinkId":"26gjlp1"},"1tuv4x5":{"id":"1tuv4x5","value":0.4369348682670615,"inputLinkIds":["iv80n1l"],"shotCount":0,"connectedMacroIds":[],"title":"Pos Y","type":"param","key":"posY","openedLinkId":"iv80n1l","activeInputLinkId":"iv80n1l"},"wdhgvg2":{"id":"wdhgvg2","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Pos Z","type":"param","key":"posZ"},"71ftemb":{"id":"71ftemb","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"grm7m9i":{"id":"grm7m9i","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Lower Range","passToNext":true,"subNode":true},"fsdfv7n":{"id":"fsdfv7n","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Upper Range","passToNext":false,"subNode":true},"3meb0s9":{"id":"3meb0s9","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}]},"e0tqe94":{"id":"e0tqe94","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"8ku58x7":{"id":"8ku58x7","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true},"acbon8j":{"id":"acbon8j","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"b8yb2ym":{"id":"b8yb2ym","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Lower Range","passToNext":true,"subNode":true},"abb5anj":{"id":"abb5anj","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Upper Range","passToNext":false,"subNode":true},"6e1mta6":{"id":"6e1mta6","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}]},"72p8iov":{"id":"72p8iov","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"3dpgn03":{"id":"3dpgn03","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true}},"scenes":{"items":{"doajdmy":{"id":"doajdmy","title":"Circle","selectedSketchId":"v66udcf","sketchIds":["v66udcf"],"linkableActionIds":{"addToA":"bxrvwbs","addToB":"lh468lq","addToActive":"4uw4m8l","addToOpposite":"j27mose","clear":"u566l3e"}}},"currentSceneId":"doajdmy","channels":{"A":"doajdmy","B":false}},"sketches":{"v66udcf":{"title":"Point","moduleId":"point","paramIds":["4127fmo","1tuv4x5","wdhgvg2"],"shotIds":[],"openedNodes":{"param":"1tuv4x5"}}},"project":{"filePath":"/Users/alex/Sites/GitHub/hedron/example-projects/trig/project.json","sketchesPath":"/Users/alex/Sites/GitHub/hedron/example-projects/trig/sketches","errors":[],"errorPopup":false},"inputs":{"audio_0":{"value":0.09192983671719823,"assignedLinkIds":[]},"audio_1":{"value":0.3920417479652838,"assignedLinkIds":[]},"audio_2":{"value":0.2800157346788512,"assignedLinkIds":[]},"audio_3":{"value":0.31956442755083536,"assignedLinkIds":[]},"lfo":{"value":218.91666666666666,"assignedLinkIds":["26gjlp1","iv80n1l"]}},"inputLinks":{"26gjlp1":{"title":"lfo","input":{"id":"lfo"},"id":"26gjlp1","nodeId":"4127fmo","nodeType":"param","modifierIds":["71ftemb","grm7m9i","fsdfv7n"],"lfoOptionIds":["3meb0s9","e0tqe94","8ku58x7"],"midiOptionIds":[],"linkableActions":{"toggleActivate":"27wt27g"},"linkType":"node"},"iv80n1l":{"title":"lfo","input":{"id":"lfo"},"id":"iv80n1l","nodeId":"1tuv4x5","nodeType":"param","modifierIds":["acbon8j","b8yb2ym","abb5anj"],"lfoOptionIds":["6e1mta6","72p8iov","3dpgn03"],"midiOptionIds":[],"linkableActions":{"toggleActivate":"p95mpjp"},"linkType":"node"}},"linkableActions":{"bxrvwbs":{"id":"bxrvwbs","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"doajdmy","channel":"A"}},"inputLinkIds":[]},"lh468lq":{"id":"lh468lq","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"doajdmy","channel":"B"}},"inputLinkIds":[]},"4uw4m8l":{"id":"4uw4m8l","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"doajdmy","type":"active"}},"inputLinkIds":[]},"j27mose":{"id":"j27mose","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"doajdmy","type":"opposite"}},"inputLinkIds":[]},"u566l3e":{"id":"u566l3e","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"doajdmy"}},"inputLinkIds":[]},"27wt27g":{"id":"27wt27g","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"4127fmo","linkId":"26gjlp1"}},"inputLinkIds":[]},"p95mpjp":{"id":"p95mpjp","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"1tuv4x5","linkId":"iv80n1l"}},"inputLinkIds":[]}},"macros":{"learningId":false,"items":{}},"ui":{"panelWidths":{"left":39.47906026557712},"isEditing":false,"openedNode":false},"router":{"location":{"pathname":"/scenes/view/doajdmy","search":"","hash":"","key":"le4hx2"}},"settings":{"clockGenerated":true,"clockBpm":120,"aspectW":16,"aspectH":9,"antialias":false,"throttledFPS":60},"form":{}} +{"nodes":{"sceneCrossfader":{"id":"sceneCrossfader","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Scene Crossfader","type":"param"},"viewerMode":{"id":"viewerMode","value":"mix","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Viewer Mode","type":"select","options":[{"value":"mix","label":"Mix"},{"value":"A","label":"A"},{"value":"B","label":"B"}]},"sketchOrganization":{"id":"sketchOrganization","value":"category","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Sketch Organization","type":"select","options":[{"value":"folder","label":"Folder"},{"value":"category","label":"Category"},{"value":"author","label":"Author"}]},"audioLevelsFalloff":{"id":"audioLevelsFalloff","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Falloff","type":"param"},"audioLevelsPower":{"id":"audioLevelsPower","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Power","type":"param","min":0.5,"max":3},"audioLevelsSmoothing":{"id":"audioLevelsSmoothing","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Smoothing","type":"param"},"audioNormalizeLevels":{"id":"audioNormalizeLevels","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalize Levels","type":"param"},"audioNormalizeRangeFalloff":{"id":"audioNormalizeRangeFalloff","value":0.01,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalized Range Falloff","type":"param"},"0q5g8o9":{"id":"0q5g8o9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"03i6pnt","channel":"A"}},"title":"Add to A"},"5ordnaq":{"id":"5ordnaq","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"03i6pnt","channel":"B"}},"title":"Add to B"},"w77snsi":{"id":"w77snsi","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"03i6pnt","type":"active"}},"title":"Add to Active"},"ewg6lsv":{"id":"ewg6lsv","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"03i6pnt","type":"opposite"}},"title":"Add to Opposite"},"eotcf9u":{"id":"eotcf9u","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"03i6pnt"}},"title":"Clear"},"4u8v39a":{"id":"4u8v39a","value":0.6913417161825233,"inputLinkIds":["3uqd8y8"],"shotCount":0,"connectedMacroIds":[],"sketchId":"twtate1","title":"Pos X","type":"param","key":"posX","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1,"openedLinkId":"3uqd8y8","activeInputLinkId":"3uqd8y8"},"6hsv6jb":{"id":"6hsv6jb","value":0.9619397662556425,"inputLinkIds":["1xl746m"],"shotCount":0,"connectedMacroIds":[],"sketchId":"twtate1","title":"Pos Y","type":"param","key":"posY","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1,"openedLinkId":"1xl746m","activeInputLinkId":"1xl746m"},"coqi875":{"id":"coqi875","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"sketchId":"twtate1","title":"Pos Z","type":"param","key":"posZ","hidden":false,"min":0,"max":1,"defaultMin":0,"defaultMax":1},"wq22umi":{"id":"wq22umi","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"3uqd8y8","sketchId":"twtate1","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"vdm6b2i":{"id":"vdm6b2i","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"3uqd8y8","sketchId":"twtate1","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"kki76ro":{"id":"kki76ro","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"3uqd8y8","sketchId":"twtate1","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"s2lgnmd":{"id":"s2lgnmd","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"twtate1","parentNodeId":"3uqd8y8"},"xirv410":{"id":"xirv410","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"twtate1","parentNodeId":"3uqd8y8"},"f8rh73k":{"id":"f8rh73k","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"twtate1","parentNodeId":"3uqd8y8"},"1u5nbvy":{"id":"1u5nbvy","value":-1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"twtate1","parentNodeId":"3uqd8y8"},"bbwdc3b":{"id":"bbwdc3b","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"4u8v39a","linkId":"3uqd8y8"}},"sketchId":"twtate1","parentNodeId":"3uqd8y8"},"3uqd8y8":{"id":"3uqd8y8","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"lfo","type":"inputLink","input":{"id":"lfo"},"nodeId":"4u8v39a","sketchId":"twtate1","parentNodeId":"4u8v39a","nodeType":"param","modifierIds":["wq22umi","vdm6b2i","kki76ro"],"lfoOptionIds":["s2lgnmd","xirv410","f8rh73k","1u5nbvy"],"midiOptionIds":[],"audioOptionIds":[],"linkableActions":{"toggleActivate":"bbwdc3b"},"linkType":"node","animOptionIds":[]},"e59hju5":{"id":"e59hju5","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"1xl746m","sketchId":"twtate1","key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"0pjakm3":{"id":"0pjakm3","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"1xl746m","sketchId":"twtate1","key":"range","title":"Lower Range","passToNext":true,"subNode":true},"qthetc4":{"id":"qthetc4","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"parentNodeId":"1xl746m","sketchId":"twtate1","key":"range","title":"Upper Range","passToNext":false,"subNode":true},"3w69bw9":{"id":"3w69bw9","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}],"sketchId":"twtate1","parentNodeId":"1xl746m"},"vovli0y":{"id":"vovli0y","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}],"sketchId":"twtate1","parentNodeId":"1xl746m"},"nf5g5vi":{"id":"nf5g5vi","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true,"sketchId":"twtate1","parentNodeId":"1xl746m"},"e95kvg8":{"id":"e95kvg8","value":-1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Seed","key":"seed","type":"select","subNode":true,"options":[{"value":-1,"label":"auto"},{"value":0,"label":"0"},{"value":1,"label":"1"},{"value":2,"label":"2"},{"value":3,"label":"3"},{"value":4,"label":"4"},{"value":5,"label":"5"},{"value":6,"label":"6"},{"value":7,"label":"7"},{"value":8,"label":"8"},{"value":9,"label":"9"},{"value":10,"label":"10"},{"value":11,"label":"11"},{"value":12,"label":"12"},{"value":13,"label":"13"},{"value":14,"label":"14"},{"value":15,"label":"15"},{"value":16,"label":"16"},{"value":17,"label":"17"},{"value":18,"label":"18"},{"value":19,"label":"19"},{"value":20,"label":"20"},{"value":21,"label":"21"},{"value":22,"label":"22"},{"value":23,"label":"23"},{"value":24,"label":"24"}],"sketchId":"twtate1","parentNodeId":"1xl746m"},"3wac4ru":{"id":"3wac4ru","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"linkableAction","title":"Toggle Activate","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"6hsv6jb","linkId":"1xl746m"}},"sketchId":"twtate1","parentNodeId":"1xl746m"},"1xl746m":{"id":"1xl746m","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"lfo","type":"inputLink","input":{"id":"lfo"},"nodeId":"6hsv6jb","sketchId":"twtate1","parentNodeId":"6hsv6jb","nodeType":"param","modifierIds":["e59hju5","0pjakm3","qthetc4"],"lfoOptionIds":["3w69bw9","vovli0y","nf5g5vi","e95kvg8"],"midiOptionIds":[],"audioOptionIds":[],"linkableActions":{"toggleActivate":"3wac4ru"},"linkType":"node","animOptionIds":[]}},"scenes":{"items":{"03i6pnt":{"id":"03i6pnt","title":"Point","selectedSketchId":"twtate1","sketchIds":["twtate1"],"linkableActionIds":{"addToA":"0q5g8o9","addToB":"5ordnaq","addToActive":"w77snsi","addToOpposite":"ewg6lsv","clear":"eotcf9u"}}},"currentSceneId":"03i6pnt","channels":{"A":"03i6pnt","B":false}},"sketches":{"twtate1":{"title":"Point","moduleId":"point","paramIds":["4u8v39a","6hsv6jb","coqi875"],"shotIds":[]}},"project":{"errors":[],"errorPopup":false},"inputs":{"audio":{"value":[0.2792073732718575,0.18485977384321212,0.22962028748828678,0.21285002514756501],"assignedLinkIds":[]},"lfo":{"value":198.125,"assignedLinkIds":["3uqd8y8","1xl746m"]}},"inputLinks":{"nodeIds":[null]},"macros":{"learningId":false,"nodeIds":[]},"ui":{"panelWidths":{"left":50},"isEditing":false,"openedNode":false,"auxOpen":[],"addSketchOpen":{}},"router":{"location":{"pathname":"/scenes/view/03i6pnt","search":"","hash":"","key":"ndr5ru"}},"settings":{"clockGenerated":true,"clockBpm":120,"aspectW":16,"aspectH":9,"antialias":false,"throttledFPS":60,"watchSketchesDir":true},"form":{}} diff --git a/example-projects/trig/sketches/point/config.js b/example-projects/trig/sketches/point/config.js index 010c4ed3..21b4adb2 100644 --- a/example-projects/trig/sketches/point/config.js +++ b/example-projects/trig/sketches/point/config.js @@ -12,19 +12,19 @@ module.exports = { { key: 'posX', // needs to be unique title: 'Pos X', // should be human - defaultValue: 0.5 // must be between 0 and 1 + defaultValue: 0.5, // must be between 0 and 1 }, { key: 'posY', title: 'Pos Y', - defaultValue: 0.5 + defaultValue: 0.5, }, { key: 'posZ', title: 'Pos Z', - defaultValue: 0.5 - } + defaultValue: 0.5, + }, ], shots: [ - ] + ], } diff --git a/example-projects/trig/sketches/point/index.js b/example-projects/trig/sketches/point/index.js index 364ecb38..9b96a0c9 100644 --- a/example-projects/trig/sketches/point/index.js +++ b/example-projects/trig/sketches/point/index.js @@ -1,10 +1,7 @@ -const THREE = require('three') - class Point { - - constructor (scene, meta, params) { + constructor () { this.root = new THREE.Group() - const geom = new THREE.IcosahedronGeometry(100) + const geom = new THREE.IcosahedronGeometry(0.5) const mat = new THREE.MeshNormalMaterial() this.mesh = new THREE.Mesh(geom, mat) @@ -12,13 +9,12 @@ class Point { } update (params, time, frameDiff, allParams) { - const rad = 1500 + const rad = 5 this.mesh.position.x = (rad * params.posX) - rad / 2 this.mesh.position.y = (rad * params.posY) - rad / 2 this.mesh.position.z = (rad * params.posZ) - rad / 2 } - } module.exports = Point diff --git a/example-projects/trippy/project.json b/example-projects/trippy/project.json deleted file mode 100644 index 7912f433..00000000 --- a/example-projects/trippy/project.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":{"sceneCrossfader":{"id":"sceneCrossfader","value":0.01366120218579231,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Scene Crossfader","type":"param"},"viewerMode":{"id":"viewerMode","value":"mix","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Viewer Mode","type":"select","options":[{"value":"mix","label":"Mix"},{"value":"A","label":"A"},{"value":"B","label":"B"}]},"audioNormalizeLevels":{"id":"audioNormalizeLevels","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Normalize Levels","type":"param"},"audioLevelsFalloff":{"id":"audioLevelsFalloff","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Levels Falloff","type":"param"},"0s6lvul":{"id":"0s6lvul","value":0.5778388278388278,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Z Speed","type":"param","key":"zSpeed"},"vei9jws":{"id":"vei9jws","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Tunnel Scale","type":"param","key":"tunnelScale"},"usb304w":{"id":"usb304w","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Speed","type":"param","key":"rotSpeed"},"hdp7xd1":{"id":"hdp7xd1","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Tween Speed","type":"param","key":"rotTweenSpeed"},"7cuaqas":{"id":"7cuaqas","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Block Shift Speed","type":"param","key":"blockShiftSpeed"},"ypj20pn":{"id":"ypj20pn","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Block Spin Speed","type":"param","key":"blockSpinSpeed"},"ftuvkhp":{"id":"ftuvkhp","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Perlin Speed","type":"param","key":"perlinSpeed"},"928kfik":{"id":"928kfik","value":0.9997322937381838,"inputLinkIds":["mdqy0x9"],"shotCount":0,"connectedMacroIds":[],"title":"color H","type":"param","key":"colorH","openedLinkId":"mdqy0x9","activeInputLinkId":"mdqy0x9"},"oekq70k":{"id":"oekq70k","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"color S","type":"param","key":"colorS"},"kb2byt3":{"id":"kb2byt3","value":0.5192307692307692,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"color L","type":"param","key":"colorL"},"2rkglfv":{"id":"2rkglfv","value":0,"inputLinkIds":["y91yr74"],"shotCount":343,"connectedMacroIds":[],"type":"shot","title":"Quarter Turn","method":"quarterTurn","sketchId":"4mipx19","openedLinkId":"y91yr74","activeInputLinkId":"y91yr74"},"utd7ext":{"id":"utd7ext","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Remove Blocks","method":"removeBlocks","sketchId":"4mipx19"},"covtc3r":{"id":"covtc3r","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Add Blocks","method":"addBlocks","sketchId":"4mipx19"},"tcyawv3":{"id":"tcyawv3","value":0,"inputLinkIds":["pqbp3yc"],"shotCount":336,"connectedMacroIds":[],"type":"shot","title":"Shift Blocks","method":"shiftBlocks","sketchId":"4mipx19","openedLinkId":"pqbp3yc","activeInputLinkId":"pqbp3yc"},"n6u2rgu":{"id":"n6u2rgu","value":0,"inputLinkIds":["oglnu99"],"shotCount":328,"connectedMacroIds":[],"type":"shot","title":"Spin Blocks","method":"spinBlocks","sketchId":"4mipx19","openedLinkId":"oglnu99","activeInputLinkId":"oglnu99"},"6bcuie8":{"id":"6bcuie8","value":0,"inputLinkIds":["ngb783x"],"shotCount":625,"connectedMacroIds":[],"type":"shot","title":"Flash Blocks","method":"flashBlocks","sketchId":"4mipx19","openedLinkId":"ngb783x","activeInputLinkId":"ngb783x"},"9h704ki":{"id":"9h704ki","value":0,"inputLinkIds":[],"shotCount":6,"connectedMacroIds":[],"type":"shot","title":"Boosted Flash Blocks","method":"boostedFlashBlocks","sketchId":"4mipx19","activeInputLinkId":"yydl896"},"a4dx8hv":{"id":"a4dx8hv","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Flash All On","method":"flashAllBlocksOn","sketchId":"4mipx19"},"yx0bq36":{"id":"yx0bq36","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Flash All Off","method":"flashAllBlocksOff","sketchId":"4mipx19"},"cl04jaf":{"id":"cl04jaf","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Pipes On","method":"pipesOn","sketchId":"4mipx19"},"fq7lx8b":{"id":"fq7lx8b","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Pipes Off","method":"pipesOff","sketchId":"4mipx19"},"1e6sq5r":{"id":"1e6sq5r","value":0.5935977586707601,"inputLinkIds":["har1p3h"],"shotCount":4369,"connectedMacroIds":[],"type":"shot","title":"Pipes Swap","method":"pipesSwap","sketchId":"4mipx19","openedLinkId":"har1p3h","activeInputLinkId":"har1p3h"},"913i7q9":{"id":"913i7q9","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Pipes All On","method":"pipesAllOn","sketchId":"4mipx19"},"di0yss4":{"id":"di0yss4","value":0.0269429365814908,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Fog Density","type":"param","key":"fogDensity"},"j5obnao":{"id":"j5obnao","value":0.29120879120879106,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color H","type":"param","key":"colorH"},"1ic3j5e":{"id":"1ic3j5e","value":0.19230769230769232,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color S","type":"param","key":"colorS"},"b52kkui":{"id":"b52kkui","value":0.2032967032967033,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color L","type":"param","key":"colorL"},"0gbvtty":{"id":"0gbvtty","value":0.027472527472527472,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Main Light Intensity","type":"param","key":"mainLightIntensity"},"j52vm6n":{"id":"j52vm6n","value":0.43131868131868134,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Distance","type":"param","key":"centralPointLightDistance"},"fg8t2s1":{"id":"fg8t2s1","value":0.07967032967032969,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Intensity","type":"param","key":"centralPointLightIntensity"},"rfs0r6r":{"id":"rfs0r6r","value":0.5934065934065934,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Color H","type":"param","key":"centralPointLightH"},"pvrhqxy":{"id":"pvrhqxy","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Color S","type":"param","key":"centralPointLightS"},"p30aooi":{"id":"p30aooi","value":0.510989010989011,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Color L","type":"param","key":"centralPointLightL"},"qgb5nue":{"id":"qgb5nue","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Camera 1","method":"camera1","sketchId":"ocqps2s"},"nn10yhi":{"id":"nn10yhi","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Camera 2","method":"camera2","sketchId":"ocqps2s"},"484bbb6":{"id":"484bbb6","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Camera 3","method":"camera3","sketchId":"ocqps2s"},"l7hv666":{"id":"l7hv666","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Camera Random","method":"cameraRandom","sketchId":"ocqps2s"},"nap0vp4":{"id":"nap0vp4","value":0.07967032967032966,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Pos Z","type":"param","key":"posZ"},"5a03ptw":{"id":"5a03ptw","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Speed X","type":"param","key":"rotSpeedX"},"9sqssm7":{"id":"9sqssm7","value":0.4606227106227106,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Speed Y","type":"param","key":"rotSpeedY"},"y45y8v3":{"id":"y45y8v3","value":0.5164835164835165,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Speed Z","type":"param","key":"rotSpeedZ"},"kvcndvn":{"id":"kvcndvn","value":0.5141941391941391,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Blob Speed","type":"param","key":"blobSpeed"},"5xblfei":{"id":"5xblfei","value":0.1291208791208791,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Num Blobs","type":"param","key":"numBlobs"},"pyam4a5":{"id":"pyam4a5","value":0.7454212454212454,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Blob Strength","type":"param","key":"blobStrength"},"vh3fvwa":{"id":"vh3fvwa","value":0,"inputLinkIds":[],"shotCount":3,"connectedMacroIds":[],"type":"shot","title":"Spin","method":"spin","sketchId":"ur1s211"},"t57i74c":{"id":"t57i74c","value":0,"inputLinkIds":["8rqkjit"],"shotCount":1115,"connectedMacroIds":[],"type":"shot","title":"Update Reflection","method":"updateReflection","sketchId":"ur1s211","openedLinkId":"8rqkjit","activeInputLinkId":"8rqkjit"},"sxkn122":{"id":"sxkn122","value":0.10000000000000003,"inputLinkIds":["efw1t57"],"shotCount":0,"connectedMacroIds":[],"title":"Pos Z","type":"param","key":"posZ","openedLinkId":"efw1t57","activeInputLinkId":"efw1t57"},"59iwl0f":{"id":"59iwl0f","value":0.5224358974358975,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Speed X","type":"param","key":"rotSpeedX"},"h79kdes":{"id":"h79kdes","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Speed Y","type":"param","key":"rotSpeedY"},"inr1ca9":{"id":"inr1ca9","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rot Speed Z","type":"param","key":"rotSpeedZ"},"y82phdn":{"id":"y82phdn","value":0.5512820512820513,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Blob Speed","type":"param","key":"blobSpeed"},"wysadp0":{"id":"wysadp0","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Num Blobs","type":"param","key":"numBlobs"},"yf31edd":{"id":"yf31edd","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Blob Strength","type":"param","key":"blobStrength"},"59sl06n":{"id":"59sl06n","value":0,"inputLinkIds":["8ciljw6"],"shotCount":1585,"connectedMacroIds":[],"type":"shot","title":"Spin","method":"spin","sketchId":"scpeype","openedLinkId":"8ciljw6","activeInputLinkId":"8ciljw6"},"o2y3foc":{"id":"o2y3foc","value":0,"inputLinkIds":["yicpwlx"],"shotCount":1572,"connectedMacroIds":[],"type":"shot","title":"Update Reflection","method":"updateReflection","sketchId":"scpeype","openedLinkId":"yicpwlx","activeInputLinkId":"yicpwlx"},"kvrxcg0":{"id":"kvrxcg0","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Fog Density","type":"param","key":"fogDensity"},"k8v9w13":{"id":"k8v9w13","value":0.4672984353849878,"inputLinkIds":["4cd69xv"],"shotCount":0,"connectedMacroIds":[],"title":"BG Color H","type":"param","key":"colorH","openedLinkId":"4cd69xv","activeInputLinkId":"4cd69xv"},"qp1gg1m":{"id":"qp1gg1m","value":0.6217948717948718,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color S","type":"param","key":"colorS"},"ck7fo50":{"id":"ck7fo50","value":0.5082417582417582,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"BG Color L","type":"param","key":"colorL"},"yy8kmye":{"id":"yy8kmye","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Main Light Intensity","type":"param","key":"mainLightIntensity"},"jfe9qam":{"id":"jfe9qam","value":0.5,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Distance","type":"param","key":"centralPointLightDistance"},"kgxq8f6":{"id":"kgxq8f6","value":0.5384615384615384,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Intensity","type":"param","key":"centralPointLightIntensity"},"sbv7x5e":{"id":"sbv7x5e","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Color H","type":"param","key":"centralPointLightH"},"e79i3yp":{"id":"e79i3yp","value":0.625,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Color S","type":"param","key":"centralPointLightS"},"wf1iwh0":{"id":"wf1iwh0","value":0.02564102564102566,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Central Point Light Color L","type":"param","key":"centralPointLightL"},"jv28hwm":{"id":"jv28hwm","value":0,"inputLinkIds":[],"shotCount":3,"connectedMacroIds":[],"type":"shot","title":"Camera 1","method":"camera1","sketchId":"t9k44bf"},"98uw21m":{"id":"98uw21m","value":0,"inputLinkIds":[],"shotCount":2,"connectedMacroIds":[],"type":"shot","title":"Camera 2","method":"camera2","sketchId":"t9k44bf"},"yn73iwy":{"id":"yn73iwy","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"type":"shot","title":"Camera 3","method":"camera3","sketchId":"t9k44bf"},"c7ol1m3":{"id":"c7ol1m3","value":0,"inputLinkIds":[],"shotCount":5,"connectedMacroIds":[],"type":"shot","title":"Camera Random","method":"cameraRandom","sketchId":"t9k44bf"},"46oelft":{"id":"46oelft","value":[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"3qvmm8l":{"id":"3qvmm8l","value":[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"m8huxne":{"id":"m8huxne","value":"triangle","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"}]},"316tj0s":{"id":"316tj0s","value":0.0625,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"vyhlvqd":{"id":"vyhlvqd","value":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"6dn9dvu":{"id":"6dn9dvu","value":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"o3w2eld":{"id":"o3w2eld","value":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"s7bmq4p":{"id":"s7bmq4p","value":[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"jwq6wgd":{"id":"jwq6wgd","value":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"uomtkk7":{"id":"uomtkk7","value":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"koeh596":{"id":"koeh596","value":[1,0,0,1,1,0,0,0,1,1,1,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,1,0,0,1,0,0],"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[]},"hc2qon7":{"id":"hc2qon7","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"qsf8bda":{"id":"qsf8bda","value":0.10000000000000003,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Lower Range","passToNext":true,"subNode":true},"i69mg9x":{"id":"i69mg9x","value":0.7434782608695651,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Upper Range","passToNext":false,"subNode":true},"ih4jeua":{"id":"ih4jeua","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"}]},"f7ot6i4":{"id":"f7ot6i4","value":0.125,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"0lvbofx":{"id":"0lvbofx","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"}]},"ouwxsec":{"id":"ouwxsec","value":0.0625,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"2h25rkg":{"id":"2h25rkg","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"}]},"3accxww":{"id":"3accxww","value":0.125,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"oo0ko1w":{"id":"oo0ko1w","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"bu2jkow":{"id":"bu2jkow","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Lower Range","passToNext":true,"subNode":true},"1qsnupi":{"id":"1qsnupi","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Upper Range","passToNext":false,"subNode":true},"ude3fuj":{"id":"ude3fuj","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}]},"0n4v4nm":{"id":"0n4v4nm","value":0.125,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"ey7arcm":{"id":"ey7arcm","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true},"2bnabgm":{"id":"2bnabgm","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"threshold","title":"Threshold","passToNext":false,"subNode":true},"rgpg4uv":{"id":"rgpg4uv","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Lower Range","passToNext":true,"subNode":true},"xn071mc":{"id":"xn071mc","value":1,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"key":"range","title":"Upper Range","passToNext":false,"subNode":true},"dcid9y7":{"id":"dcid9y7","value":"sine","inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Shape","key":"shape","type":"select","subNode":true,"options":[{"value":"sine","label":"Sine"},{"value":"square","label":"Square"},{"value":"sawtooth","label":"Sawtooth"},{"value":"rSawtooth","label":"Revese Sawtooth"},{"value":"triangle","label":"Triangle"},{"value":"noise","label":"Noise"}]},"ptl3gkx":{"id":"ptl3gkx","value":0.25,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Rate","key":"rate","type":"select","subNode":true,"options":[{"value":32,"label":"32"},{"value":16,"label":"16"},{"value":8,"label":"8"},{"value":4,"label":"4"},{"value":2,"label":"2"},{"value":1,"label":"1"},{"value":0.5,"label":"1/2"},{"value":0.25,"label":"1/4"},{"value":0.125,"label":"1/8"},{"value":0.0625,"label":"1/16"},{"value":0.03125,"label":"1/32"}]},"0gjaa69":{"id":"0gjaa69","value":0,"inputLinkIds":[],"shotCount":0,"connectedMacroIds":[],"title":"Phase","key":"phase","subNode":true}},"scenes":{"items":{"o4imxh1":{"id":"o4imxh1","title":"Scene 1","selectedSketchId":"4mipx19","sketchIds":["4mipx19","ocqps2s","scpeype"],"linkableActionIds":{"addToA":"jcyapan","addToB":"pcur2h9","addToActive":"1mcpry9","addToOpposite":"akqhown","clear":"pnisikj"}},"bwcbhnc":{"id":"bwcbhnc","title":"Scene 2","selectedSketchId":"ur1s211","sketchIds":["ur1s211","t9k44bf"],"linkableActionIds":{"addToA":"7joltm2","addToB":"o77wdca","addToActive":"hbo3m24","addToOpposite":"1m10ph8","clear":"kreswpj"}}},"currentSceneId":"o4imxh1","channels":{"A":"o4imxh1","B":"bwcbhnc"}},"sketches":{"4mipx19":{"title":"Tunnel","moduleId":"tunnel","paramIds":["0s6lvul","vei9jws","usb304w","hdp7xd1","7cuaqas","ypj20pn","ftuvkhp","928kfik","oekq70k","kb2byt3"],"shotIds":["2rkglfv","utd7ext","covtc3r","tcyawv3","n6u2rgu","6bcuie8","9h704ki","a4dx8hv","yx0bq36","cl04jaf","fq7lx8b","1e6sq5r","913i7q9"],"openedNodes":{}},"ocqps2s":{"title":"Env","moduleId":"env","paramIds":["di0yss4","j5obnao","1ic3j5e","b52kkui","0gbvtty","j52vm6n","fg8t2s1","rfs0r6r","pvrhqxy","p30aooi"],"shotIds":["qgb5nue","nn10yhi","484bbb6","l7hv666"],"openedNodes":{}},"ur1s211":{"title":"Blobs","moduleId":"blobs","paramIds":["nap0vp4","5a03ptw","9sqssm7","y45y8v3","kvcndvn","5xblfei","pyam4a5"],"shotIds":["vh3fvwa","t57i74c"],"openedNodes":{"shot":"t57i74c"}},"scpeype":{"title":"Blobs","moduleId":"blobs","paramIds":["sxkn122","59iwl0f","h79kdes","inr1ca9","y82phdn","wysadp0","yf31edd"],"shotIds":["59sl06n","o2y3foc"],"openedNodes":{"shot":"o2y3foc"}},"t9k44bf":{"title":"Env","moduleId":"env","paramIds":["kvrxcg0","k8v9w13","qp1gg1m","ck7fo50","yy8kmye","jfe9qam","kgxq8f6","sbv7x5e","e79i3yp","wf1iwh0"],"shotIds":["jv28hwm","98uw21m","yn73iwy","c7ol1m3"],"openedNodes":{}}},"project":{"filePath":"/Users/alex/Sites/GitHub/hedron/example-projects/trippy/project.json","sketchesPath":"/Users/alex/Sites/GitHub/hedron/example-projects/trippy/sketches","errors":[],"errorPopup":false},"inputs":{"audio_0":{"value":0.004992596511431009,"assignedLinkIds":[]},"audio_1":{"value":0,"assignedLinkIds":[]},"audio_2":{"value":0,"assignedLinkIds":[]},"audio_3":{"value":0,"assignedLinkIds":[]},"lfo":{"value":642.0416666666666,"assignedLinkIds":["efw1t57","mdqy0x9","4cd69xv"]},"seq-step":{"assignedLinkIds":["8ciljw6","yicpwlx","8rqkjit","y91yr74","pqbp3yc","oglnu99","ngb783x","har1p3h"],"value":16}},"inputLinks":{"8ciljw6":{"title":"seq-step","input":{"id":"seq-step"},"id":"8ciljw6","nodeId":"59sl06n","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"mngwmxq"},"sequencerGridId":"46oelft","linkType":"node"},"yicpwlx":{"title":"seq-step","input":{"id":"seq-step"},"id":"yicpwlx","nodeId":"o2y3foc","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"naps24x"},"sequencerGridId":"3qvmm8l","linkType":"node"},"8rqkjit":{"title":"seq-step","input":{"id":"seq-step"},"id":"8rqkjit","nodeId":"t57i74c","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"pl8p2ge"},"sequencerGridId":"vyhlvqd","linkType":"node"},"y91yr74":{"title":"seq-step","input":{"id":"seq-step"},"id":"y91yr74","nodeId":"2rkglfv","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"a4rfv47"},"sequencerGridId":"6dn9dvu","linkType":"node"},"pqbp3yc":{"title":"seq-step","input":{"id":"seq-step"},"id":"pqbp3yc","nodeId":"tcyawv3","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"tykfg94"},"sequencerGridId":"o3w2eld","linkType":"node"},"oglnu99":{"title":"seq-step","input":{"id":"seq-step"},"id":"oglnu99","nodeId":"n6u2rgu","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"53cehe3"},"sequencerGridId":"s7bmq4p","linkType":"node"},"ngb783x":{"title":"seq-step","input":{"id":"seq-step"},"id":"ngb783x","nodeId":"6bcuie8","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"9heiqdi"},"sequencerGridId":"uomtkk7","linkType":"node"},"har1p3h":{"title":"seq-step","input":{"id":"seq-step"},"id":"har1p3h","nodeId":"1e6sq5r","nodeType":"shot","modifierIds":[],"lfoOptionIds":[],"midiOptionIds":[],"linkableActions":{"toggleActivate":"c66i99c"},"sequencerGridId":"koeh596","linkType":"node"},"efw1t57":{"title":"lfo","input":{"id":"lfo"},"id":"efw1t57","nodeId":"sxkn122","nodeType":"param","modifierIds":["hc2qon7","qsf8bda","i69mg9x"],"lfoOptionIds":["ih4jeua","f7ot6i4"],"midiOptionIds":[],"linkableActions":{"toggleActivate":"jw3yfb0"},"linkType":"node"},"mdqy0x9":{"title":"lfo","input":{"id":"lfo"},"id":"mdqy0x9","nodeId":"928kfik","nodeType":"param","modifierIds":["oo0ko1w","bu2jkow","1qsnupi"],"lfoOptionIds":["ude3fuj","0n4v4nm","ey7arcm"],"midiOptionIds":[],"linkableActions":{"toggleActivate":"jreqw2t"},"linkType":"node"},"4cd69xv":{"title":"lfo","input":{"id":"lfo"},"id":"4cd69xv","nodeId":"k8v9w13","nodeType":"param","modifierIds":["2bnabgm","rgpg4uv","xn071mc"],"lfoOptionIds":["dcid9y7","ptl3gkx","0gjaa69"],"midiOptionIds":[],"linkableActions":{"toggleActivate":"95yti2d"},"linkType":"node"}},"linkableActions":{"jcyapan":{"id":"jcyapan","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"o4imxh1","channel":"A"}},"inputLinkIds":[]},"pcur2h9":{"id":"pcur2h9","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"o4imxh1","channel":"B"}},"inputLinkIds":[]},"1mcpry9":{"id":"1mcpry9","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"o4imxh1","type":"active"}},"inputLinkIds":[]},"akqhown":{"id":"akqhown","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"o4imxh1","type":"opposite"}},"inputLinkIds":[]},"pnisikj":{"id":"pnisikj","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"o4imxh1"}},"inputLinkIds":[]},"7joltm2":{"id":"7joltm2","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"bwcbhnc","channel":"A"}},"inputLinkIds":[]},"o77wdca":{"id":"o77wdca","action":{"type":"R_SCENE_SELECT_CHANNEL","payload":{"id":"bwcbhnc","channel":"B"}},"inputLinkIds":[]},"hbo3m24":{"id":"hbo3m24","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"bwcbhnc","type":"active"}},"inputLinkIds":[]},"1m10ph8":{"id":"1m10ph8","action":{"type":"U_SCENE_SELECT_CHANNEL","payload":{"id":"bwcbhnc","type":"opposite"}},"inputLinkIds":[]},"kreswpj":{"id":"kreswpj","action":{"type":"SCENE_CLEAR_CHANNEL","payload":{"id":"bwcbhnc"}},"inputLinkIds":[]},"mngwmxq":{"id":"mngwmxq","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"59sl06n","linkId":"8ciljw6"}},"inputLinkIds":[]},"naps24x":{"id":"naps24x","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"o2y3foc","linkId":"yicpwlx"}},"inputLinkIds":[]},"pl8p2ge":{"id":"pl8p2ge","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"t57i74c","linkId":"8rqkjit"}},"inputLinkIds":[]},"a4rfv47":{"id":"a4rfv47","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"2rkglfv","linkId":"y91yr74"}},"inputLinkIds":[]},"tykfg94":{"id":"tykfg94","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"tcyawv3","linkId":"pqbp3yc"}},"inputLinkIds":[]},"53cehe3":{"id":"53cehe3","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"n6u2rgu","linkId":"oglnu99"}},"inputLinkIds":[]},"9heiqdi":{"id":"9heiqdi","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"6bcuie8","linkId":"ngb783x"}},"inputLinkIds":[]},"c66i99c":{"id":"c66i99c","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"1e6sq5r","linkId":"har1p3h"}},"inputLinkIds":[]},"jw3yfb0":{"id":"jw3yfb0","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"sxkn122","linkId":"efw1t57"}},"inputLinkIds":[]},"jreqw2t":{"id":"jreqw2t","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"928kfik","linkId":"mdqy0x9"}},"inputLinkIds":[]},"95yti2d":{"id":"95yti2d","action":{"type":"NODE_ACTIVE_INPUT_LINK_TOGGLE","payload":{"nodeId":"k8v9w13","linkId":"4cd69xv"}},"inputLinkIds":[]}},"macros":{"learningId":false,"items":{}},"ui":{"panelWidths":{"left":50},"isEditing":false,"openedNode":"sceneCrossfader"},"router":{"location":{"pathname":"/scenes/view","search":"","hash":"","key":"i4qf6b"}},"settings":{"clockGenerated":true,"clockBpm":120,"aspectW":16,"aspectH":9,"antialias":false,"throttledFPS":60},"form":{}} diff --git a/example-projects/trippy/sketches/blobs/config.js b/example-projects/trippy/sketches/blobs/config.js deleted file mode 100644 index 2c15721d..00000000 --- a/example-projects/trippy/sketches/blobs/config.js +++ /dev/null @@ -1,50 +0,0 @@ -module.exports = { - defaultTitle: 'Blobs', - params: [ - { - key: 'posZ', - title: 'Pos Z', - defaultValue: 0.5 - }, - { - key: 'rotSpeedX', - title: 'Rot Speed X', - defaultValue: 0.5 - }, - { - key: 'rotSpeedY', - title: 'Rot Speed Y', - defaultValue: 0.5 - }, - { - key: 'rotSpeedZ', - title: 'Rot Speed Z', - defaultValue: 0.5 - }, - { - key: 'blobSpeed', - title: 'Blob Speed', - defaultValue: 0.5 - }, - { - key: 'numBlobs', - title: 'Num Blobs', - defaultValue: 0.5 - }, - { - key: 'blobStrength', - title: 'Blob Strength', - defaultValue: 0.5 - } - ], - shots: [ - { - method: 'spin', - title: 'Spin' - }, - { - method: 'updateReflection', - title: 'Update Reflection' - } - ] -} diff --git a/example-projects/trippy/sketches/blobs/index.js b/example-projects/trippy/sketches/blobs/index.js deleted file mode 100644 index 174a77b0..00000000 --- a/example-projects/trippy/sketches/blobs/index.js +++ /dev/null @@ -1,88 +0,0 @@ -const { MeshStandardMaterial, CubeCamera, Object3D } = require('three') -const { MarchingCubes } = require('three-addons') -const TWEEN = require('@tweenjs/tween.js') - -class Blobs { - constructor (injectedScene) { - const { scene, renderer } = injectedScene - - this.root = new Object3D() - const scale = 1000 - this.scene = scene - this.renderer = renderer - this.cubeCamera = new CubeCamera(1, 3000, 32) - - setTimeout(() => { - this.cubeCamera.update(this.renderer, this.scene) - }, 100) - - const mat = new MeshStandardMaterial( - { color: 0xFFFFFF, envMap: this.cubeCamera.renderTarget, roughness: 0.1, metalness: 1.0 } - ) - this.object = new MarchingCubes(32, mat, true, true) - this.object.position.set(0, 0, 0) - this.object.scale.set(scale, scale, scale) - - this.object.enableUvs = false - this.object.enableColors = false - - this.group = new Object3D() - this.group.add(this.cubeCamera) - this.group.add(this.object) - this.root.add(this.group) - - this.blobTime = 0 - - this.props = { - spinSpeed: 0 - } - } - - spin () { - this.isAnimating = true - this.props.spinSpeed = 0.15 - - new TWEEN.Tween(this.props) - .to({ spinSpeed: 0 }, 1000) - .easing(TWEEN.Easing.Quadratic.Out) - .start() - .onComplete(() => { - this.isAnimating = false - }) - } - - updateReflection () { - this.cubeCamera.update(this.renderer, this.scene) - } - - update (params, time, frameDiff) { - this.blobTime += ((params.blobSpeed * 2) - 1) * frameDiff / 7 - const object = this.object - const numblobs = params.numBlobs * 50 - const rotSpeedZ = params.rotSpeedZ + this.props.spinSpeed - - object.reset() - - this.group.rotation.x += ((params.rotSpeedX * 2) - 1) * frameDiff - this.group.rotation.y += ((params.rotSpeedY * 2) - 1) * frameDiff - this.group.rotation.z += ((rotSpeedZ * 2) - 1) * frameDiff - - this.group.position.z = params.posZ * -10000 - - // fill the field with some metaballs - var i, ballx, bally, ballz, subtract, strength - - subtract = 12 - strength = (params.blobStrength * 3) / ((Math.sqrt(numblobs) - 1) / 4 + 1) - - for (i = 0; i < numblobs; i++) { - ballx = Math.sin(i + 1.26 * this.blobTime * (1.03 + 0.5 * Math.cos(0.21 * i))) * 0.27 + 0.5 - bally = Math.abs(Math.cos(i + 1.12 * this.blobTime * Math.cos(1.22 + 0.1424 * i))) * 0.27 + 0.5 - ballz = Math.cos(i + 1.32 * this.blobTime * 0.1 * Math.sin((0.92 + 0.53 * i))) * 0.27 + 0.5 - - object.addBall(ballx, bally, ballz, strength, subtract) - } - } -} - -module.exports = Blobs diff --git a/example-projects/trippy/sketches/env/config.js b/example-projects/trippy/sketches/env/config.js deleted file mode 100644 index 6f15f138..00000000 --- a/example-projects/trippy/sketches/env/config.js +++ /dev/null @@ -1,73 +0,0 @@ -module.exports = { - defaultTitle: 'Env', - params: [ - { - key: 'fogDensity', - title: 'Fog Density', - defaultValue: 0 - }, - { - key: 'colorH', - title: 'BG Color H', - defaultValue: 0 - }, - { - key: 'colorS', - title: 'BG Color S', - defaultValue: 0 - }, - { - key: 'colorL', - title: 'BG Color L', - defaultValue: 0 - }, - { - key: 'mainLightIntensity', - title: 'Main Light Intensity', - defaultValue: 1 - }, - { - key: 'centralPointLightDistance', - title: 'Central Point Light Distance', - defaultValue: 0.5 - }, - { - key: 'centralPointLightIntensity', - title: 'Central Point Light Intensity', - defaultValue: 0.5 - }, - { - key: 'centralPointLightH', - title: 'Central Point Light Color H', - defaultValue: 1 - }, - { - key: 'centralPointLightS', - title: 'Central Point Light Color S', - defaultValue: 1 - }, - { - key: 'centralPointLightL', - title: 'Central Point Light Color L', - defaultValue: 1 - } - ], - shots: [ - { - title: 'Camera 1', - method: 'camera1' - }, - { - title: 'Camera 2', - method: 'camera2' - }, - { - title: 'Camera 3', - method: 'camera3' - }, - { - title: 'Camera Random', - method: 'cameraRandom' - } - ] -} diff --git a/example-projects/trippy/sketches/env/index.js b/example-projects/trippy/sketches/env/index.js deleted file mode 100644 index 6a176599..00000000 --- a/example-projects/trippy/sketches/env/index.js +++ /dev/null @@ -1,73 +0,0 @@ -const THREE = require('three') - -class Env { - constructor (scene) { - this.root = new THREE.Object3D() - this.scene = scene - - this.clearColor = new THREE.Color() - this.scene.scene.fog = new THREE.FogExp2() - - this.ambientLight = new THREE.AmbientLight(0xffffff, 0.3) - this.directionalLight1 = new THREE.DirectionalLight(0xffffff, 0.7) - this.directionalLight2 = new THREE.DirectionalLight(0x256351, 0.7) - this.directionalLight1.position.set(1, 1, 1) - this.directionalLight1.position.set(-0.5, 0.5, 0.5) - - this.centralPointLight = new THREE.PointLight(0xffffff, 1, 10000) - // this.centralPointLight.position.z = -1000 - this.scene.scene.add(this.centralPointLight) - - this.scene.scene.add(this.directionalLight1) - this.scene.scene.add(this.directionalLight2) - this.scene.scene.add(this.ambientLight) - - this.props = {} - - this.pointLightTick = 0 - - this.camera1() - } - - cameraMove (x, y, z) { - this.scene.camera.position.x = x - this.scene.camera.position.y = y - this.scene.camera.position.z = z - this.scene.camera.lookAt(new THREE.Vector3(0, 0, 0)) - } - - camera1 () { - this.cameraMove(0, 0, 1000) - } - - camera2 () { - this.cameraMove(500, -500, 1000) - } - - camera3 () { - this.cameraMove(-500, 500, 500) - } - - cameraRandom () { - const a = [500, -500, 800, -800, 1000, -1000] - const r = () => Math.floor(Math.random() * a.length) - this.cameraMove(a[r()], a[r()], a[r()]) - } - - update (p, t) { - this.clearColor.setHSL(p.colorH, p.colorS, p.colorL) - this.scene.scene.fog.density = p.fogDensity * 0.01 - this.scene.scene.fog.color = this.clearColor - this.scene.scene.background = this.clearColor - - this.directionalLight1.intensity = 0.7 * p.mainLightIntensity - this.directionalLight2.intensity = 0.7 * p.mainLightIntensity - this.ambientLight.intensity = 0.3 * p.mainLightIntensity - - this.centralPointLight.color.setHSL(p.centralPointLightH, p.centralPointLightS, p.centralPointLightL) - this.centralPointLight.distance = Math.max(p.centralPointLightDistance * 30000, 0.001) - this.centralPointLight.intensity = p.centralPointLightIntensity * 10 - } -} - -module.exports = Env diff --git a/example-projects/trippy/sketches/tunnel/Block.js b/example-projects/trippy/sketches/tunnel/Block.js deleted file mode 100644 index 7f93bcf9..00000000 --- a/example-projects/trippy/sketches/tunnel/Block.js +++ /dev/null @@ -1,350 +0,0 @@ -const { Object3D, MeshLambertMaterial, Mesh } = require('three') -const TWEEN = require('@tweenjs/tween.js') -const PI_HALF = Math.PI / 2 - -const roundRot = rot => { - const diff = rot % PI_HALF - - if (diff === 0) { - return rot - } else { - return rot + (PI_HALF - diff) - } -} - -class Block { - constructor (x, y, z, blockSize, colors, towerWidth, towerHeight, wavyMats, cubeGeom) { - this.blockSize = blockSize - this.towerHeight = towerHeight - this.towerWidth = towerWidth - this.wavyMatSide = false - - this.shiftTween = false - - // Tweenable properties - this.props = { - scale: 1, - rotX: 0, - rotY: 0, - rotZ: 0, - cubeScale: 1, - xPos: x, - yPos: y, - zPos: z - } - this.nextProps = {} - - const wavyMatIndex = Math.floor(Math.random() * wavyMats.length) - - this.wavyMat = wavyMats[wavyMatIndex] - - this.defaultMats = [ - new MeshLambertMaterial({ - color: 0x000000 - }), - new MeshLambertMaterial({ - color: 0x555555 - }), - new MeshLambertMaterial({ - color: 0xffffff - }), - new MeshLambertMaterial({ - color: 0x222222 - }), - new MeshLambertMaterial({ - color: 0x444444 - }), - new MeshLambertMaterial({ - color: 0x999999 - }) - ] - - this.mats = this.defaultMats.slice(0) - - this.cube = new Mesh(cubeGeom, this.mats) - this.group = new Object3D() - this.group.add(this.cube) - } - - change () { - if (Math.random() > 0.5) { - this.toggle() - } - } - - flash (boosted) { - this.cube.material = this.defaultMats.slice(0) - this.wavyMatSide = false - - if (boosted || Math.random() > 0.5) { - this.wavyMatSide = Math.floor(Math.random() * 4) - this.cube.material[this.wavyMatSide] = this.wavyMat - - if (boosted) { - this.wavyMatSide = 'force' - this.cube.material[Math.floor(Math.random() * 4)] = this.wavyMat - this.cube.material[Math.floor(Math.random() * 4)] = this.wavyMat - this.cube.material[Math.floor(Math.random() * 4)] = this.wavyMat - } - } - } - - flashAllOn () { - this.wavyMatSide = 'force' - this.cube.material = this.wavyMat - } - - flashAllOff () { - this.wavyMatSide = false - this.cube.material = this.defaultMats.slice(0) - } - - spin () { - const axis = ['X', 'Y', 'Z'] - const nextRot = { - rotX: roundRot(this.props.rotX), - rotY: roundRot(this.props.rotY), - rotZ: roundRot(this.props.rotZ) - } - const i = Math.floor(Math.random() * 3) - nextRot[`rot${axis[i]}`] += Math.PI / 2 - - new TWEEN.Tween(this.props) - .to(nextRot, this.blockSpinSpeed) - .easing(TWEEN.Easing.Quadratic.Out) - .start() - } - - flicker (hide, cb) { - const numFlicks = 5 - let i = 0 - const flick = () => { - if (i > numFlicks) { - this.group.visible = !hide - if (cb) cb() - } else { - this.group.visible = !this.group.visible - setTimeout(flick, Math.random() * 100) - i++ - } - } - - flick() - } - - toggle () { - if (this.visible) { - this.visible = false - } else { - this.visible = true - } - - const s = this.visible ? 1 : 0.001 - const r = this.visible ? 0 : Math.PI - - new TWEEN.Tween(this.props) - .to({ scale: s, rot: r }, 500) - .easing(TWEEN.Easing.Quadratic.Out) - .start() - } - - move (blocks) { - const numBlocks = this.towerWidth - 1 - - let nextMove = {} - let doTween - - let moves = { - up: { - prop: 'yPos', - val: Math.round(this.props.yPos) + 1, - enabled: true - }, - down: { - prop: 'yPos', - val: Math.round(this.props.yPos) - 1, - enabled: true - }, - left: { - prop: 'xPos', - val: Math.round(this.props.xPos) + 1, - enabled: true - }, - right: { - prop: 'xPos', - val: Math.round(this.props.xPos) - 1, - enabled: true - }, - forward: { - prop: 'zPos', - val: Math.round(this.props.zPos) + 1, - enabled: true - }, - backward: { - prop: 'zPos', - val: Math.round(this.props.zPos) - 1, - enabled: true - } - } - - for (let i = 0; i < blocks.length; i++) { - const props = blocks[i].props - const nextProps = blocks[i].nextProps - - if ( - ( - props.xPos === this.props.xPos && - props.yPos === this.props.yPos && - props.zPos === moves.forward.val || - moves.forward.val > this.towerHeight - 1 - ) || - ( - nextProps.xPos === this.props.xPos && - nextProps.yPos === this.props.yPos && - nextProps.zPos === moves.forward.val - ) - ) { - moves.forward.enabled = false - } - - if ( - ( - props.xPos === this.props.xPos && - props.yPos === this.props.yPos && - props.zPos === moves.backward.val || - moves.forward.val < 0 - ) || - ( - nextProps.xPos === this.props.xPos && - nextProps.yPos === this.props.yPos && - nextProps.zPos === moves.backward.val - ) - ) { - moves.backward.enabled = false - } - - if ( - ( - props.xPos === this.props.xPos && - props.yPos === moves.up.val && - props.zPos === this.props.zPos || - moves.up.val > numBlocks - ) || - ( - nextProps.xPos === this.props.xPos && - nextProps.yPos === moves.up.val && - nextProps.zPos === this.props.zPos - ) - ) { - moves.up.enabled = false - } - - if ( - ( - props.xPos === this.props.xPos && - props.yPos === moves.down.val && - props.zPos === this.props.zPos || - moves.down.val < 0 - ) || - ( - nextProps.xPos === this.props.xPos && - nextProps.yPos === moves.down.val && - nextProps.zPos === this.props.zPos - ) - ) { - moves.down.enabled = false - } - - if ( - ( - props.xPos === moves.left.val && - props.yPos === this.props.yPos && - props.zPos === this.props.zPos || - moves.left.val > numBlocks - ) || - ( - nextProps.xPos === moves.left.val && - nextProps.yPos === this.props.yPos && - nextProps.zPos === this.props.zPos - ) - ) { - moves.left.enabled = false - } - - if ( - ( - props.xPos === moves.right.val && - props.yPos === this.props.yPos && - props.zPos === this.props.zPos || - moves.right.val < 0 - ) || - ( - nextProps.xPos === moves.right.val && - nextProps.yPos === this.props.yPos && - nextProps.zPos === this.props.zPos - ) - ) { - moves.right.enabled = false - } - } - - if (this.props.yPos === 2) { - if (moves.right.val === 2) moves.right.enabled = false - if (moves.left.val === 2) moves.left.enabled = false - } - - if (this.props.xPos === 2) { - if (moves.up.val === 2) moves.up.enabled = false - if (moves.down.val === 2) moves.down.enabled = false - } - - const permittedMoves = - Object.keys(moves).filter(key => - moves[key].enabled - ) - - if (permittedMoves.length) { - const roundMoves = { - xPos: Math.round(this.props.xPos), - yPos: Math.round(this.props.yPos), - zPos: Math.round(this.props.zPos) - } - - const i = Math.floor(Math.random() * permittedMoves.length) - const move = moves[permittedMoves[i]] - - nextMove = Object.assign({}, roundMoves, { [move.prop]: move.val }) - - doTween = true - } - - if (doTween) { - this.nextProps = Object.assign({}, this.props, nextMove) - - this.shiftTween = new TWEEN.Tween(this.props) - .to(nextMove, this.blockShiftSpeed) - .easing(TWEEN.Easing.Bounce.Out) - .start() - } - } - - update (p, t, f, color) { - const blockSize = this.blockSize - const towerHeight = this.towerHeight - - const { blockShiftSpeed, blockSpinSpeed } = p - - this.blockShiftSpeed = 1000 - (1000 * blockShiftSpeed) - this.blockSpinSpeed = 1000 - (1000 * blockSpinSpeed) - - this.group.rotation.x = this.props.rotX - this.group.rotation.y = this.props.rotY - this.group.rotation.z = this.props.rotZ - - this.group.position.x = this.props.xPos * blockSize - blockSize * 2 - this.group.position.y = this.props.yPos * blockSize - blockSize * 2 - this.group.position.z = this.props.zPos * blockSize - blockSize * towerHeight / 2 - } -} - -module.exports = Block diff --git a/example-projects/trippy/sketches/tunnel/Pipe.js b/example-projects/trippy/sketches/tunnel/Pipe.js deleted file mode 100644 index bf822307..00000000 --- a/example-projects/trippy/sketches/tunnel/Pipe.js +++ /dev/null @@ -1,94 +0,0 @@ -const { TubeGeometry, Mesh, Vector3, CubicBezierCurve3, Geometry } = require('three') -const _ = require('lodash') - -class Pipe { - constructor (blockSize, towerHeight, material) { - const boundry = [2, 2] - - // const cubeGeom = new BoxGeometry(blockSize, blockSize, blockSize) - // const cubeMaterial = new MeshBasicMaterial({ wireframe: true }) - // const blockHelper = new Mesh(cubeGeom, cubeMaterial) - this.geom = new Geometry() - - const createBend = (prevDir, nextDir) => { - const bendCurve = new CubicBezierCurve3( - new Vector3(-prevDir[0] * blockSize / 2, -prevDir[1] * blockSize / 2, -prevDir[2] * blockSize / 2), - new Vector3(0, 0, 0), - new Vector3(0, 0, 0), - new Vector3(nextDir[0] * blockSize / 2, nextDir[1] * blockSize / 2, nextDir[2] * blockSize / 2) - ) - const bendGeom = new TubeGeometry(bendCurve, 10, 10, 8, false) - // bend.add(blockHelper.clone()) - return bendGeom - } - - const positions = [] - let nextPos = [1, 0, 0] - let failCount = 0 - const failLimit = 50 - let z = 0 - let i = 0 - while (z > -towerHeight && failCount < failLimit) { - const calc = () => { - let rp - if (Math.random() > 0.5) { - // Encourage twisty pipes by only allowing - // them to go forwards 50% of the time - rp = Math.floor(Math.random() * 3) - } else { - rp = Math.floor(Math.random() * 2) - } - if (rp === 2) { - z-- - } - const r = rp === 2 ? -1 : Math.random() > 0.5 ? 1 : -1 - const dir = [0, 0, 0] - dir[rp] = r - - nextPos = [pos[0] + dir[0], pos[1] + dir[1], pos[2] + dir[2]] - let allowNextPos = true - - if (nextPos[0] > boundry[0] || nextPos[0] < -boundry[0] || - nextPos[1] > boundry[1] || nextPos[1] < -boundry[1] || - (nextPos[0] === 0 && nextPos[1] === 0) - ) { - allowNextPos = false - } else { - for (let j = 0; j < i; j++) { - const p = positions[j] - if (_.isEqual(nextPos, p.pos)) { - allowNextPos = false - } - } - } - - if (allowNextPos) { - failCount = 0 - positions[i] = { dir, pos } - i++ - } else if (failCount < failLimit) { - failCount++ - calc() - } - } - const pos = nextPos - - calc() - } - - for (let i = 0; i < positions.length; i++) { - const p = positions[i].pos - const d = positions[i].dir - const prevDir = i > 0 ? positions[i - 1].dir : [1, 0, 0] - - const s = createBend(prevDir, d) - s.translate(p[0] * blockSize, p[1] * blockSize, p[2] * blockSize) - - this.geom.merge(s) - } - - this.group = new Mesh(this.geom, material) - } -} - -module.exports = Pipe diff --git a/example-projects/trippy/sketches/tunnel/Pipes.js b/example-projects/trippy/sketches/tunnel/Pipes.js deleted file mode 100644 index 510af015..00000000 --- a/example-projects/trippy/sketches/tunnel/Pipes.js +++ /dev/null @@ -1,75 +0,0 @@ -const { Object3D, MeshBasicMaterial } = require('three') -const Pipe = require('./Pipe') - -class Pipes { - constructor (blockSize, towerHeight) { - this.pipes = [] - this.numPipes = 3 - this.group = new Object3D() - this.group.visible = true - this.material = new MeshBasicMaterial({ wireframe: true, color: 0x2EFFFD, fog: false }) - - for (let i = 0; i < this.numPipes; i++) { - const pipe = new Pipe(blockSize, towerHeight, this.material) - this.pipes.push(pipe) - this.group.add(pipe.group) - } - - this.isRotating = false - } - - randomPipeIndex () { - return Math.floor(Math.random() * this.numPipes) - } - - flicker (hide, cb) { - const numFlicks = 5 - let i = 0 - const flick = () => { - if (i > numFlicks) { - this.group.visible = !hide - if (cb) cb() - } else { - this.group.visible = !this.group.visible - setTimeout(flick, Math.random() * 100) - i++ - } - } - - flick() - } - - swap () { - let randomIndex - const r = () => { - randomIndex = this.randomPipeIndex() - if (randomIndex === this.visiblePipe) r() - } - r() - this.visiblePipe = randomIndex - for (let i = 0; i < this.numPipes; i++) { - const pipe = this.pipes[i] - if (randomIndex === i) { - pipe.group.visible = true - } else { - pipe.group.visible = false - } - } - } - - allOn () { - for (let i = 0; i < this.numPipes; i++) { - this.pipes[i].group.visible = true - } - } - - update (color) { - if (this.isRotating) { - this.group.rotation.z -= 0.015 - } - - this.material.color = color - } -} - -module.exports = Pipes diff --git a/example-projects/trippy/sketches/tunnel/Tower.js b/example-projects/trippy/sketches/tunnel/Tower.js deleted file mode 100644 index 8dc05831..00000000 --- a/example-projects/trippy/sketches/tunnel/Tower.js +++ /dev/null @@ -1,198 +0,0 @@ -const { Object3D, ShaderMaterial, Color, BoxBufferGeometry, UniformsUtils, UniformsLib } = require('three') -const Block = require('./Block') -const Pipes = require('./Pipes') -const glsl = require('glslify') -const vertShader = glsl.file('./vert.glsl') -const fragShader = glsl.file('./frag.glsl') - -class Tower { - constructor (blockSize, colors, towerWidth, towerHeight, startPos) { - const now = Date.now() - this.pipes = new Pipes(blockSize, towerHeight) - const numWavyMats = 5 - this.delta = now - this.gamma = now - this.beta = now - this.alpha = now + 500 - this.blocks = [] - this.group = new Object3D() - this.group.position.z = startPos - this.maxZ = towerHeight * blockSize - this.minZ = -this.maxZ - this.tower = new Object3D() - this.group.add(this.tower) - this.group.add(this.pipes.group) - this.isFlickering = false - - this.props = { - perlinTime: 0 - } - - this.wavyMats = [] - - for (let i = 0; i < numWavyMats; i++) { - const uniforms = UniformsUtils.merge([ - UniformsLib[ 'fog' ], - { - iTime: { value: Date.now(), type: 'f' }, - seed: { value: Math.random() * 100 }, - color1: { value: new Color(colors[0]) }, - color2: { value: new Color(0x2EFFFD) } - } - ]) - const mat = new ShaderMaterial({ - vertexShader: vertShader, - fragmentShader: fragShader, - fog: false, - uniforms - }) - - this.wavyMats.push(mat) - } - - const cubeGeom = new BoxBufferGeometry(blockSize, blockSize, blockSize) - - for (let x = 0; x < towerWidth; x++) { - for (let y = 0; y < towerWidth; y++) { - for (let z = 0; z < towerHeight - 2; z++) { - if (!(x === 2 && y === 2) && Math.random() > 0.5) { - const newBlock = new Block( - x, y, z, blockSize, colors, towerWidth, towerHeight, this.wavyMats, cubeGeom - ) - this.tower.add(newBlock.group) - this.blocks.push(newBlock) - } - } - } - } - - this.flashBlocks() - } - - removeBlocks () { - for (let i = 0; i < this.blocks.length; i++) { - if (Math.random() > 0.8) { - this.blocks[i].flicker(true) - } - } - } - - addBlocks () { - for (let i = 0; i < this.blocks.length; i++) { - if (Math.random() > 0.8) { - this.blocks[i].flicker() - } - } - } - - shiftBlocks () { - for (let i = 0; i < this.blocks.length; i++) { - this.blocks[i].move(this.blocks) - } - } - - spinBlocks () { - for (let i = 0; i < this.blocks.length; i++) { - if (Math.random() > 0.5) { - this.blocks[i].spin() - } - } - } - - flashBlocks () { - for (let i = 0; i < this.blocks.length; i++) { - this.blocks[i].flash() - } - } - - flashAllBlocksOn () { - for (let i = 0; i < this.blocks.length; i++) { - this.blocks[i].flashAllOn() - } - } - - flashAllBlocksOff () { - for (let i = 0; i < this.blocks.length; i++) { - this.blocks[i].flashAllOff() - } - } - - boostedFlashBlocks () { - for (let i = 0; i < this.blocks.length; i++) { - this.blocks[i].flash(true) - } - } - - pipesOn () { - this.pipes.flicker() - } - - pipesOff () { - this.pipes.flicker(true) - } - - pipesSwap () { - this.pipes.group.visible = true - this.pipes.swap() - } - - pipesAllOn () { - this.pipes.flicker() - this.pipes.allOn() - } - - flicker (cb) { - const numFlicks = 5 - let i = 0 - const flick = () => { - if (i > numFlicks) { - this.group.visible = true - cb() - } else { - this.group.visible = !this.group.visible - setTimeout(flick, Math.random() * 50) - i++ - } - } - - flick() - } - - update (p, t, f, color) { - const blocks = this.blocks - let { tunnelScale, zSpeed, perlinSpeed } = p - const speed = ((zSpeed * 2) - 1) * f * 20 - const scale = 1 + (10 * tunnelScale) - - this.props.perlinTime += perlinSpeed * f / 10 - - this.group.position.z += speed - - if (this.group.position.z < this.minZ && !this.isFlickering) { - this.isFlickering = true - this.flicker(() => { - this.isFlickering = false - const diff = Math.abs(this.group.position.z) - Math.abs(this.minZ) - this.group.position.z = this.maxZ - diff - }) - } else if (this.group.position.z > this.maxZ && !this.isFlickering) { - const diff = this.group.position.z - this.maxZ - this.group.position.z = this.minZ + diff - } - - this.tower.scale.set(scale, scale, 1) - - this.pipes.update(color) - - for (let i = 0; i < blocks.length; i++) { - blocks[i].update(p, t, f, color) - } - - for (let i = 0; i < this.wavyMats.length; i++) { - this.wavyMats[i].uniforms.iTime.value = this.props.perlinTime - this.wavyMats[i].uniforms.color2.value = color - } - } -} - -module.exports = Tower diff --git a/example-projects/trippy/sketches/tunnel/chunks/common.glsl b/example-projects/trippy/sketches/tunnel/chunks/common.glsl deleted file mode 100644 index 2ed7888d..00000000 --- a/example-projects/trippy/sketches/tunnel/chunks/common.glsl +++ /dev/null @@ -1,95 +0,0 @@ -#define PI 3.14159265359 -#define PI2 6.28318530718 -#define PI_HALF 1.5707963267949 -#define RECIPROCAL_PI 0.31830988618 -#define RECIPROCAL_PI2 0.15915494 -#define LOG2 1.442695 -#define EPSILON 1e-6 - -#define saturate(a) clamp( a, 0.0, 1.0 ) -#define whiteCompliment(a) ( 1.0 - saturate( a ) ) - -float pow2( const in float x ) { return x*x; } -float pow3( const in float x ) { return x*x*x; } -float pow4( const in float x ) { float x2 = x*x; return x2*x2; } -float average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); } -// expects values in the range of [0,1]x[0,1], returns values in the [0,1] range. -// do not collapse into a single function per: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ -highp float rand( const in vec2 uv ) { - const highp float a = 12.9898, b = 78.233, c = 43758.5453; - highp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI ); - return fract(sin(sn) * c); -} - -struct IncidentLight { - vec3 color; - vec3 direction; - bool visible; -}; - -struct ReflectedLight { - vec3 directDiffuse; - vec3 directSpecular; - vec3 indirectDiffuse; - vec3 indirectSpecular; -}; - -struct GeometricContext { - vec3 position; - vec3 normal; - vec3 viewDir; -}; - -vec3 transformDirection( in vec3 dir, in mat4 matrix ) { - - return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); - -} - -// http://en.wikibooks.org/wiki/GLSL_Programming/Applying_Matrix_Transformations -vec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) { - - return normalize( ( vec4( dir, 0.0 ) * matrix ).xyz ); - -} - -vec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) { - - float distance = dot( planeNormal, point - pointOnPlane ); - - return - distance * planeNormal + point; - -} - -float sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) { - - return sign( dot( point - pointOnPlane, planeNormal ) ); - -} - -vec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) { - - return lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine; - -} - -mat3 transposeMat3( const in mat3 m ) { - - mat3 tmp; - - tmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x ); - tmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y ); - tmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z ); - - return tmp; - -} - -// https://en.wikipedia.org/wiki/Relative_luminance -float linearToRelativeLuminance( const in vec3 color ) { - - vec3 weights = vec3( 0.2126, 0.7152, 0.0722 ); - - return dot( weights, color.rgb ); - -} diff --git a/example-projects/trippy/sketches/tunnel/chunks/fog_fragment.glsl b/example-projects/trippy/sketches/tunnel/chunks/fog_fragment.glsl deleted file mode 100644 index 8307a324..00000000 --- a/example-projects/trippy/sketches/tunnel/chunks/fog_fragment.glsl +++ /dev/null @@ -1,15 +0,0 @@ -#ifdef USE_FOG - - #ifdef FOG_EXP2 - - float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) ); - - #else - - float fogFactor = smoothstep( fogNear, fogFar, fogDepth ); - - #endif - - gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); - -#endif diff --git a/example-projects/trippy/sketches/tunnel/chunks/fog_pars_fragment.glsl b/example-projects/trippy/sketches/tunnel/chunks/fog_pars_fragment.glsl deleted file mode 100644 index 26c4093c..00000000 --- a/example-projects/trippy/sketches/tunnel/chunks/fog_pars_fragment.glsl +++ /dev/null @@ -1,17 +0,0 @@ -#ifdef USE_FOG - - uniform vec3 fogColor; - varying float fogDepth; - - #ifdef FOG_EXP2 - - uniform float fogDensity; - - #else - - uniform float fogNear; - uniform float fogFar; - - #endif - -#endif diff --git a/example-projects/trippy/sketches/tunnel/chunks/fog_pars_vertex.glsl b/example-projects/trippy/sketches/tunnel/chunks/fog_pars_vertex.glsl deleted file mode 100644 index d27a1a1e..00000000 --- a/example-projects/trippy/sketches/tunnel/chunks/fog_pars_vertex.glsl +++ /dev/null @@ -1,5 +0,0 @@ -#ifdef USE_FOG - - varying float fogDepth; - -#endif diff --git a/example-projects/trippy/sketches/tunnel/chunks/fog_vertex.glsl b/example-projects/trippy/sketches/tunnel/chunks/fog_vertex.glsl deleted file mode 100644 index 549ea8d2..00000000 --- a/example-projects/trippy/sketches/tunnel/chunks/fog_vertex.glsl +++ /dev/null @@ -1,5 +0,0 @@ -vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 ); - -#ifdef USE_FOG -fogDepth = -mvPosition.z; -#endif diff --git a/example-projects/trippy/sketches/tunnel/config.js b/example-projects/trippy/sketches/tunnel/config.js deleted file mode 100644 index 96c811e6..00000000 --- a/example-projects/trippy/sketches/tunnel/config.js +++ /dev/null @@ -1,109 +0,0 @@ -module.exports = { - defaultTitle: 'Tunnel', - params: [ - { - key: 'zSpeed', - title: 'Z Speed', - defaultValue: 0.5 - }, - { - key: 'tunnelScale', - title: 'Tunnel Scale', - defaultValue: 0 - }, - { - key: 'rotSpeed', - title: 'Rot Speed', - defaultValue: 0 - }, - { - key: 'rotTweenSpeed', - title: 'Rot Tween Speed', - defaultValue: 0.5 - }, - { - key: 'blockShiftSpeed', - title: 'Block Shift Speed', - defaultValue: 0.5 - }, - { - key: 'blockSpinSpeed', - title: 'Block Spin Speed', - defaultValue: 0.5 - }, - { - key: 'perlinSpeed', - title: 'Perlin Speed', - defaultValue: 0.5 - }, - { - key: 'colorH', - title: 'color H', - defaultValue: 0.5 - }, - { - key: 'colorS', - title: 'color S', - defaultValue: 0.5 - }, - { - key: 'colorL', - title: 'color L', - defaultValue: 0.5 - } - ], - shots: [ - { - method: 'quarterTurn', - title: 'Quarter Turn' - }, - { - method: 'removeBlocks', - title: 'Remove Blocks' - }, - { - method: 'addBlocks', - title: 'Add Blocks' - }, - { - method: 'shiftBlocks', - title: 'Shift Blocks' - }, - { - method: 'spinBlocks', - title: 'Spin Blocks' - }, - { - method: 'flashBlocks', - title: 'Flash Blocks' - }, - { - method: 'boostedFlashBlocks', - title: 'Boosted Flash Blocks' - }, - { - method: 'flashAllBlocksOn', - title: 'Flash All On' - }, - { - method: 'flashAllBlocksOff', - title: 'Flash All Off' - }, - { - method: 'pipesOn', - title: 'Pipes On' - }, - { - method: 'pipesOff', - title: 'Pipes Off' - }, - { - method: 'pipesSwap', - title: 'Pipes Swap' - }, - { - method: 'pipesAllOn', - title: 'Pipes All On' - } - ] -} diff --git a/example-projects/trippy/sketches/tunnel/frag.glsl b/example-projects/trippy/sketches/tunnel/frag.glsl deleted file mode 100644 index 644f018b..00000000 --- a/example-projects/trippy/sketches/tunnel/frag.glsl +++ /dev/null @@ -1,48 +0,0 @@ -varying vec2 vUv; -varying vec3 vWorldPosition; - -uniform vec2 iResolution; -uniform float iTime; -uniform float seed; -uniform vec3 color1; -uniform vec3 color2; - -#pragma glslify: import('./chunks/common.glsl') -#pragma glslify: import('./chunks/fog_pars_fragment.glsl') - -vec2 GetGradient(vec2 intPos, float t) { - float rand = fract(sin(dot(intPos, vec2(12.9898, 78.233))) * seed);; - float angle = 6.283185 * rand + 4.0 * t * rand; - return vec2(cos(angle), sin(angle)); -} - - -float Pseudo3dNoise(vec3 pos) { - vec2 i = floor(pos.xy); - vec2 f = pos.xy - i; - vec2 blend = f * f * (3.0 - 2.0 * f); - float noiseVal = - mix( - mix( - dot(GetGradient(i + vec2(0, 0), pos.z), f - vec2(0, 0)), - dot(GetGradient(i + vec2(1, 0), pos.z), f - vec2(1, 0)), - blend.x), - mix( - dot(GetGradient(i + vec2(0, 1), pos.z), f - vec2(0, 1)), - dot(GetGradient(i + vec2(1, 1), pos.z), f - vec2(1, 1)), - blend.x), - blend.y - ); - return noiseVal / 0.7; // normalize to about [-1..1] -} - - -void main() { - - - vec2 uv = vUv.xy; - float noiseVal = 0.5 + 0.5 * Pseudo3dNoise(vec3(uv * 1.0, iTime / 2.)); - noiseVal = mod(noiseVal, 0.1) * 10.; - gl_FragColor = vec4(mix(color1, color2, noiseVal), 1.); - #pragma glslify: import('./chunks/fog_fragment.glsl') -} diff --git a/example-projects/trippy/sketches/tunnel/index.js b/example-projects/trippy/sketches/tunnel/index.js deleted file mode 100644 index 29ebb8fd..00000000 --- a/example-projects/trippy/sketches/tunnel/index.js +++ /dev/null @@ -1,117 +0,0 @@ -const THREE = require('three') -const TWEEN = require('@tweenjs/tween.js') -const Tower = require('./Tower') - -class Tunnel { - constructor (scene) { - scene.scene.fog = new THREE.FogExp2() - this.root = new THREE.Group() - const groupSize = 500 - const towerHeight = 10 - const towerWidth = 5 - const blockSize = groupSize / towerWidth - - this.isRotating = false - this.colors = [0x004C48, 0x962515] - - this.rotator = new THREE.Object3D() - this.rotator.position.z = 1000 - this.root.add(this.rotator) - - this.tower1 = new Tower(blockSize, this.colors, towerWidth, towerHeight, -towerHeight * blockSize / 2) - this.tower2 = new Tower(blockSize, this.colors, towerWidth, towerHeight, towerHeight * blockSize / 2) - this.rotator.add(this.tower1.group) - this.rotator.add(this.tower2.group) - - this.rotatorProps = { - rotZ: 0 - } - } - - quarterTurn () { - let diff = Math.round(this.rotatorProps.rotZ % (Math.PI / 4) * 1000) / 1000 - - new TWEEN.Tween(this.rotatorProps) - .to({ rotZ: this.rotatorProps.rotZ + ((Math.PI / 4) - diff) }, this.rotTweenSpeed) - .easing(TWEEN.Easing.Quadratic.Out) - .start() - } - - removeBlocks () { - this.tower1.removeBlocks() - this.tower2.removeBlocks() - } - - addBlocks () { - this.tower1.addBlocks() - this.tower2.addBlocks() - } - - shiftBlocks () { - this.tower1.shiftBlocks() - this.tower2.shiftBlocks() - } - - spinBlocks () { - this.tower1.spinBlocks() - this.tower2.spinBlocks() - } - - flashBlocks () { - this.tower1.flashBlocks() - this.tower2.flashBlocks() - } - - flashAllBlocksOn () { - this.tower1.flashAllBlocksOn() - this.tower2.flashAllBlocksOn() - } - - flashAllBlocksOff () { - this.tower1.flashAllBlocksOff() - this.tower2.flashAllBlocksOff() - } - - boostedFlashBlocks () { - this.tower1.boostedFlashBlocks() - this.tower2.boostedFlashBlocks() - } - - pipesOn () { - this.tower1.pipesOn() - this.tower2.pipesOn() - } - - pipesOff () { - this.tower1.pipesOff() - this.tower2.pipesOff() - } - - pipesSwap () { - this.tower1.pipesSwap() - this.tower2.pipesSwap() - } - - pipesAllOn () { - this.tower1.pipesAllOn() - this.tower2.pipesAllOn() - } - - update (p, t, f) { - const { rotSpeed, rotTweenSpeed, colorH, colorS, colorL } = p - const color = new THREE.Color().setHSL(colorH, colorS, colorL) - this.tower1.update(p, t, f, color) - this.tower2.update(p, t, f, color) - - this.rotTweenSpeed = 1000 - (rotTweenSpeed * 1000) - - this.rotatorProps.rotZ += rotSpeed * 0.5 - - this.rotator.rotation.z = this.rotatorProps.rotZ - this.rotator.scale.set(25, 25, 25) - - TWEEN.update() - } -} - -module.exports = Tunnel diff --git a/example-projects/trippy/sketches/tunnel/vert.glsl b/example-projects/trippy/sketches/tunnel/vert.glsl deleted file mode 100644 index 72d85f61..00000000 --- a/example-projects/trippy/sketches/tunnel/vert.glsl +++ /dev/null @@ -1,17 +0,0 @@ -varying vec3 vWorldPosition; -varying vec2 vUv; - -#pragma glslify: import('./chunks/fog_pars_vertex.glsl') - -void main() { - - vUv = uv; - - vec4 worldPosition = modelMatrix * vec4( position, 1.0 ); - vWorldPosition = worldPosition.xyz; - - #pragma glslify: import('./chunks/fog_vertex.glsl') - - gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); - -} diff --git a/example-projects/yarn.lock b/example-projects/yarn.lock deleted file mode 100644 index 5cad8fb9..00000000 --- a/example-projects/yarn.lock +++ /dev/null @@ -1,598 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@choojs/findup@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" - dependencies: - commander "^2.15.1" - -"@tweenjs/tween.js@^17.2.0": - version "17.2.0" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-17.2.0.tgz#21f89b709bafc4b303adae7a83b4f35a0d9e4796" - -acorn@^5.0.0: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -bl@^1.0.0: - version "1.2.2" - resolved "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - -commander@^2.15.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -define-properties@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - dependencies: - object-keys "^1.0.12" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -duplexify@^3.4.5: - version "3.6.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -end-of-stream@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -es-abstract@^1.5.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escodegen@^1.8.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - -estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -events@^1.0.2: - version "1.1.1" - resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -falafel@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" - dependencies: - acorn "^5.0.0" - foreach "^2.0.5" - isarray "0.0.1" - object-keys "^1.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" - -for-each@~0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - dependencies: - is-callable "^1.1.3" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -glob@~7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glsl-inject-defines@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" - dependencies: - glsl-token-inject-block "^1.0.0" - glsl-token-string "^1.0.1" - glsl-tokenizer "^2.0.2" - -glsl-resolve@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" - dependencies: - resolve "^0.6.1" - xtend "^2.1.2" - -glsl-token-assignments@^2.0.0: - version "2.0.2" - resolved "http://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" - -glsl-token-defines@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" - dependencies: - glsl-tokenizer "^2.0.0" - -glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: - version "1.1.2" - resolved "http://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" - -glsl-token-descope@^1.0.2: - version "1.0.2" - resolved "http://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" - dependencies: - glsl-token-assignments "^2.0.0" - glsl-token-depth "^1.1.0" - glsl-token-properties "^1.0.0" - glsl-token-scope "^1.1.0" - -glsl-token-inject-block@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" - -glsl-token-properties@^1.0.0: - version "1.0.1" - resolved "http://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" - -glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: - version "1.1.2" - resolved "http://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" - -glsl-token-string@^1.0.1: - version "1.0.1" - resolved "http://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" - -glsl-token-whitespace-trim@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" - -glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" - dependencies: - through2 "^0.6.3" - -glslify-bundle@^5.0.0: - version "5.0.0" - resolved "http://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.0.0.tgz#0252ada1ef9df30b660006e0bb21fd130b486e42" - dependencies: - glsl-inject-defines "^1.0.1" - glsl-token-defines "^1.0.0" - glsl-token-depth "^1.1.1" - glsl-token-descope "^1.0.2" - glsl-token-scope "^1.1.1" - glsl-token-string "^1.0.1" - glsl-token-whitespace-trim "^1.0.0" - glsl-tokenizer "^2.0.2" - murmurhash-js "^1.0.0" - shallow-copy "0.0.1" - -glslify-deps@^1.2.5: - version "1.3.1" - resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.1.tgz#dfa6962322454a91ecc4de25b5e710415b0c89ad" - dependencies: - "@choojs/findup" "^0.2.0" - events "^1.0.2" - glsl-resolve "0.0.1" - glsl-tokenizer "^2.0.0" - graceful-fs "^4.1.2" - inherits "^2.0.1" - map-limit "0.0.1" - resolve "^1.0.0" - -glslify@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/glslify/-/glslify-6.3.1.tgz#af74f4a47497603f21498ad14172396cddc8062f" - dependencies: - bl "^1.0.0" - concat-stream "^1.5.2" - duplexify "^3.4.5" - falafel "^2.1.0" - from2 "^2.3.0" - glsl-resolve "0.0.1" - glsl-token-whitespace-trim "^1.0.0" - glslify-bundle "^5.0.0" - glslify-deps "^1.2.5" - minimist "^1.2.0" - resolve "^1.1.5" - stack-trace "0.0.9" - static-eval "^2.0.0" - tape "^4.6.0" - through2 "^2.0.1" - xtend "^4.0.0" - -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - -has@^1.0.1, has@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - dependencies: - function-bind "^1.1.1" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - dependencies: - has-symbols "^1.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - -map-limit@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" - dependencies: - once "~1.3.0" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@~1.2.0: - version "1.2.0" - resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -murmurhash-js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" - -object-inspect@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - -object-keys@^1.0.12, object-keys@^1.0.6: - version "1.0.12" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-parse@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.5: - version "2.3.6" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -resolve@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" - -resolve@^1.0.0, resolve@^1.1.5: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - dependencies: - path-parse "^1.0.5" - -resolve@~1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - dependencies: - path-parse "^1.0.5" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - dependencies: - through "~2.3.4" - -safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -shallow-copy@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - -source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -stack-trace@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" - -static-eval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.0.tgz#0e821f8926847def7b4b50cda5d55c04a9b13864" - dependencies: - escodegen "^1.8.1" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -string.prototype.trim@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -tape@^4.6.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9" - dependencies: - deep-equal "~1.0.1" - defined "~1.0.0" - for-each "~0.3.3" - function-bind "~1.1.1" - glob "~7.1.2" - has "~1.0.3" - inherits "~2.0.3" - minimist "~1.2.0" - object-inspect "~1.6.0" - resolve "~1.7.1" - resumer "~0.0.0" - string.prototype.trim "~1.1.2" - through "~2.3.8" - -three-addons@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/three-addons/-/three-addons-1.2.0.tgz#a36293e2489bdda08be8efc31291485b41de1560" - dependencies: - three "^0.92.0" - -three@^0.92.0: - version "0.92.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.92.0.tgz#8d3d1f5af890e62da7f4cb45d20c09fa51057dcd" - -three@^0.97.0: - version "0.97.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.97.0.tgz#76141e1b0ace14246fe9198a458fefddc98a4e30" - -through2@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" diff --git a/external-assets/hedron.blend b/external-assets/hedron.blend new file mode 100644 index 00000000..93235e98 Binary files /dev/null and b/external-assets/hedron.blend differ diff --git a/external-assets/icon.svg b/external-assets/icon.svg new file mode 100644 index 00000000..34e4cab7 --- /dev/null +++ b/external-assets/icon.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/mockTests/inputLinks.test.js b/mockTests/inputLinks.test.js new file mode 100644 index 00000000..df546a67 --- /dev/null +++ b/mockTests/inputLinks.test.js @@ -0,0 +1,108 @@ +/** * SETUP ***/ + +import proxyquire from 'proxyquire' +import listen from 'redux-action-listeners' +import { createStore, applyMiddleware, combineReducers } from 'redux' + +import inputsReducer from '../src/store/inputs/reducer' +import nodesReducer from '../src/store/nodes/reducer' +import inputLinksReducer from '../src/store/inputLinks/reducer' + +import { constructMidiId } from '../src/utils/midiMessage' + +import { uInputLinkUpdateMidiInput } from '../src/store/inputLinks/actions' + +const rootReducer = combineReducers( + { + nodes: nodesReducer, + inputs: inputsReducer, + inputLinks: inputLinksReducer, + } +) + +let uniqueId +const uid = () => { + uniqueId++ + return 'id_' + uniqueId +} + +const inputLinksListener = proxyquire('../src/store/inputLinks/listener', { + 'uid': uid, +}).default + +const rootListener = { + types: 'all', + + handleAction (action, dispatched, store) { + inputLinksListener(action, store) + }, +} + +/** * TEST ***/ + +test('(mock) Input Links - Update link midi input', () => { + uniqueId = 0 + const messageType = 'controlChange' + const noteNum = 100 + const channel = 13 + + // State starts assuming some dropdown value have changed + const startState = { + nodes: { + option_a: { + key: 'channel', + value: channel, + }, + option_b: { + key: 'messageType', + value: messageType, + }, + option_c: { + key: 'noteNum', + value: noteNum, + }, + option_x: { + key: 'foo', + value: 1, + }, + link_a: { + id: 'link_a', + midiOptionIds: [ + 'option_a', 'option_b', 'option_c', + ], + input: { + id: 'midi_0_0', + type: 'midi', + }, + }, + }, + inputs: { + midi_0_0: { + assignedLinkIds: [ + 'link_a', + ], + }, + }, + inputLinks: { + nodeIds: ['link_a'], + }, + } + + const store = createStore(rootReducer, startState, applyMiddleware(listen(rootListener))) + + let state + + // The dropdown value has changed and so this action would be dispatched + store.dispatch(uInputLinkUpdateMidiInput('link_a')) + state = store.getState() + + const oldInput = state.inputs.midi_0_0 + expect(oldInput.assignedLinkIds.length).toBe(0) + + const newInputId = constructMidiId(messageType, noteNum, channel) + const newInput = state.inputs[newInputId] + expect(newInput.assignedLinkIds[0]).toBe('link_a') + + const link = state.nodes.link_a + expect(link.input.id).toBe(newInputId) +}) diff --git a/mockTests/scenes.spec.js b/mockTests/scenes.spec.js index 718c4c6d..61deed47 100644 --- a/mockTests/scenes.spec.js +++ b/mockTests/scenes.spec.js @@ -1,424 +1,426 @@ -import test from 'tape' -import proxyquire from 'proxyquire' -import listen from 'redux-action-listeners' -import { createStore, applyMiddleware, combineReducers } from 'redux' -import createSagaMiddleware from 'redux-saga' -const sagaMiddleware = createSagaMiddleware() -import { uSceneCreate, uSceneDelete, sceneSketchSelect, sceneRename } from '../src/store/scenes/actions' - -import { fork } from 'redux-saga/effects' -import { watchNodes } from '../src/store/nodes/sagas' -import sketchesReducer from '../src/store/sketches/reducer' -import scenesReducer from '../src/store/scenes/reducer' -import nodesReducer from '../src/store/nodes/reducer' -import uiReducer from '../src/store/ui/reducer' -import linkableActionsReducer from '../src/store/linkableActions/reducer' -import linkableActionsListener from '../src/store/linkableActions/listener' - -const rootReducer = combineReducers( - { - nodes: nodesReducer, - sketches: sketchesReducer, - scenes: scenesReducer, - linkableActions: linkableActionsReducer - } -) - -let uniqueId -const uid = () => { - uniqueId++ - return 'id_' + uniqueId -} - -const sceneUtils = { - generateSceneLinkableActionIds: id => ({ - foo: { - id: 'f01', - action: { type: 'FOO', payload: { id } } - }, - bar: { - id: 'b01', - action: { type: 'BAR', payload: { id } } - } - }) -} - -const sketchesListener = proxyquire('../src/store/sketches/listener', { - 'uid': uid -}).default - -const scenesListener = proxyquire('../src/store/scenes/listener', { - 'uid': uid, - './utils': sceneUtils -}).default - -function* rootSaga (dispatch) { - yield [ - fork(watchNodes) - ] -} - -const rootListener = { - types: 'all', - - handleAction (action, dispatched, store) { - scenesListener(action, store) - sketchesListener(action, store) - linkableActionsListener(action, store) - } -} - -test('(mock) Scenes - Add Scene', (t) => { - uniqueId = 0 - - const rootReducer = combineReducers( - { - nodes: nodesReducer, - sketches: sketchesReducer, - scenes: scenesReducer, - ui: uiReducer, - linkableActions: linkableActionsReducer - } - ) - - const store = createStore(rootReducer, { - nodes: {}, - sketches: {} - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - state = store.getState() - t.deepEqual(state.scenes.items, {}, - 'scenes start with empty items') - - store.dispatch(uSceneCreate()) - state = store.getState() - t.deepEqual(state.scenes.items, - { - id_1: { - id: 'id_1', - title: 'New Scene', - selectedSketchId: false, - sketchIds: [], - linkableActionIds: { - foo: 'f01', - bar: 'b01' - } - } - }, - 'scene is added to items list when sceneCreate is dispatched') - - t.equal(state.scenes.currentSceneId, 'id_1', - 'scene just created is made current' - ) - - t.deepEqual(state.scenes.channels, { - A: 'id_1', - B: false - }, - 'because is first scene, id_1 added to channel A' - ) - - t.deepEqual(state.linkableActions, { - f01: { - id: 'f01', - action: { type: 'FOO', payload: { 'id': 'id_1' } }, - inputLinkIds: [] - }, - b01: { - id: 'b01', - action: { type: 'BAR', payload: { 'id': 'id_1' } }, - inputLinkIds: [] - } - }, - 'linkable actions created' - ) - - t.deepEqual(state.ui.isEditing, - { - id: 'id_1', - type: 'sceneTitle' - } - , 'UI opens to editing scene') - - store.dispatch(uSceneCreate()) - state = store.getState() - t.deepEqual(state.scenes.items, - { - id_1: { - id: 'id_1', - title: 'New Scene', - selectedSketchId: false, - sketchIds: [], - linkableActionIds: { - foo: 'f01', - bar: 'b01' - } - }, - id_2: { - id: 'id_2', - title: 'New Scene', - selectedSketchId: false, - sketchIds: [], - linkableActionIds: { - foo: 'f01', - bar: 'b01' - } - } - }, - 'scene is added to items list when sceneCreate is dispatched') - t.equal(state.scenes.currentSceneId, 'id_2', - 'scene just created is made current' - ) - - t.deepEqual(state.scenes.channels, { - A: 'id_1', - B: false - }, - 'because is NOT first scene, channels remain untouched' - ) - - t.deepEqual(state.ui.isEditing, - { - id: 'id_2', - type: 'sceneTitle' - } - , 'UI opens to editing scene') - - t.end() -}) - -test('(mock) Scenes - Delete Scene', (t) => { - const store = createStore(rootReducer, { - nodes: { - node_01: {}, - node_02: {}, - node_03: {} - }, - sketches: { - sketch_01: { - title: 'Foo', - moduleId: 'foo', - paramIds: [], - shotIds: [], - openedNodes: {} - }, - sketch_02: { - title: 'Bar', - moduleId: 'bar', - paramIds: ['node_01', 'node_02'], - shotIds: ['node_03'], - openedNodes: {} - } - }, - scenes: { - currentSceneId: 'id_1', - channels: { - A: 'id_1', - B: 'id_2' - }, - items: { - id_1: { - id: 'id_1', - sketchIds: [], - linkableActionIds: {} - }, - id_2: { - id: 'id_2', - sketchIds: ['sketch_01', 'sketch_02'], - linkableActionIds: { - foo: 'f01', - bar: 'b01' - } - } - } - }, - linkableActions: { - f01: { - id: 'f01', - inputLinkIds: [] - }, - b01: { - id: 'b01', - inputLinkIds: ['i01'] - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(uSceneDelete('id_1')) - state = store.getState() - t.deepEqual(state.scenes.items, - { - id_2: { - id: 'id_2', - sketchIds: ['sketch_01', 'sketch_02'], - linkableActionIds: { - foo: 'f01', - bar: 'b01' - } - } - }, - 'Scene deleted with no sketches just removes that scene') - t.equal(state.scenes.currentSceneId, 'id_2', - 'currentSceneId is changed to last item in list' - ) - - t.deepEqual(state.scenes.channels, { - A: false, - B: 'id_2' - }, - 'Scene id is removed from channel' - ) - - t.equal(Object.keys(state.nodes).length, 3, 'Nodes kept the same') - t.equal(Object.keys(state.sketches).length, 2, 'Sketches kept the same') - t.equal(Object.keys(state.linkableActions).length, 2, 'linkableActions kept the same') - - store.dispatch(uSceneDelete('id_2')) - state = store.getState() - - t.equal(Object.keys(state.scenes.items).length, 0, 'Last scene deleted, scenes are now 0') - t.equal(state.scenes.currentSceneId, false, 'Last scene deleted, currentSceneId is now false') - t.equal(Object.keys(state.nodes).length, 0, 'Last scene deleted, nodes are now 0') - t.equal(Object.keys(state.sketches).length, 0, 'Last scene deleted, sketches are now 0') - t.equal(Object.keys(state.linkableActions).length, 0, 'Last scene deleted, linkableActions are now 0') - t.deepEqual(state.scenes.channels, { - A: false, - B: false - }, - 'Scene id is removed from channel' - ) - - t.end() -}) - -test('(mock) Scenes - Select Sketch', (t) => { - const store = createStore(rootReducer, { - nodes: { - }, - sketches: { - }, - scenes: { - items: { - id_1: { - id: 'id_1', - selectedSketchId: false, - sketchIds: ['sketch_03'] - }, - id_2: { - id: 'id_2', - selectedSketchId: 'sketch_01', - sketchIds: ['sketch_01', 'sketch_02'] - } - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(sceneSketchSelect('id_1', 'sketch_03')) - state = store.getState() - t.deepEqual(state.scenes, - { - items: { - id_1: { - id: 'id_1', - selectedSketchId: 'sketch_03', - sketchIds: ['sketch_03'] - }, - id_2: { - id: 'id_2', - selectedSketchId: 'sketch_01', - sketchIds: ['sketch_01', 'sketch_02'] - } - } - }, - 'Sketch id updated when sketch selected') - - store.dispatch(sceneSketchSelect('id_2', 'sketch_01')) - state = store.getState() - t.deepEqual(state.scenes, - { - items: { - id_1: { - id: 'id_1', - selectedSketchId: 'sketch_03', - sketchIds: ['sketch_03'] - }, - id_2: { - id: 'id_2', - selectedSketchId: 'sketch_01', - sketchIds: ['sketch_01', 'sketch_02'] - } - } - }, - 'Sketch id updated when sketch selected') - - t.end() -}) - -test('(mock) Scenes - Rename', (t) => { - const store = createStore(rootReducer, { - nodes: { - }, - sketches: { - }, - scenes: { - items: { - id_1: { - title: 'Foo Title', - id: 'id_1' - }, - id_2: { - title: 'Bar Title', - id: 'id_2' - } - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(sceneRename('id_1', 'Lorem Ipsum')) - state = store.getState() - t.deepEqual(state.scenes, - { - items: { - id_1: { - title: 'Lorem Ipsum', - id: 'id_1' - }, - id_2: { - title: 'Bar Title', - id: 'id_2' - } - } - }, - 'Scene title updated') - - store.dispatch(sceneRename('id_2', 'Ipsum Dollor')) - state = store.getState() - t.deepEqual(state.scenes, - { - items: { - id_1: { - title: 'Lorem Ipsum', - id: 'id_1' - }, - id_2: { - title: 'Ipsum Dollor', - id: 'id_2' - } - } - }, - 'Scene title updated') - - t.end() -}) +// DISABLED. Need to move over to jest to allow "window" global + +// import test from 'tape' +// import proxyquire from 'proxyquire' +// import listen from 'redux-action-listeners' +// import { createStore, applyMiddleware, combineReducers } from 'redux' +// import createSagaMiddleware from 'redux-saga' +// const sagaMiddleware = createSagaMiddleware() +// import { uSceneCreate, uSceneDelete, sceneSketchSelect, sceneRename } from '../src/store/scenes/actions' + +// import { fork } from 'redux-saga/effects' +// import { watchNodes } from '../src/store/nodes/sagas' +// import sketchesReducer from '../src/store/sketches/reducer' +// import scenesReducer from '../src/store/scenes/reducer' +// import nodesReducer from '../src/store/nodes/reducer' +// import uiReducer from '../src/store/ui/reducer' +// import linkableActionsReducer from '../src/store/linkableActions/reducer' +// import linkableActionsListener from '../src/store/linkableActions/listener' + +// const rootReducer = combineReducers( +// { +// nodes: nodesReducer, +// sketches: sketchesReducer, +// scenes: scenesReducer, +// linkableActions: linkableActionsReducer, +// } +// ) + +// let uniqueId +// const uid = () => { +// uniqueId++ +// return 'id_' + uniqueId +// } + +// const sceneUtils = { +// generateSceneLinkableActionIds: id => ({ +// foo: { +// id: 'f01', +// action: { type: 'FOO', payload: { id } }, +// }, +// bar: { +// id: 'b01', +// action: { type: 'BAR', payload: { id } }, +// }, +// }), +// } + +// const sketchesListener = proxyquire('../src/store/sketches/listener', { +// 'uid': uid, +// }).default + +// const scenesListener = proxyquire('../src/store/scenes/listener', { +// 'uid': uid, +// './utils': sceneUtils, +// }).default + +// function* rootSaga (dispatch) { +// yield [ +// fork(watchNodes), +// ] +// } + +// const rootListener = { +// types: 'all', + +// handleAction (action, dispatched, store) { +// scenesListener(action, store) +// sketchesListener(action, store) +// linkableActionsListener(action, store) +// }, +// } + +// test('(mock) Scenes - Add Scene', (t) => { +// uniqueId = 0 + +// const rootReducer = combineReducers( +// { +// nodes: nodesReducer, +// sketches: sketchesReducer, +// scenes: scenesReducer, +// ui: uiReducer, +// linkableActions: linkableActionsReducer, +// } +// ) + +// const store = createStore(rootReducer, { +// nodes: {}, +// sketches: {}, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// state = store.getState() +// t.deepEqual(state.scenes.items, {}, +// 'scenes start with empty items') + +// store.dispatch(uSceneCreate()) +// state = store.getState() +// t.deepEqual(state.scenes.items, +// { +// id_1: { +// id: 'id_1', +// title: 'New Scene', +// selectedSketchId: false, +// sketchIds: [], +// linkableActionIds: { +// foo: 'f01', +// bar: 'b01', +// }, +// }, +// }, +// 'scene is added to items list when sceneCreate is dispatched') + +// t.equal(state.scenes.currentSceneId, 'id_1', +// 'scene just created is made current' +// ) + +// t.deepEqual(state.scenes.channels, { +// A: 'id_1', +// B: false, +// }, +// 'because is first scene, id_1 added to channel A' +// ) + +// t.deepEqual(state.linkableActions, { +// f01: { +// id: 'f01', +// action: { type: 'FOO', payload: { 'id': 'id_1' } }, +// inputLinkIds: [], +// }, +// b01: { +// id: 'b01', +// action: { type: 'BAR', payload: { 'id': 'id_1' } }, +// inputLinkIds: [], +// }, +// }, +// 'linkable actions created' +// ) + +// t.deepEqual(state.ui.isEditing, +// { +// id: 'id_1', +// type: 'sceneTitle', +// } +// , 'UI opens to editing scene') + +// store.dispatch(uSceneCreate()) +// state = store.getState() +// t.deepEqual(state.scenes.items, +// { +// id_1: { +// id: 'id_1', +// title: 'New Scene', +// selectedSketchId: false, +// sketchIds: [], +// linkableActionIds: { +// foo: 'f01', +// bar: 'b01', +// }, +// }, +// id_2: { +// id: 'id_2', +// title: 'New Scene', +// selectedSketchId: false, +// sketchIds: [], +// linkableActionIds: { +// foo: 'f01', +// bar: 'b01', +// }, +// }, +// }, +// 'scene is added to items list when sceneCreate is dispatched') +// t.equal(state.scenes.currentSceneId, 'id_2', +// 'scene just created is made current' +// ) + +// t.deepEqual(state.scenes.channels, { +// A: 'id_1', +// B: false, +// }, +// 'because is NOT first scene, channels remain untouched' +// ) + +// t.deepEqual(state.ui.isEditing, +// { +// id: 'id_2', +// type: 'sceneTitle', +// } +// , 'UI opens to editing scene') + +// t.end() +// }) + +// test('(mock) Scenes - Delete Scene', (t) => { +// const store = createStore(rootReducer, { +// nodes: { +// node_01: {}, +// node_02: {}, +// node_03: {}, +// }, +// sketches: { +// sketch_01: { +// title: 'Foo', +// moduleId: 'foo', +// paramIds: [], +// shotIds: [], +// openedNodes: {}, +// }, +// sketch_02: { +// title: 'Bar', +// moduleId: 'bar', +// paramIds: ['node_01', 'node_02'], +// shotIds: ['node_03'], +// openedNodes: {}, +// }, +// }, +// scenes: { +// currentSceneId: 'id_1', +// channels: { +// A: 'id_1', +// B: 'id_2', +// }, +// items: { +// id_1: { +// id: 'id_1', +// sketchIds: [], +// linkableActionIds: {}, +// }, +// id_2: { +// id: 'id_2', +// sketchIds: ['sketch_01', 'sketch_02'], +// linkableActionIds: { +// foo: 'f01', +// bar: 'b01', +// }, +// }, +// }, +// }, +// linkableActions: { +// f01: { +// id: 'f01', +// inputLinkIds: [], +// }, +// b01: { +// id: 'b01', +// inputLinkIds: ['i01'], +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(uSceneDelete('id_1')) +// state = store.getState() +// t.deepEqual(state.scenes.items, +// { +// id_2: { +// id: 'id_2', +// sketchIds: ['sketch_01', 'sketch_02'], +// linkableActionIds: { +// foo: 'f01', +// bar: 'b01', +// }, +// }, +// }, +// 'Scene deleted with no sketches just removes that scene') +// t.equal(state.scenes.currentSceneId, 'id_2', +// 'currentSceneId is changed to last item in list' +// ) + +// t.deepEqual(state.scenes.channels, { +// A: false, +// B: 'id_2', +// }, +// 'Scene id is removed from channel' +// ) + +// t.equal(Object.keys(state.nodes).length, 3, 'Nodes kept the same') +// t.equal(Object.keys(state.sketches).length, 2, 'Sketches kept the same') +// t.equal(Object.keys(state.linkableActions).length, 2, 'linkableActions kept the same') + +// store.dispatch(uSceneDelete('id_2')) +// state = store.getState() + +// t.equal(Object.keys(state.scenes.items).length, 0, 'Last scene deleted, scenes are now 0') +// t.equal(state.scenes.currentSceneId, false, 'Last scene deleted, currentSceneId is now false') +// t.equal(Object.keys(state.nodes).length, 0, 'Last scene deleted, nodes are now 0') +// t.equal(Object.keys(state.sketches).length, 0, 'Last scene deleted, sketches are now 0') +// t.equal(Object.keys(state.linkableActions).length, 0, 'Last scene deleted, linkableActions are now 0') +// t.deepEqual(state.scenes.channels, { +// A: false, +// B: false, +// }, +// 'Scene id is removed from channel' +// ) + +// t.end() +// }) + +// test('(mock) Scenes - Select Sketch', (t) => { +// const store = createStore(rootReducer, { +// nodes: { +// }, +// sketches: { +// }, +// scenes: { +// items: { +// id_1: { +// id: 'id_1', +// selectedSketchId: false, +// sketchIds: ['sketch_03'], +// }, +// id_2: { +// id: 'id_2', +// selectedSketchId: 'sketch_01', +// sketchIds: ['sketch_01', 'sketch_02'], +// }, +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(sceneSketchSelect('id_1', 'sketch_03')) +// state = store.getState() +// t.deepEqual(state.scenes, +// { +// items: { +// id_1: { +// id: 'id_1', +// selectedSketchId: 'sketch_03', +// sketchIds: ['sketch_03'], +// }, +// id_2: { +// id: 'id_2', +// selectedSketchId: 'sketch_01', +// sketchIds: ['sketch_01', 'sketch_02'], +// }, +// }, +// }, +// 'Sketch id updated when sketch selected') + +// store.dispatch(sceneSketchSelect('id_2', 'sketch_01')) +// state = store.getState() +// t.deepEqual(state.scenes, +// { +// items: { +// id_1: { +// id: 'id_1', +// selectedSketchId: 'sketch_03', +// sketchIds: ['sketch_03'], +// }, +// id_2: { +// id: 'id_2', +// selectedSketchId: 'sketch_01', +// sketchIds: ['sketch_01', 'sketch_02'], +// }, +// }, +// }, +// 'Sketch id updated when sketch selected') + +// t.end() +// }) + +// test('(mock) Scenes - Rename', (t) => { +// const store = createStore(rootReducer, { +// nodes: { +// }, +// sketches: { +// }, +// scenes: { +// items: { +// id_1: { +// title: 'Foo Title', +// id: 'id_1', +// }, +// id_2: { +// title: 'Bar Title', +// id: 'id_2', +// }, +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(sceneRename('id_1', 'Lorem Ipsum')) +// state = store.getState() +// t.deepEqual(state.scenes, +// { +// items: { +// id_1: { +// title: 'Lorem Ipsum', +// id: 'id_1', +// }, +// id_2: { +// title: 'Bar Title', +// id: 'id_2', +// }, +// }, +// }, +// 'Scene title updated') + +// store.dispatch(sceneRename('id_2', 'Ipsum Dollor')) +// state = store.getState() +// t.deepEqual(state.scenes, +// { +// items: { +// id_1: { +// title: 'Lorem Ipsum', +// id: 'id_1', +// }, +// id_2: { +// title: 'Ipsum Dollor', +// id: 'id_2', +// }, +// }, +// }, +// 'Scene title updated') + +// t.end() +// }) diff --git a/mockTests/sketches.spec.js b/mockTests/sketches.spec.js deleted file mode 100644 index acf23ce2..00000000 --- a/mockTests/sketches.spec.js +++ /dev/null @@ -1,884 +0,0 @@ -import test from 'tape' -import proxyquire from 'proxyquire' -import listen from 'redux-action-listeners' -import { createStore, applyMiddleware, combineReducers } from 'redux' -import createSagaMiddleware from 'redux-saga' -const sagaMiddleware = createSagaMiddleware() -import { uSketchCreate, uSketchDelete, uSketchReimport } from '../src/store/sketches/actions' - -import { fork } from 'redux-saga/effects' -import { watchNodes } from '../src/store/nodes/sagas' -import sketchesReducer from '../src/store/sketches/reducer' -import availableModulesReducer from '../src/store/availableModules/reducer' -import nodesReducer from '../src/store/nodes/reducer' -import scenesReducer from '../src/store/scenes/reducer' - -const rootReducer = combineReducers( - { - nodes: nodesReducer, - availableModules: availableModulesReducer, - sketches: sketchesReducer, - scenes: scenesReducer - } -) - -let uniqueId -const uid = () => { - uniqueId++ - return 'id_' + uniqueId -} - -const sketchesListener = proxyquire('../src/store/sketches/listener', { - 'uid': uid -}).default - -const scenesListener = proxyquire('../src/store/scenes/listener', { - 'uid': uid -}).default - -const rootListener = { - types: 'all', - - handleAction (action, dispatched, store) { - sketchesListener(action, store) - scenesListener(action, store) - } -} - -function* rootSaga (dispatch) { - yield [ - fork(watchNodes) - ] -} - -test('(mock) Sketches - Add/Delete Sketch', (t) => { - uniqueId = 0 - - const rootReducer = combineReducers( - { - nodes: nodesReducer, - availableModules: availableModulesReducer, - sketches: sketchesReducer, - scenes: scenesReducer, - router: () => ({ - location: { - pathname: 'scenes/addSketch/scene_02' - } - }) - } - ) - - const store = createStore(rootReducer, { - availableModules: { - foo: { - defaultTitle: 'Foo', - params: [ - { - key: 'speed', - title: 'Speed', - defaultValue: 0.5 - } - ], - shots: [] - }, - bar: { - defaultTitle: 'Bar', - params: [ - { - key: 'scale', - title: 'Scale', - defaultValue: 0.2 - }, - { - key: 'color', - title: 'Color', - defaultValue: 0.1 - } - ], - shots: [ - { - method: 'explode', - title: 'Explode' - } - ] - }, - boring: { - defaultTitle: 'Boring' - } - }, - nodes: {}, - sketches: {}, - scenes: { - currentSceneId: 'scene_02', - items: { - scene_01: { - id: 'scene_01', - selectedSketchId: false, - sketchIds: [] - }, - scene_02: { - id: 'scene_02', - selectedSketchId: false, - sketchIds: [] - } - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - state = store.getState() - t.deepEqual(state.nodes, {}, 'nodes start empty') - - store.dispatch(uSketchCreate('foo', 'scene_01')) - state = store.getState() - - t.deepEqual(state.scenes.items, { - scene_01: { - id: 'scene_01', - selectedSketchId: 'id_1', - sketchIds: ['id_1'] - }, - scene_02: { - id: 'scene_02', - selectedSketchId: false, - sketchIds: [] - } - }, 'After creating sketch, sketch id is added to scene, selectedSketchId is set') - - t.deepEqual(state.sketches, { - id_1: { - title: 'Foo', - moduleId: 'foo', - paramIds: ['id_2'], - shotIds: [], - openedNodes: {} - } - }, 'After creating sketch, sketch item is created') - - t.deepEqual(state.nodes, { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - } - }, 'After creating sketch, node item is created for param') - - store.dispatch(uSketchCreate('bar', 'scene_01')) - state = store.getState() - - t.deepEqual(state.scenes.items, { - scene_01: { - id: 'scene_01', - sketchIds: ['id_1', 'id_3'], - selectedSketchId: 'id_3' - }, - scene_02: { - id: 'scene_02', - selectedSketchId: false, - sketchIds: [] - } - }, 'After creating sketch, sketch id is added to scene') - - t.deepEqual(state.sketches, { - id_1: { - title: 'Foo', - moduleId: 'foo', - paramIds: ['id_2'], - shotIds: [], - openedNodes: {} - }, - id_3: { - title: 'Bar', - moduleId: 'bar', - paramIds: ['id_4', 'id_5'], - shotIds: ['id_6'], - openedNodes: {} - } - }, 'After creating sketch, sketch item is created') - - t.deepEqual(state.nodes, { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_4: { - id: 'id_4', - title: 'Scale', - value: 0.2, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'scale' - }, - id_5: { - id: 'id_5', - title: 'Color', - value: 0.1, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'color' - }, - id_6: { - id: 'id_6', - title: 'Explode', - value: 0, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'shot', - method: 'explode', - sketchId: 'id_3' - } - }, 'After creating sketch, node items are created for params and shot') - - store.dispatch(uSketchDelete('id_1', 'scene_01')) - state = store.getState() - - t.deepEqual(state.scenes.items, { - scene_01: { - id: 'scene_01', - sketchIds: ['id_3'], - selectedSketchId: 'id_3' - }, - scene_02: { - id: 'scene_02', - sketchIds: [], - selectedSketchId: false - } - }, 'After deleting sketch, sketch id is removed from scene, selectedSketchId becomes last in list') - - t.deepEqual(state.sketches, { - id_3: { - title: 'Bar', - moduleId: 'bar', - paramIds: ['id_4', 'id_5'], - shotIds: ['id_6'], - openedNodes: {} - } - }, 'After deleting sketch, sketch item is removed') - - t.deepEqual(state.nodes, { - id_4: { - id: 'id_4', - title: 'Scale', - value: 0.2, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'scale' - }, - id_5: { - id: 'id_5', - title: 'Color', - value: 0.1, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'color' - }, - id_6: { - id: 'id_6', - title: 'Explode', - value: 0, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'shot', - method: 'explode', - sketchId: 'id_3' - } - }, 'After deleting sketch, node items are removed') - - store.dispatch(uSketchDelete('id_3', 'scene_01')) - state = store.getState() - - t.deepEqual(state.scenes.items, { - scene_01: { - id: 'scene_01', - sketchIds: [], - selectedSketchId: false - }, - scene_02: { - id: 'scene_02', - sketchIds: [], - selectedSketchId: false - } - }, 'After deleting sketch, sketch id is removed from scene, selected sketchId becomes false (none left)') - - t.deepEqual(state.sketches, {}, 'After deleting sketch, sketch item is removed') - t.deepEqual(state.nodes, {}, 'After deleting sketch, node items are removed') - - store.dispatch(uSketchCreate('boring')) - state = store.getState() - - t.deepEqual(state.scenes.items, { - scene_01: { - id: 'scene_01', - sketchIds: [], - selectedSketchId: false - }, - scene_02: { - id: 'scene_02', - sketchIds: ['id_7'], - selectedSketchId: 'id_7' - } - }, 'After creating sketch with no specified scene id, sketch id is added to scene using currentSceneId') - - t.deepEqual(state.sketches, { - id_7: { - title: 'Boring', - moduleId: 'boring', - paramIds: [], - shotIds: [], - openedNodes: {} - } - }, 'After creating sketch, sketch item is created') - - t.deepEqual(state.nodes, {}, 'After creating sketch, no nodes created (because sketch has no params/shots)') - - store.dispatch(uSketchDelete('id_7')) - state = store.getState() - - t.deepEqual(state.scenes.items, { - scene_01: { - id: 'scene_01', - sketchIds: [], - selectedSketchId: false - }, - scene_02: { - id: 'scene_02', - sketchIds: [], - selectedSketchId: false - } - }, 'After deleting sketch with no specified scene id, uses currentSceneId to determine which scene') - - t.deepEqual(state.sketches, {}, 'After deleting sketch, sketch item is removed') - - t.end() -}) - -test('(mock) Sketches - Reimport Sketch (Unedited sketch)', (t) => { - uniqueId = 2 - - const defaultState = { - availableModules: { - foo: { - defaultTitle: 'Foo', - params: [ - { - key: 'speed', - title: 'Speed', - defaultValue: 0.5 - } - ], - shots: [] - } - }, - nodes: { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - } - }, - sketches: { - id_1: { - title: 'Foo', - moduleId: 'foo', - paramIds: ['id_2'], - shotIds: [], - openedNodes: {} - } - }, - scenes: { - items: {} - } - } - - const store = createStore(rootReducer, defaultState, - applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(uSketchReimport('id_1')) - - state = store.getState() - - t.deepEqual( - state, defaultState, - 'After reimporting undedited sketch, state has not changed' - ) - - t.end() -}) - -test('(mock) Sketches - Reimport Sketch (simple)', (t) => { - uniqueId = 2 - - const store = createStore(rootReducer, { - availableModules: { - foo: { - defaultTitle: 'Foo', - params: [ - { - key: 'speed', - title: 'Speed', - defaultValue: 0.5 - }, - { - key: 'scale', - title: 'Scale', - defaultValue: 0.2 - } - ], - shots: [] - } - }, - nodes: { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - } - }, - sketches: { - id_1: { - title: 'Foo', - moduleId: 'foo', - paramIds: ['id_2'], - shotIds: [], - openedNodes: {} - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(uSketchReimport('id_1')) - - state = store.getState() - - t.deepEqual( - state.sketches['id_1'].paramIds, ['id_2', 'id_3'], - 'After reimporting, sketch has new paramId' - ) - - t.deepEqual( - state.nodes, - { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_3: { - id: 'id_3', - title: 'Scale', - value: 0.2, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'scale' - } - }, - 'After reimporting, new node exists' - ) - - t.end() -}) - -test('(mock) Sketches - Reimport Sketch (params and shots)', (t) => { - uniqueId = 3 - - const store = createStore(rootReducer, { - availableModules: { - foo: { - defaultTitle: 'Foo', - params: [ - { - key: 'speed', - title: 'Speed', - defaultValue: 0.5 - }, - { - key: 'scale', - title: 'Scale', - defaultValue: 0.2 - } - ], - shots: [ - { - method: 'explode', - title: 'Explode' - }, - { - method: 'spin', - title: 'Spin' - } - ] - } - }, - nodes: { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_3: { - id: 'id_3', - title: 'Explode', - value: 0, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'shot', - method: 'explode', - sketchId: 'id_1' - } - }, - sketches: { - id_1: { - title: 'Foo', - moduleId: 'foo', - paramIds: ['id_2'], - shotIds: ['id_3'], - openedNodes: {} - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(uSketchReimport('id_1')) - - state = store.getState() - - t.deepEqual( - state.sketches['id_1'].paramIds, ['id_2', 'id_4'], - 'After reimporting, sketch has new paramId' - ) - - t.deepEqual( - state.sketches['id_1'].shotIds, ['id_3', 'id_5'], - 'After reimporting, sketch has new shotId' - ) - - t.deepEqual( - state.nodes, - { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_3: { - id: 'id_3', - title: 'Explode', - value: 0, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'shot', - method: 'explode', - sketchId: 'id_1' - }, - id_4: { - id: 'id_4', - title: 'Scale', - value: 0.2, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'scale' - }, - id_5: { - id: 'id_5', - title: 'Spin', - value: 0, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'shot', - method: 'spin', - sketchId: 'id_1' - } - }, - 'After reimporting, new nodes exist' - ) - - t.end() -}) - -test('(mock) Sketches - Reimport Sketch (with shot and param title changes)', (t) => { - uniqueId = 3 - - const store = createStore(rootReducer, { - availableModules: { - foo: { - defaultTitle: 'Foo', - params: [ - { - key: 'speed', - title: 'Speed New', - defaultValue: 0.5 - }, - { - key: 'scale', - title: 'Scale', - defaultValue: 0.2 - } - ], - shots: [ - { - method: 'explode', - title: 'Explode New' - } - ] - } - }, - nodes: { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_3: { - id: 'id_3', - title: 'Explode New', - value: 0, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'shot', - method: 'explode', - sketchId: 'id_1' - } - }, - sketches: { - id_1: { - title: 'Foo', - moduleId: 'foo', - paramIds: ['id_2'], - shotIds: ['id_3'], - openedNodes: {} - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(uSketchReimport('id_1')) - - state = store.getState() - - t.deepEqual( - state.sketches['id_1'].paramIds, ['id_2', 'id_4'], - 'After reimporting, sketch has new paramId' - ) - - t.deepEqual( - state.nodes, - { - id_2: { - id: 'id_2', - title: 'Speed New', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_3: { - id: 'id_3', - title: 'Explode New', - value: 0, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'shot', - method: 'explode', - sketchId: 'id_1' - }, - id_4: { - id: 'id_4', - title: 'Scale', - value: 0.2, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'scale' - } - }, - 'After reimporting, new node exists, old nodes titles have changed' - ) - - t.end() -}) - -test('(mock) Sketches - Reimport Sketch (Different order)', (t) => { - uniqueId = 3 - - const store = createStore(rootReducer, { - availableModules: { - foo: { - defaultTitle: 'Foo', - params: [ - { - key: 'speed', - title: 'Speed', - defaultValue: 0.5 - }, - { - key: 'bar', - title: 'Bar', - defaultValue: 0.5 - }, - { - key: 'scale', - title: 'Scale', - defaultValue: 0.2 - } - ], - shots: [] - } - }, - nodes: { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_3: { - id: 'id_3', - title: 'Scale', - value: 0.2, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'scale' - } - }, - sketches: { - id_1: { - title: 'Foo', - moduleId: 'foo', - paramIds: ['id_2', 'id_3'], - shotIds: [], - openedNodes: {} - } - } - }, applyMiddleware(sagaMiddleware, listen(rootListener))) - sagaMiddleware.run(rootSaga, store.dispatch) - - let state - - store.dispatch(uSketchReimport('id_1')) - - state = store.getState() - - t.deepEqual( - state.sketches['id_1'].paramIds, ['id_2', 'id_4', 'id_3'], - 'After reimporting, sketch has new paramId in middle of array' - ) - - t.deepEqual( - state.nodes, - { - id_2: { - id: 'id_2', - title: 'Speed', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'speed' - }, - id_3: { - id: 'id_3', - title: 'Scale', - value: 0.2, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'scale' - }, - id_4: { - id: 'id_4', - title: 'Bar', - value: 0.5, - inputLinkIds: [], - shotCount: 0, - connectedMacroIds: [], - type: 'param', - key: 'bar' - } - }, - 'After reimporting, new node exists' - ) - - t.end() -}) diff --git a/mockTests/sketches.test.js b/mockTests/sketches.test.js new file mode 100644 index 00000000..1bf42d1c --- /dev/null +++ b/mockTests/sketches.test.js @@ -0,0 +1,1159 @@ +import listen from 'redux-action-listeners' +import { createStore, applyMiddleware, combineReducers } from 'redux' +import createSagaMiddleware from 'redux-saga' +const sagaMiddleware = createSagaMiddleware() +import { uSketchCreate, uSketchDelete } from '../src/store/sketches/actions' + +import { fork } from 'redux-saga/effects' +import { watchNodes } from '../src/store/nodes/sagas' +import { watchMacros } from '../src/store/macros/sagas' +import sketchesReducer from '../src/store/sketches/reducer' +import availableModulesReducer from '../src/store/availableModules/reducer' +import nodesReducer from '../src/store/nodes/reducer' +import scenesReducer from '../src/store/scenes/reducer' +import macrosReducer from '../src/store/macros/reducer' + +import sketchesListener from '../src/store/sketches/listener' +import scenesListener from '../src/store/scenes/listener' + +let mockUniqueId = 0 + +jest.mock('uid', () => () => { + mockUniqueId++ + return 'id_' + mockUniqueId +}) + +const rootListener = { + types: 'all', + + handleAction (action, dispatched, store) { + sketchesListener(action, store) + scenesListener(action, store) + }, +} + +function* rootSaga (dispatch) { + yield [ + fork(watchNodes), + fork(watchMacros), + ] +} + +test('(mock) Sketches - Add/Delete Sketch', () => { + const rootReducer = combineReducers( + { + nodes: nodesReducer, + availableModules: availableModulesReducer, + sketches: sketchesReducer, + scenes: scenesReducer, + router: () => ({ + location: { + pathname: 'scenes/addSketch/scene_02', + }, + }), + } + ) + + const store = createStore(rootReducer, { + availableModules: { + foo: { + defaultTitle: 'Foo', + params: [ + { + key: 'speed', + title: 'Speed', + defaultValue: 0.5, + defaultMin: -1, + defaultMax: 1, + }, + ], + shots: [], + }, + bar: { + defaultTitle: 'Bar', + params: [ + { + key: 'scale', + title: 'Scale', + defaultValue: 0.2, + }, + { + key: 'color', + title: 'Color', + defaultValue: 0.1, + }, + ], + shots: [ + { + method: 'explode', + title: 'Explode', + }, + ], + }, + boring: { + defaultTitle: 'Boring', + }, + }, + nodes: {}, + sketches: {}, + scenes: { + currentSceneId: 'scene_02', + items: { + scene_01: { + id: 'scene_01', + selectedSketchId: false, + sketchIds: [], + }, + scene_02: { + id: 'scene_02', + selectedSketchId: false, + sketchIds: [], + }, + }, + }, + }, applyMiddleware(sagaMiddleware, listen(rootListener))) + sagaMiddleware.run(rootSaga, store.dispatch) + + let state + + state = store.getState() + + // 'nodes start empty' + expect(state.nodes).toEqual({}) + + store.dispatch(uSketchCreate('foo', 'scene_01')) + state = store.getState() + + // 'After creating sketch, sketch id is added to scene, selectedSketchId is set' + expect(state.scenes.items).toEqual({ + scene_01: { + id: 'scene_01', + selectedSketchId: 'id_1', + sketchIds: ['id_1'], + }, + scene_02: { + id: 'scene_02', + selectedSketchId: false, + sketchIds: [], + }, + }) + + // 'After creating sketch, sketch item is created' + expect(state.sketches).toEqual({ + id_1: { + title: 'Foo', + moduleId: 'foo', + paramIds: ['id_2'], + shotIds: [], + }, + }) + + // 'After creating sketch, node item is created for param' + expect(state.nodes).toEqual({ + id_2: { + id: 'id_2', + title: 'Speed', + value: 0.5, + inputLinkIds: [], + shotCount: 0, + sketchId: 'id_1', + connectedMacroIds: [], + type: 'param', + key: 'speed', + hidden: false, + min: -1, + max: 1, + defaultMin: -1, + defaultMax: 1, + }, + }) + + store.dispatch(uSketchCreate('bar', 'scene_01')) + state = store.getState() + + // 'After creating sketch, sketch id is added to scene' + expect(state.scenes.items).toEqual({ + scene_01: { + id: 'scene_01', + sketchIds: ['id_1', 'id_3'], + selectedSketchId: 'id_3', + }, + scene_02: { + id: 'scene_02', + selectedSketchId: false, + sketchIds: [], + }, + }) + + // 'After creating sketch, sketch item is created' + expect(state.sketches).toEqual({ + id_1: { + title: 'Foo', + moduleId: 'foo', + paramIds: ['id_2'], + shotIds: [], + }, + id_3: { + title: 'Bar', + moduleId: 'bar', + paramIds: ['id_4', 'id_5'], + shotIds: ['id_6'], + }, + }) + + // 'After creating sketch, node items are created for params and shot' + expect(state.nodes).toEqual({ + id_2: { + id: 'id_2', + title: 'Speed', + value: 0.5, + inputLinkIds: [], + shotCount: 0, + sketchId: 'id_1', + connectedMacroIds: [], + type: 'param', + key: 'speed', + hidden: false, + min: -1, + max: 1, + defaultMin: -1, + defaultMax: 1, + }, + id_4: { + id: 'id_4', + title: 'Scale', + value: 0.2, + inputLinkIds: [], + shotCount: 0, + sketchId: 'id_3', + connectedMacroIds: [], + type: 'param', + key: 'scale', + hidden: false, + min: 0, + max: 1, + defaultMin: 0, + defaultMax: 1, + }, + id_5: { + id: 'id_5', + title: 'Color', + value: 0.1, + inputLinkIds: [], + shotCount: 0, + sketchId: 'id_3', + connectedMacroIds: [], + type: 'param', + key: 'color', + hidden: false, + min: 0, + max: 1, + defaultMin: 0, + defaultMax: 1, + }, + id_6: { + id: 'id_6', + title: 'Explode', + value: 0, + inputLinkIds: [], + shotCount: 0, + connectedMacroIds: [], + type: 'shot', + method: 'explode', + sketchId: 'id_3', + }, + }) + + store.dispatch(uSketchDelete('id_1', 'scene_01')) + state = store.getState() + + // 'After deleting sketch, sketch id is removed from scene, selectedSketchId becomes last in list' + expect(state.scenes.items).toEqual({ + scene_01: { + id: 'scene_01', + sketchIds: ['id_3'], + selectedSketchId: 'id_3', + }, + scene_02: { + id: 'scene_02', + sketchIds: [], + selectedSketchId: false, + }, + }) + + // 'After deleting sketch, sketch item is removed' + expect(state.sketches).toEqual({ + id_3: { + title: 'Bar', + moduleId: 'bar', + paramIds: ['id_4', 'id_5'], + shotIds: ['id_6'], + }, + }) + + // 'After deleting sketch, node items are removed' + expect(state.nodes).toEqual({ + id_4: { + id: 'id_4', + title: 'Scale', + value: 0.2, + inputLinkIds: [], + shotCount: 0, + sketchId: 'id_3', + connectedMacroIds: [], + type: 'param', + key: 'scale', + hidden: false, + min: 0, + max: 1, + defaultMin: 0, + defaultMax: 1, + }, + id_5: { + id: 'id_5', + title: 'Color', + value: 0.1, + inputLinkIds: [], + shotCount: 0, + sketchId: 'id_3', + connectedMacroIds: [], + type: 'param', + key: 'color', + hidden: false, + min: 0, + max: 1, + defaultMin: 0, + defaultMax: 1, + }, + id_6: { + id: 'id_6', + title: 'Explode', + value: 0, + inputLinkIds: [], + shotCount: 0, + connectedMacroIds: [], + type: 'shot', + method: 'explode', + sketchId: 'id_3', + }, + }) + + store.dispatch(uSketchDelete('id_3', 'scene_01')) + state = store.getState() + + expect(state.scenes.items).toEqual({ + scene_01: { + id: 'scene_01', + sketchIds: [], + selectedSketchId: false, + }, + scene_02: { + id: 'scene_02', + sketchIds: [], + selectedSketchId: false, + }, + }, 'After deleting sketch, sketch id is removed from scene, selected sketchId becomes false (none left)') + + // 'After deleting sketch, sketch item is removed' + expect(state.sketches).toEqual({}) + // 'After deleting sketch, node items are removed' + expect(state.nodes).toEqual({}) + + store.dispatch(uSketchCreate('boring')) + state = store.getState() + + // 'After creating sketch with no specified scene id, sketch id is added to scene using currentSceneId' + expect(state.scenes.items).toEqual({ + scene_01: { + id: 'scene_01', + sketchIds: [], + selectedSketchId: false, + }, + scene_02: { + id: 'scene_02', + sketchIds: ['id_7'], + selectedSketchId: 'id_7', + }, + }) + + // 'After creating sketch, sketch item is created' + expect(state.sketches).toEqual({ + id_7: { + title: 'Boring', + moduleId: 'boring', + paramIds: [], + shotIds: [], + }, + }) + + // 'After creating sketch, no nodes created (because sketch has no params/shots)' + expect(state.nodes).toEqual({}) + + store.dispatch(uSketchDelete('id_7')) + state = store.getState() + + // 'After deleting sketch with no specified scene id, uses currentSceneId to determine which scene' + expect(state.scenes.items).toEqual({ + scene_01: { + id: 'scene_01', + sketchIds: [], + selectedSketchId: false, + }, + scene_02: { + id: 'scene_02', + sketchIds: [], + selectedSketchId: false, + }, + }) + + // 'After deleting sketch, sketch item is removed' + expect(state.sketches).toEqual({}) +}) + +test('(mock) Sketches - Delete sketch with macro associated to params', () => { + const rootReducer = combineReducers( + { + nodes: nodesReducer, + availableModules: availableModulesReducer, + sketches: sketchesReducer, + scenes: scenesReducer, + macros: macrosReducer, + router: () => ({ + location: { + pathname: 'scenes/addSketch/scene_02', + }, + }), + } + ) + + const store = createStore(rootReducer, { + nodes: { + param_a: { + id: 'param_a', + connectedMacroIds: ['macro_a'], + }, + macro_a: { + targetParamLinks: { + param_a: { + paramId: 'param_a', + nodeId: 'macro_link_a', + }, + }, + }, + macro_link_a: { + + }, + }, + sketches: { + sketch_a: { + paramIds: ['param_a'], + shotIds: [], + }, + }, + scenes: { + currentSceneId: 'scene_01', + items: { + scene_01: { + id: 'scene_01', + selectedSketchId: false, + sketchIds: ['sketch_a'], + }, + }, + }, + macros: { + nodeIds: ['macro_a'], + }, + }, applyMiddleware(sagaMiddleware, listen(rootListener))) + sagaMiddleware.run(rootSaga, store.dispatch) + + store.dispatch(uSketchDelete('sketch_a', 'scene_01')) + + let state = store.getState() + + const nodes = state.nodes + const macros = state.macros + + expect(nodes.param_a).toBe(undefined) + expect(nodes.macro_link_a).toBe(undefined) + expect(nodes.macro_a.targetParamLinks.param_a).toBe(undefined) + expect(macros.nodeIds).toHaveLength(1) // Macro not deleted +}) + +// TODO: Below tests disabled because since changes made to reimporting sketches, this is now harder to mock + +// test('(mock) Sketches - Reimport Sketch (Unedited sketch)', (t) => { +// mockUniqueId = 2 + +// const defaultState = { +// nodes: { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// }, +// availableModules: { +// foo: { +// defaultTitle: 'Foo', +// filePathArray: [], +// params: [ +// { +// key: 'speed', +// title: 'Speed', +// defaultValue: 0.5, +// }, +// ], +// shots: [], +// }, +// }, +// sketches: { +// id_1: { +// title: 'Foo', +// moduleId: 'foo', +// paramIds: ['id_2'], +// shotIds: [], +// }, +// }, +// scenes: { +// items: {}, +// }, +// project: { +// sketchesPath: '', +// }, +// } + +// const store = createStore(rootReducer, defaultState, +// applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(uSketchReloadFile('id_1')) + +// state = store.getState() + +// // 'After reimporting undedited sketch, state has not changed' +// expect(state).toEqual(defaultState) +// }) + +// test('(mock) Sketches - Reimport Sketch (simple)', (t) => { +// mockUniqueId = 2 + +// const store = createStore(rootReducer, { +// availableModules: { +// foo: { +// defaultTitle: 'Foo', +// params: [ +// { +// key: 'speed', +// title: 'Speed', +// defaultValue: 0.5, +// }, +// { +// key: 'scale', +// title: 'Scale', +// defaultValue: 0.2, +// }, +// ], +// shots: [], +// }, +// }, +// nodes: { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// }, +// }, +// sketches: { +// id_1: { +// title: 'Foo', +// moduleId: 'foo', +// paramIds: ['id_2'], +// shotIds: [], +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(uSketchReloadFile('id_1')) + +// state = store.getState() + +// // 'After reimporting, sketch has new paramId' +// expect(state.sketches['id_1'].paramIds).toEqual(['id_2', 'id_3']) + +// // 'After reimporting, new node exists' +// expect(state.nodes).toEqual( +// { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_3: { +// id: 'id_3', +// title: 'Scale', +// value: 0.2, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'scale', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// }, +// ) +// }) + +// test('(mock) Sketches - Reimport Sketch (params and shots)', (t) => { +// mockUniqueId = 2 + +// const store = createStore(rootReducer, { +// availableModules: { +// foo: { +// defaultTitle: 'Foo', +// params: [ +// { +// key: 'speed', +// title: 'Speed', +// defaultValue: 0.5, +// }, +// { +// key: 'scale', +// title: 'Scale', +// defaultValue: 0.2, +// }, +// ], +// shots: [ +// { +// method: 'explode', +// title: 'Explode', +// }, +// { +// method: 'spin', +// title: 'Spin', +// }, +// ], +// }, +// }, +// nodes: { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// }, +// id_3: { +// id: 'id_3', +// title: 'Explode', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'explode', +// sketchId: 'id_1', +// }, +// }, +// sketches: { +// id_1: { +// title: 'Foo', +// moduleId: 'foo', +// paramIds: ['id_2'], +// shotIds: ['id_3'], +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(uSketchReloadFile('id_1')) + +// state = store.getState() + +// // 'After reimporting, sketch has new paramId' +// expect(state.sketches['id_1'].paramIds).toEqual(['id_2', 'id_4']) + +// // 'After reimporting, sketch has new shotId' +// expect(state.sketches['id_1'].shotIds).toEqual(['id_3', 'id_5']) + +// // 'After reimporting, new nodes exist' +// expect(state.nodes).toEqual( +// { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_3: { +// id: 'id_3', +// title: 'Explode', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'explode', +// sketchId: 'id_1', +// }, +// id_4: { +// id: 'id_4', +// title: 'Scale', +// value: 0.2, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'scale', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_5: { +// id: 'id_5', +// title: 'Spin', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'spin', +// sketchId: 'id_1', +// }, +// } +// ) +// }) + +// test('(mock) Sketches - Reimport Sketch (with shot and param title changes)', (t) => { +// mockUniqueId = 2 + +// const store = createStore(rootReducer, { +// availableModules: { +// foo: { +// defaultTitle: 'Foo', +// params: [ +// { +// key: 'speed', +// title: 'Speed New', +// defaultValue: 0.5, +// }, +// { +// key: 'scale', +// title: 'Scale', +// defaultValue: 0.2, +// }, +// ], +// shots: [ +// { +// method: 'explode', +// title: 'Explode New', +// }, +// ], +// }, +// }, +// nodes: { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// hidden: false, +// min: 0, +// max: 1, +// type: 'param', +// key: 'speed', +// }, +// id_3: { +// id: 'id_3', +// title: 'Explode New', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'explode', +// sketchId: 'id_1', +// }, +// }, +// sketches: { +// id_1: { +// title: 'Foo', +// moduleId: 'foo', +// paramIds: ['id_2'], +// shotIds: ['id_3'], +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(uSketchReloadFile('id_1')) + +// state = store.getState() + +// // 'After reimporting, sketch has new paramId' +// expect(state.sketches['id_1'].paramIds).toEqual(['id_2', 'id_4']) + +// // 'After reimporting, new node exists, old nodes titles have changed' +// expect(state.nodes).toEqual( +// { +// id_2: { +// id: 'id_2', +// title: 'Speed New', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_3: { +// id: 'id_3', +// title: 'Explode New', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'explode', +// sketchId: 'id_1', +// }, +// id_4: { +// id: 'id_4', +// title: 'Scale', +// value: 0.2, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'scale', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// } +// ) +// }) + +// test('(mock) Sketches - Reimport Sketch (Different order)', (t) => { +// mockUniqueId = 2 + +// const store = createStore(rootReducer, { +// availableModules: { +// foo: { +// defaultTitle: 'Foo', +// params: [ +// { +// key: 'speed', +// title: 'Speed', +// defaultValue: 0.5, +// }, +// { +// key: 'bar', +// title: 'Bar', +// defaultValue: 0.5, +// }, +// { +// key: 'scale', +// title: 'Scale', +// defaultValue: 0.2, +// }, +// ], +// shots: [], +// }, +// }, +// nodes: { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// }, +// id_3: { +// id: 'id_3', +// title: 'Scale', +// value: 0.2, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'scale', +// hidden: false, +// min: 0, +// max: 1, +// }, +// }, +// sketches: { +// id_1: { +// title: 'Foo', +// moduleId: 'foo', +// paramIds: ['id_2', 'id_3'], +// shotIds: [], +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(uSketchReloadFile('id_1')) + +// state = store.getState() + +// // 'After reimporting, sketch has new paramId in middle of array' +// expect(state.sketches['id_1'].paramIds).toEqual(['id_2', 'id_4', 'id_3']) + +// // 'After reimporting, new node exists' +// expect(state.nodes).toEqual( +// { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_3: { +// id: 'id_3', +// title: 'Scale', +// value: 0.2, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'scale', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_4: { +// id: 'id_4', +// title: 'Bar', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'bar', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// } +// ) +// }) + +// test('(mock) Sketches - Reimport Sketch (remove old nodes)', (t) => { +// mockUniqueId = 2 + +// const store = createStore(rootReducer, { +// availableModules: { +// foo: { +// defaultTitle: 'Foo', +// params: [ +// { +// key: 'speed', +// title: 'Speed', +// defaultValue: 0.5, +// }, +// ], +// shots: [ +// { +// method: 'spin', +// title: 'Spin', +// }, +// ], +// }, +// }, +// nodes: { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_3: { +// id: 'id_3', +// title: 'Explode', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'explode', +// sketchId: 'id_1', +// }, +// id_4: { +// id: 'id_4', +// title: 'Scale', +// value: 0.2, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'scale', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_5: { +// id: 'id_5', +// title: 'Spin', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'spin', +// sketchId: 'id_1', +// }, +// }, +// sketches: { +// id_1: { +// title: 'Foo', +// moduleId: 'foo', +// paramIds: ['id_2', 'id_4'], +// shotIds: ['id_3', 'id_5'], +// }, +// }, +// }, applyMiddleware(sagaMiddleware, listen(rootListener))) +// sagaMiddleware.run(rootSaga, store.dispatch) + +// let state + +// store.dispatch(uSketchReloadFile('id_1')) + +// state = store.getState() + +// // 'After reimporting, sketch has removed paramId' +// expect(state.sketches['id_1'].paramIds).toEqual(['id_2']) + +// // 'After reimporting, sketch has removed shotId' +// expect(state.sketches['id_1'].shotIds).toEqual(['id_5']) + +// // 'After reimporting, old nodes removed' +// expect(state.nodes).toEqual( +// { +// id_2: { +// id: 'id_2', +// title: 'Speed', +// value: 0.5, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'param', +// key: 'speed', +// hidden: false, +// min: 0, +// max: 1, +// defaultMin: 0, +// defaultMax: 1, +// }, +// id_5: { +// id: 'id_5', +// title: 'Spin', +// value: 0, +// inputLinkIds: [], +// shotCount: 0, +// connectedMacroIds: [], +// type: 'shot', +// method: 'spin', +// sketchId: 'id_1', +// }, +// }) +// }) diff --git a/package.json b/package.json index a0254553..e013c820 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,20 @@ { - "name": "hedron", - "version": "0.4.1", + "name": "Hedron", + "author": "Nudibranch Records", + "description": "Perform live shows with your three.js creations", + "version": "0.5.0", + "homepage": "https://github.com/nudibranchrecords/hedron", "repository": {}, "license": "AGPL-3.0+", "scripts": { - "lint": "eslint bin build config server src tests", + "lint": "eslint src config example-projects mockTests", "lint:css": "stylelint \"src/components/**/*.js\"", "lint:fix": "yarn lint -- --fix", - "test": "yarn lint && NODE_ENV=test tape-watch --once -r babel-register src/**/*.spec.js mockTests/**/*.spec.js -p tap-diff", - "test:dev": "NODE_ENV=test tape-watch -r babel-register src/**/*.spec.js mockTests/**/*.spec.js -p tap-diff", + "test": "yarn lint && yarn jest && cross-env NODE_ENV=test tape-watch --once -r @babel/register src/**/*.spec.js mockTests/**/*.spec.js -p tap-diff", + "test:dev": "cross-env NODE_ENV=test tape-watch -r @babel/register src/**/*.spec.js mockTests/**/*.spec.js -p tap-diff", + "test-jest": "yarn jest --watch", "compile": "electron-webpack", "dist": "yarn compile && electron-builder", - "dist:dev": "yarn dist -- --dir -c.compression=store -c.mac.identity=null && open dist/mac/hedron.app/ --args --distDev", - "dist:example-projects": "yarn --cwd ./example-projects && zip dist/example-projects.zip ./example-projects -r", "start": "yarn electron-webpack dev" }, "electronWebpack": { @@ -32,33 +34,39 @@ "glslify-import" ] }, + "jest": { + "testMatch": [ + "**/?(*.)+(test).[jt]s?(x)" + ] + }, "dependencies": { - "babel-loader": "^6.3.2", - "babel-plugin-transform-object-rest-spread": "^6.22.0", - "babel-polyfill": "^6.23.0", - "babel-preset-es2015": "^6.22.0", - "babel-register": "^6.22.0", + "@babel/core": "^7.2.2", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/polyfill": "^7.0.0", + "@babel/preset-env": "^7.3.1", + "@babel/register": "^7.0.0", + "@tweenjs/tween.js": "^17.2.0", + "babel-loader": "^8.0.5", + "chokidar": "^3.0.0", "create-react-class": "^15.5.2", - "electron-debug": "^1.4.0", - "electron-log": "^2.2.14", "err-code": "^1.1.2", "eventemitter3": "^3.0.1", "glslify-import": "^3.1.0", "history": "^4.6.1", "jsonfile": "^2.4.0", - "lodash": "^4.17.4", + "lodash": "^4.17.15", "performance-now": "^2.1.0", "proxyquire": "^1.7.11", - "react": "^16.2.0", + "react": "^16.7.0", "react-addons-perf": "^15.4.2", "react-create-class": "^1.0.0", - "react-dom": "16", + "react-dom": "^16.7.0", "react-hot-loader": "next", "react-input-autosize": "^1.1.3", + "react-popper": "^1.3.3", "react-redux": "^5.0.2", "react-router-dom": "next", "react-router-redux": "^5.0.0-alpha.9", - "react-select": "^1.0.0-rc.3", "recompose": "^0.26.0", "redux": "^3.6.0", "redux-action-listeners": "^1.0.2", @@ -68,39 +76,55 @@ "redux-ignore": "^1.2.4", "redux-saga": "^0.16.0", "stats.js": "^0.17.0", - "styled-components": "^2.2.3", + "styled-components": "^4.1.3", "tap-diff": "^0.1.1", "tap-tempo": "^0.1.1", - "three": "^0.92.0", + "three": "^0.107.0", "tinycolor2": "^1.4.1", "try-require": "^1.2.1", "uid": "^0.0.2" }, "devDependencies": { - "babel-eslint": "^7.1.1", - "babel-preset-react": "^6.24.1", - "babel-preset-stage-2": "^6.22.0", + "@babel/core": "^7.2.2", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-namespace-from": "^7.0.0", + "@babel/plugin-proposal-function-sent": "^7.0.0", + "@babel/plugin-proposal-json-strings": "^7.0.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-throw-expressions": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-import-meta": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.2.0", + "@babel/preset-react": "^7.0.0", + "@babel/runtime": "^7.3.1", + "babel-eslint": "8.2.6", + "babel-plugin-styled-components": "^1.10.0", "clean-webpack-plugin": "^0.1.16", "concurrently": "^3.4.0", "copy-webpack-plugin": "^4.0.1", + "cross-env": "^5.2.0", "css-loader": "^0.28.7", "deep-freeze": "^0.0.1", - "electron": "^1.8.2-beta.2", - "electron-builder": "^19.43.0", + "electron": "3", + "electron-builder": "^20.38.5", + "electron-debug": "^1.4.0", "electron-devtools-installer": "^2.2.1", - "electron-webpack": "^1.11.0", - "eslint": "^3.15.0", + "electron-log": "^2.2.14", + "electron-webpack": "^2.6.1", + "eslint": "^6.1.0", "eslint-config-standard": "^6.2.1", "eslint-config-standard-react": "^4.2.0", "eslint-plugin-babel": "^4.0.1", + "eslint-plugin-jest": "^22.3.0", "eslint-plugin-promise": "^3.4.1", "eslint-plugin-react": "^6.10.0", "eslint-plugin-standard": "^2.0.1", + "jest": "^24.1.0", "jsdom": "^11.5.1", "jsdom-global": "^3.0.2", "minimist": "^1.2.0", "redux-debounced": "^0.4.0", - "redux-devtools-extension": "^2.13.2", + "redux-devtools-extension": "^2.13.7", "sinon": "^2.1.0", "style-loader": "^0.16.1", "stylelint": "^7.9.0", @@ -110,7 +134,8 @@ "tap-colorize": "^1.2.0", "tape": "^4.6.3", "tape-watch": "^2.3.0", - "webpack": "^3.8.1", - "webpack-dev-server": "^2.4.1" + "webpack": "^4.29.1", + "webpack-cli": "^3.2.3", + "webpack-dev-server": "^3.1.14" } } diff --git a/readme.md b/readme.md index 9ffb4dad..a5ae8de0 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# Hedron +# Hedron Perform live shows with your three.js creations. @@ -14,26 +14,27 @@ Perform live shows with your three.js creations. - ⏲️ Use MIDI clock input or tap tempo to get BPM - 🌇🎚️🌋 Create many scenes and crossfade between them - 🔍 Preview and compose scenes before displaying them to the audience -- 🎛️ Use virtual MIDI banks to get the most out of your controllers - 💡 Use MIDI Learn to quickly assign controls +- 🔥 Hot reload your sketches on code changes, without affecting the rest of the scene - ⚙️ Support for multiple MIDI control modes (abs, rel1, rel2, rel3) - 📽️ Easily send output picture to external display - 💾 Save / load using JSON project files +## Hedron in action +[![Polyop](http://nudibranchrecords.github.io/hedron/polyop-creator.jpg)](https://vimeo.com/310779808) +[![Netgrind @ Halifax Pride](http://nudibranchrecords.github.io/hedron/netgrind-halifax-pride.jpg)](https://www.netgrindgames.com/) + ## Getting Started ### Install Download the latest [release](https://github.com/nudibranchrecords/hedron/releases) or [build from source](#build-from-source). -### Load trippy example project -1. If you haven't got the source code, download the latest example projects zip from the [releases](https://github.com/nudibranchrecords/hedron/releases) page. -2. Choose "Load Existing Project". Locate the repo directory. Open `example-projects/trippy/project.json` -3. An alert will appear. Choose "Locate Sketch Folder" and open `/example-projects/trippy/sketches` +### Load example project +1. Download the latest example projects zip from the [releases](https://github.com/nudibranchrecords/hedron/releases) page. If you've compiled from source, you'll already have the example projects, found in `/example-projects`. +2. In Hedron, choose "Load Existing Project". Choose a folder from the example projects (`Logo` is a good start!) and open `project.json`. 4. Play it some music, tap BPM, experiment with the controls -5. 😎 - -Please note that if you're trying to do this from the source code, you'll want to run `yarn` from inside the `example-projects` directory to install dependencies. +5. 👽 ## User Guide Head to the [User Guide](docs/user-guide/index.md) to learn how to use Hedron. @@ -63,7 +64,7 @@ If you are having fun with Hedron, we'd love you to help with development. See t Don't worry too much if the tests aren't passing, we can work on that together. :) ### Build From Source -If you're making your own sketches, you'll probably want to build Hedron from source. You'll get lots of extra development benefits this way, such as auto refreshing on save. +Building from source gives you some extra development features such as setting a default project that will always load on start. 1. Make sure [Node.js](https://nodejs.org/en/) and [Yarn](https://yarnpkg.com/en/docs/install) are installed on your machine. 2. Open terminal and run the commands below. @@ -85,8 +86,6 @@ Run `yarn dist` to package up the app for best performance and no dev tools. Onc |--|--| | `yarn start` | Run in dev mode | | `yarn dist` | Package the app | -| `yarn dist:dev` | Run a production build without packaging. Behaves similarly to `yarn start` in that it will look for a default project and open Chrome DevTools automatically. However it will not do any sort of live refreshing. | -| `yarn dist:example-projects`| Install dependencies for example projects, zip them and move them to the `dist` folder | | `yarn lint` | Run linting | | `yarn test` | Run pre deployment tests (including linting) | | `yarn test:dev` | Run tests on file changes (does not include linting) | diff --git a/src/assets/icons/down.icon.txt b/src/assets/icons/down.icon.txt index 4fb1a169..2c5035b5 100644 --- a/src/assets/icons/down.icon.txt +++ b/src/assets/icons/down.icon.txt @@ -3,8 +3,6 @@ - - - + diff --git a/src/components/AboutOverlay/index.js b/src/components/AboutOverlay/index.js new file mode 100644 index 00000000..4508b204 --- /dev/null +++ b/src/components/AboutOverlay/index.js @@ -0,0 +1,64 @@ +import React from 'react' +import PropTypes from 'prop-types' +import OverlayModal from '../OverlayModal' +import styled from 'styled-components' +import logo from '../../../build/icon.png' + +const { app } = require('electron').remote +const isDevelopment = process.env.NODE_ENV !== 'production' +const vNum = app.getVersion() + +// Version number comes out wrong in dev mode so we only display for production +const modalTitle = isDevelopment ? 'Dev Mode' : `v${vNum}` + +const Wrapper = styled.div` + display: flex; + flex-direction: column; + align-items: center; + + img { + max-width: 15rem; + margin-bottom: 1rem; + } + + p:last-child { + margin: 0; + } +` + +const Credits = styled.div` + border-top: 1px solid rgba(255,255,255,0.5); + width: 100%; + padding-top: 1rem; + + p { + font-size: 0.8rem; + } +` + +const AboutOverlay = ({ isVisible, onCancelClick }) => ( + + + + +

Hedron is an open-source project brought to you + by Nudibranch

+

Give feedback, report bugs or improve the software + on Github

+ +

Logo created by Cale Bradbury

+
+
+
+) + +AboutOverlay.propTypes = { + isVisible: PropTypes.bool, + onCancelClick: PropTypes.func.isRequired, +} + +export default AboutOverlay diff --git a/src/components/AddSketch/index.js b/src/components/AddSketch/index.js index 53f82566..ca9c5948 100644 --- a/src/components/AddSketch/index.js +++ b/src/components/AddSketch/index.js @@ -3,45 +3,95 @@ import PropTypes from 'prop-types' import Button from '../Button' import SceneHeader from '../../containers/SceneHeader' import styled from 'styled-components' +import Revealer from '../../containers/AuxRevealer' +import Control from '../../containers/Control' +const Category = styled(Revealer)` + font-size:1rem; + margin-bottom: .5rem; +` const Items = styled.ul` display: flex; flex-wrap: wrap; - margin-bottom: 2rem; & li { margin-right: 1rem; margin-bottom: 1rem; } ` +const Main = styled.div` + margin-left: 1rem; + margin-top: 1rem; +` -const AddSketch = ({ items, onAddClick, onChooseFolderClick, sketchesPath }) => ( -
- Add Sketch +const SketchItems = ({ subcategories, items, onAddClick }) => ( +
+ {(subcategories !== undefined) && subcategories.map(category => + + + + )} - {items.map((item) => ( + {items.map(item =>
  • - ))} + )}
    - {items.length === 0 &&

    You haven't chosen the sketch folder for the project yet.

    } +
    +) + +const AddSketch = ({ items, hasSketches, onAddClick, onChooseFolderClick, sketchesPath }) => ( + + Add Sketch + + + {items.categorizedItems[0].categories.map((catItem) => + + + + )} + + {!hasSketches &&

    You haven't chosen the sketch folder for the project yet.

    }
    {sketchesPath} -
    + ) +const itemsType = PropTypes.arrayOf(PropTypes.shape({ + title: PropTypes.string, + id: PropTypes.string, +})) + AddSketch.propTypes = { sketchesPath: PropTypes.string, onAddClick: PropTypes.func.isRequired, onChooseFolderClick: PropTypes.func.isRequired, - items: PropTypes.arrayOf( - PropTypes.shape({ + items: PropTypes.shape({ + looseItems: itemsType, + categorizedItems: PropTypes.arrayOf(PropTypes.shape({ title: PropTypes.string, - id: PropTypes.string - }) - ).isRequired + id: PropTypes.string, + items: itemsType, + categories: PropTypes.array, + })), + }), + hasSketches: PropTypes.bool, +} + +SketchItems.propTypes = { + subcategories: PropTypes.array, + items: itemsType, + onAddClick: PropTypes.func.isRequired, } export default AddSketch diff --git a/src/components/App/index.js b/src/components/App/index.js index ad45b536..b7b8bfb5 100644 --- a/src/components/App/index.js +++ b/src/components/App/index.js @@ -10,7 +10,10 @@ import PanelDragger from '../PanelDragger' import MidiLearn from '../../containers/MidiLearn' import EditingOverlay from '../../containers/EditingOverlay' import ErrorOverlay from '../../containers/ErrorOverlay' +import AboutOverlay from '../../containers/AboutOverlay' import MainViewOuter from '../../containers/MainViewOuter' +import ParamPropertiesPanel from '../../containers/ParamPropertiesPanel' +import MacroPropertiesPanel from '../../containers/MacroPropertiesPanel' import Home from '../../containers/Home' import ScenesNav from '../ScenesNav' @@ -31,6 +34,8 @@ const Left = styled.div` const Right = styled.div` flex: 1; + display: flex; + flex-direction: column; ` const Bar = styled.div` @@ -40,8 +45,8 @@ const Bar = styled.div` background: #111; height: 100%; ` -const App = ({ stats, leftWidth, onLeftDrag, onWrapperClick }) => ( - +const App = ({ stats, leftWidth, onLeftDrag, onWrapperClick, sketchId, macroId }) => ( + @@ -53,6 +58,9 @@ const App = ({ stats, leftWidth, onLeftDrag, onWrapperClick }) => ( + + } /> + @@ -60,6 +68,7 @@ const App = ({ stats, leftWidth, onLeftDrag, onWrapperClick }) => ( + ) @@ -69,5 +78,9 @@ App.propTypes = { stats: PropTypes.object.isRequired, leftWidth: PropTypes.number.isRequired, onLeftDrag: PropTypes.func.isRequired, - onWrapperClick: PropTypes.func.isRequired + onWrapperClick: PropTypes.func.isRequired, + sketchId: PropTypes.oneOfType([ + PropTypes.string, PropTypes.bool, + ]).isRequired, + macroId: PropTypes.string, } diff --git a/src/components/AudioAnalyzer/index.js b/src/components/AudioAnalyzer/index.js index b789a9ba..5b18ec56 100644 --- a/src/components/AudioAnalyzer/index.js +++ b/src/components/AudioAnalyzer/index.js @@ -1,11 +1,11 @@ import React from 'react' import PropTypes from 'prop-types' import uiEventEmitter from '../../utils/uiEventEmitter' -import Control from '../../containers/Control' +import Node from '../../containers/Node' import styled, { css } from 'styled-components' import theme from '../../utils/theme' -let height, val, offset, hue, i, inputs, bands +let height, val, offset, hue, i, inputs const triH = 8 @@ -34,14 +34,14 @@ const triangle = css` const SettingsBox = styled.div` visibility: ${props => props.isVisible ? 'visible' : 'hidden'}; left: 50%; - width: 9rem; - margin-left: -4.5rem; + width: 12rem; + margin-left: -6rem; margin-top: 0.25rem; border: 1px solid white; background: ${theme.bgColorDark1}; position: absolute; z-index: 10; - padding: 0.5rem 0.25rem 0.25rem 0.5rem; + padding: 0.5rem 0.25rem; &:after { ${triangle} @@ -56,8 +56,15 @@ const SettingsBox = styled.div` } ` -class AudioAnalyzer extends React.Component { +const Block = styled.div` + margin-bottom: 0.25rem; +` +const Item = (props) => ( + +) + +class AudioAnalyzer extends React.Component { constructor (props) { super(props) this.draw = this.draw.bind(this) @@ -79,8 +86,7 @@ class AudioAnalyzer extends React.Component { draw () { inputs = this.context.store.getState().inputs - bands = [inputs.audio_0.value, inputs.audio_1.value, inputs.audio_2.value, inputs.audio_3.value] - this.drawGraph(bands) + this.drawGraph(inputs.audio.value) } drawGraph (data) { @@ -103,14 +109,17 @@ class AudioAnalyzer extends React.Component { render () { return ( - + { this.canvas = node }} onClick={this.props.onAnalyzerClick} /> - - + + + + + ) @@ -118,12 +127,12 @@ class AudioAnalyzer extends React.Component { } AudioAnalyzer.contextTypes = { - store: PropTypes.object.isRequired + store: PropTypes.object.isRequired, } AudioAnalyzer.propTypes = { isOpen: PropTypes.bool, onAnalyzerClick: PropTypes.func.isRequired, - onWrapperClick: PropTypes.func.isRequired + onWrapperClick: PropTypes.func.isRequired, } export default AudioAnalyzer diff --git a/src/components/BankSelect/index.js b/src/components/BankSelect/index.js deleted file mode 100644 index 1d9a5201..00000000 --- a/src/components/BankSelect/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import styled from 'styled-components' -import BankSelectItem from '../../containers/BankSelectItem' - -const List = styled.ul` - display: flex; - justify-content: space-between; -` - -const BankSelect = ({ deviceId }) => ( - - {[...Array(8)].map((x, i) => - - )} - -) - -BankSelect.propTypes = { - deviceId: PropTypes.string.isRequired -} - -export default BankSelect diff --git a/src/components/BankSelectItem/index.js b/src/components/BankSelectItem/index.js deleted file mode 100644 index 1ae95a47..00000000 --- a/src/components/BankSelectItem/index.js +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import styled from 'styled-components' - -const Wrapper = styled.li` - border: 1px solid; - font-size: 0.8rem; - padding: 0.25rem 0.5rem; - flex: 1; - margin-right: 0.25rem; - text-align: center; - cursor: pointer; - background: ${props => props.isActive ? '#da5782' : 'transparent'}; - border-color: ${props => props.isActive ? '#da5782' : '#aaa'}; - - &:hover { - border-color: white; - } - - &:last-child { - margin-right: 0; - } -` - -const BankSelectItem = ({ index, onClick, isActive }) => ( - - {index + 1} - -) - -BankSelectItem.propTypes = { - index: PropTypes.number.isRequired, - onClick: PropTypes.func.isRequired, - isActive: PropTypes.bool -} - -export default BankSelectItem diff --git a/src/components/Button/index.js b/src/components/Button/index.js index 1e134eaa..946b9faa 100644 --- a/src/components/Button/index.js +++ b/src/components/Button/index.js @@ -7,13 +7,13 @@ import { Link as RouterLink } from 'react-router-dom' const sizes = { large: '1.5rem', - small: '0.7rem' + small: '0.7rem', } const colors = { channelA: theme.channelAColor, channelB: theme.channelBColor, - danger: theme.dangerColor + danger: theme.dangerColor, } const Inner = styled.span` @@ -41,11 +41,11 @@ const Wrapper = styled.span` &:hover { ${Inner} { background: ${ - props => { - const col = colors[props.color] || theme.actionColor1 - return tinyColor(col).lighten(5).toString() - } - }; + props => { + const col = colors[props.color] || theme.actionColor1 + return tinyColor(col).lighten(5).toString() + } +}; ${props => props.reversed && ` color: white; @@ -68,12 +68,14 @@ const Link = styled(RouterLink)` text-decoration: none; ` -const Button = ({ onClick, ...props }) => - - +// Anything in ...props could be a function like onClick, onMouseDown, etc +// so we only want that to be given to one element to prevent things firing twice +const Button = ({ color, size, disabled, reversed, children, to, ...props }) => + + {props.to - ? - : {props.children} + ? {children} + : {children} } @@ -81,7 +83,10 @@ const Button = ({ onClick, ...props }) => Button.propTypes = { to: PropTypes.string, children: PropTypes.node.isRequired, - onClick: PropTypes.func + color: PropTypes.string, + size: PropTypes.string, + disabled: PropTypes.bool, + reversed: PropTypes.bool, } export default Button diff --git a/src/components/ButtonWithInputIcons/index.js b/src/components/ButtonWithInputIcons/index.js new file mode 100644 index 00000000..d32a3e09 --- /dev/null +++ b/src/components/ButtonWithInputIcons/index.js @@ -0,0 +1,27 @@ +import React from 'react' +import styled from 'styled-components' +import PropTypes from 'prop-types' +import Button from '../../components/Button' +import Row from '../../components/Row' +import NodeInputIcons from '../../containers/NodeInputIcons' + +const MainButton = styled(Button)` + margin-right: 0.25rem; +` + +const ButtonWithInputIcons = ({ onClick, children, linkableActionId, color, panelId }) => ( + + {children} + + +) + +ButtonWithInputIcons.propTypes = { + linkableActionId: PropTypes.string, + children: PropTypes.node.isRequired, + onClick: PropTypes.func, + color: PropTypes.string, + panelId: PropTypes.string, +} + +export default ButtonWithInputIcons diff --git a/src/components/Clock/index.js b/src/components/Clock/index.js index 041d53bd..2c0ba4c8 100644 --- a/src/components/Clock/index.js +++ b/src/components/Clock/index.js @@ -38,10 +38,10 @@ const Clock = ({ beat, bar, phrase, bpm, onResetClick, onTapTempoClick }) => ( {beat} - {bar} - {phrase} {bpm} - + - Tap
    Tempo
    + Tap
    Tempo
    ) @@ -52,7 +52,7 @@ Clock.propTypes = { phrase: PropTypes.number.isRequired, bpm: PropTypes.number, onResetClick: PropTypes.func.isRequired, - onTapTempoClick: PropTypes.func.isRequired + onTapTempoClick: PropTypes.func.isRequired, } export default Clock diff --git a/src/components/Col/index.js b/src/components/Col/index.js index 20e51697..ae8b7719 100644 --- a/src/components/Col/index.js +++ b/src/components/Col/index.js @@ -4,7 +4,7 @@ const Col = styled.div` ${props => props.width ? `flex: 0 0 ${props.width};` : `flex: 1;` - } +} padding-right: 1rem; diff --git a/src/components/Control/index.js b/src/components/Control/index.js index fa08071e..5ba13d1e 100644 --- a/src/components/Control/index.js +++ b/src/components/Control/index.js @@ -1,22 +1,32 @@ import React from 'react' import PropTypes from 'prop-types' -import Modifier from '../../containers/Modifier' -import Select from '../../containers/Select' +import ParamBar from '../../containers/ParamBar' +import NodeSelect from '../../containers/NodeSelect' -const Control = ({ nodeId, type }) => { +const Control = ({ nodeId, onParamBarClick, type, theme, onChangeAction }) => { switch (type) { case 'select': - return @@ -23,7 +22,8 @@ InputSelect.propTypes = { onInputChange: PropTypes.func.isRequired, options: PropTypes.arrayOf( PropTypes.object - ).isRequired + ).isRequired, + nodeId: PropTypes.string.isRequired, } export default InputSelect diff --git a/src/components/Item/index.js b/src/components/Item/index.js index b257f936..f901cd4e 100644 --- a/src/components/Item/index.js +++ b/src/components/Item/index.js @@ -12,7 +12,7 @@ const Item = ({ children }) => ( ) Item.propTypes = { - children: PropTypes.node + children: PropTypes.node, } export default Item diff --git a/src/components/Items/index.js b/src/components/Items/index.js index 403632db..0566bab8 100644 --- a/src/components/Items/index.js +++ b/src/components/Items/index.js @@ -15,7 +15,7 @@ const Items = ({ children, direction }) => ( Items.propTypes = { children: PropTypes.node, - direction: PropTypes.string + direction: PropTypes.string, } export default Items diff --git a/src/components/MacroItem/index.js b/src/components/MacroItem/index.js deleted file mode 100644 index 52274f67..00000000 --- a/src/components/MacroItem/index.js +++ /dev/null @@ -1,98 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import ButtonComponent from '../Button' -import Param from '../../components/Param' -import MacroLink from '../../containers/MacroLink' -import InputLinkUI from '../../containers/InputLinkUI' -import Row from '../Row' -import styled from 'styled-components' - -const Links = styled.div` - display: flex; - flex-wrap: wrap; - margin-bottom: 0.5rem; -` - -const Bottom = styled.div` - margin-top: 1rem; -` - -const Button = styled(ButtonComponent)` - margin-right: 1rem; - - &:last-child { - margin-right: 0; - margin-left: auto; - } -` - -const MacroItem = ({ - nodeId, onLearningClick, onDeleteClick, paramLinks, inputLinkIds, isLearning, - macroId, inputSettingsAreVisible, paramLinksAreVisible, isOpen, title, onOpenClick, numInputs, - inputLinkTitle, onRenameClick -}) => ( -
    - - - - - { - paramLinksAreVisible && -
    -
    Connected Params
    - - {paramLinks.map(item => ( - - ))} - -
    - } -
    - - - - - - - - -
    -) - -MacroItem.propTypes = { - isLearning: PropTypes.bool, - paramLinks: PropTypes.array.isRequired, - inputLinkIds: PropTypes.array.isRequired, - nodeId: PropTypes.string.isRequired, - macroId: PropTypes.string.isRequired, - onLearningClick: PropTypes.func.isRequired, - onDeleteClick: PropTypes.func.isRequired, - inputSettingsAreVisible: PropTypes.bool, - paramLinksAreVisible: PropTypes.bool, - isOpen: PropTypes.bool, - title: PropTypes.string.isRequired, - onOpenClick: PropTypes.func.isRequired, - numInputs: PropTypes.number.isRequired, - inputLinkTitle: PropTypes.string, - onRenameClick: PropTypes.func.isRequired -} - -export default MacroItem diff --git a/src/components/MacroLink/index.js b/src/components/MacroLink/index.js index 923e2637..cbf961d3 100644 --- a/src/components/MacroLink/index.js +++ b/src/components/MacroLink/index.js @@ -38,7 +38,7 @@ const MacroLink = ( MacroLink.propTypes = { title: PropTypes.string.isRequired, nodeId: PropTypes.string.isRequired, - onDeleteClick: PropTypes.func.isRequired + onDeleteClick: PropTypes.func.isRequired, } export default MacroLink diff --git a/src/components/MacroProperties/index.js b/src/components/MacroProperties/index.js new file mode 100644 index 00000000..823ee070 --- /dev/null +++ b/src/components/MacroProperties/index.js @@ -0,0 +1,76 @@ +import React from 'react' +import PropTypes from 'prop-types' +import ButtonComponent from '../Button' +import MacroLink from '../../containers/MacroLink' +import Row from '../Row' +import styled from 'styled-components' + +const Wrapper = styled.div` + flex: 1; + display: flex; + flex-direction: column; +` + +const Links = styled.div` + display: flex; + flex-wrap: wrap; + margin-bottom: 0.5rem; +` + +const Bottom = styled.div` + margin-top: auto; + padding-top: 1rem; +` + +const Button = styled(ButtonComponent)` + margin-right: 1rem; + + &:last-child { + margin-right: 0; + margin-left: auto; + } +` + +const MacroProperties = ({ + macroId, onLearningClick, onDeleteClick, paramLinks, isLearning, paramLinksAreVisible, onRenameClick, +}) => ( + + + {paramLinksAreVisible && +
    +
    Connected Params
    + + {paramLinks.map(item => ( + + ))} + +
    + } +
    + + + + + + +
    +) + +MacroProperties.propTypes = { + isLearning: PropTypes.bool, + paramLinks: PropTypes.array.isRequired, + macroId: PropTypes.string.isRequired, + onLearningClick: PropTypes.func.isRequired, + onDeleteClick: PropTypes.func.isRequired, + paramLinksAreVisible: PropTypes.bool, + onRenameClick: PropTypes.func.isRequired, +} + +export default MacroProperties diff --git a/src/components/Macros/index.js b/src/components/Macros/index.js index 1e3c6c94..365c9cd6 100644 --- a/src/components/Macros/index.js +++ b/src/components/Macros/index.js @@ -5,11 +5,10 @@ import Button from '../Button' import ViewHeader from '../ViewHeader' import Items from '../Items' import Item from '../Item' -import MacroItem from '../../containers/MacroItem' +import Node from '../../containers/Node' const Wrapper = styled.div` display: flex; - height: 100%; flex-direction: column; ` @@ -19,7 +18,7 @@ const Macros = ({ items, onAddClick }) => ( {items.map(({ id }) => ( - + ))} @@ -34,9 +33,9 @@ Macros.propTypes = { items: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.string, - title: PropTypes.string + title: PropTypes.string, }) - ) + ), } export default Macros diff --git a/src/components/MainViewOuter/index.js b/src/components/MainViewOuter/index.js index 55929798..3c0608c6 100644 --- a/src/components/MainViewOuter/index.js +++ b/src/components/MainViewOuter/index.js @@ -27,17 +27,29 @@ const Notification = styled.div` justify-content: space-between; ` +const Buttons = styled.div` + display: flex; + flex-direction: row-reverse; + + > * { + margin-left: 0.5rem; + } +` + const MainViewOuter = ( - { children, notificationText, notificationButtonText, isActive, - onNotificationButtonClick } + { children, notificationText, isActive, buttons } ) => ( {notificationText && {notificationText} - + + {buttons.map(({ text, onClick }, index) => + + )} + } @@ -51,7 +63,11 @@ export default MainViewOuter MainViewOuter.propTypes = { children: PropTypes.node.isRequired, notificationText: PropTypes.string, - notificationButtonText: PropTypes.string, - onNotificationButtonClick: PropTypes.func, - isActive: PropTypes.bool + buttons: PropTypes.arrayOf( + PropTypes.shape({ + text: PropTypes.string.isRequired, + onClick: PropTypes.func.isRequired, + }) + ), + isActive: PropTypes.bool, } diff --git a/src/components/MenuPanel/index.js b/src/components/MenuPanel/index.js new file mode 100644 index 00000000..fff1e3ec --- /dev/null +++ b/src/components/MenuPanel/index.js @@ -0,0 +1,62 @@ +import React from 'react' +import PropTypes from 'prop-types' +import styled from 'styled-components' +import theme from '../../utils/theme' + +const Wrapper = styled.div` + background-color: ${theme.bgColorDark2}; + border-top: 1px solid ${theme.lineColor2}; + min-height: 15rem; + display: flex; + flex-direction: column; +` + +const Header = styled.h4` + display: flex; + margin: 0; + padding-left: 0.5rem; + height: 2rem; + align-items: center; + background: ${theme.bgColorDark3}; + color: ${theme.textColorLight1}; +` + +const Body = styled.div` + padding: 0.5rem; + flex: 1; + display: flex; + flex-direction: column; + max-height: 40vh; + overflow: auto; +` + +const Icon = styled.span` + display: block; + padding: 0.5rem; + margin-left: auto; + cursor: pointer; + + &:hover { + color: ${theme.actionColor1}; + } +` + +const MenuPanel = ({ titleContent, children, onCloseClick }) => ( + +
    + {titleContent} + { onCloseClick && {'×'} } +
    + + {children} + +
    +) + +MenuPanel.propTypes = { + children: PropTypes.node.isRequired, + titleContent: PropTypes.node.isRequired, + onCloseClick: PropTypes.func, +} + +export default MenuPanel diff --git a/src/components/MidiButton/index.js b/src/components/MidiButton/index.js index 27dc89c6..397a995b 100644 --- a/src/components/MidiButton/index.js +++ b/src/components/MidiButton/index.js @@ -17,7 +17,7 @@ const MidiButton = ({ onClick }) => ( ) MidiButton.propTypes = { - onClick: PropTypes.func.isRequired + onClick: PropTypes.func.isRequired, } export default MidiButton diff --git a/src/components/MidiLearn/index.js b/src/components/MidiLearn/index.js index 91810537..b3639357 100644 --- a/src/components/MidiLearn/index.js +++ b/src/components/MidiLearn/index.js @@ -16,5 +16,5 @@ export default MidiLearn MidiLearn.propTypes = { isVisible: PropTypes.bool, - onCancelClick: PropTypes.func.isRequired + onCancelClick: PropTypes.func.isRequired, } diff --git a/src/components/Modifier/index.js b/src/components/Modifier/index.js index 7a351b7c..afeddd27 100644 --- a/src/components/Modifier/index.js +++ b/src/components/Modifier/index.js @@ -33,7 +33,7 @@ const Modifier = ( Modifier.propTypes = { title: PropTypes.string.isRequired, nodeId: PropTypes.string.isRequired, - onAssignClick: PropTypes.func.isRequired + onAssignClick: PropTypes.func.isRequired, } export default Modifier diff --git a/src/components/NavItem/index.js b/src/components/NavItem/index.js index 8d10e3ea..bc06e575 100644 --- a/src/components/NavItem/index.js +++ b/src/components/NavItem/index.js @@ -51,7 +51,7 @@ const NavItem = (props) => { } NavItem.propTypes = { - to: PropTypes.string + to: PropTypes.string, } export default NavItem diff --git a/src/components/Node/index.js b/src/components/Node/index.js index 22526065..b9e10710 100644 --- a/src/components/Node/index.js +++ b/src/components/Node/index.js @@ -1,9 +1,86 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Control from '../../containers/Control' +import NodeInputIcons from '../../containers/NodeInputIcons' import styled from 'styled-components' import theme from '../../utils/theme' -const Node = styled.div` +const Wrapper = styled.div` border: 1px solid ${theme.lineColor1}; border-radius: 3px; + color: ${theme.textColorLight1}; + fill: ${theme.textColorLight1}; + padding: 0.25rem; + display: flex; + flex-direction: column; + + ${props => { + switch (props.theme) { + case 'panel': + return `border-color: ${theme.bgColorDark3};` + case 'light': + return `border-color: ${theme.lineColor2};` + } + }} + + + ${props => props.isOpen && ` + border-color: white; + `} +` + +const Main = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +` + +const Inner = styled.div` + margin-bottom: 0.25rem; + width: 50%; ` +const Title = styled.div` + width: 50%; + border-bottom: 1px dotted ${theme.bgColorDark3}; + display: flex; + align-items: center; + height: 16px; + text-transform: uppercase; + margin-bottom: 0.25rem; + margin-right: 0.25rem; + font-size: 0.5rem; + z-index: 1; + overflow: hidden; + + ${props => { + switch (props.theme) { + case 'light': + return `border-color: ${theme.lineColor2};` + } + }} +` + +const Node = ({ title, nodeId, isOpen, onParamBarClick, type, panelId, theme }) => ( + +
    + {title} + + + +
    + +
    +) + +Node.propTypes = { + title: PropTypes.string.isRequired, + nodeId: PropTypes.string.isRequired, + isOpen: PropTypes.bool, + onParamBarClick: PropTypes.func, + type: PropTypes.string, + panelId: PropTypes.string, + theme: PropTypes.string, +} + export default Node diff --git a/src/components/NodeInputIcons/index.js b/src/components/NodeInputIcons/index.js new file mode 100644 index 00000000..bb4b849a --- /dev/null +++ b/src/components/NodeInputIcons/index.js @@ -0,0 +1,81 @@ +import React from 'react' +import PropTypes from 'prop-types' +import styled from 'styled-components' +import theme from '../../utils/theme' + +import inputIcon from '../../assets/icons/input.icon.txt' +import macroIcon from '../../assets/icons/macro.icon.txt' +import IconComponent from '../Icon' + +import { PanelContext } from '../../context' + +const Wrapper = styled.div` + display: flex; + justify-content: space-between; + font-size: 0.5rem; + cursor: pointer; + text-transform: uppercase; + + > span { + display: flex; + } + + &:hover { + color: ${theme.actionColor1}; + + svg { + fill: ${theme.actionColor1}; + } + } +` + +const Icon = styled(IconComponent)` + width: 0.5rem; + height: 0.5rem; + margin-right: 0.1rem; +` + +const IconInfo = styled.div` + display: flex; + margin-left: auto; + flex-direction: ${props => props.size === 'compact' ? 'column' : 'row'}; + + > span { + display: flex; + margin-left: ${props => props.size === 'compact' ? '0' : '0.3rem'}; + } + + svg { + fill: #fff; + + &:hover { + opacity: 1; + } + } +` + +const NodeInputIcons = ({ + onClick, inputLinkTitle, numInputs, numMacros, size, +}) => ( + + {panelId => + { onClick(panelId) }}> + {inputLinkTitle && size !== 'compact' && {inputLinkTitle}} + + {numInputs !== undefined && ({numInputs})} + {numMacros !== undefined && ({numMacros})} + + + } + +) + +NodeInputIcons.propTypes = { + onClick: PropTypes.func, + numInputs: PropTypes.number, + numMacros: PropTypes.number, + inputLinkTitle: PropTypes.string, + size: PropTypes.string, +} + +export default NodeInputIcons diff --git a/src/components/NodeInputInfo/index.js b/src/components/NodeInputInfo/index.js index b879f6ba..ff2d2121 100644 --- a/src/components/NodeInputInfo/index.js +++ b/src/components/NodeInputInfo/index.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import InputLinkTags from '../InputLinkTags' const NodeInputInfo = ({ - inputLinkIds, isLearningMidi + inputLinkIds, isLearningMidi, }) => (
    {isLearningMidi @@ -17,7 +17,7 @@ NodeInputInfo.propTypes = { inputLinkIds: PropTypes.arrayOf( PropTypes.string ), - isLearningMidi: PropTypes.bool + isLearningMidi: PropTypes.bool, } export default NodeInputInfo diff --git a/src/components/NodeProperties/index.js b/src/components/NodeProperties/index.js new file mode 100644 index 00000000..629bf0bd --- /dev/null +++ b/src/components/NodeProperties/index.js @@ -0,0 +1,56 @@ +import React from 'react' +import styled from 'styled-components' +import PropTypes from 'prop-types' +import Revealer from '../../components/Revealer' +import ParamRange from '../../containers/ParamRange' +import Control from '../../containers/Control' +import InputLinkUI from '../../containers/InputLinkUI' +import theme from '../../utils/theme' +import MacroProperties from '../../containers/MacroProperties' + +const Top = styled.div` + margin-bottom: 0.5rem; + padding-bottom: 0.5rem; + border-bottom: ${theme.lineColor1} 1px dashed; +` +const Bar = styled.div` + display: flex; + margin-bottom: 0.5rem; + text-transform: uppercase; + font-size: 0.6rem; + align-items: center; + + > div { + width: 30%; + } + + > span { + margin-right: 0.5rem; + } +` + +const NodeProperties = ({ nodeId, type, advancedIsOpen, onAdvancedClick, displayValue }) => ( +
    + + { displayValue && Value:
    } + +
    + { + type === 'macro' + ? + : + + + } +
    +) + +NodeProperties.propTypes = { + nodeId: PropTypes.string.isRequired, + advancedIsOpen: PropTypes.bool, + onAdvancedClick: PropTypes.func.isRequired, + type: PropTypes.string, + displayValue: PropTypes.bool, +} + +export default NodeProperties diff --git a/src/components/NodeTabItem/index.js b/src/components/NodeTabItem/index.js index ae14100a..c274f194 100644 --- a/src/components/NodeTabItem/index.js +++ b/src/components/NodeTabItem/index.js @@ -8,7 +8,7 @@ const Wrapper = styled.div` font-size: 0.7rem; padding: 0.25rem 0.5rem; text-transform: uppercase; - border: 1px solid ${theme.lineColor2}; + border: 1px solid ${theme.lineColor1}; color: ${props => props.isSelected ? 'white' : '#ddd'}; background-color: ${props => { @@ -18,7 +18,7 @@ const Wrapper = styled.div` }}; border-color: ${props => { - let color = props.isActive ? theme.actionColor1 : theme.lineColor1 + let color = props.isActive ? theme.actionColor1 : theme.lineColor2 color = props.isSelected ? 'white' : color return color }}; @@ -44,7 +44,7 @@ NodeTabItem.propTypes = { title: PropTypes.string.isRequired, isSelected: PropTypes.bool, isActive: PropTypes.bool, - onClick: PropTypes.func.isRequired + onClick: PropTypes.func.isRequired, } export default NodeTabItem diff --git a/src/components/OverlayModal/index.js b/src/components/OverlayModal/index.js index 213bb23f..c4b5a2cd 100644 --- a/src/components/OverlayModal/index.js +++ b/src/components/OverlayModal/index.js @@ -9,7 +9,7 @@ const Wrapper = styled.div` top: 0; bottom: 0; right: 0; - z-index: 10; + z-index: 100; display: flex; align-items: center; justify-content: center; @@ -49,8 +49,8 @@ const Close = styled.div` const OverlayModal = ({ isVisible, title, onCancelClick, children }) => (
    {isVisible && - { e.stopPropagation(); onCancelClick() }}> - e.stopPropagation()}> + { e.stopPropagation(); onCancelClick() }}> + e.stopPropagation()}> {title &&

    {title}

    } {children} {onCancelClick && ×} @@ -66,5 +66,5 @@ OverlayModal.propTypes = { title: PropTypes.string, isVisible: PropTypes.bool, onCancelClick: PropTypes.func.isRequired, - children: PropTypes.node.isRequired + children: PropTypes.node.isRequired, } diff --git a/src/components/Overview/index.js b/src/components/Overview/index.js index 3121b666..02996267 100644 --- a/src/components/Overview/index.js +++ b/src/components/Overview/index.js @@ -8,7 +8,8 @@ import AudioAnalyzer from '../../containers/AudioAnalyzer' import Clock from '../../containers/Clock' import SceneManager from '../../containers/SceneManager' import Devices from '../../containers/Devices' -import Control from '../../containers/Control' +import Node from '../../containers/Node' +import OverviewPropertiesPanel from '../../containers/OverviewPropertiesPanel' import theme from '../../utils/theme' const Wrapper = styled.div` @@ -22,6 +23,7 @@ const Top = styled.div` const Bottom = styled.div` margin-top: auto; + margin-bottom: 0.5rem; ` const Tools = styled.div` @@ -29,8 +31,11 @@ const Tools = styled.div` margin-bottom: 1rem; background: ${theme.bgColorDark3}; padding: 0.5rem; + align-items: flex-end; & > div { + display: flex; + align-items: flex-end; height: 48px; margin-right: 0.5rem } @@ -43,6 +48,10 @@ const Scroller = styled.div` overflow: auto; ` +const PanelWrapper = styled.div` + margin: 0 -0.5rem -0.5rem -0.5rem; +` + class Overview extends React.Component { render () { return ( @@ -53,7 +62,7 @@ class Overview extends React.Component {
    node && node.appendChild(this.props.stats.dom)} />
    -
    +
    @@ -67,6 +76,9 @@ class Overview extends React.Component { + + + ) @@ -75,8 +87,8 @@ class Overview extends React.Component { Overview.propTypes = { stats: PropTypes.shape({ - dom: PropTypes.object - }).isRequired + dom: PropTypes.object, + }).isRequired, } export default Overview diff --git a/src/components/PanelDragger/index.js b/src/components/PanelDragger/index.js index b4828c80..719a0a74 100644 --- a/src/components/PanelDragger/index.js +++ b/src/components/PanelDragger/index.js @@ -23,7 +23,6 @@ const Wrapper = styled.div` } ` class PanelDragger extends React.Component { - constructor (props) { super(props) @@ -44,31 +43,26 @@ class PanelDragger extends React.Component { document.addEventListener('mouseup', onMouseUp) } - componentDidMount () { - // Force repaint after mounting to fix up components - setTimeout(() => { - uiEventEmitter.emit('repaint') - }, 1000) - } - handleMouseMove (e) { + uiEventEmitter.emit('panel-resize-start') + const diff = (e.screenX - this.pos) / window.innerWidth * 100 const newVal = Math.max(0, Math.min(100, this.currentPos + diff)) this.props.onHandleDrag(newVal) - setTimeout(() => { + clearTimeout(this.dragDebounce) + this.dragDebounce = setTimeout(() => { uiEventEmitter.emit('repaint') - }) + }, 50) } render () { return () } - } export default PanelDragger PanelDragger.propTypes = { onHandleDrag: PropTypes.func.isRequired, - position: PropTypes.number.isRequired + position: PropTypes.number.isRequired, } diff --git a/src/components/Param/index.js b/src/components/Param/index.js deleted file mode 100644 index 7c69ab72..00000000 --- a/src/components/Param/index.js +++ /dev/null @@ -1,224 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import ParamBar from '../../containers/ParamBar' -import Node from '../Node' -import styled, { ThemeProvider } from 'styled-components' -import inputIcon from '../../assets/icons/input.icon.txt' -import macroIcon from '../../assets/icons/macro.icon.txt' -import IconComponent from '../Icon' -import theme from '../../utils/theme' -import uiEventEmitter from '../../utils/uiEventEmitter' - -const Wrapper = styled.div` - width: 100%; -` - -const Inner = styled(Node)` - width: 100%; - color: ${theme.textColorLight1}; - fill: ${theme.textColorLight1}; - - ${props => props.isOpen && ` - border-bottom: 0; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - border-color: white; - `}; - - ${props => props.isActive && ` - border-color: ${theme.actionColor1}; - `} -` - -const BarCol = styled.div` - width: 100%; - position: relative; - overflow: hidden; - margin-bottom: 0.25rem; -` - -const Top = styled.div` - padding: 0.5rem; -` - -const Row = styled.div` - display: flex; - flex-direction: column; -` - -const Bottom = styled.div` - align-items: center; - padding: 0.5rem 0.25rem 0.5rem 0.5rem; - border: 1px solid white; - position: absolute; - left: 0.25rem; - right: 0.25rem; - margin-top: 0.5rem; - - ${props => props.isActive && ` - border-color: ${theme.actionColor1}; - `} -` - -const Padder = styled.div` - height: calc(${props => props.height}px + 0.5rem); - - &:after { - display: block; - position: relative; - z-index: 2; - content: ""; - border: 1px solid white; - border-top-style: dashed; - border-bottom: 0; - height: calc(0.5rem + 2px); - background: ${theme.bgColorDark1}; - - ${props => props.isActive && ` - border-color: ${theme.actionColor1}; - `} - } -` - -const Title = styled.div` - color: ${theme.textColorLight1}; - text-transform: uppercase; - height: 1rem; - font-size: 0.6rem; - z-index: 1; - position: absolute; - top: 0.25rem; - left: 0.2rem; - width: 1000px; - pointer-events: none; -` - -const Icon = styled(IconComponent)` - width: 0.6rem; - height: 0.6rem; - margin-right: 0.1rem; -` -const Info = styled.div` - display: flex; - justify-content: space-between; - font-size: 0.6rem; - cursor: pointer; - text-transform: uppercase; - - > span { - display: flex; - } - - &:hover { - color: ${theme.actionColor1}; - fill: ${theme.actionColor1}; - } -` - -const IconInfo = styled.div` - display: flex; - margin-left: auto; - - > span { - display: flex; - margin-left: 0.3rem; - } -` - -class Param extends React.Component { - constructor () { - super() - this.state = { - bottomHeight: 0 - } - this.calculateHeights = this.calculateHeights.bind(this) - - uiEventEmitter.on('repaint', this.calculateHeights) - } - - componentDidMount () { - this.calculateHeights() - } - - componentWillUnmount () { - uiEventEmitter.removeListener('repaint', this.calculateHeights) - } - - componentDidUpdate (prevProps, prevState) { - if ( - (prevProps.isOpen === false && this.props.isOpen === true) || - (prevProps.numInputs !== this.props.numInputs) || - (prevProps.numMacros !== this.props.numMacros) - ) { - this.calculateHeights() - } - } - - calculateHeights () { - if (this.bottomEl) { - this.setState({ - bottomHeight: this.bottomEl.offsetHeight - }) - } - } - - render () { - const { title, nodeId, isOpen, onOpenClick, onParamBarClick, - children, numInputs, numMacros, inputLinkTitle, isActive, type } = this.props - - return ( - - - - - - - - {title} - - - - - {inputLinkTitle && {inputLinkTitle}} - - {numInputs !== undefined && ({numInputs})} - {numMacros !== undefined && ({numMacros})} - - - - - - {isOpen && -
    - { this.bottomEl = node }}> - {children} - - -
    - } -
    -
    - ) - } - -} - -Param.propTypes = { - title: PropTypes.string.isRequired, - nodeId: PropTypes.string.isRequired, - isOpen: PropTypes.bool, - isActive: PropTypes.bool, - onOpenClick: PropTypes.func.isRequired, - onParamBarClick: PropTypes.func, - children: PropTypes.node, - numInputs: PropTypes.number, - numMacros: PropTypes.number, - inputLinkTitle: PropTypes.string, - type: PropTypes.string -} - -export default Param diff --git a/src/components/ParamRange/index.js b/src/components/ParamRange/index.js new file mode 100644 index 00000000..94bfa401 --- /dev/null +++ b/src/components/ParamRange/index.js @@ -0,0 +1,83 @@ +import React from 'react' +import PropTypes from 'prop-types' +import styled from 'styled-components' +import { Field } from 'redux-form' +import Row from '../Row' +import theme from '../../utils/theme' +import Button from '../Button' + +const Wrapper = styled.div` + display: flex; + flex-direction: column; + font-size: 0.7rem; + padding: 0; + margin-bottom: .5rem; + + input { + font-size: .7rem; + display: block; + border: 1px solid #aaa; + background: ${theme.bgColorDark2}; + color: white; + padding: 0.1rem; + outline: none; + max-width: 5rem; + + &:focus { + border-color: white; + } + } +` + +const Col = styled.div` + margin-right: 1rem; +` + +class ParamRange extends React.Component { + constructor (props) { + super(props) + + this.handleKeyPress = this.handleKeyPress.bind(this) + this.handleBlur = this.handleBlur.bind(this) + } + + handleKeyPress (e) { + if (e.key === 'Enter') { this.props.handleSubmit() } + } + + handleBlur () { + this.props.handleSubmit() + } + + render () { + return ( + +

    Range

    + + + + + + + + + + + +
    + ) + } +} + +ParamRange.propTypes = { + handleSubmit: PropTypes.func, + onResetClick: PropTypes.func.isRequired, +} + +export default ParamRange diff --git a/src/components/ParamValueForm/index.js b/src/components/ParamValueForm/index.js index 4af02571..66d12c3d 100644 --- a/src/components/ParamValueForm/index.js +++ b/src/components/ParamValueForm/index.js @@ -34,7 +34,7 @@ class ParamvalueForm extends React.Component { ParamvalueForm.propTypes = { handleSubmit: PropTypes.func.isRequired, - onBlur: PropTypes.func.isRequired + onBlur: PropTypes.func.isRequired, } export default ParamvalueForm diff --git a/src/components/ProjectDetails/index.js b/src/components/ProjectDetails/index.js index 4d7d53aa..d0201450 100644 --- a/src/components/ProjectDetails/index.js +++ b/src/components/ProjectDetails/index.js @@ -16,7 +16,7 @@ const Error = styled.div` ` const Menu = ({ - filePath, errorMessage + filePath, errorMessage, }) => { return (
    @@ -28,7 +28,7 @@ const Menu = ({ Menu.propTypes = { filePath: PropTypes.string, - errorMessage: PropTypes.string + errorMessage: PropTypes.string, } export default Menu diff --git a/src/components/PropertiesPanel/index.js b/src/components/PropertiesPanel/index.js new file mode 100644 index 00000000..d666ec3e --- /dev/null +++ b/src/components/PropertiesPanel/index.js @@ -0,0 +1,81 @@ +import React from 'react' +import styled from 'styled-components' +import PropTypes from 'prop-types' +import MenuPanel from '../../components/MenuPanel' +import { PanelContext } from '../../context' +import theme from '../../utils/theme' + +const List = styled.nav` + display: flex; +` + +const Item = styled.div` + margin-right: 0.5rem; + + + span:last-child { + margin-left: 0.5rem; + } + + &:last-child { + span:last-child { + display: none; + } + } + + ${props => props.isClickable && + `cursor: pointer; + &:hover { + span:first-child { + color: ${theme.actionColor1} + } + }` +} + +` + +const PropertiesPanel = ({ isOpen, nodeId, Component, onCloseClick, panelId, titleItems, onTitleItemClick }) => { + const titleContent = + {titleItems.map((item, index) => { + const isClickable = item.type !== 'inputLink' && index !== titleItems.length - 1 + const onClick = isClickable ? function () { onTitleItemClick(item.id) } : undefined + + return ( + + {item.title} {'›'} + + ) + })} + + + return ( + + {isOpen && + + + + } + + ) +} + +PropertiesPanel.propTypes = { + nodeId: PropTypes.string, + isOpen: PropTypes.bool, + Component: PropTypes.func, + onCloseClick: PropTypes.func, + panelId: PropTypes.string, + titleItems: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.string, + title: PropTypes.string, + }) + ).isRequired, + onTitleItemClick: PropTypes.func.isRequired, +} + +export default PropertiesPanel diff --git a/src/components/Revealer/index.js b/src/components/Revealer/index.js new file mode 100644 index 00000000..f2381f07 --- /dev/null +++ b/src/components/Revealer/index.js @@ -0,0 +1,51 @@ +import React from 'react' +import PropTypes from 'prop-types' +import styled from 'styled-components' +import IconComponent from '../Icon' +import downIcon from '../../assets/icons/down.icon.txt' +import theme from '../../utils/theme' + +const Wrapper = styled.div` + +` + +const Header = styled.a` + display: flex; + color: ${theme.textColorLight1}; + fill: ${theme.textColorLight1}; + cursor: pointer; + &:hover { + color: ${theme.actionColor1}; + fill: ${theme.actionColor1}; + } +` + +const Body = styled.div` + padding-top: 0.5rem; +` + +const Icon = styled(IconComponent)` + transform: rotate(${props => props.isOpen ? '0deg' : '-90deg'}); +` + +const Revealer = ({ children, isOpen, title, onHeaderClick, className }) => ( + +
    {title}
    + { + isOpen && + + {children} + + } +
    +) + +Revealer.propTypes = { + children: PropTypes.node.isRequired, + isOpen: PropTypes.bool, + title: PropTypes.string.isRequired, + onHeaderClick: PropTypes.func.isRequired, + className: PropTypes.string, +} + +export default Revealer diff --git a/src/components/SceneManager/index.js b/src/components/SceneManager/index.js index 888c2aac..f1e67cfe 100644 --- a/src/components/SceneManager/index.js +++ b/src/components/SceneManager/index.js @@ -1,11 +1,11 @@ import React from 'react' import PropTypes from 'prop-types' -import ButtonComponent from '../Button' +import Button from '../Button' import RowComponent from '../Row' import styled from 'styled-components' import SceneThumb from '../SceneThumb' import SceneThumbContainer from '../../containers/SceneThumb' -import InputLinkMidiControl from '../../containers/InputLinkMidiControl' +import ButtonWithInputIcons from '../ButtonWithInputIcons' import theme from '../../utils/theme' const Wrapper = styled.nav` @@ -16,13 +16,9 @@ const Row = styled(RowComponent)` flex-wrap: wrap; ` -const Button = styled(ButtonComponent)` -` - const Thumbs = styled.div` display: flex; flex-wrap: wrap; - margin: 0 -0.25rem 0.5rem; ` const Panel = styled.div` @@ -34,16 +30,6 @@ const Panel = styled.div` font-size: 0.7rem; text-transform: uppercase; } - - svg { - fill: #fff; - opacity: 0.8; - margin-left: 0.2rem; - - &:hover { - opacity: 1; - } - } ` const Col = styled.div` @@ -53,17 +39,17 @@ const Col = styled.div` margin-bottom: 0.5rem; ` -const Item = ({ title, onClick, linkableActionId, color }) => +const ActionButton = (props) => ( - - + +) const SceneManager = ( { items, onAddClick, currentScene, onDeleteClick, onRenameClick, onChannelClick, - onClearClick, onActiveClick, onOppositeClick - } + onClearClick, onActiveClick, onOppositeClick, + } ) => { const la = currentScene && currentScene.linkableActionIds return ( @@ -73,8 +59,8 @@ const SceneManager = ( - ))} + /> + ))} + {currentScene && @@ -82,33 +68,48 @@ const SceneManager = (

    Current scene: {currentScene.title}

    - { onChannelClick(currentScene.id, 'A') }} color='channelA' linkableActionId={la.addToA} - /> - + Add to A + + + { onChannelClick(currentScene.id, 'B') }} color='channelB' linkableActionId={la.addToB} - /> - + Add to B + + + { onActiveClick(currentScene.id) }} linkableActionId={la.addToActive} - /> - + Add to Active + + + { onOppositeClick(currentScene.id) }} linkableActionId={la.addToOpposite} - /> - + Add to Opposite + + + { onClearClick(currentScene.id) }} linkableActionId={la.clear} - /> + panelId='overview' + > + Clear + + + )} + + + + {({ ref, style, placement, outOfBoundaries, scheduleUpdate }) => { + if (!this.scheduleUpdate) this.scheduleUpdate = scheduleUpdate + + return ( + + + {options.map(option => + + )} + + + ) + }} + + + ) + } +} Select.propTypes = { - value: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.bool, - PropTypes.number - ]), options: PropTypes.arrayOf( PropTypes.object ), onChange: PropTypes.func.isRequired, - onAssignClick: PropTypes.func.isRequired, - title: PropTypes.string.isRequired, - nodeId: PropTypes.string.isRequired + onOpenClick: PropTypes.func.isRequired, + isOpen: PropTypes.bool, + buttonText: PropTypes.oneOfType([ + PropTypes.string, PropTypes.number, + ]).isRequired, + value: PropTypes.oneOfType([ + PropTypes.string, PropTypes.number, PropTypes.bool, + ]), } export default Select diff --git a/src/components/SequencerGrid/index.js b/src/components/SequencerGrid/index.js index 7bade89c..6c060598 100644 --- a/src/components/SequencerGrid/index.js +++ b/src/components/SequencerGrid/index.js @@ -32,7 +32,7 @@ class SequencerGrid extends React.Component { constructor () { super() this.state = { - mouseDown: false + mouseDown: false, } } render () { @@ -50,7 +50,7 @@ class SequencerGrid extends React.Component { }} onMouseDown={() => this.setState({ mouseDown: true })} onMouseUp={() => this.setState({ mouseDown: false })} - > + > {index % 8 + 1} ))} @@ -63,7 +63,7 @@ SequencerGrid.propTypes = { items: PropTypes.arrayOf( PropTypes.number ).isRequired, - onStepClick: PropTypes.func.isRequired + onStepClick: PropTypes.func.isRequired, } export default SequencerGrid diff --git a/src/components/Settings/index.js b/src/components/Settings/index.js index 6d44807a..a25caaa5 100644 --- a/src/components/Settings/index.js +++ b/src/components/Settings/index.js @@ -4,6 +4,7 @@ import ViewHeader from '../ViewHeader' import Input from '../Input' import Row from '../Row' import Col from '../Col' +import Control from '../../containers/Control' const Wrapper = styled.div` display: flex; @@ -15,6 +16,15 @@ const Settings = () => ( Settings
    e.preventDefault()}> +

    Sketches

    + + + + + + + +

    Clock

    diff --git a/src/components/Shot/index.js b/src/components/Shot/index.js index 97187882..e92c4943 100644 --- a/src/components/Shot/index.js +++ b/src/components/Shot/index.js @@ -1,18 +1,18 @@ import React from 'react' import PropTypes from 'prop-types' import InputLinkUI from '../../containers/InputLinkUI' -import Param from '../../containers/Param' +import Node from '../../containers/Node' const Shot = ({ nodeId, sketchId, method }) => ( - + - + ) Shot.propTypes = { nodeId: PropTypes.string.isRequired, sketchId: PropTypes.string.isRequired, - method: PropTypes.string.isRequired + method: PropTypes.string.isRequired, } export default Shot diff --git a/src/components/Sketch/index.js b/src/components/Sketch/index.js index 3e9cbd11..3f4dcb7d 100644 --- a/src/components/Sketch/index.js +++ b/src/components/Sketch/index.js @@ -28,7 +28,17 @@ const Bottom = styled.div` } ` -const Sketch = ({ title, params, shots, onDeleteClick, sketchId, onRenameClick, onReimportClick }) => ( +const ActionButton = styled(Button)` + margin-left: 0.5rem; +` + +const DeleteButton = styled(Button)` + margin-right: auto; +` + +const Sketch = ({ + title, params, shots, onDeleteClick, sketchId, onRenameClick, onReloadFileClick, +}) => ( { @@ -45,7 +55,7 @@ const Sketch = ({ title, params, shots, onDeleteClick, sketchId, onRenameClick, {params.map((id, index) => ( - + ))} @@ -67,8 +77,8 @@ const Sketch = ({ title, params, shots, onDeleteClick, sketchId, onRenameClick,
    - - + { onDeleteClick(sketchId) }}>Delete Sketch + { onReloadFileClick(sketchId) }}>Reload File
    @@ -85,7 +95,7 @@ Sketch.propTypes = { ).isRequired, onDeleteClick: PropTypes.func.isRequired, onRenameClick: PropTypes.func.isRequired, - onReimportClick: PropTypes.func.isRequired + onReloadFileClick: PropTypes.func.isRequired, } export default Sketch diff --git a/src/components/SketchParam/index.js b/src/components/SketchParam/index.js deleted file mode 100644 index de7a3f7a..00000000 --- a/src/components/SketchParam/index.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import Param from '../../containers/Param' -import InputLinkUI from '../../containers/InputLinkUI' - -const SketchParam = ({ nodeId, sketchId }) => ( - - - -) - -SketchParam.propTypes = { - nodeId: PropTypes.string.isRequired, - sketchId: PropTypes.string.isRequired -} - -export default SketchParam diff --git a/src/components/SketchesNav/index.js b/src/components/SketchesNav/index.js index b60ce07f..b861bc95 100644 --- a/src/components/SketchesNav/index.js +++ b/src/components/SketchesNav/index.js @@ -27,16 +27,16 @@ const SketchesNav = ({ items, sceneId, onNavItemClick, currentSketchId }) => ( SketchesNav.propTypes = { currentSketchId: PropTypes.oneOfType([ - PropTypes.string, PropTypes.bool + PropTypes.string, PropTypes.bool, ]).isRequired, sceneId: PropTypes.string.isRequired, onNavItemClick: PropTypes.func.isRequired, items: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.string, - title: PropTypes.string + title: PropTypes.string, }) - ) + ), } export default SketchesNav diff --git a/src/components/SubNode/index.js b/src/components/SubNode/index.js index 8cd103fe..b7171ee6 100644 --- a/src/components/SubNode/index.js +++ b/src/components/SubNode/index.js @@ -40,7 +40,7 @@ SubNode.propTypes = { title: PropTypes.string.isRequired, nodeId: PropTypes.string.isRequired, children: PropTypes.node.isRequired, - noInfo: PropTypes.bool + noInfo: PropTypes.bool, } export default SubNode diff --git a/src/components/Tag/index.js b/src/components/Tag/index.js index 69f5ffe8..19624497 100644 --- a/src/components/Tag/index.js +++ b/src/components/Tag/index.js @@ -35,7 +35,7 @@ const Tag = ({ title, onCloseClick }) => ( Tag.propTypes = { title: PropTypes.string.isRequired, - onCloseClick: PropTypes.func.isRequired + onCloseClick: PropTypes.func.isRequired, } export default Tag diff --git a/src/components/ValueBar/index.js b/src/components/ValueBar/index.js index 6ad6ad93..2e78181f 100644 --- a/src/components/ValueBar/index.js +++ b/src/components/ValueBar/index.js @@ -9,7 +9,7 @@ import ParamValueForm from '../../containers/ParamValueForm' const pixelDensity = 2 const Bar = styled.canvas` - background: ${theme.bgColorDark2}; + background: ${props => props.theme === 'panel' ? theme.bgColorDark3 : theme.bgColorDark2}; cursor: pointer; ` @@ -44,20 +44,20 @@ const ValueForm = styled.div` ` class ValueBar extends React.Component { - constructor (props) { super(props) this.handleMouseDown = this.handleMouseDown.bind(this) this.handleMouseMove = this.handleMouseMove.bind(this) this.setSize = this.setSize.bind(this) + this.clearSize = this.clearSize.bind(this) this.draw = this.draw.bind(this) this.flashFading = false } componentDidMount () { this.containerEl = this.canvas.parentElement - const height = this.props.type === 'shot' ? 6 : 2.5 + const height = this.props.type === 'shot' ? 4 : 2.2 this.height = 16 * height this.canvas.height = this.height this.ctx = this.canvas.getContext('2d') @@ -66,6 +66,7 @@ class ValueBar extends React.Component { uiEventEmitter.on('repaint', this.setSize) uiEventEmitter.on('slow-tick', this.draw) + uiEventEmitter.on('panel-resize-start', this.clearSize) this.shotCount = this.getData().shotCount } @@ -77,7 +78,7 @@ class ValueBar extends React.Component { const node = this.context.store.getState().nodes[this.props.nodeId] return { value: node.value, - shotCount: node.shotCount + shotCount: node.shotCount, } } @@ -93,13 +94,11 @@ class ValueBar extends React.Component { clearInterval(this.sizer) uiEventEmitter.removeListener('repaint', this.setSize) uiEventEmitter.removeListener('slow-tick', this.draw) + uiEventEmitter.removeListener('panel-resize-start', this.clearSize) } setSize () { - this.canvas.width = 0 - this.canvas.style.display = 'none' - this.containerEl.style.display = 'none' - this.containerEl.style.display = 'block' + this.clearSize() this.sizer = setTimeout(() => { this.width = this.containerEl.offsetWidth * pixelDensity @@ -111,6 +110,13 @@ class ValueBar extends React.Component { }) } + clearSize () { + this.canvas.width = 0 + this.canvas.style.display = 'none' + this.containerEl.style.display = 'none' + this.containerEl.style.display = 'block' + } + handleMouseDown (e) { this.pos = e.nativeEvent.screenX this.currentValue = this.getData().value @@ -154,7 +160,7 @@ class ValueBar extends React.Component { const roundedVal = Math.round(newVal * 1000) / 1000 - this.ctx.font = '24px Arial' + this.ctx.font = '20px Arial' this.ctx.textAlign = 'right' if (this.oldVal && flashOpacity < 0 && !this.flashIsPainted) { @@ -183,7 +189,7 @@ class ValueBar extends React.Component { if (!this.props.hideBar) { // Draw value as text this.ctx.fillStyle = theme.textColorLight1 - this.ctx.fillText(roundedVal.toFixed(3), innerWidth - 5, this.height - 13) + this.ctx.fillText(roundedVal.toFixed(3), innerWidth - 8, this.height - 11) // Draw bar at new position this.ctx.fillStyle = '#fff' this.ctx.fillRect(pos, 0, barWidth, this.height) @@ -192,15 +198,16 @@ class ValueBar extends React.Component { } render () { - const { markerIsVisible } = this.props + const { markerIsVisible, theme } = this.props return ( { this.canvas = node }} + ref={node => { this.canvas = node }} + theme={theme} onMouseDown={this.props.onMouseDown || this.handleMouseDown} /> {this.props.formIsVisible && - + e.stopPropagation()}> } @@ -217,11 +224,12 @@ ValueBar.propTypes = { type: PropTypes.string, hideBar: PropTypes.bool, formIsVisible: PropTypes.bool, - markerIsVisible: PropTypes.bool + markerIsVisible: PropTypes.bool, + theme: PropTypes.string, } ValueBar.contextTypes = { - store: PropTypes.object.isRequired + store: PropTypes.object.isRequired, } export default ValueBar diff --git a/src/components/ViewHeader/index.js b/src/components/ViewHeader/index.js index da5a2101..8e755238 100644 --- a/src/components/ViewHeader/index.js +++ b/src/components/ViewHeader/index.js @@ -33,7 +33,7 @@ const ViewHeader = ({ children, onButtonClick, buttonText }) => ( ViewHeader.propTypes = { children: PropTypes.string.isRequired, onButtonClick: PropTypes.func, - buttonText: PropTypes.string + buttonText: PropTypes.string, } export default ViewHeader diff --git a/src/components/ViewSubheader/index.js b/src/components/ViewSubheader/index.js index d40c69b3..80e91332 100644 --- a/src/components/ViewSubheader/index.js +++ b/src/components/ViewSubheader/index.js @@ -12,7 +12,7 @@ const ViewHeader = ({ children }) => ( ) ViewHeader.propTypes = { - children: PropTypes.string.isRequired + children: PropTypes.string.isRequired, } export default ViewHeader diff --git a/src/components/Viewer/index.js b/src/components/Viewer/index.js index 20a28165..eb5bc3eb 100644 --- a/src/components/Viewer/index.js +++ b/src/components/Viewer/index.js @@ -1,10 +1,13 @@ import React from 'react' import PropTypes from 'prop-types' import styled from 'styled-components' +import theme from '../../utils/theme' const Wrapper = styled.div` width: 100%; position: relative; + background: ${theme.bgColorDark2}; + overflow: hidden; > canvas { position: absolute; @@ -18,13 +21,13 @@ const Wrapper = styled.div` class Viewer extends React.Component { render () { return ( - + ) } } Viewer.propTypes = { - containerElRef: PropTypes.func + containerElRef: PropTypes.func, } export default Viewer diff --git a/src/components/VisibleSwitch/index.js b/src/components/VisibleSwitch/index.js new file mode 100644 index 00000000..fb455daa --- /dev/null +++ b/src/components/VisibleSwitch/index.js @@ -0,0 +1,21 @@ +import React from 'react' +import PropTypes from 'prop-types' + +const VisibleSwitch = (props) => { + const Component = props.component + + return ( +
    + {props.isVisible && + + } +
    + ) +} + +VisibleSwitch.propTypes = { + component: PropTypes.func.isRequired, + isVisible: PropTypes.bool, +} + +export default VisibleSwitch diff --git a/src/containers/AboutOverlay/index.js b/src/containers/AboutOverlay/index.js new file mode 100644 index 00000000..66010cd5 --- /dev/null +++ b/src/containers/AboutOverlay/index.js @@ -0,0 +1,21 @@ +import { connect } from 'react-redux' +import AboutOverlay from '../../components/AboutOverlay' +import getIsAuxOpen from '../../selectors/getIsAuxOpen' +import { uiAuxToggleOpen } from '../../store/ui/actions' + +const mapStateToProps = (state, ownProps) => { + return { + isVisible: getIsAuxOpen(state, 'aboutHedron'), + } +} + +const mapDispatchToProps = (dispatch, ownProps) => ({ + onCancelClick: () => { + dispatch(uiAuxToggleOpen('aboutHedron')) + }, +}) + +export default connect( + mapStateToProps, + mapDispatchToProps +)(AboutOverlay) diff --git a/src/containers/AddSketch/_test/selectors.getModules.spec.js b/src/containers/AddSketch/_test/selectors.getModules.spec.js deleted file mode 100644 index 9720fa4f..00000000 --- a/src/containers/AddSketch/_test/selectors.getModules.spec.js +++ /dev/null @@ -1,31 +0,0 @@ -import test from 'tape' -import { getModules } from '../selectors' - -test('(Selector) getModules', (t) => { - const state = { - availableModules: { - foo: { - defaultTitle: 'Foo' - }, - bar: { - defaultTitle: 'Bar' - } - } - } - - const expected = [ - { - title: 'Foo', - id: 'foo' - }, - { - title: 'Bar', - id: 'bar' - } - ] - - const actual = getModules(state) - - t.deepEqual(actual, expected, 'Returns array of modules with title and id') - t.end() -}) diff --git a/src/containers/AddSketch/index.js b/src/containers/AddSketch/index.js index 52aae436..e3a42674 100644 --- a/src/containers/AddSketch/index.js +++ b/src/containers/AddSketch/index.js @@ -1,21 +1,24 @@ import { connect } from 'react-redux' import AddSketch from '../../components/AddSketch' -import { getModules } from './selectors' +import getCategorizedModules from '../../selectors/getCategorizedModules' import getSketchesPath from '../../selectors/getSketchesPath' import { uSketchCreate } from '../../store/sketches/actions' import { projectChooseSketchesFolder } from '../../store/project/actions' -const mapStateToProps = (state, ownProps) => ( - { - items: getModules(state), - sketchesPath: getSketchesPath(state) +const mapStateToProps = (state, ownProps) => { + const items = getCategorizedModules(state) + return { + items, + hasSketches: items.looseItems.length > 0 || items.categorizedItems.length > 0, + sketchesPath: getSketchesPath(state), + open: state.ui.addSketchOpen, } -) +} const mapDispatchToProps = (dispatch, ownProps) => ( { onAddClick: (id) => { dispatch(uSketchCreate(id)) }, - onChooseFolderClick: () => { dispatch(projectChooseSketchesFolder()) } + onChooseFolderClick: () => { dispatch(projectChooseSketchesFolder()) }, } ) diff --git a/src/containers/AddSketch/selectors.js b/src/containers/AddSketch/selectors.js deleted file mode 100644 index 5a50fc80..00000000 --- a/src/containers/AddSketch/selectors.js +++ /dev/null @@ -1,8 +0,0 @@ -export const getModules = (state) => { - return Object.keys(state.availableModules).map((id) => ( - { - title: state.availableModules[id].defaultTitle, - id - } - )) -} diff --git a/src/containers/App/index.js b/src/containers/App/index.js index 09bd2fc8..1e5c7be6 100644 --- a/src/containers/App/index.js +++ b/src/containers/App/index.js @@ -1,11 +1,13 @@ import { connect } from 'react-redux' import App from '../../components/App' import getPanelWidth from '../../selectors/getPanelWidth' +import getSelectedSketchId from '../../selectors/getSelectedSketchId' import { uiPanelResize, uiEditingClose } from '../../store/ui/actions' import { withRouter } from 'react-router' const mapStateToProps = (state, ownProps) => ({ - leftWidth: getPanelWidth(state, 'left') + leftWidth: getPanelWidth(state, 'left'), + sketchId: getSelectedSketchId(state), }) const mapDispatchToProps = (dispatch, ownProps) => ({ @@ -14,7 +16,7 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ }, onWrapperClick: () => { dispatch(uiEditingClose()) - } + }, }) export default withRouter(connect(mapStateToProps, mapDispatchToProps)(App)) diff --git a/src/containers/AudioAnalyzer/index.js b/src/containers/AudioAnalyzer/index.js index a5deb67c..114822a2 100644 --- a/src/containers/AudioAnalyzer/index.js +++ b/src/containers/AudioAnalyzer/index.js @@ -5,7 +5,7 @@ import { uiEditingToggle } from '../../store/ui/actions' const mapStateToProps = (state, ownProps) => ( { - isOpen: getUiIsEditingType(state) === 'audioAnalyzerPanel' + isOpen: getUiIsEditingType(state) === 'audioAnalyzerPanel', } ) @@ -16,7 +16,7 @@ const mapDispatchToProps = (dispatch, ownProps) => ( }, onAnalyzerClick: () => { dispatch(uiEditingToggle('audioAnalyzerPanel')) - } + }, } ) @@ -27,6 +27,6 @@ export default connect( { // Audio analyzer gets state for bars via context // so we only need to check UI to see if panel is open - areStatesEqual: (next, prev) => next.ui === prev.ui + areStatesEqual: (next, prev) => next.ui === prev.ui, } )(AudioAnalyzer) diff --git a/src/containers/AuxRevealer/index.js b/src/containers/AuxRevealer/index.js new file mode 100644 index 00000000..33b44efe --- /dev/null +++ b/src/containers/AuxRevealer/index.js @@ -0,0 +1,19 @@ +import { connect } from 'react-redux' +import Revealer from '../../components/Revealer' +import { uiAuxToggleOpen } from '../../store/ui/actions' +import getIsAuxOpen from '../../selectors/getIsAuxOpen' + +const mapStateToProps = (state, ownProps) => ({ + isOpen: getIsAuxOpen(state, ownProps.auxId), +}) + +const mapDispatchToProps = (dispatch, ownProps) => ({ + onHeaderClick: () => { + dispatch(uiAuxToggleOpen(ownProps.auxId)) + }, +}) + +export default connect( + mapStateToProps, + mapDispatchToProps +)(Revealer) diff --git a/src/containers/BankSelectItem/index.js b/src/containers/BankSelectItem/index.js deleted file mode 100644 index eaa4ca1d..00000000 --- a/src/containers/BankSelectItem/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import BankSelectItem from '../../components/BankSelectItem' -import { midiDeviceBankChange } from '../../store/midi/actions' - -const mapStateToProps = (state, ownProps) => ({ - isActive: state.midi.devices[ownProps.id].bankIndex === ownProps.index -}) -const mapDispatchToProps = (dispatch, ownProps) => ({ - onClick: () => { dispatch(midiDeviceBankChange(ownProps.id, ownProps.index)) } -}) - -export default connect( - mapStateToProps, - mapDispatchToProps -)(BankSelectItem) diff --git a/src/containers/Clock/index.js b/src/containers/Clock/index.js index c863ecaf..aed17951 100644 --- a/src/containers/Clock/index.js +++ b/src/containers/Clock/index.js @@ -8,7 +8,7 @@ const mapStateToProps = (state, ownProps) => ({ beat: (state.clock.beat % 4) + 1, bar: (Math.floor(state.clock.beat / 4) % 4) + 1, phrase: (Math.floor(state.clock.beat / 16) % 4) + 1, - bpm: getClockBpm(state) + bpm: getClockBpm(state), }) const mapDispatchToProps = (dispatch, ownProps) => ({ @@ -16,7 +16,7 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ onTapTempoClick: () => { tap() dispatch(clockSnap()) - } + }, }) export default connect( @@ -26,6 +26,6 @@ export default connect( { // We are mutating state of clock // so this means component always updates - areStatesEqual: () => false + areStatesEqual: () => false, } )(Clock) diff --git a/src/containers/Control/index.js b/src/containers/Control/index.js index 21e70cd4..3524ad5a 100644 --- a/src/containers/Control/index.js +++ b/src/containers/Control/index.js @@ -4,17 +4,16 @@ import getNode from '../../selectors/getNode' const mapStateToProps = (state, ownProps) => { const node = getNode(state, ownProps.nodeId) + const type = node.type || 'param' + return { - type: node.type || 'slider' + type, + onChangeAction: node.onChangeAction, } } -export default connect( +const ControlContainer = connect( mapStateToProps, - null, - null, - { - areStatesEqual: (next, prev) => - next.nodes === prev.nodes - } )(Control) + +export default ControlContainer diff --git a/src/containers/Crossfader/index.js b/src/containers/Crossfader/index.js index 94b77c40..2ec164d2 100644 --- a/src/containers/Crossfader/index.js +++ b/src/containers/Crossfader/index.js @@ -12,7 +12,7 @@ const mapStateToProps = (state, ownProps) => { return { titleA: sceneA && sceneA.title, - titleB: sceneB && sceneB.title + titleB: sceneB && sceneB.title, } } @@ -22,7 +22,7 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ }, onClickB: () => { dispatch(nodeValueUpdate('sceneCrossfader', 1)) - } + }, }) export default connect( diff --git a/src/containers/CurrentSketch/index.js b/src/containers/CurrentSketch/index.js index 9802bd3c..e649c071 100644 --- a/src/containers/CurrentSketch/index.js +++ b/src/containers/CurrentSketch/index.js @@ -1,8 +1,9 @@ import { connect } from 'react-redux' import CurrentSketchComponent from '../../components/CurrentSketch' -import { uSketchDelete, uSketchReimport } from '../../store/sketches/actions' +import { uSketchDelete, uSketchReloadFile } from '../../store/sketches/actions' import getSelectedSketchId from '../../selectors/getSelectedSketchId' import { uiEditingOpen } from '../../store/ui/actions' +import getVisibleSketchParamIds from '../../selectors/getVisibleSketchParamIds' const mapStateToProps = (state, ownProps) => { const sketchId = getSelectedSketchId(state) @@ -11,13 +12,13 @@ const mapStateToProps = (state, ownProps) => { return { isSketch: true, title: state.sketches[sketchId].title, - params: state.sketches[sketchId].paramIds, + params: getVisibleSketchParamIds(state, sketchId), sketchId: sketchId, - shots: state.sketches[sketchId].shotIds + shots: state.sketches[sketchId].shotIds, } } else { return { - isSketch: false + isSketch: false, } } } @@ -28,7 +29,7 @@ const mapDispatchToProps = (dispatch, ownProps) => { onRenameClick: sketchId => { dispatch(uiEditingOpen('sketchTitle', sketchId)) }, - onReimportClick: sketchId => dispatch(uSketchReimport(sketchId)) + onReloadFileClick: sketchId => dispatch(uSketchReloadFile(sketchId)), } } diff --git a/src/containers/Devices/index.js b/src/containers/Devices/index.js index eefa7396..fc4fc93c 100644 --- a/src/containers/Devices/index.js +++ b/src/containers/Devices/index.js @@ -2,7 +2,7 @@ import { connect } from 'react-redux' import Devices from '../../components/Devices' const mapStateToProps = (state, ownProps) => ({ - items: Object.keys(state.midi.devices).map(key => state.midi.devices[key]) + items: Object.keys(state.midi.devices).map(key => state.midi.devices[key]), }) export default connect( @@ -10,6 +10,6 @@ export default connect( null, null, { - areStatesEqual: (next, prev) => next.midi === prev.midi + areStatesEqual: (next, prev) => next.midi === prev.midi, } )(Devices) diff --git a/src/containers/EditingOverlay/index.js b/src/containers/EditingOverlay/index.js index dbd3edd8..7ac21664 100644 --- a/src/containers/EditingOverlay/index.js +++ b/src/containers/EditingOverlay/index.js @@ -13,14 +13,14 @@ const mapStateToProps = (state, ownProps) => { id: isEditing ? isEditing.id : undefined, type: isEditing ? isEditing.type : undefined, isVisible: isPopup, - title: node ? `Editing: ${node.title}` : undefined + title: node ? `Editing: ${node.title}` : undefined, } } const mapDispatchToProps = (dispatch, ownProps) => ({ onCancelClick: () => { dispatch(uiEditingClose()) - } + }, }) export default connect( diff --git a/src/containers/EditingOverlayForm/index.js b/src/containers/EditingOverlayForm/index.js index 6c17b884..b750b3cc 100644 --- a/src/containers/EditingOverlayForm/index.js +++ b/src/containers/EditingOverlayForm/index.js @@ -12,9 +12,9 @@ const mapStateToProps = (state, ownProps) => { return { initialValues: { - title: node.title + title: node.title, }, - enableReinitialize: true + enableReinitialize: true, } } @@ -32,11 +32,11 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ dispatch(sceneRename(ownProps.id, values.title)) break } - } + }, }) const EditingOverlayForm = reduxForm({ - form: 'editingOverlay' + form: 'editingOverlay', })(EditingOverlayFormComponent) export default connect( diff --git a/src/containers/ErrorOverlay/index.js b/src/containers/ErrorOverlay/index.js index 1b08fdf5..abd10e56 100644 --- a/src/containers/ErrorOverlay/index.js +++ b/src/containers/ErrorOverlay/index.js @@ -7,7 +7,7 @@ const mapStateToProps = (state, ownProps) => { return { isVisible: errorPopup && errorPopup.message ? true : undefined, message: errorPopup && errorPopup.message || undefined, - code: errorPopup && errorPopup.code || undefined + code: errorPopup && errorPopup.code || undefined, } } @@ -17,7 +17,7 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ }, onChooseSketchFolderClick: () => { dispatch(projectChooseSketchesFolder(true)) - } + }, }) export default connect( diff --git a/src/containers/Home/index.js b/src/containers/Home/index.js index 181e9b7b..ee7b399e 100644 --- a/src/containers/Home/index.js +++ b/src/containers/Home/index.js @@ -5,7 +5,7 @@ import { connect } from 'react-redux' const mapDispatchToProps = (dispatch, ownProps) => ( { onChooseFolderClick: () => { dispatch(projectChooseSketchesFolder(true, true)) }, - onLoadClick: () => { dispatch(projectLoad()) } + onLoadClick: () => { dispatch(projectLoad()) }, } ) diff --git a/src/containers/InputLink/index.js b/src/containers/InputLink/index.js index 30502d8c..440ed0b2 100644 --- a/src/containers/InputLink/index.js +++ b/src/containers/InputLink/index.js @@ -3,23 +3,29 @@ import InputLink from '../../components/InputLink' import getInputLinkLfoOptionIds from '../../selectors/getInputLinkLfoOptionIds' import getInputLinkModifierIds from '../../selectors/getInputLinkModifierIds' import getInputLinkMidiOptionIds from '../../selectors/getInputLinkMidiOptionIds' +import getInputLinkAnimOptionIds from '../../selectors/getInputLinkAnimOptionIds' +import getInputLinkAudioOptionIds from '../../selectors/getInputLinkAudioOptionIds' import getInputLink from '../../selectors/getInputLink' import getIsInputLinkActive from '../../selectors/getIsInputLinkActive' import getCanInputLinkDisable from '../../selectors/getCanInputLinkDisable' import { uInputLinkDelete, uInputLinkCreate } from '../../store/inputLinks/actions' import { nodeTabOpen, nodeActiveInputLinkToggle } from '../../store/nodes/actions' +import { uAnimStart } from '../../store/anims/actions' const mapStateToProps = (state, ownProps) => { const link = getInputLink(state, ownProps.id) return { - title: state.inputLinks[ownProps.id].title, + title: link.title, modifierIds: getInputLinkModifierIds(state, ownProps.id), lfoOptionIds: getInputLinkLfoOptionIds(state, ownProps.id), midiOptionIds: getInputLinkMidiOptionIds(state, ownProps.id), + animOptionIds: getInputLinkAnimOptionIds(state, ownProps.id), + audioOptionIds: getInputLinkAudioOptionIds(state, ownProps.id), isActive: getIsInputLinkActive(state, ownProps.id), isActivateVisible: getCanInputLinkDisable(state, ownProps.id), toggleActionId: link.linkableActions.toggleActivate, - sequencerGridId: link.sequencerGridId + sequencerGridId: link.sequencerGridId, + animStartActionId: link.linkableActions.animStart, } } @@ -33,7 +39,10 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ }, onActivateAssignClick: () => { dispatch(uInputLinkCreate(ownProps.id, 'midi', 'inputLinkToggle')) - } + }, + onAnimStartClick: () => { + dispatch(uAnimStart(ownProps.id)) + }, }) export default connect( @@ -42,7 +51,6 @@ export default connect( null, { areStatesEqual: (next, prev) => - next.nodes === prev.nodes && - next.inputLinks === next.inputLinks + next.nodes === prev.nodes, } )(InputLink) diff --git a/src/containers/InputLinkMidiControl/index.js b/src/containers/InputLinkMidiControl/index.js index c424705e..655c7e38 100644 --- a/src/containers/InputLinkMidiControl/index.js +++ b/src/containers/InputLinkMidiControl/index.js @@ -1,17 +1,17 @@ import { connect } from 'react-redux' import InputLinkMidiControl from '../../components/InputLinkMidiControl' -import { uInputLinkCreate } from '../../store/inputLinks/actions' -import getLinkableAction from '../../selectors/getLinkableAction' +import { uiNodeToggleOpen } from '../../store/ui/actions' +import getNode from '../../selectors/getNode' const mapStateToProps = (state, ownProps) => { - const linkableAction = getLinkableAction(state, ownProps.linkableActionId) + const linkableAction = getNode(state, ownProps.linkableActionId) return { - inputLinkIds: linkableAction.inputLinkIds + inputLinkIds: linkableAction.inputLinkIds, } } const mapDispatchToProps = (dispatch, ownProps) => ({ - onAssignClick: () => { dispatch(uInputLinkCreate(ownProps.linkableActionId, 'midi', 'linkableAction')) } + onAssignClick: () => { dispatch(uiNodeToggleOpen(ownProps.linkableActionId)) }, }) export default connect( diff --git a/src/containers/InputLinkTabItem/index.js b/src/containers/InputLinkTabItem/index.js index 6171851b..a28369ef 100644 --- a/src/containers/InputLinkTabItem/index.js +++ b/src/containers/InputLinkTabItem/index.js @@ -6,15 +6,16 @@ import getIsInputLinkActive from '../../selectors/getIsInputLinkActive' const mapStateToProps = (state, ownProps) => { const node = getNode(state, ownProps.nodeId) + const link = getNode(state, ownProps.id) return { - title: state.inputLinks[ownProps.id].title, + title: link.title, isSelected: ownProps.id === node.openedLinkId, - isActive: getIsInputLinkActive(state, ownProps.id) + isActive: getIsInputLinkActive(state, ownProps.id), } } const mapDispatchToProps = (dispatch, ownProps) => ({ - onClick: () => { dispatch(nodeTabOpen(ownProps.nodeId, ownProps.id)) } + onClick: () => { dispatch(nodeTabOpen(ownProps.nodeId, ownProps.id)) }, }) export default connect( diff --git a/src/containers/InputLinkTag/index.js b/src/containers/InputLinkTag/index.js index 61bc248c..f47c7e0d 100644 --- a/src/containers/InputLinkTag/index.js +++ b/src/containers/InputLinkTag/index.js @@ -3,11 +3,11 @@ import Tag from '../../components/Tag' import { uInputLinkDelete } from '../../store/inputLinks/actions' const mapStateToProps = (state, ownProps) => ({ - title: state.inputLinks[ownProps.id].title + title: state.nodes[ownProps.id].title, }) const mapDispatchToProps = (dispatch, ownProps) => ({ - onCloseClick: () => { dispatch(uInputLinkDelete(ownProps.id)) } + onCloseClick: () => { dispatch(uInputLinkDelete(ownProps.id)) }, }) export default connect( diff --git a/src/containers/InputLinkUI/index.js b/src/containers/InputLinkUI/index.js index 12b0207d..e28f244a 100644 --- a/src/containers/InputLinkUI/index.js +++ b/src/containers/InputLinkUI/index.js @@ -8,7 +8,7 @@ const mapStateToProps = (state, ownProps) => { const inputLinkIds = getInputLinkIdsSeperated(state, ownProps.nodeId) return { inputLinkIds, - currentInputLinkId: node.openedLinkId + currentInputLinkId: node.openedLinkId, } } @@ -18,7 +18,6 @@ export default connect( null, { areStatesEqual: (next, prev) => - next.nodes === prev.nodes && - next.inputLinks === prev.inputLinks + next.nodes === prev.nodes, } )(InputLinkUI) diff --git a/src/containers/Macro/index.js b/src/containers/Macro/index.js deleted file mode 100644 index 367e5bb1..00000000 --- a/src/containers/Macro/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import { connect } from 'react-redux' -import Param from '../../components/Param' -import { sketchNodeOpenedToggle } from '../../store/sketches/actions' -import getIsSketchNodeOpened from '../../selectors/getIsSketchNodeOpened' - -const mapStateToProps = (state, ownProps) => { - const param = state.nodes[ownProps.nodeId] - return { - title: param.title, - isOpen: getIsSketchNodeOpened(state, ownProps.sketchId, ownProps.nodeId, 'param') - } -} - -const mapDispatchToProps = (dispatch, ownProps) => ({ - onOpenClick: () => { dispatch(sketchNodeOpenedToggle(ownProps.sketchId, ownProps.nodeId, 'param')) } -}) - -const ParamContainer = connect( - mapStateToProps, - mapDispatchToProps -)(Param) - -export default ParamContainer diff --git a/src/containers/MacroLink/index.js b/src/containers/MacroLink/index.js index fed1269f..a5bd8ec5 100644 --- a/src/containers/MacroLink/index.js +++ b/src/containers/MacroLink/index.js @@ -5,14 +5,14 @@ import { uMacroTargetParamLinkDelete } from '../../store/macros/actions' const mapStateToProps = (state, ownProps) => { const node = state.nodes[ownProps.nodeId] return { - title: node.title + title: node.title, } } const mapDispatchToProps = (dispatch, ownProps) => ({ onDeleteClick: () => { dispatch(uMacroTargetParamLinkDelete(ownProps.macroId, ownProps.paramId)) - } + }, }) export default connect( diff --git a/src/containers/MacroItem/index.js b/src/containers/MacroProperties/index.js similarity index 54% rename from src/containers/MacroItem/index.js rename to src/containers/MacroProperties/index.js index aa97db37..6820d665 100644 --- a/src/containers/MacroItem/index.js +++ b/src/containers/MacroProperties/index.js @@ -1,43 +1,42 @@ import { connect } from 'react-redux' -import MacroItem from '../../components/MacroItem' -import getMacro from '../../selectors/getMacro' +import MacroProperties from '../../components/MacroProperties' import getIsMacroOpened from '../../selectors/getIsMacroOpened' import getNode from '../../selectors/getNode' import getNodeInputLinkIds from '../../selectors/getNodeInputLinkIds' import getInputLink from '../../selectors/getInputLink' import { uiEditingOpen } from '../../store/ui/actions' -import { rMacroLearningToggle, uMacroDelete, rMacroOpenToggle } from '../../store/macros/actions' +import { rMacroLearningToggle, uMacroDelete } from '../../store/macros/actions' import { values } from 'lodash' const mapStateToProps = (state, ownProps) => { - const macro = getMacro(state, ownProps.id) - const inputLinkIds = getNodeInputLinkIds(state, macro.nodeId) - const paramLinks = values(macro.targetParamLinks) - const node = getNode(state, macro.nodeId) + const node = getNode(state, ownProps.macroId) + const inputLinkIds = getNodeInputLinkIds(state, ownProps.macroId) + const paramLinks = values(node.targetParamLinks) const activeInputLinkId = node.activeInputLinkId const activeInputLink = activeInputLinkId && getInputLink(state, activeInputLinkId) return { - nodeId: macro.nodeId, + macroId: ownProps.macroId, title: node.title, - isOpen: getIsMacroOpened(state, ownProps.id), - macroId: macro.id, + isOpen: getIsMacroOpened(state, ownProps.macroId), paramLinks, inputLinkIds, inputSettingsAreVisible: inputLinkIds.length > 0, paramLinksAreVisible: paramLinks.length > 0, - isLearning: state.macros.learningId === ownProps.id, + isLearning: state.macros.learningId === ownProps.macroId, numInputs: inputLinkIds.length, - inputLinkTitle: activeInputLink && activeInputLink.title + inputLinkTitle: activeInputLink && activeInputLink.title, } } const mapDispatchToProps = (dispatch, ownProps) => ({ - onLearningClick: () => { dispatch(rMacroLearningToggle(ownProps.id)) }, - onDeleteClick: () => { dispatch(uMacroDelete(ownProps.id)) }, - onOpenClick: () => { dispatch(rMacroOpenToggle(ownProps.id)) }, - onRenameClick: (nodeId) => { dispatch(uiEditingOpen('nodeTitle', nodeId)) } + onLearningClick: () => { dispatch(rMacroLearningToggle(ownProps.macroId)) }, + onDeleteClick: () => { dispatch(uMacroDelete(ownProps.macroId)) }, + onRenameClick: (e) => { + e.stopPropagation() + dispatch(uiEditingOpen('nodeTitle', ownProps.macroId)) + }, }) export default connect( @@ -48,6 +47,6 @@ export default connect( areStatesEqual: (next, prev) => next.nodes === prev.nodes && next.macros.learningId === prev.macros.learningId && - next.macros.openedId === prev.macros.openedId + next.macros.openedId === prev.macros.openedId, } -)(MacroItem) +)(MacroProperties) diff --git a/src/containers/MacroPropertiesPanel/index.js b/src/containers/MacroPropertiesPanel/index.js new file mode 100644 index 00000000..51480ca6 --- /dev/null +++ b/src/containers/MacroPropertiesPanel/index.js @@ -0,0 +1,27 @@ +import { connect } from 'react-redux' +import PropertiesPanel from '../../containers/PropertiesPanel' +import NodeProperties from '../NodeProperties' +import getOpenedMacroNode from '../../selectors/getOpenedMacroNode' +import { rMacroClose } from '../../store/macros/actions' + +const mapStateToProps = (state) => { + const node = getOpenedMacroNode(state) + return { + Component: NodeProperties, + node: node, + panelId: 'macros', + } +} + +const mapDispatchToProps = (dispatch) => { + return { + onCloseClick: () => { + dispatch(rMacroClose()) + }, + } +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PropertiesPanel) diff --git a/src/containers/Macros/index.js b/src/containers/Macros/index.js index e66b483f..f463e781 100644 --- a/src/containers/Macros/index.js +++ b/src/containers/Macros/index.js @@ -4,14 +4,14 @@ import getMacros from '../../selectors/getMacros' import { uMacroCreate } from '../../store/macros/actions' const mapStateToProps = (state, ownProps) => ({ - items: getMacros(state) + items: getMacros(state), }) const mapDispatchToProps = (dispatch, ownProps) => ({ onAddClick: e => { e.stopPropagation() dispatch(uMacroCreate()) - } + }, }) export default connect( @@ -20,6 +20,6 @@ export default connect( null, { areStatesEqual: (next, prev) => - Object.keys(next.macros.items).length === Object.keys(prev.macros.items).length + Object.keys(next.macros.nodeIds).length === Object.keys(prev.macros.nodeIds).length, } )(Macros) diff --git a/src/containers/MainViewOuter/index.js b/src/containers/MainViewOuter/index.js index 67514299..cc671c15 100644 --- a/src/containers/MainViewOuter/index.js +++ b/src/containers/MainViewOuter/index.js @@ -1,22 +1,47 @@ import { connect } from 'react-redux' import MainViewOuter from '../../components/MainViewOuter' -import getMacroNodeLearning from '../../selectors/getMacroNodeLearning' -import { rMacroLearningStop } from '../../store/macros/actions' +import getLearningMacro from '../../selectors/getLearningMacro' +import { + rMacroLearningStop, uMacroAddAllForSketch, uMacroAddAllForScene, +} from '../../store/macros/actions' const mapStateToProps = (state, ownProps) => { - const macro = getMacroNodeLearning(state) + const macro = getLearningMacro(state) + const page = state.router.location.pathname.split('/')[1] + const buttonsText = ['Stop Learning'] + + if (page === 'scenes') { + buttonsText.push( + '+ All for Scene', + '+ All for Sketch', + ) + } return { notificationText: macro && `Macro Learning: ${macro.title}`, - notificationButtonText: 'Stop Learning', - isActive: macro !== undefined + isActive: macro !== undefined, + buttonsText, } } const mapDispatchToProps = (dispatch, ownProps) => ({ - onNotificationButtonClick: () => { dispatch(rMacroLearningStop()) } + buttonsOnClick: [ + () => { dispatch(rMacroLearningStop()) }, + () => { dispatch(uMacroAddAllForScene()) }, + () => { dispatch(uMacroAddAllForSketch()) }, + ], }) +const mergeProps = (stateProps, dispatchProps, props) => { + const buttons = stateProps.buttonsText.map((text, index) => ({ + text, + onClick: dispatchProps.buttonsOnClick[index], + })) + + return { ...props, ...stateProps, ...dispatchProps, buttons } +} + export default connect( mapStateToProps, - mapDispatchToProps + mapDispatchToProps, + mergeProps )(MainViewOuter) diff --git a/src/containers/MidiLearn/index.js b/src/containers/MidiLearn/index.js index 933598dd..9759ad85 100644 --- a/src/containers/MidiLearn/index.js +++ b/src/containers/MidiLearn/index.js @@ -3,13 +3,13 @@ import MidiLearn from '../../components/MidiLearn' import { midiStopLearning } from '../../store/midi/actions' const mapStateToProps = (state, ownProps) => ({ - isVisible: state.midi.learning !== false + isVisible: state.midi.learning !== false, }) const mapDispatchToProps = (dispatch, ownProps) => ({ onCancelClick: () => { dispatch(midiStopLearning()) - } + }, }) export default connect( diff --git a/src/containers/Modifier/index.js b/src/containers/Modifier/index.js index a264c604..c90afe77 100644 --- a/src/containers/Modifier/index.js +++ b/src/containers/Modifier/index.js @@ -5,14 +5,14 @@ import { uInputLinkCreate } from '../../store/inputLinks/actions' const mapStateToProps = (state, ownProps) => { const node = state.nodes[ownProps.nodeId] return { - title: node.title + title: node.title, } } const mapDispatchToProps = (dispatch, ownProps) => ({ onAssignClick: () => { dispatch(uInputLinkCreate(ownProps.nodeId, 'midi', 'midi')) - } + }, }) export default connect( diff --git a/src/containers/Node/index.js b/src/containers/Node/index.js new file mode 100644 index 00000000..1cbd792b --- /dev/null +++ b/src/containers/Node/index.js @@ -0,0 +1,54 @@ +import { PanelContext } from '../../context' +import React from 'react' +import PropTypes from 'prop-types' + +import { connect } from 'react-redux' +import Node from '../../components/Node' +import getNode from '../../selectors/getNode' +import getIsNodeOpen from '../../selectors/getIsNodeOpen' +import getActiveInputsText from '../../selectors/getActiveInputsText' +import { nodeShotFired } from '../../store/nodes/actions' + +const mapStateToProps = (state, ownProps) => { + const node = getNode(state, ownProps.nodeId) + + const inputLinkTitle = getActiveInputsText(state, ownProps.nodeId) + + return { + title: node.title, + isOpen: getIsNodeOpen(state, ownProps.nodeId, ownProps.panelId), + inputLinkTitle, + } +} + +const mapDispatchToProps = (dispatch, ownProps) => { + const type = ownProps.type || 'param' + + return { + onParamBarClick: type === 'shot' + ? () => { + dispatch(nodeShotFired(ownProps.nodeId, ownProps.sketchId, ownProps.shotMethod)) + } : undefined, + } +} + +const NodeContainer = connect( + mapStateToProps, + mapDispatchToProps +)(Node) + +const NodeWithContext = (props) => ( + + {panelId => { + const computedTheme = props.theme || (panelId !== undefined ? 'panel' : 'sketch') + + return + }} + +) + +NodeWithContext.propTypes = { + theme: PropTypes.string, +} + +export default NodeWithContext diff --git a/src/containers/NodeInputIcons/index.js b/src/containers/NodeInputIcons/index.js new file mode 100644 index 00000000..da27f062 --- /dev/null +++ b/src/containers/NodeInputIcons/index.js @@ -0,0 +1,31 @@ +import { connect } from 'react-redux' +import NodeInputIcons from '../../components/NodeInputIcons' +import getNode from '../../selectors/getNode' +import getActiveInputsText from '../../selectors/getActiveInputsText' +import { uNodeOpenInPanel } from '../../store/nodes/actions' + +const mapStateToProps = (state, ownProps) => { + const node = getNode(state, ownProps.nodeId) + const inputLinkIds = node.inputLinkIds + + const inputLinkTitle = getActiveInputsText(state, ownProps.nodeId) + + return { + numInputs: inputLinkIds.length, + numMacros: node.connectedMacroIds.length, + inputLinkTitle, + } +} + +const mapDispatchToProps = (dispatch, ownProps) => ({ + onClick: (panelId = ownProps.panelId) => { + dispatch(uNodeOpenInPanel(ownProps.nodeId, panelId)) + }, +}) + +const NodeInputIconsContainer = connect( + mapStateToProps, + mapDispatchToProps +)(NodeInputIcons) + +export default NodeInputIconsContainer diff --git a/src/containers/NodeInputInfo/index.js b/src/containers/NodeInputInfo/index.js index 93c31209..2ab0ccb3 100644 --- a/src/containers/NodeInputInfo/index.js +++ b/src/containers/NodeInputInfo/index.js @@ -4,7 +4,7 @@ import getNodeInputLinkIds from '../../selectors/getNodeInputLinkIds' const mapStateToProps = (state, ownProps) => ({ inputLinkIds: getNodeInputLinkIds(state, ownProps.nodeId), - isLearningMidi: state.midi.learning === ownProps.nodeId + isLearningMidi: state.midi.learning === ownProps.nodeId, }) export default connect( diff --git a/src/containers/NodeProperties/index.js b/src/containers/NodeProperties/index.js new file mode 100644 index 00000000..6e02f488 --- /dev/null +++ b/src/containers/NodeProperties/index.js @@ -0,0 +1,25 @@ +import { connect } from 'react-redux' +import NodeProperties from '../../components/NodeProperties' +import { uiAuxToggleOpen } from '../../store/ui/actions' +import getIsAuxOpen from '../../selectors/getIsAuxOpen' +import getNode from '../../selectors/getNode' + +const mapStateToProps = (state, ownProps) => { + const node = getNode(state, ownProps.nodeId) + return { + type: node.type, + displayValue: node.parentNodeId !== undefined && node.type !== 'linkableAction', + advancedIsOpen: getIsAuxOpen(state, ownProps.nodeId), + } +} + +const mapDispatchToProps = (dispatch, ownProps) => ({ + onAdvancedClick: () => { + dispatch(uiAuxToggleOpen(ownProps.nodeId)) + }, +}) + +export default connect( + mapStateToProps, + mapDispatchToProps +)(NodeProperties) diff --git a/src/containers/NodeSelect/index.js b/src/containers/NodeSelect/index.js new file mode 100644 index 00000000..ec0f1546 --- /dev/null +++ b/src/containers/NodeSelect/index.js @@ -0,0 +1,37 @@ +import { connect } from 'react-redux' +import Select from '../Select' +import { nodeValueUpdate } from '../../store/nodes/actions' + +const mapStateToProps = (state, ownProps) => { + const select = state.nodes[ownProps.nodeId] + const currentOpt = select.options.find(opt => opt.value === select.value) + return { + id: `node_${ownProps.nodeId}`, + buttonText: currentOpt.label, + value: currentOpt.value, + options: select.options, + } +} + +const mapDispatchToProps = (dispatch, ownProps) => { + return { + onChange: option => { + dispatch(nodeValueUpdate(ownProps.nodeId, option.value, { + dontMutate: true, + })) + + if (ownProps.onChangeAction) { + dispatch(ownProps.onChangeAction) + } + }, + } +} + +export default connect( + mapStateToProps, + mapDispatchToProps, + null, + { + areStatesEqual: () => false, + } +)(Select) diff --git a/src/containers/OverviewPropertiesPanel/index.js b/src/containers/OverviewPropertiesPanel/index.js new file mode 100644 index 00000000..ffef3aef --- /dev/null +++ b/src/containers/OverviewPropertiesPanel/index.js @@ -0,0 +1,29 @@ +import { connect } from 'react-redux' +import PropertiesPanel from '../../containers/PropertiesPanel' +import NodeProperties from '../NodeProperties' +import getUiOpenedNodeId from '../../selectors/getUiOpenedNodeId' +import getNode from '../../selectors/getNode' +import { uiNodeClose } from '../../store/ui/actions' + +const mapStateToProps = (state) => { + const nodeId = getUiOpenedNodeId(state) + const node = getNode(state, nodeId) + return { + Component: NodeProperties, + node: node, + panelId: 'overview', + } +} + +const mapDispatchToProps = (dispatch) => { + return { + onCloseClick: () => { + dispatch(uiNodeClose()) + }, + } +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PropertiesPanel) diff --git a/src/containers/Param/index.js b/src/containers/Param/index.js deleted file mode 100644 index 2cdbcea1..00000000 --- a/src/containers/Param/index.js +++ /dev/null @@ -1,51 +0,0 @@ -import { connect } from 'react-redux' -import Param from '../../components/Param' -import getNode from '../../selectors/getNode' -import { sketchNodeOpenedToggle } from '../../store/sketches/actions' -import getIsSketchNodeOpened from '../../selectors/getIsSketchNodeOpened' -import getActiveInputsText from '../../selectors/getActiveInputsText' -import { nodeShotFired } from '../../store/nodes/actions' -import { uiNodeToggleOpen } from '../../store/ui/actions' - -const mapStateToProps = (state, ownProps) => { - const node = getNode(state, ownProps.nodeId) - const inputLinkIds = node.inputLinkIds - const param = state.nodes[ownProps.nodeId] - const type = ownProps.type || 'param' - - const inputLinkTitle = getActiveInputsText(state, ownProps.nodeId) - - return { - type, - numInputs: inputLinkIds.length, - numMacros: node.connectedMacroIds.length, - title: param.title, - isOpen: getIsSketchNodeOpened(state, ownProps.sketchId, ownProps.nodeId, type, ownProps.notInSketch), - inputLinkTitle - } -} - -const mapDispatchToProps = (dispatch, ownProps) => { - const type = ownProps.type || 'param' - - return { - onOpenClick: () => { - if (ownProps.notInSketch) { - dispatch(uiNodeToggleOpen(ownProps.nodeId)) - } else { - dispatch(sketchNodeOpenedToggle(ownProps.sketchId, ownProps.nodeId, type)) - } - }, - onParamBarClick: type === 'shot' - ? () => { - dispatch(nodeShotFired(ownProps.nodeId, ownProps.sketchId, ownProps.shotMethod)) - } : undefined - } -} - -const ParamContainer = connect( - mapStateToProps, - mapDispatchToProps -)(Param) - -export default ParamContainer diff --git a/src/containers/ParamBar/index.js b/src/containers/ParamBar/index.js index 643c3b4b..1577bf07 100644 --- a/src/containers/ParamBar/index.js +++ b/src/containers/ParamBar/index.js @@ -17,7 +17,7 @@ const mapStateToProps = (state, ownProps) => { type, hideBar, markerIsVisible: type === 'shot' && !hideBar && inputLink.armed, - formIsVisible: getIsEditing(state, ownProps.nodeId, 'paramValue') + formIsVisible: getIsEditing(state, ownProps.nodeId, 'paramValue'), } } @@ -31,7 +31,7 @@ const mapDispatchToProps = (dispatch, ownProps) => { onDoubleClick: () => { type === 'param' && dispatch(uiEditingOpen('paramValue', ownProps.nodeId)) - } + }, } } diff --git a/src/containers/ParamInputSelect/index.js b/src/containers/ParamInputSelect/index.js index 92d59f69..0f760913 100644 --- a/src/containers/ParamInputSelect/index.js +++ b/src/containers/ParamInputSelect/index.js @@ -4,22 +4,18 @@ import { uInputLinkCreate } from '../../store/inputLinks/actions' import getNodeInputOptions from '../../selectors/getNodeInputOptions' const mapStateToProps = (state, ownProps) => ({ - options: getNodeInputOptions(state, ownProps.nodeId) + options: getNodeInputOptions(state, ownProps.nodeId), }) const mapDispatchToProps = (dispatch, ownProps) => { return { - onInputChange: (value) => { - dispatch(uInputLinkCreate(ownProps.nodeId, value.value, value.type)) - } + onInputChange: (option) => { + dispatch(uInputLinkCreate(ownProps.nodeId, option.value, option.type)) + }, } } export default connect( mapStateToProps, mapDispatchToProps, - null, - { - areStatesEqual: () => true - } )(InputSelect) diff --git a/src/containers/ParamPropertiesPanel/index.js b/src/containers/ParamPropertiesPanel/index.js new file mode 100644 index 00000000..d992c428 --- /dev/null +++ b/src/containers/ParamPropertiesPanel/index.js @@ -0,0 +1,27 @@ +import { connect } from 'react-redux' +import PropertiesPanel from '../../containers/PropertiesPanel' +import NodeProperties from '../NodeProperties' +import getOpenedSketchNode from '../../selectors/getOpenedSketchNode' +import { sketchNodeOpenedClose } from '../../store/sketches/actions' + +const mapStateToProps = (state) => { + const node = getOpenedSketchNode(state) + return { + Component: NodeProperties, + node: node, + panelId: 'sketch', + } +} + +const mapDispatchToProps = (dispatch, ownProps) => { + return { + onCloseClick: () => { + dispatch(sketchNodeOpenedClose(ownProps.sketchId)) + }, + } +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(PropertiesPanel) diff --git a/src/containers/ParamRange/index.js b/src/containers/ParamRange/index.js new file mode 100644 index 00000000..bfd67701 --- /dev/null +++ b/src/containers/ParamRange/index.js @@ -0,0 +1,36 @@ +import { connect } from 'react-redux' +import { reduxForm } from 'redux-form' +import RangeComponent from '../../components/ParamRange' +import { nodeUpdate, nodeResetRange } from '../../store/nodes/actions' +import getNode from '../../selectors/getNode' + +const mapStateToProps = (state, ownProps) => { + const node = getNode(state, ownProps.nodeId) + return { + initialValues: { + min: node.min, + max: node.max, + }, + form: ownProps.nodeId + 'range', + } +} + +const mapDispatchToProps = (dispatch, ownProps) => { + return { + onSubmit: (obj) => { + dispatch(nodeUpdate(ownProps.nodeId, obj)) + }, + onResetClick: () => { + dispatch(nodeResetRange(ownProps.nodeId)) + }, + } +} + +const ParamRange = reduxForm({ + enableReinitialize: true, +})(RangeComponent) + +export default connect( + mapStateToProps, + mapDispatchToProps +)(ParamRange) diff --git a/src/containers/ParamValueForm/index.js b/src/containers/ParamValueForm/index.js index 01806131..3255c713 100644 --- a/src/containers/ParamValueForm/index.js +++ b/src/containers/ParamValueForm/index.js @@ -10,10 +10,10 @@ const mapStateToProps = (state, ownProps) => { return { initialValues: { - paramValue: Math.round(node.value * 1000) / 1000 + paramValue: Math.round(node.value * 1000) / 1000, }, label: node.title, - enableReinitialize: true + enableReinitialize: true, } } @@ -25,11 +25,11 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ }, onBlur: () => { dispatch(uiEditingClose()) - } + }, }) const ParamValueForm = reduxForm({ - form: 'paramValue' + form: 'paramValue', })(ParamValueFormComponent) export default connect( diff --git a/src/containers/ProjectDetails/index.js b/src/containers/ProjectDetails/index.js index f216f601..3c9047f1 100644 --- a/src/containers/ProjectDetails/index.js +++ b/src/containers/ProjectDetails/index.js @@ -4,7 +4,7 @@ import getProjectErrorLatest from '../../selectors/getProjectErrorLatest' const mapStateToProps = (state, ownProps) => ({ filePath: state.project.filePath, - errorMessage: getProjectErrorLatest(state) + errorMessage: getProjectErrorLatest(state), }) export default connect( @@ -14,6 +14,6 @@ export default connect( { areStatesEqual: (next, prev) => next.project === prev.project && - next.displays === prev.displays + next.displays === prev.displays, } )(ProjectDetails) diff --git a/src/containers/PropertiesPanel/index.js b/src/containers/PropertiesPanel/index.js new file mode 100644 index 00000000..7f842970 --- /dev/null +++ b/src/containers/PropertiesPanel/index.js @@ -0,0 +1,26 @@ +import { connect } from 'react-redux' +import PropertiesPanel from '../../components/PropertiesPanel' +import getNodeAncestors from '../../selectors/getNodeAncestors' +import { uNodeOpenInPanel } from '../../store/nodes/actions' + +const mapStateToProps = (state, ownProps) => { + const node = ownProps.node + const titleItems = node ? getNodeAncestors(state, node.id).reverse() : [] + + return { + isOpen: node !== undefined, + titleItems, + nodeId: node && node.id, + } +} + +const mapDipatchToProps = (dispatch, ownProps) => ({ + onTitleItemClick: (nodeId) => { + dispatch(uNodeOpenInPanel(nodeId, ownProps.panelId)) + }, +}) + +export default connect( + mapStateToProps, + mapDipatchToProps +)(PropertiesPanel) diff --git a/src/containers/SceneHeader/index.js b/src/containers/SceneHeader/index.js index 5a30211a..66e278db 100644 --- a/src/containers/SceneHeader/index.js +++ b/src/containers/SceneHeader/index.js @@ -5,7 +5,7 @@ import getCurrentScene from '../../selectors/getCurrentScene' const mapStateToProps = (state, ownProps) => { const scene = getCurrentScene(state) return { - children: `${scene.title}: ${ownProps.children}` + children: `${scene.title}: ${ownProps.children}`, } } diff --git a/src/containers/SceneManager/index.js b/src/containers/SceneManager/index.js index ec5691ae..93834d8a 100644 --- a/src/containers/SceneManager/index.js +++ b/src/containers/SceneManager/index.js @@ -4,7 +4,7 @@ import getScenes from '../../selectors/getScenes' import getCurrentScene from '../../selectors/getCurrentScene' import { uSceneCreate, uSceneDelete, rSceneSelectChannel, - uSceneSelectChannel, sceneClearChannel + uSceneSelectChannel, sceneClearChannel, } from '../../store/scenes/actions' import { uiEditingOpen } from '../../store/ui/actions' @@ -12,7 +12,7 @@ import { uiEditingOpen } from '../../store/ui/actions' const mapStateToProps = (state, ownProps) => ( { items: getScenes(state), - currentScene: getCurrentScene(state) + currentScene: getCurrentScene(state), } ) @@ -38,7 +38,7 @@ const mapDispatchToProps = (dispatch, ownProps) => ( }, onChannelClick: (sceneId, channel) => { dispatch(rSceneSelectChannel(sceneId, channel)) - } + }, } ) diff --git a/src/containers/SceneThumb/index.js b/src/containers/SceneThumb/index.js index 748f2604..9ebabe2c 100644 --- a/src/containers/SceneThumb/index.js +++ b/src/containers/SceneThumb/index.js @@ -15,12 +15,12 @@ const mapStateToProps = (state, ownProps) => { children: scene.title, isActive: ownProps.id === currentSceneId, channel: isChannelA && 'A' || isChannelB && 'B' || undefined, - to: '/scenes/view' + to: '/scenes/view', } } const mapDispatchToProps = (dispatch, ownProps) => ({ - onClick: () => { dispatch(rSceneSelectCurrent(ownProps.id)) } + onClick: () => { dispatch(rSceneSelectCurrent(ownProps.id)) }, }) const SceneThumb = connect( diff --git a/src/containers/Select/index.js b/src/containers/Select/index.js index 16cb2817..a02e2c04 100644 --- a/src/containers/Select/index.js +++ b/src/containers/Select/index.js @@ -1,35 +1,23 @@ import { connect } from 'react-redux' import Select from '../../components/Select' -import { nodeValueUpdate } from '../../store/nodes/actions' -import { uInputLinkCreate } from '../../store/inputLinks/actions' +import getIsEditing from '../../selectors/getIsEditing' +import { uiEditingToggle } from '../../store/ui/actions' const mapStateToProps = (state, ownProps) => { - const select = state.nodes[ownProps.nodeId] return { - value: select.value, - title: select.title, - options: select.options + isOpen: getIsEditing(state, ownProps.id, 'selectComponent'), } } const mapDispatchToProps = (dispatch, ownProps) => { return { - onChange: value => { - dispatch(nodeValueUpdate(ownProps.nodeId, value.value, { - dontMutate: true - })) + onOpenClick: e => { + dispatch(uiEditingToggle('selectComponent', ownProps.id)) }, - onAssignClick: () => { - dispatch(uInputLinkCreate(ownProps.nodeId, 'midi', 'midi')) - } } } export default connect( mapStateToProps, mapDispatchToProps, - null, - { - areStatesEqual: () => false - } )(Select) diff --git a/src/containers/SequencerGrid/index.js b/src/containers/SequencerGrid/index.js index 9c779ea1..2669b53a 100644 --- a/src/containers/SequencerGrid/index.js +++ b/src/containers/SequencerGrid/index.js @@ -4,7 +4,7 @@ import getNode from '../../selectors/getNode' import { nodeValueUpdate } from '../../store/nodes/actions' const mapStateToProps = (state, ownProps) => ({ - items: getNode(state, ownProps.nodeId).value + items: getNode(state, ownProps.nodeId).value, }) const mapDispatchToProps = (dispatch, ownProps) => ({ @@ -13,9 +13,9 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ steps = steps.slice(0) steps[index] = steps[index] === 1 ? 0 : 1 dispatch(nodeValueUpdate(ownProps.nodeId, steps, { - dontMutate: true + dontMutate: true, })) - } + }, }) export default connect( @@ -24,6 +24,6 @@ export default connect( null, { areStatesEqual: (next, prev) => - next.nodes === prev.nodes + next.nodes === prev.nodes, } )(SequencerGrid) diff --git a/src/containers/Settings/index.js b/src/containers/Settings/index.js index a72d89d4..656e10d4 100644 --- a/src/containers/Settings/index.js +++ b/src/containers/Settings/index.js @@ -6,7 +6,7 @@ import { reduxForm } from 'redux-form' const mapStateToProps = (state, ownProps) => ({ initialValues: state.settings, - enableReinitialize: true + enableReinitialize: true, }) const mapDispatchToProps = (dispatch, ownProps) => ({ @@ -14,11 +14,11 @@ const mapDispatchToProps = (dispatch, ownProps) => ({ dispatch(settingsUpdate(values)) uiEventEmitter.emit('reset-renderer') uiEventEmitter.emit('repaint') - } + }, }) const Settings = reduxForm({ - form: 'settings' + form: 'settings', })(SettingsComponent) export default connect( diff --git a/src/containers/Shot/index.js b/src/containers/Shot/index.js index 9a724551..101a7054 100644 --- a/src/containers/Shot/index.js +++ b/src/containers/Shot/index.js @@ -6,7 +6,7 @@ const mapStateToProps = (state, ownProps) => { return { title: state.nodes[ownProps.nodeId].title, sketchId: state.nodes[ownProps.nodeId].sketchId, - method: state.nodes[ownProps.nodeId].method + method: state.nodes[ownProps.nodeId].method, } } diff --git a/src/containers/SketchParam/index.js b/src/containers/SketchParam/index.js index 4d41a324..e93529c0 100644 --- a/src/containers/SketchParam/index.js +++ b/src/containers/SketchParam/index.js @@ -1,6 +1,5 @@ -import SketchParam from '../../components/SketchParam' +import { connect } from 'react-redux' +import Node from '../Node' import withDeferRender from '../../utils/withDeferRender' -const ParamContainer = withDeferRender(SketchParam) - -export default ParamContainer +export default connect()(withDeferRender(Node)) diff --git a/src/containers/SketchesNav/index.js b/src/containers/SketchesNav/index.js index 49e788d4..7b47440c 100644 --- a/src/containers/SketchesNav/index.js +++ b/src/containers/SketchesNav/index.js @@ -10,14 +10,14 @@ const mapStateToProps = (state, ownProps) => { return { sceneId: getCurrentSceneId(state), items: getCurrentSketches(state), - currentSketchId: page === 'addSketch' ? false : getSelectedSketchId(state) + currentSketchId: page === 'addSketch' ? false : getSelectedSketchId(state), } } const mapDispatchToProps = (dispatch, ownProps) => ({ onNavItemClick: (sceneId, itemId) => { dispatch(sceneSketchSelect(sceneId, itemId)) - } + }, }) export default connect( @@ -28,6 +28,6 @@ export default connect( areStatesEqual: (next, prev) => next.sketches === prev.sketches && next.scenes === prev.scenes && - next.router === prev.router + next.router === prev.router, } )(SketchesNav) diff --git a/src/containers/Viewer/index.js b/src/containers/Viewer/index.js index e6650e30..2b5c2554 100644 --- a/src/containers/Viewer/index.js +++ b/src/containers/Viewer/index.js @@ -4,7 +4,7 @@ import { setViewerEl } from '../../engine/renderer' const mapStateToProps = (state, ownProps) => ( { - containerElRef: (el) => setViewerEl(el) + containerElRef: (el) => setViewerEl(el), } ) @@ -13,6 +13,6 @@ export default connect( null, null, { - areStatesEqual: () => true + areStatesEqual: () => true, } )(Viewer) diff --git a/src/context.js b/src/context.js new file mode 100644 index 00000000..5ab8eead --- /dev/null +++ b/src/context.js @@ -0,0 +1,3 @@ +import React from 'react' + +export const PanelContext = React.createContext() diff --git a/src/coreModifiers/gain/config.js b/src/coreModifiers/gain/config.js index d715ae58..96dd9a29 100644 --- a/src/coreModifiers/gain/config.js +++ b/src/coreModifiers/gain/config.js @@ -1,5 +1,5 @@ module.exports = { title: ['Gain'], defaultValue: [0.333], - type: 'audio' + type: 'audio', } diff --git a/src/coreModifiers/range/config.js b/src/coreModifiers/range/config.js index e2a1c131..0414a1bc 100644 --- a/src/coreModifiers/range/config.js +++ b/src/coreModifiers/range/config.js @@ -1,4 +1,4 @@ module.exports = { title: ['Lower Range', 'Upper Range'], - defaultValue: [0, 1] + defaultValue: [0, 1], } diff --git a/src/coreModifiers/threshold/config.js b/src/coreModifiers/threshold/config.js index d98f03f4..7f189fd1 100644 --- a/src/coreModifiers/threshold/config.js +++ b/src/coreModifiers/threshold/config.js @@ -1,4 +1,4 @@ module.exports = { title: ['Threshold'], - defaultValue: [0] + defaultValue: [0], } diff --git a/src/engine/QuadScene.js b/src/engine/QuadScene.js index 826d728f..d66858ea 100644 --- a/src/engine/QuadScene.js +++ b/src/engine/QuadScene.js @@ -32,8 +32,8 @@ class QuadScene { uniforms: { tDiffuseA: { value: rttA.texture }, tDiffuseB: { value: rttB.texture }, - mixRatio: { value: 0 } - } + mixRatio: { value: 0 }, + }, }) this.camera = new THREE.OrthographicCamera(null, null, null, null, -10000, 10000) diff --git a/src/engine/Scene.js b/src/engine/Scene.js index 1cbc9a78..d1992d34 100644 --- a/src/engine/Scene.js +++ b/src/engine/Scene.js @@ -3,8 +3,8 @@ import * as THREE from 'three' class Scene { constructor () { this.scene = new THREE.Scene() - this.camera = new THREE.PerspectiveCamera(75, null, 1, 1000000) - this.camera.position.z = 1000 + this.camera = new THREE.PerspectiveCamera(75, null, 1, 100000) + this.camera.position.z = 5 } setRatio (ratio) { diff --git a/src/engine/actions.js b/src/engine/actions.js index 195aadac..c01c2ddd 100644 --- a/src/engine/actions.js +++ b/src/engine/actions.js @@ -1,19 +1,19 @@ export const engineSceneSketchAdd = (sceneId, sketchId, moduleId) => ({ type: 'ENGINE_SCENE_SKETCH_ADD', - payload: { sceneId, sketchId, moduleId } + payload: { sceneId, sketchId, moduleId }, }) export const engineSceneSketchDelete = (sceneId, sketchId) => ({ type: 'ENGINE_SCENE_SKETCH_DELETE', - payload: { sceneId, sketchId } + payload: { sceneId, sketchId }, }) export const engineSceneAdd = (sceneId) => ({ type: 'ENGINE_SCENE_ADD', - payload: { sceneId } + payload: { sceneId }, }) export const engineSceneRemove = (sceneId) => ({ type: 'ENGINE_SCENE_REMOVE', - payload: { sceneId } + payload: { sceneId }, }) diff --git a/src/engine/index.js b/src/engine/index.js index 9ce91211..d2f54376 100644 --- a/src/engine/index.js +++ b/src/engine/index.js @@ -1,4 +1,5 @@ -import { loadSketches } from '../externals/sketches' +import path from 'path' +import { loadSketches, loadSketch, loadConfig } from '../externals/sketches' import getSketch from '../selectors/getSketch' import getScenes from '../selectors/getScenes' import getScene from '../selectors/getScene' @@ -8,38 +9,99 @@ import getChannelSceneId from '../selectors/getChannelSceneId' import getSceneCrossfaderValue from '../selectors/getSceneCrossfaderValue' import getViewerMode from '../selectors/getViewerMode' import { availableModulesReplaceAll } from '../store/availableModules/actions' -import { projectError } from '../store/project/actions' +import { projectError, projectSketchesPathUpdate } from '../store/project/actions' import now from 'performance-now' import * as renderer from './renderer' import Scene from './Scene' import { nodeValuesBatchUpdate } from '../store/nodes/actions' +import TWEEN from '@tweenjs/tween.js' +import { getProjectFilepath } from '../store/project/selectors' export let scenes = {} let sketches = {} -let modules = {} +let moduleConfigs = {} let isRunning = false -let allModules = {} +let moduleFiles = {} let sketchesFolder let store +// Load sketches from sketches folder export const loadSketchModules = (url) => { - try { - sketchesFolder = url - allModules = loadSketches(url) + let hasCheckedForSiblingDir = false - Object.keys(allModules).forEach((key) => { - const config = allModules[key].config - modules[key] = config - }) + const load = url => { + try { + sketchesFolder = url + moduleFiles = loadSketches(url) + + Object.keys(moduleFiles).forEach((key) => { + moduleConfigs[key] = moduleFiles[key].config + }) + + isRunning = true + + // If second check inside sibling sketches folder was successful, save the absolute path + if (hasCheckedForSiblingDir) { + store.dispatch(projectSketchesPathUpdate(url)) + } + } catch (error) { + if (!hasCheckedForSiblingDir) { + // If can't find sketches folder, try looking for "sketches" folder next to project.json first + hasCheckedForSiblingDir = true + // eslint-disable-next-line no-console + console.log( + `%cHEDRON: Can't find sketches folder for project. %c\nChecking for sibling folder named "sketches"`, + `font-weight: bold`, + `font-weight: normal`, + ) + // Generate file path for sibling folder and try again + const state = store.getState() + const filePath = getProjectFilepath(state) + const sketchesPath = path.resolve(path.dirname(filePath), 'sketches/') + load(sketchesPath) + } else { + // If all else fails, throw error + isRunning = false + console.error(error) + store.dispatch(projectError(`Sketches failed to load: ${error.message}`, { + popup: 'true', + code: error.code, + })) + } + } + } + + load(url) +} - isRunning = true +export const reloadSingleSketchModule = (url, moduleId, pathArray) => { + try { + moduleFiles[moduleId] = loadSketch(url) + moduleConfigs[moduleId] = moduleFiles[moduleId].config + moduleConfigs[moduleId].filePathArray = pathArray + moduleConfigs[moduleId].filePath = url + } catch (error) { + isRunning = false + console.error(error) + store.dispatch(projectError(`Sketch ${moduleId} failed to load: ${error.message}`, { + popup: 'true', + code: error.code, + })) + } +} + +export const reloadSingleSketchConfig = (url, moduleId, pathArray) => { + try { + moduleConfigs[moduleId] = loadConfig(url) + moduleConfigs[moduleId].filePathArray = pathArray + moduleConfigs[moduleId].filePath = url } catch (error) { isRunning = false console.error(error) - store.dispatch(projectError(`Sketches failed to load: ${error.message}`, { + store.dispatch(projectError(`Sketch config ${moduleId} failed to load: ${error.message}`, { popup: 'true', - code: error.code + code: error.code, })) } } @@ -55,7 +117,7 @@ export const removeScene = (sceneId) => { export const addSketchToScene = (sceneId, sketchId, moduleId) => { const meta = { - sketchesFolder: `file://${sketchesFolder}` + sketchesFolder: `file://${sketchesFolder}`, } const scene = scenes[sceneId] @@ -64,7 +126,7 @@ export const addSketchToScene = (sceneId, sketchId, moduleId) => { const state = store.getState() const params = getSketchParams(state, sketchId) - const module = new allModules[moduleId].Module(scene, meta, params) + const module = new moduleFiles[moduleId].Module(scene, params, meta) sketches[sketchId] = module module.root && scene.scene.add(module.root) @@ -92,7 +154,7 @@ export const fireShot = (sketchId, method) => { vals.push( { id, - value: params[key] + value: params[key], } ) } @@ -133,7 +195,7 @@ export const run = (injectedStore, stats) => { isRunning = true renderer.initiate(injectedStore, scenes) // Give store module params - store.dispatch(availableModulesReplaceAll(modules)) + store.dispatch(availableModulesReplaceAll(moduleConfigs)) const updateSceneSketches = (sceneId) => { stateScene = getScene(state, sceneId) @@ -154,6 +216,10 @@ export const run = (injectedStore, stats) => { spf = 1000 / state.settings.throttledFPS newTime = now() + + // Tween JS used for animated param values (anims) + TWEEN.update(newTime) + delta = newTime - oldTimeModified // Elapsed frames are from the perspective of a 60FPS target // regardless of throttling (so that throttled animations dont slow down) diff --git a/src/engine/renderer.js b/src/engine/renderer.js index 29ba85dc..2f373c1c 100644 --- a/src/engine/renderer.js +++ b/src/engine/renderer.js @@ -14,7 +14,7 @@ export const setRenderer = () => { const settings = store.getState().settings renderer = new THREE.WebGLRenderer({ - antialias: settings.antialias + antialias: settings.antialias, }) domEl = renderer.domElement @@ -24,7 +24,7 @@ export const setRenderer = () => { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, - stencilBuffer: false + stencilBuffer: false, } rttA = new THREE.WebGLRenderTarget(null, null, renderTargetParameters) rttB = new THREE.WebGLRenderTarget(null, null, renderTargetParameters) @@ -145,8 +145,21 @@ export const stopOutput = () => { } const renderChannels = (sceneA, sceneB) => { - sceneA && renderer.render(sceneA.scene, sceneA.camera, rttA, true) - sceneB && renderer.render(sceneB.scene, sceneB.camera, rttB, true) + renderer.setRenderTarget(rttA) + if (sceneA) { + renderer.render(sceneA.scene, sceneA.camera) + } else { + renderer.clear() + } + + renderer.setRenderTarget(rttB) + if (sceneB) { + renderer.render(sceneB.scene, sceneB.camera) + } else { + renderer.clear() + } + + renderer.setRenderTarget(null) renderer.render(quadScene.scene, quadScene.camera) } diff --git a/src/externals/_test/sketches.spec.js b/src/externals/_test/sketches.spec.js index 6a8d9b17..45976539 100644 --- a/src/externals/_test/sketches.spec.js +++ b/src/externals/_test/sketches.spec.js @@ -5,33 +5,45 @@ import sinon from 'sinon' proxyquire.noCallThru() -const syncStub = sinon.stub() +const globStub = { + sync: sinon.stub(), +} +const fsStub = { + existsSync: sinon.stub(), + statSync: sinon.stub(), +} -syncStub.returns([]) -syncStub.withArgs('foo/bar/*').returns(['foo/bar/dog', 'foo/bar/cat', 'foo/bar/frog']) -syncStub.withArgs('bar/bar/*').returns(['bar/bar/dog', 'bar/bar/cat']) -syncStub.withArgs('wee/bar/*').returns(['wee/bar/dog']) +globStub.sync.returns([]) +globStub.sync.withArgs('foo/bar/*').returns(['foo/bar/dog', 'foo/bar/cat', 'foo/bar/amphibians']) +globStub.sync.withArgs('foo/bar/amphibians/*').returns(['foo/bar/amphibians/frog']) +globStub.sync.withArgs('bar/bar/*').returns(['bar/bar/dog', 'bar/bar/cat']) +globStub.sync.withArgs('wee/bar/*').returns(['wee/bar/dog']) + +fsStub.statSync.returns({ isDirectory: true }) + +fsStub.existsSync.returns(true) +fsStub.existsSync.withArgs(path.resolve('foo/bar/amphibians/index.js')).returns(false) +fsStub.existsSync.withArgs(path.resolve('foo/bar/amphibians/config.js')).returns(false) const { loadSketches } = proxyquire('../sketches', { - glob: { - // Mocked up sketch files - sync: syncStub - }, + glob: globStub, + fs: fsStub, // Mocked up modules and meta (just returning strings for test) [path.resolve('foo/bar/dog/index.js')]: 'dogModule', [path.resolve('foo/bar/cat/index.js')]: 'catModule', - [path.resolve('foo/bar/frog/index.js')]: 'frogModule', - [path.resolve('foo/bar/dog/config.js')]: 'dogMeta', - [path.resolve('foo/bar/cat/config.js')]: 'catMeta', - [path.resolve('foo/bar/frog/config.js')]: 'frogMeta', + [path.resolve('foo/bar/amphibians/frog/index.js')]: 'frogModule', + + [path.resolve('foo/bar/dog/config.js')]: { name:'dogMeta' }, + [path.resolve('foo/bar/cat/config.js')]: { name:'catMeta' }, + [path.resolve('foo/bar/amphibians/frog/config.js')]: { name:'frogMeta' }, // /bar/bar/cat does not have a config file [path.resolve('bar/bar/dog/index.js')]: 'dogModule', [path.resolve('bar/bar/cat/index.js')]: 'catModule', - [path.resolve('bar/bar/dog/config.js')]: 'dogMeta', + [path.resolve('bar/bar/dog/config.js')]: { name:'dogMeta' }, // does not have index file - [path.resolve('wee/bar/dog/config.js')]: 'dogMeta' + [path.resolve('wee/bar/dog/config.js')]: { name:'dogMeta' }, }) @@ -39,16 +51,16 @@ test('(External) sketches - loadSketches()', (t) => { const expected = { dog: { Module: 'dogModule', - config: 'dogMeta' + config: { name:'dogMeta', filePathArray:[], filePath: 'foo/bar/dog' }, }, cat: { Module: 'catModule', - config: 'catMeta' + config: { name:'catMeta', filePathArray:[], filePath: 'foo/bar/cat' }, }, frog: { Module: 'frogModule', - config: 'frogMeta' - } + config: { name:'frogMeta', filePathArray:['amphibians'], filePath: 'foo/bar/amphibians/frog' }, + }, } const actual = loadSketches('foo/bar') t.deepEqual(actual, expected, 'Returns modules from files') diff --git a/src/externals/modifiers.js b/src/externals/modifiers.js index ccf9103f..a7cf60b9 100644 --- a/src/externals/modifiers.js +++ b/src/externals/modifiers.js @@ -1,18 +1,18 @@ -require('babel-register') +require('@babel/register') const all = { gain: { func: require('../coreModifiers/gain'), - config: require('../coreModifiers/gain/config') + config: require('../coreModifiers/gain/config'), }, range: { func: require('../coreModifiers/range'), - config: require('../coreModifiers/range/config') + config: require('../coreModifiers/range/config'), }, threshold: { func: require('../coreModifiers/threshold'), - config: require('../coreModifiers/threshold/config') - } + config: require('../coreModifiers/threshold/config'), + }, } const getAll = () => @@ -23,5 +23,5 @@ const work = (modifierId, control, value) => module.exports = { getAll, - work + work, } diff --git a/src/externals/sketches.js b/src/externals/sketches.js index a42b80a6..416c600e 100644 --- a/src/externals/sketches.js +++ b/src/externals/sketches.js @@ -1,29 +1,77 @@ -require('babel-register') +require('@babel/register') + const glob = require('glob') const path = require('path') const errcode = require('err-code') +const fs = require('fs') + +const ignoredFolders = ['node_modules'] + +const loadFile = resolvedPath => { + let file = false + + if (fs.existsSync(resolvedPath)) { + if (resolvedPath.includes('\\')) { + // For paths in Windows the next require function requires the path to have \\ as a separator instead of only \ + resolvedPath = resolvedPath.replace(/\\/g, '\\\\') + } + + /*eslint-disable */ + // need to invalidate require cache for any hot changes to be picked up + // this must be inside an eval() so it is in the correct context as the scripts eval'd below + eval(`delete require.cache['${resolvedPath}']`) + + file = eval(`require('${resolvedPath}')`) + /* eslint-enable */ + } + + return file +} + +const loadSketch = (file) => { + const url = path.resolve(file) + let indexUrl = path.format({ dir: url, base: 'index.js' }) + let configUrl = path.format({ dir: url, base: 'config.js' }) + + return { + Module: loadFile(indexUrl), + config: loadFile(configUrl), + } +} + +const loadConfig = (file) => { + const url = path.resolve(file) + let configUrl = path.format({ dir: url, base: 'config.js' }) + + return loadFile(configUrl) +} + +const findSketches = (file, all, pathArray) => { + if (fs.statSync(file).isDirectory) { + const name = path.parse(file).name + if (ignoredFolders.includes(name)) { + return + } + + const sketch = loadSketch(file) + + if (sketch.Module !== false) { + sketch.config.filePathArray = pathArray + sketch.config.filePath = file + all[name] = sketch + } else { + glob.sync(file + '/*').forEach(function (childFile) { + findSketches(childFile, all, [...pathArray, name]) + }) + } + } +} const loadSketches = globUrl => { const all = {} try { glob.sync(globUrl + '/*').forEach(function (file) { - const name = path.parse(file).name - const url = path.resolve(file) - let indexUrl = path.format({ dir: url, base: 'index.js' }) - let configUrl = path.format({ dir: url, base: 'config.js' }) - - if (indexUrl.indexOf('\\')) { - // For paths in Windows the next require function requires the path to have \\ as a separator instead of only \ - indexUrl = indexUrl.replace(/\\/g, '\\\\') - configUrl = configUrl.replace(/\\/g, '\\\\') - } - - all[name] = { - /*eslint-disable */ - Module: eval('require("' + indexUrl + '")'), - config: eval('require("' + configUrl + '")') - /*eslint-enable */ - } + findSketches(file, all, []) }) if (Object.keys(all).length === 0) { @@ -38,5 +86,7 @@ const loadSketches = globUrl => { } module.exports = { - loadSketches + loadSketches, + loadSketch, + loadConfig, } diff --git a/src/fileWatch/actions.js b/src/fileWatch/actions.js new file mode 100644 index 00000000..0f650af4 --- /dev/null +++ b/src/fileWatch/actions.js @@ -0,0 +1,10 @@ +export const fileSketchModuleChanged = (moduleId) => ({ + type: 'FILE_SKETCH_MODULE_CHANGED', + payload: { moduleId }, +}) + +export const fileSketchConfigChanged = (moduleId) => ({ + type: 'FILE_SKETCH_CONFIG_CHANGED', + payload: { moduleId }, +}) + diff --git a/src/fileWatch/listener.js b/src/fileWatch/listener.js new file mode 100644 index 00000000..5afb45d5 --- /dev/null +++ b/src/fileWatch/listener.js @@ -0,0 +1,103 @@ +import chokidar from 'chokidar' +import getSketchesPath from '../selectors/getSketchesPath' +import getAvailableModulesPaths from '../selectors/getAvailableModulesPaths' +import { fileSketchModuleChanged, fileSketchConfigChanged } from './actions' +import getProjectSettings from '../selectors/getProjectSettings' +import path from 'path' + +let sketchWatcher + +// Hacky way to check if one path is a child of another. +// Wont work for things like "foo/../bar" +// should work for this purpose as all paths are absolute +const isChildPath = (child, parent) => child.includes(`${parent}${path.sep}`) + +// Check if the file that changed was the top level config for that sketch +const isConfig = (child, parent) => child === `${parent}${path.sep}config.js` + +const stopSketchesWatcher = () => { + if (sketchWatcher !== undefined) { + sketchWatcher.close() + } +} + +const startSketchesWatcher = (store) => { + // Kill old sketch watcher if it existed before + stopSketchesWatcher() + + const state = store.getState() + const sketchesPath = getSketchesPath(state) + const modulePaths = getAvailableModulesPaths(state) + + // Kill old sketch watcher if it existed before + if (sketchWatcher !== undefined) { + sketchWatcher.close() + } + + const watchOptions = { + ignored: ['**/node_modules/**', '**/.DS_Store'], + ignoreInitial: true, + } + + // Watch for changes in the sketches path + sketchWatcher = chokidar.watch(sketchesPath, watchOptions).on('change', (changedPath) => { + // Get the correct module by comparing path of changed file against list of module root paths + const changedModule = modulePaths.find(module => isChildPath(changedPath, module.filePath)) + if (changedModule) { + const isFileConfig = isConfig(changedPath, changedModule.filePath) + const configMessage = isFileConfig ? '\nFile is config, reimporting params and shots' : '' + // eslint-disable-next-line no-console + console.log( + `%cHEDRON: Sketch file changed! %c\nModule: ${changedModule.moduleId}\nPath: ${changedPath} %c${configMessage}`, + `font-weight: bold`, + `font-weight: normal`, + `font-style: italic`, + ) + // If its a config file that has changed, reload the params/sketches too + if (isFileConfig) { + store.dispatch(fileSketchConfigChanged(changedModule.moduleId)) + } else { + store.dispatch(fileSketchModuleChanged(changedModule.moduleId)) + } + } else { + console.error(`File changed: Could not find related sketch module. Path: ${changedPath}`) + } + }) +} + +// start/stop watcher depending on newly loaded project / change of sketches folder +export const handleWatchSketches = (action, store) => { + const state = store.getState() + const shouldWatch = getProjectSettings(state).watchSketchesDir + + if (shouldWatch) { + startSketchesWatcher(store) + } else { + stopSketchesWatcher() + } +} + +// start/stop watcher depending on settings +export const handleSettingsChange = (action, store) => { + const shouldWatchSketches = action.payload.items.watchSketchesDir + + if (shouldWatchSketches) { + startSketchesWatcher(store) + } else { + stopSketchesWatcher() + } +} + +export default (action, store) => { + switch (action.type) { + case 'PROJECT_LOAD_SUCCESS': + handleWatchSketches(action, store) + break + } + + switch (action.type) { + case 'SETTINGS_UPDATE': + handleSettingsChange(action, store) + break + } +} diff --git a/src/inputs/AudioAnalyzer.js b/src/inputs/AudioAnalyzer.js index 7071d935..951190a5 100644 --- a/src/inputs/AudioAnalyzer.js +++ b/src/inputs/AudioAnalyzer.js @@ -1,3 +1,4 @@ +import * as THREE from 'three' class AudioInput { constructor (stream) { const context = new window.AudioContext() @@ -12,45 +13,99 @@ class AudioInput { // storing the levels data before normalization so we dont get errors when using a low falloff this.cleanLevelsData = [] // how much we reduce the clean bins value each frame, low numbers create a smoother release after sound bumps it up + // stores the highest value we have received for each bin + this.maxLevelsData = [] + this.minLevelsData = [] + + this.fullLevelsData = [] + this.fullCleanLevelsData = [] + this.fullMaxLevelsData = [] + this.fullMinLevelsData = [] + this.textureData = new Uint8Array(this.analyser.frequencyBinCount) + this.levelsFalloff = 1 // blends between the pure volume and a normalized result this.normalizeLevels = 0 - // stores the highest value we have received for each bin - this.maxLevelsData = [] - // shaving a small amount off the max value each frame in case of a rare peak, quieter song, etc + // smoothes out the input + this.smoothing = 0 + // applies a level of exponentiality to the levels, make only the loudest peaks pop + this.levelsPower = 1 + // shaving a small amount off the max levels value each frame in case of a rare peak, quieter song, etc this.maxLevelFalloffMultiplier = 0.9999 // stoping divide by zeros this.maxLevelMinimum = 0.001 for (let i = 0; i < this.numBands; i++) { - this.maxLevelsData[ i ] = this.maxLevelMinimum - this.levelsData[ i ] = this.cleanLevelsData[ i ] = 0 + this.minLevelsData[i] = 0 + this.maxLevelsData[i] = this.maxLevelMinimum + this.levelsData[i] = this.cleanLevelsData[i] = 0 + } + for (let i = 0; i < this.analyser.frequencyBinCount; i++) { + this.fullMinLevelsData[i] = 0 + this.fullMaxLevelsData[i] = this.maxLevelMinimum + this.fullLevelsData[i] = this.fullCleanLevelsData[i] = 0 } source.connect(this.analyser) // Knocking off 500 redundant frequencies this.levelBins = Math.floor((this.analyser.frequencyBinCount - 500) / this.numBands) + + // creating audio texture + this.texture = new THREE.DataTexture(self.data, this.analyser.frequencyBinCount, 1, THREE.LuminanceFormat) + this.texture.magFilter = this.texture.minFilter = THREE.LinearFilter + } + + lerp (v0, v1, t) { + return (1 - t) * v0 + t * v1 } update () { this.analyser.getByteFrequencyData(this.freqs) + for (let i = 0; i < this.freqs.length; i++) { + let freq = this.freqs[i] / 256 + freq = Math.max(freq, Math.max(0, this.fullCleanLevelsData[i] - this.levelsFalloff)) + this.fullCleanLevelsData[i] = freq + + this.fullMaxLevelsData[i] = Math.max( + this.fullMaxLevelsData[i] * this.maxLevelFalloffMultiplier, + this.maxLevelMinimum) + this.fullMinLevelsData[i] = Math.min( + 1 - (1 - this.fullMinLevelsData[i]) * this.maxLevelFalloffMultiplier, + this.fullMaxLevelsData[i] - this.maxLevelMinimum) + this.fullMaxLevelsData[i] = Math.max(this.fullMaxLevelsData[i], freq) + this.fullMinLevelsData[i] = Math.min(this.fullMinLevelsData[i], freq) + let normalized = (freq - this.fullMinLevelsData[i]) / + (this.fullMaxLevelsData[i] - this.fullMinLevelsData[i]) + freq = this.lerp(freq, normalized, this.normalizeLevels) + freq = Math.pow(freq, this.levelsPower) + this.fullLevelsData[i] = this.lerp(freq, this.fullLevelsData[i], this.smoothing) + this.textureData[i] = Math.floor(this.fullLevelsData[i] * 256) + } + + this.texture.image.data = this.textureData + + this.texture.needsUpdate = true for (let i = 0; i < this.numBands; i++) { let sum = 0 for (let j = 0; j < this.levelBins; j++) { - sum += this.freqs[ (i * this.levelBins) + j ] + sum += this.freqs[(i * this.levelBins) + j] } - let band = (sum / this.levelBins) / 256 band = Math.max(band, Math.max(0, this.cleanLevelsData[ i ] - this.levelsFalloff)) this.cleanLevelsData[ i ] = band this.maxLevelsData[ i ] = Math.max(this.maxLevelsData[ i ] * this.maxLevelFalloffMultiplier, this.maxLevelMinimum) this.maxLevelsData[ i ] = Math.max(this.maxLevelsData[ i ], band) - const normalized = band / this.maxLevelsData[ i ] - this.levelsData[ i ] = (1 - this.normalizeLevels) * band + this.normalizeLevels * normalized + this.minLevelsData[ i ] = Math.min( + 1 - (1 - this.minLevelsData[ i ]) * this.maxLevelFalloffMultiplier, + this.maxLevelsData[ i ] - this.maxLevelMinimum) + this.minLevelsData[ i ] = Math.min(this.minLevelsData[ i ], band) + const normalized = (band - this.minLevelsData[ i ]) / (this.maxLevelsData[ i ] - this.minLevelsData[ i ]) + band = this.lerp(band, normalized, this.normalizeLevels) + band = Math.pow(band, this.levelsPower) + this.levelsData[ i ] = this.lerp(band, this.levelsData[ i ], this.smoothing) } - return this.levelsData } } diff --git a/src/inputs/AudioInput.js b/src/inputs/AudioInput.js index f591a17c..4306b3b7 100644 --- a/src/inputs/AudioInput.js +++ b/src/inputs/AudioInput.js @@ -4,21 +4,22 @@ import { inputFired } from '../store/inputs/actions' export default (store) => { const gotStream = (stream) => { const input = new AudioAnalyzer(stream) - const bandIds = ['audio_0', 'audio_1', 'audio_2', 'audio_3'] - let bands, i + let bands window.setInterval(() => { - input.normalizeLevels = store.getState().nodes['audioNormalizeLevels'].value - input.levelsFalloff = Math.pow(store.getState().nodes['audioLevelsFalloff'].value, 2) + let state = store.getState() + input.normalizeLevels = state.nodes['audioNormalizeLevels'].value + input.levelsFalloff = Math.pow(state.nodes['audioLevelsFalloff'].value, 2) + input.maxLevelFalloffMultiplier = 1 - Math.pow(state.nodes['audioNormalizeRangeFalloff'].value, 3) * 0.01 + input.smoothing = state.nodes['audioLevelsSmoothing'].value * 0.99 + input.levelsPower = state.nodes['audioLevelsPower'].value * 3 + 0.5 bands = input.update() - for (i = 0; i < bands.length; i++) { - store.dispatch(inputFired(bandIds[i], bands[i], { type: 'audio' })) - } + store.dispatch(inputFired('audio', bands, { type: 'audio' })) }, 30) } navigator.getUserMedia({ - audio: true + audio: true, }, gotStream, err => { console.error('The following error occured: ' + err.message) }) diff --git a/src/inputs/MidiInput.js b/src/inputs/MidiInput.js index 775bc97e..f6d961e5 100644 --- a/src/inputs/MidiInput.js +++ b/src/inputs/MidiInput.js @@ -3,24 +3,24 @@ import { midiStopLearning, midiUpdateDevices, midiMessage } from '../store/midi/ import { uInputLinkCreate } from '../store/inputLinks/actions' import { clockPulse } from '../store/clock/actions' import { newData as teachMidi } from '../utils/getMidiMode' -import processMidiMessage from '../utils/processMidiMessage' +import { processMidiData } from '../utils/midiMessage' export default (store) => { const onMessage = (rawMessage) => { const state = store.getState() - const m = processMidiMessage(rawMessage) + const m = processMidiData(rawMessage.data) - if (m.type !== 'timingClock' && m.type !== 'noteOff') { + if (m.messageType !== 'timingClock' && m.messageType !== 'noteOff') { store.dispatch(midiMessage(rawMessage.target.name, { data: rawMessage.data, - timeStamp: rawMessage.timeStamp + timeStamp: rawMessage.timeStamp, })) const learning = state.midi.learning if (learning) { let controlType - const mode = teachMidi(rawMessage.data, m.type) + const mode = teachMidi(rawMessage.data, m.messageType) if (mode !== 'learning') { if (mode === 'ignore') { @@ -30,18 +30,26 @@ export default (store) => { controlType = mode } store.dispatch(uInputLinkCreate( - learning.id, m.id, learning.type, rawMessage.target.name, controlType + learning.id, + m.id, + learning.type, + { + controlType, + channel: m.channel, + messageType: m.messageType, + noteNum: m.noteNum, + } )) store.dispatch(midiStopLearning()) } } else { store.dispatch(inputFired(m.id, m.value, { - noteOn: m.type === 'noteOn', - type: 'midi' + noteOn: m.messageType === 'noteOn', + type: 'midi', })) } // If no note data, treat as clock - } else if (m.type === 'timingClock') { + } else if (m.messageType === 'timingClock') { // Only dispatch clock pulse if no generated clock if (!state.clock.isGenerated) { store.dispatch(clockPulse()) @@ -57,7 +65,6 @@ export default (store) => { title: entry.name, id: entry.name, manufacturer: entry.manufacturer, - bankIndex: 0 } entry.onmidimessage = onMessage }) diff --git a/src/main/index.js b/src/main/index.js index 74df766a..420a2493 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -8,10 +8,16 @@ app.on('ready', () => { updateMenu() createMainWindow() if (isDevelopment) { - const { default: installExtension, REDUX_DEVTOOLS } = require('electron-devtools-installer') + const { default: installExtension, REDUX_DEVTOOLS, REACT_DEVELOPER_TOOLS } = require('electron-devtools-installer') + + installExtension(REACT_DEVELOPER_TOOLS) + // eslint-disable-next-line no-console + .then((name) => console.log(`Added Extension: ${name}`)) + .catch((err) => console.error('An error occurred: ', err)) installExtension(REDUX_DEVTOOLS) - .then((name) => console.log(`Added Extension: ${name}`)) - .catch((err) => console.error('An error occurred: ', err)) + // eslint-disable-next-line no-console + .then((name) => console.log(`Added Extension: ${name}`)) + .catch((err) => console.error('An error occurred: ', err)) } }) diff --git a/src/main/mainWindow.js b/src/main/mainWindow.js index 625b9714..cdcf8b6b 100644 --- a/src/main/mainWindow.js +++ b/src/main/mainWindow.js @@ -1,7 +1,7 @@ -import { BrowserWindow, ipcMain } from 'electron' +import { BrowserWindow, ipcMain, shell } from 'electron' const argv = require('minimist')(process.argv) -const isDistDev = argv.distDev // Prod build with some useful dev things const isDevelopment = process.env.NODE_ENV !== 'production' +const path = require('path') // Global reference to mainWindow // Necessary to prevent win from being garbage collected @@ -9,23 +9,28 @@ export let mainWindow export const createMainWindow = () => { // Construct new BrowserWindow - const dimensions = isDevelopment || isDistDev + + const dimensions = isDevelopment ? { width: 1920, - height: 1080 + height: 1080, } // Smaller dimensions for prod for easier moving of window : { width: 800, - height: 500 + height: 500, } mainWindow = new BrowserWindow({ fullscreenable: true, webPreferences: { nativeWindowOpen: true, - webSecurity: false + webSecurity: false, }, - ...dimensions + title: 'Hedron', + // get Hedron icon to appear during dev (only works for win and linux) + // for better icons, still need to build the app + icon: isDevelopment && path.join(__dirname, '../../build/icon.png'), + ...dimensions, }) mainWindow.webContents.on('new-window', (event, url, frameName, disposition, options, additionalFeatures) => { @@ -60,13 +65,13 @@ export const createMainWindow = () => { }) // Set url for `win` - // points to `webpack-dev-server` in development - // points to `index.html` in production + // points to `webpack-dev-server` in development + // points to `index.html` in production const url = isDevelopment ? `http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}` : `file://${__dirname}/index.html` - if (isDevelopment || isDistDev) { + if (isDevelopment) { mainWindow.webContents.openDevTools() } @@ -91,6 +96,16 @@ export const createMainWindow = () => { }) }) + // Open anchor tag links in new browser window + mainWindow.webContents.on('will-navigate', (event, url) => { + // Don't do anything if "localhost" as this is most likely + // dev auto refresh rather than an anchor tag href + if (url.includes('http://localhost:')) { return } + + event.preventDefault() + shell.openExternal(url) + }) + setTimeout(() => { mainWindow.webContents.send('args', argv) }, 2000) diff --git a/src/main/menu.js b/src/main/menu.js index 4a0f36b0..a9126efe 100644 --- a/src/main/menu.js +++ b/src/main/menu.js @@ -5,43 +5,52 @@ const onClick = (...args) => { mainWindow.webContents.send('app-menu-click', ...args) } +const hedronMenu = { + label: 'Hedron', + submenu: [ + { + label: 'About Hedron', + click: () => { onClick('hedron-about') }, + }, + ], +} + const projectMenu = { label: 'Project', submenu: [ { label: 'New', - role: 'forcereload' + role: 'forcereload', }, { label: 'Save', click: () => { onClick('project-save') }, - accelerator: 'CommandOrControl+S' + accelerator: 'CommandOrControl+S', }, { label: 'Save As...', click: () => { onClick('project-save-as') }, - accelerator: 'CommandOrControl+Shift+S' + accelerator: 'CommandOrControl+Shift+S', }, { label: 'Load', - click: () => { onClick('project-load') } + click: () => { onClick('project-load') }, }, { label: 'Settings', - click: () => { onClick('project-settings') } - } - ] + click: () => { onClick('project-settings') }, + accelerator: 'CommandOrControl+,', + }, + ], } const displayMenu = { label: 'Displays', - submenu: [] + submenu: [], } const template = [ - { - label: 'Hedron' - }, + hedronMenu, projectMenu, displayMenu, { @@ -55,9 +64,9 @@ const template = [ { role: 'zoomin' }, { role: 'zoomout' }, { type: 'separator' }, - { role: 'togglefullscreen' } - ] - } + { role: 'togglefullscreen' }, + ], + }, ] ipcMain.on('update-displays', (e, displays) => { @@ -69,7 +78,7 @@ ipcMain.on('update-displays', (e, displays) => { label: `Send to ${w}x${h}`, click: () => { mainWindow.webContents.send('send-output', index) - } + }, } }) diff --git a/src/renderer/index.js b/src/renderer/index.js index d97cee20..0a51af16 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -1,4 +1,5 @@ -import { ipcRenderer } from 'electron' +import './threeImports' + import React from 'react' import { render } from 'react-dom' import { Provider } from 'react-redux' @@ -22,7 +23,6 @@ import Stats from 'stats.js' import createDebounce from 'redux-debounced' import tryRequire from 'try-require' -import 'react-select/dist/react-select.css' import '../style.css' // inputs @@ -43,16 +43,12 @@ if (process.env.NODE_ENV !== 'development') { composeEnhancers = compose } else { composeEnhancers = composeWithDevTools({ - // Redux devtools plays up due to the fact so many fast firing actions - // are blacklisted. maxAge and latency below helps but isn't perfect - // https://github.com/zalmoxisus/redux-devtools-extension/issues/316 - maxAge: 1000, - latency: 3000, actionsBlacklist: [ 'CLOCK_PULSE', 'CLOCK_BEAT_INC', 'CLOCK_BPM_UPDATE', 'INPUT_FIRED', - 'NODE_VALUE_UPDATE', 'NODE_SHOT_ARM', 'NODE_SHOT_DISARM', 'NODE_SHOT_FIRED', - 'NODE_VALUES_BATCH_UPDATE' - ] + 'NODE_VALUE_UPDATE', 'NODE_RANGE_UPDATE', 'NODE_SHOT_ARM', 'NODE_SHOT_DISARM', 'NODE_SHOT_FIRED', + 'NODE_VALUES_BATCH_UPDATE', + ], + maxAge: 10, }) } @@ -101,19 +97,13 @@ initiateAudio(store) initiateMidi(store) initiateGeneratedClock(store) initiateScreens(store) + engine.run(store, stats) if (isDevelopment) { loadDefaultProject() } -// Load default project if running the app with '--devDist' -ipcRenderer.on('args', (event, data) => { - if (data.distDev) { - loadDefaultProject() - } -}) - if (module.hot) { module.hot.accept('../containers/App', () => { // Pausing engine after HMR to stop lag issue diff --git a/src/renderer/menuHandler.js b/src/renderer/menuHandler.js index ac120f86..9512fbf9 100644 --- a/src/renderer/menuHandler.js +++ b/src/renderer/menuHandler.js @@ -1,5 +1,6 @@ import { ipcRenderer } from 'electron' import { projectSave, projectSaveAs, projectLoad } from '../store/project/actions' +import { uiAuxToggleOpen } from '../store/ui/actions' import history from '../history' let dispatch @@ -22,5 +23,8 @@ ipcRenderer.on('app-menu-click', (e, id, ...args) => { case 'project-settings': history.push('/settings') break + case 'hedron-about': + dispatch(uiAuxToggleOpen('aboutHedron')) + break } }) diff --git a/src/renderer/threeImports.js b/src/renderer/threeImports.js new file mode 100644 index 00000000..46e7a4be --- /dev/null +++ b/src/renderer/threeImports.js @@ -0,0 +1,8 @@ +// Declaring THREE as a global var, so that sketches can use the same instance of three.js as Hedron does +// This keeps the library versions matched and also prevents strange things from happening when two instances of three +// are running at the same time +window.THREE = require('three') + +// For convenience, also requiring some common three extras +require('three/examples/js/loaders/GLTFLoader') +require('three/examples/js/controls/OrbitControls') diff --git a/src/selectors/_test/getCategorizedModules.spec.js b/src/selectors/_test/getCategorizedModules.spec.js new file mode 100644 index 00000000..cd7ca72e --- /dev/null +++ b/src/selectors/_test/getCategorizedModules.spec.js @@ -0,0 +1,355 @@ +import test from 'tape' +import getCategorizedModules from '../getCategorizedModules' + +test('(Selector) getCategorizedModules - no categories', (t) => { + const state = { + nodes:{ + sketchOrganization:{ value:'category' }, + }, + availableModules: { + foo: { + defaultTitle: 'Foo', + somethingElse: 'thing', + }, + bar: { + defaultTitle: 'Bar', + }, + }, + } + + const expected = { + looseItems: [ + { + id: 'foo', + title: 'Foo', + defaultTitle: 'Foo', + somethingElse: 'thing', + }, + { + id: 'bar', + title: 'Bar', + defaultTitle: 'Bar', + }, + ], + categorizedItems: [{ + id: 'root', + title: 'root', + items: [], + categories:[] }], + } + + const actual = getCategorizedModules(state) + + t.deepEqual(actual, expected, 'Returns array of modules with title and id, inside "looseItems"') + t.end() +}) + +test('(Selector) getCategorizedModules - all categories', (t) => { + const state = { + nodes:{ + sketchOrganization:{ value:'category' }, + }, + availableModules: { + foo: { + defaultTitle: 'Foo', + somethingElse: 'thing', + category: 'cat1', + }, + bar: { + defaultTitle: 'Bar', + category: 'cat2', + }, + lorem: { + defaultTitle: 'Lorem', + category: 'cat1', + }, + }, + } + + const expected = { + looseItems: [], + categorizedItems: [ + { + id: 'root', + title: 'root', + items: [], + categories: + [ + { + id: 'cat1', + title: 'cat1', + items: [ + { + id: 'foo', + title: 'Foo', + defaultTitle: 'Foo', + somethingElse: 'thing', + category: 'cat1', + }, + { + id: 'lorem', + title: 'Lorem', + defaultTitle: 'Lorem', + category: 'cat1', + }, + ], + }, + { + id: 'cat2', + title: 'cat2', + items: [ + { + id: 'bar', + title: 'Bar', + defaultTitle: 'Bar', + category: 'cat2', + }, + ], + }, + ], + }, + ], + } + + const actual = getCategorizedModules(state) + + t.deepEqual(actual, expected, 'Returns array of modules with title and id, inside "categorizedItems"') + t.end() +}) + +test('(Selector) getCategorizedModules - loose and categories', (t) => { + const state = { + nodes:{ + sketchOrganization:{ value:'category' }, + }, + availableModules: { + foo: { + defaultTitle: 'Foo', + somethingElse: 'thing', + category: 'cat1', + }, + bar: { + defaultTitle: 'Bar', + category: 'cat2', + }, + lorem: { + defaultTitle: 'Lorem', + }, + }, + } + + const expected = { + looseItems: [ + { + id: 'lorem', + title: 'Lorem', + defaultTitle: 'Lorem', + }, + ], + categorizedItems: [ + { + id: 'root', + title: 'root', + items: [], + categories: + [ + { + id: 'cat1', + title: 'cat1', + items: [ + { + id: 'foo', + title: 'Foo', + defaultTitle: 'Foo', + somethingElse: 'thing', + category: 'cat1', + }, + ], + }, + { + id: 'cat2', + title: 'cat2', + items: [ + { + id: 'bar', + title: 'Bar', + defaultTitle: 'Bar', + category: 'cat2', + }, + ], + }, + ], + }, + ], + } + + const actual = getCategorizedModules(state) + + t.deepEqual(actual, expected, + 'Returns array of modules with title and id, inside "looseItems" and "categorizedItems"') + t.end() +}) + +test('(Selector) getCategorizedModules - loose and authors', (t) => { + const state = { + nodes:{ + sketchOrganization:{ value:'author' }, + }, + availableModules: { + foo: { + defaultTitle: 'Foo', + somethingElse: 'thing', + author: 'auth1', + }, + bar: { + defaultTitle: 'Bar', + author: 'auth2', + }, + lorem: { + defaultTitle: 'Lorem', + }, + }, + } + + const expected = { + looseItems: [ + { + id: 'lorem', + title: 'Lorem', + defaultTitle: 'Lorem', + }, + ], + categorizedItems: [ + { + id: 'root', + title: 'root', + items: [], + categories: + [ + { + id: 'auth1', + title: 'auth1', + items: [ + { + id: 'foo', + title: 'Foo', + defaultTitle: 'Foo', + somethingElse: 'thing', + author: 'auth1', + }, + ], + }, + { + id: 'auth2', + title: 'auth2', + items: [ + { + id: 'bar', + title: 'Bar', + defaultTitle: 'Bar', + author: 'auth2', + }, + ], + }, + ], + }, + ], + } + + const actual = getCategorizedModules(state) + + t.deepEqual(actual, expected, 'Returns array of modules with title and id, with categories based on author') + t.end() +}) + +test('(Selector) getCategorizedModules - loose and folders', (t) => { + const state = { + nodes:{ + sketchOrganization:{ value:'folder' }, + }, + availableModules: { + foo: { + defaultTitle: 'Foo', + somethingElse: 'thing', + filePathArray: ['foo'], + }, + bar: { + defaultTitle: 'Bar', + filePathArray: ['bar'], + }, + sub: { + defaultTitle: 'Sub', + filePathArray: ['bar', 'sub'], + }, + lorem: { + defaultTitle: 'Lorem', + }, + }, + } + + const expected = { + looseItems: [ + { + id: 'lorem', + title: 'Lorem', + defaultTitle: 'Lorem', + }, + ], + categorizedItems: [ + { + id: 'root', + title: 'root', + items: [], + categories: + [ + { + id: 'foo', + title: 'foo', + items: [ + { + id: 'foo', + title: 'Foo', + defaultTitle: 'Foo', + somethingElse: 'thing', + filePathArray: ['foo'], + }, + ], + categories:[], + }, + { + id: 'bar', + title: 'bar', + items: [ + { + id: 'bar', + title: 'Bar', + defaultTitle: 'Bar', + filePathArray: ['bar'], + }, + ], + categories:[ + { + id: 'sub', + title:'sub', + items:[ + { + id: 'sub', + title: 'Sub', + defaultTitle: 'Sub', + filePathArray: ['bar', 'sub'], + }, + ], + categories:[], + }, + ], + }, + ], + }, + ], + } + + const actual = getCategorizedModules(state) + + t.deepEqual(actual, expected, 'Returns array of modules with title and id, with categories based on filePathArray') + t.end() +}) diff --git a/src/selectors/_test/getInputLinkLfoOptionIds.spec.js b/src/selectors/_test/getInputLinkLfoOptionIds.spec.js index 63dfe5e6..95ac155c 100644 --- a/src/selectors/_test/getInputLinkLfoOptionIds.spec.js +++ b/src/selectors/_test/getInputLinkLfoOptionIds.spec.js @@ -3,62 +3,131 @@ import getInputLinkLfoOptionIds from '../getInputLinkLfoOptionIds' test('(Selector) getInputLinkLfoOptionIds (input is not "lfo")', (t) => { const state = { - inputLinks: { - xxx: { + nodes: { + aaa: { input: { - id: 'BAR' - } - } - } + id: 'BAR', + }, + lfoOptionIds: [], + }, + }, } - const actual = getInputLinkLfoOptionIds(state, 'xxx') + const actual = getInputLinkLfoOptionIds(state, 'aaa') - t.equal(actual, undefined, 'Returns undefined') + t.deepEqual(actual, [], 'Returns empty array') t.end() }) -test('(Selector) getInputLinkLfoOptionIds (input is "lfo")', (t) => { +test('(Selector) getInputLinkLfoOptionIds (input is "lfo", shape is NOT "noise")', (t) => { const state = { - inputLinks: { + nodes: { + aaa: { + input: { + id: 'lfo', + }, + lfoOptionIds: ['xxx', 'yyy', 'zzz'], + }, xxx: { + key: 'seed', + }, + yyy: { + key: 'rate', + }, + zzz: { + key: 'shape', + value: 'sine', + }, + }, + } + + const actual = getInputLinkLfoOptionIds(state, 'aaa') + + t.deepEqual(actual, ['yyy', 'zzz'], 'Returns options ids array, omitting "seed"') + t.end() +}) +test('(Selector) getInputLinkLfoOptionIds (input is "lfo", shape is "noise")', (t) => { + const state = { + nodes: { + aaa: { input: { - id: 'lfo' + id: 'lfo', }, - lfoOptionIds: ['yyy', 'zzz'] - } - } + lfoOptionIds: ['xxx', 'yyy', 'zzz'], + }, + xxx: { + key: 'seed', + }, + yyy: { + key: 'rate', + }, + zzz: { + key: 'shape', + value: 'noise', + }, + }, } - const actual = getInputLinkLfoOptionIds(state, 'xxx') + const actual = getInputLinkLfoOptionIds(state, 'aaa') - t.deepEqual(actual, ['yyy', 'zzz'], 'Returns options ids array') + t.deepEqual(actual, ['xxx', 'yyy', 'zzz'], 'Returns options ids array, including "seed"') t.end() }) -test('(Selector) getInputLinkLfoOptionIds (input is "lfo", link type "shot")', (t) => { +test('(Selector) getInputLinkLfoOptionIds (input is "lfo", link type "shot", wave shape is NOT "noise")', (t) => { const state = { - inputLinks: { - xxx: { + nodes: { + aaa: { nodeType: 'shot', input: { - id: 'lfo' + id: 'lfo', }, - lfoOptionIds: ['yyy', 'zzz'] - } + lfoOptionIds: ['xxx', 'yyy', 'zzz'], + }, + xxx: { + key: 'seed', + }, + yyy: { + key: 'rate', + }, + zzz: { + key: 'shape', + value: 'sine', + }, }, + } + + const actual = getInputLinkLfoOptionIds(state, 'aaa') + + t.deepEqual(actual, ['yyy'], 'Only returns rate ID') + t.end() +}) + +test('(Selector) getInputLinkLfoOptionIds (input is "lfo", link type "shot", wave shape is "noise")', (t) => { + const state = { nodes: { + aaa: { + nodeType: 'shot', + input: { + id: 'lfo', + }, + lfoOptionIds: ['xxx', 'yyy', 'zzz'], + }, + xxx: { + key: 'seed', + }, yyy: { - key: 'rate' + key: 'rate', }, zzz: { - key: 'shape' - } - } + key: 'shape', + value: 'noise', + }, + }, } - const actual = getInputLinkLfoOptionIds(state, 'xxx') + const actual = getInputLinkLfoOptionIds(state, 'aaa') - t.deepEqual(actual, ['yyy'], 'Only returns rate ID') + t.deepEqual(actual, ['xxx', 'yyy'], 'Only returns rate ID and noise ID') t.end() }) diff --git a/src/selectors/_test/getInputLinkModifierIds.spec.js b/src/selectors/_test/getInputLinkModifierIds.spec.js index 0158638c..9742465d 100644 --- a/src/selectors/_test/getInputLinkModifierIds.spec.js +++ b/src/selectors/_test/getInputLinkModifierIds.spec.js @@ -3,24 +3,22 @@ import getInputLinkModifierIds from '../getInputLinkModifierIds' test('(Selector) getInputLinkModifierIds (input type "audio")', (t) => { const state = { - inputLinks: { + nodes: { xxx: { input: { id: 'BAR', - type: 'audio' + type: 'audio', }, - modifierIds: ['mod1', 'mod2'] - } - }, - nodes: { + modifierIds: ['mod1', 'mod2'], + }, mod1: { type: 'audio', - id: 'mod1' + id: 'mod1', }, mod2: { - id: 'mod2' - } - } + id: 'mod2', + }, + }, } const actual = getInputLinkModifierIds(state, 'xxx') @@ -31,24 +29,22 @@ test('(Selector) getInputLinkModifierIds (input type "audio")', (t) => { test('(Selector) getInputLinkModifierIds (input type "foo")', (t) => { const state = { - inputLinks: { + nodes: { xxx: { input: { id: 'BAR', - type: 'foo' + type: 'foo', }, - modifierIds: ['mod1', 'mod2'] - } - }, - nodes: { + modifierIds: ['mod1', 'mod2'], + }, mod1: { type: 'audio', - id: 'mod1' + id: 'mod1', }, mod2: { - id: 'mod2' - } - } + id: 'mod2', + }, + }, } const actual = getInputLinkModifierIds(state, 'xxx') @@ -59,20 +55,18 @@ test('(Selector) getInputLinkModifierIds (input type "foo")', (t) => { test('(Selector) getNodeModifierIds (no input)', (t) => { const state = { - inputLinks: { - xxx: { - modifierIds: ['mod1', 'mod2'] - } - }, nodes: { + xxx: { + modifierIds: ['mod1', 'mod2'], + }, mod1: { type: 'audio', - id: 'mod1' + id: 'mod1', }, mod2: { - id: 'mod2' - } - } + id: 'mod2', + }, + }, } const actual = getInputLinkModifierIds(state, 'xxx') @@ -83,30 +77,28 @@ test('(Selector) getNodeModifierIds (no input)', (t) => { test('(Selector) getInputLinkModifierIds (node type "shot" input type audio)', (t) => { const state = { - inputLinks: { + nodes: { xxx: { nodeType: 'shot', input: { id: 'BAR', - type: 'audio' + type: 'audio', }, - modifierIds: ['mod1', 'mod2', 'mod3'] - } - }, - nodes: { + modifierIds: ['mod1', 'mod2', 'mod3'], + }, mod1: { key: 'foo', - id: 'mod1' + id: 'mod1', }, mod2: { key: 'threshold', - id: 'mod2' + id: 'mod2', }, mod3: { key: 'bar', - id: 'mod3' - } - } + id: 'mod3', + }, + }, } const actual = getInputLinkModifierIds(state, 'xxx') @@ -117,30 +109,28 @@ test('(Selector) getInputLinkModifierIds (node type "shot" input type audio)', ( test('(Selector) getInputLinkModifierIds (node type "shot" input type not audio)', (t) => { const state = { - inputLinks: { + nodes: { xxx: { nodeType: 'shot', input: { id: 'BAR', - type: 'foo' + type: 'foo', }, - modifierIds: ['mod1', 'mod2', 'mod3'] - } - }, - nodes: { + modifierIds: ['mod1', 'mod2', 'mod3'], + }, mod1: { key: 'gain', - id: 'mod1' + id: 'mod1', }, mod2: { key: 'foo', - id: 'mod2' + id: 'mod2', }, mod3: { key: 'bar', - id: 'mod3' - } - } + id: 'mod3', + }, + }, } const actual = getInputLinkModifierIds(state, 'xxx') diff --git a/src/selectors/_test/getIsEditing.spec.js b/src/selectors/_test/getIsEditing.spec.js index cb44a1d5..95790b34 100644 --- a/src/selectors/_test/getIsEditing.spec.js +++ b/src/selectors/_test/getIsEditing.spec.js @@ -6,8 +6,8 @@ test('(Selector) getIsEditing - not editing', (t) => { const state = { ui: { - isEditing: false - } + isEditing: false, + }, } actual = getIsEditing(state, 'XXX') @@ -23,9 +23,9 @@ test('(Selector) getIsEditing - editing type doesnt match', (t) => { ui: { isEditing: { id: 'XXX', - type: 'fooType' - } - } + type: 'fooType', + }, + }, } actual = getIsEditing(state, 'XXX', 'barType') @@ -43,9 +43,9 @@ test('(Selector) getIsEditing - editing type does match', (t) => { ui: { isEditing: { id: 'XXX', - type: 'fooType' - } - } + type: 'fooType', + }, + }, } actual = getIsEditing(state, 'XXX', 'fooType') diff --git a/src/selectors/_test/getModuleSketchIds.spec.js b/src/selectors/_test/getModuleSketchIds.spec.js new file mode 100644 index 00000000..8735c913 --- /dev/null +++ b/src/selectors/_test/getModuleSketchIds.spec.js @@ -0,0 +1,71 @@ +import test from 'tape' +import getModuleSketchIds from '../getModuleSketchIds' + +test('(Selector) getModuleSketchIds', (t) => { + let actual + + const state = { + scenes: { + items: { + scene_0: { + id: 'scene_0', + sketchIds: ['sketch_0', 'sketch_1', 'sketch_2'], + }, + scene_1: { + id: 'scene_1', + sketchIds: ['sketch_3', 'sketch_4', 'sketch_5'], + }, + }, + }, + sketches: { + sketch_0: { + id: 'sketch_0', + moduleId: 'foo_module', + }, + sketch_1: { + id: 'sketch_1', + moduleId: 'bar_module', + }, + sketch_2: { + id: 'sketch_2', + moduleId: 'foo_module', + }, + sketch_3: { + id: 'sketch_3', + moduleId: 'foo_module', + }, + sketch_4: { + id: 'sketch_4', + moduleId: 'foo_module', + }, + sketch_5: { + id: 'sketch_5', + moduleId: 'bar_module', + }, + }, + } + + const expected = [ + { + sceneId: 'scene_0', + sketchId: 'sketch_0', + }, + { + sceneId: 'scene_0', + sketchId: 'sketch_2', + }, + { + sceneId: 'scene_1', + sketchId: 'sketch_3', + }, + { + sceneId: 'scene_1', + sketchId: 'sketch_4', + }, + ] + + actual = getModuleSketchIds(state, 'foo_module') + t.deepEqual(actual, expected, 'Returns array of objects with sceneId and sketchId for matching sketches') + + t.end() +}) diff --git a/src/selectors/_test/getNodeAncestors.test.js b/src/selectors/_test/getNodeAncestors.test.js new file mode 100644 index 00000000..edf1d7b8 --- /dev/null +++ b/src/selectors/_test/getNodeAncestors.test.js @@ -0,0 +1,45 @@ +import getNodeAncestors from '../getNodeAncestors' + +test('(selector) getNodeAncestors', () => { + const state = { + nodes: { + aaa: { + title: 'A', + parentNodeId: 'bbb', + }, + bbb: { + title: 'B', + parentNodeId: 'ccc', + }, + xxx: { + title: 'X', + }, + ccc: { + title: 'C', + parentNodeId: 'xxx', + }, + }, + } + + const expected = [ + { + title: 'A', + parentNodeId: 'bbb', + }, + { + title: 'B', + parentNodeId: 'ccc', + }, + { + title: 'C', + parentNodeId: 'xxx', + }, + { + title: 'X', + }, + ] + + const actual = getNodeAncestors(state, 'aaa') + + expect(actual).toEqual(expected) +}) diff --git a/src/selectors/_test/getNodeInputId.spec.js b/src/selectors/_test/getNodeInputId.spec.js index b3f21c8f..d1a55e42 100644 --- a/src/selectors/_test/getNodeInputId.spec.js +++ b/src/selectors/_test/getNodeInputId.spec.js @@ -6,10 +6,10 @@ test('(Selector) getNodeInputId (normal)', (t) => { nodes: { xxx: { input: { - id: 'YYY' - } - } - } + id: 'YYY', + }, + }, + }, } const actual = getNodeInputId(state, 'xxx') @@ -22,9 +22,9 @@ test('(Selector) getNodeInputId (false)', (t) => { const state = { nodes: { xxx: { - input: false - } - } + input: false, + }, + }, } const actual = getNodeInputId(state, 'xxx') @@ -39,10 +39,10 @@ test('(Selector) getNodeInputId (midi)', (t) => { xxx: { input: { id: 'something', - type: 'midi' - } - } - } + type: 'midi', + }, + }, + }, } const actual = getNodeInputId(state, 'xxx') diff --git a/src/selectors/_test/getNodes.spec.js b/src/selectors/_test/getNodes.spec.js index 58a974e6..22861ec5 100644 --- a/src/selectors/_test/getNodes.spec.js +++ b/src/selectors/_test/getNodes.spec.js @@ -6,14 +6,14 @@ test('(Selector) getNodes', (t) => { nodes: { XX: { foo: 1 }, YY: { foo: 2 }, - ZZ: { foo: 3 } - } + ZZ: { foo: 3 }, + }, } const expected = [ { foo: 1 }, { foo: 2 }, - { foo: 3 } + { foo: 3 }, ] const actual = getNodes(state, ['XX', 'YY', 'ZZ']) @@ -27,8 +27,8 @@ test('(Selector) getNodes', (t) => { nodes: { XX: { foo: 1 }, YY: { foo: 2 }, - ZZ: { foo: 3 } - } + ZZ: { foo: 3 }, + }, } const expected = [] @@ -44,8 +44,8 @@ test('(Selector) getNodes - Nodes dont exist', (t) => { nodes: { XX: { foo: 1 }, YY: { foo: 2 }, - ZZ: { foo: 3 } - } + ZZ: { foo: 3 }, + }, } t.throws(getNodes.bind(null, state, ['AA']), Error, 'Throws an error') diff --git a/src/selectors/_test/getNodesValues.spec.js b/src/selectors/_test/getNodesValues.spec.js index 6dfcd3c9..dce48459 100644 --- a/src/selectors/_test/getNodesValues.spec.js +++ b/src/selectors/_test/getNodesValues.spec.js @@ -6,18 +6,18 @@ test('(Selector) getNodesValues', (t) => { nodes: { XX: { key: 'shape', - value: 'triangle' + value: 'triangle', }, YY: { key: 'rate', - value: 2 - } - } + value: 2, + }, + }, } const expected = { shape: 'triangle', - rate: 2 + rate: 2, } const actual = getNodesValues(state, ['XX', 'YY']) @@ -31,13 +31,13 @@ test('(Selector) getNodesValues - undefined array', (t) => { nodes: { XX: { key: 'shape', - value: 'triangle' + value: 'triangle', }, YY: { key: 'rate', - value: 2 - } - } + value: 2, + }, + }, } const expected = {} diff --git a/src/selectors/_test/getParamInfoText.spec.js b/src/selectors/_test/getParamInfoText.spec.js index d50edc9e..23dbe66c 100644 --- a/src/selectors/_test/getParamInfoText.spec.js +++ b/src/selectors/_test/getParamInfoText.spec.js @@ -7,11 +7,11 @@ test('(Selector) getInfoText - "Learning MIDI"', (t) => { nodes: { xxx: { - } + }, }, midi: { - learning: 'xxx' - } + learning: 'xxx', + }, } deepFreeze(state) @@ -24,21 +24,19 @@ test('(Selector) getInfoText - "Learning MIDI"', (t) => { test('(Selector) getInfoText - MIDI info', (t) => { const state = { midi: { - learning: false + learning: false, }, nodes: { xxx: { - inputLinkIds: ['aaa', 'bbb'] - } - }, - inputLinks: { + inputLinkIds: ['aaa', 'bbb'], + }, aaa: { - title: 'midi_x' + title: 'midi_x', }, bbb: { - title: 'midi_y' - } - } + title: 'midi_y', + }, + }, } deepFreeze(state) diff --git a/src/selectors/_test/getSketchParams.spec.js b/src/selectors/_test/getSketchParams.spec.js index d45fa0e7..bfd74cac 100644 --- a/src/selectors/_test/getSketchParams.spec.js +++ b/src/selectors/_test/getSketchParams.spec.js @@ -10,62 +10,62 @@ test('(engine) getSketchParams', function (t) { '01': { title: 'Rotation X', key: 'rotX', - value: 0.1 + value: 0.1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.2 + value: 0.2, }, '03': { title: 'Speed X', key: 'speedX', - value: 0.3 + value: 0.3, }, '04': { title: 'Speed Y', key: 'speedY', - value: 0.4 + value: 0.4, }, '05': { title: 'Speed Z', key: 'speedZ', - value: 0.5 - } + value: 0.5, + }, }, sketches: { 'xxx': { moduleId: 'sketch_1', module: 'test', title: 'Lorem Sketch', - paramIds: ['01', '02'] + paramIds: ['01', '02'], }, 'yyy': { moduleId: 'sketch_2', module: 'test', title: 'Ipsum Sketch', - paramIds: ['03', '04'] + paramIds: ['03', '04'], }, 'zzz': { moduleId: 'sketch_3', module: 'test', title: 'Dollor Sketch', - paramIds: ['05'] - } + paramIds: ['05'], + }, }, scenes: { items: { 'aaa': { - sketchIds: ['xxx', 'yyy'] - } - } - } + sketchIds: ['xxx', 'yyy'], + }, + }, + }, } deepFreeze(state) expected = { rotX: 0.1, - rotY: 0.2 + rotY: 0.2, } actual = getSketchParams(state, 'xxx') @@ -74,7 +74,7 @@ test('(engine) getSketchParams', function (t) { expected = { speedX: 0.3, - speedY: 0.4 + speedY: 0.4, } actual = getSketchParams(state, 'yyy') @@ -84,36 +84,88 @@ test('(engine) getSketchParams', function (t) { expected = { sketch_1: { rotX: 0.1, - rotY: 0.2 + rotY: 0.2, }, sketch_2: { speedX: 0.3, - speedY: 0.4 + speedY: 0.4, }, sketch_3: { - speedZ: 0.5 - } + speedZ: 0.5, + }, } actual = getSketchParams(state) t.deepEqual(actual, expected, - 'Returns key:value params for all sketches if no id given') + 'Returns key:value params for all sketches if no id given') expected = { sketch_1: { rotX: 0.1, - rotY: 0.2 + rotY: 0.2, }, sketch_2: { speedX: 0.3, - speedY: 0.4 - } + speedY: 0.4, + }, } actual = getSketchParams(state, null, 'aaa') t.deepEqual(actual, expected, - 'Returns key:value params for all sketches if scene ID given') + 'Returns key:value params for all sketches if scene ID given') + + t.end() +}) + +test('(engine) getSketchParams (min/max)', function (t) { + const state = { + nodes: { + '06': { + title: 'Foo', + key: 'foo', + value: 0.5, + min: 0, + max: 100, + }, + '07': { + title: 'Bar', + key: 'bar', + value: 0.5, + min: -100, + max: 0, + }, + '08': { + title: 'Lorem', + key: 'lorem', + value: 0.9, + min: 10, + max: 20, + }, + }, + sketches: { + '@@@': { + moduleId: 'sketch_4', + module: 'minmax', + title: 'Min Max', + paramIds: ['06', '07', '08'], + }, + }, + } + deepFreeze(state) + + let expected, actual + + expected = { + foo: 50, + bar: -50, + lorem: 19, + } + + actual = getSketchParams(state, '@@@') + + t.deepEqual(actual, expected, + 'Returns correct value based on min/max') t.end() }) diff --git a/src/selectors/getAvailableModulesPaths.js b/src/selectors/getAvailableModulesPaths.js new file mode 100644 index 00000000..8a337db7 --- /dev/null +++ b/src/selectors/getAvailableModulesPaths.js @@ -0,0 +1,10 @@ +import path from 'path' + +export default state => { + const modules = Object.entries(state.availableModules) + + return modules.map(([key, module]) => ({ + moduleId: key, + filePath: path.resolve(module.filePath), + })) +} diff --git a/src/selectors/getCanInputLinkDisable.js b/src/selectors/getCanInputLinkDisable.js index 1a4116f6..d598c130 100644 --- a/src/selectors/getCanInputLinkDisable.js +++ b/src/selectors/getCanInputLinkDisable.js @@ -1,2 +1,3 @@ export default (state, linkId) => - state.inputLinks[linkId].input.type !== 'midi' + state.nodes[linkId].input.type !== 'midi' && + state.nodes[linkId].input.type !== 'anim' diff --git a/src/selectors/getCategorizedModules.js b/src/selectors/getCategorizedModules.js new file mode 100644 index 00000000..c2f81c25 --- /dev/null +++ b/src/selectors/getCategorizedModules.js @@ -0,0 +1,73 @@ +function getStringCategory (state, id, sortParameter, looseItems, categorizedItems) { + const item = { + id, + title: state.availableModules[id].defaultTitle, + ...state.availableModules[id], + } + if (item[sortParameter] === undefined) { + looseItems.push(item) + } else { + const existingCatItem = categorizedItems[0].categories.find(catItem => catItem.id === item[sortParameter]) + + if (existingCatItem) { + existingCatItem.items.push(item) + } else { + const newCatItem = { + id: item[sortParameter], + title: item[sortParameter], + items: [ + item, + ], + } + categorizedItems[0].categories.push(newCatItem) + } + } +} + +function getArrayCategory (state, id, sortParameter, looseItems, categorizedItems) { + const item = { + id, + title: state.availableModules[id].defaultTitle, + ...state.availableModules[id], + } + if (item[sortParameter] === undefined || item[sortParameter].length === 0) { + looseItems.push(item) + } else { + let categorizedItem = categorizedItems[0] + for (let i = 0; i < item[sortParameter].length; i++) { + const existingCatItem = categorizedItem.categories.find(catItem => catItem.id === item[sortParameter][i]) + if (existingCatItem) { + categorizedItem = existingCatItem + } else { + const newCatItem = { + id: item[sortParameter][i], + title: item[sortParameter][i], + items: [], + categories:[], + } + categorizedItem.categories.push(newCatItem) + categorizedItem = newCatItem + } + } + categorizedItem.items.push(item) + } +} + +export default (state) => { + const looseItems = [] + let categorizedItems = [{ title:'root', id:'root', items:[], categories:[] }] + + if (state.nodes['sketchOrganization'].value === 'folder') { + Object.keys(state.availableModules).forEach((id) => { + getArrayCategory(state, id, 'filePathArray', looseItems, categorizedItems) + }) + } else { + Object.keys(state.availableModules).forEach((id) => { + getStringCategory(state, id, state.nodes['sketchOrganization'].value, looseItems, categorizedItems) + }) + } + return { + looseItems, + categorizedItems, + } +} diff --git a/src/selectors/getClockBpm.js b/src/selectors/getClockBpm.js index 66a0e071..df5d9f06 100644 --- a/src/selectors/getClockBpm.js +++ b/src/selectors/getClockBpm.js @@ -3,5 +3,5 @@ // otherwise return calculated BPM export default state => state.settings.clockGenerated - ? state.settings.clockBpm - : state.clock.bpm + ? state.settings.clockBpm + : state.clock.bpm diff --git a/src/selectors/getCurrentBankIndex.js b/src/selectors/getCurrentBankIndex.js deleted file mode 100644 index 7ea62cdd..00000000 --- a/src/selectors/getCurrentBankIndex.js +++ /dev/null @@ -1,2 +0,0 @@ -export default (state, deviceId) => - state.midi.devices[deviceId].bankIndex diff --git a/src/selectors/getCurrentSketches.js b/src/selectors/getCurrentSketches.js index e5acf435..b3a50e72 100644 --- a/src/selectors/getCurrentSketches.js +++ b/src/selectors/getCurrentSketches.js @@ -7,7 +7,7 @@ export default state => { return sketchIds.map((id) => ( { ...state.sketches[id], - id + id, } )) } else { diff --git a/src/selectors/getInputLink.js b/src/selectors/getInputLink.js index e387bf92..ef0aaafa 100644 --- a/src/selectors/getInputLink.js +++ b/src/selectors/getInputLink.js @@ -1,2 +1,2 @@ export default (state, linkId) => - state.inputLinks[linkId] + state.nodes[linkId] diff --git a/src/selectors/getInputLinkAnimOptionIds.js b/src/selectors/getInputLinkAnimOptionIds.js new file mode 100644 index 00000000..9be7cee1 --- /dev/null +++ b/src/selectors/getInputLinkAnimOptionIds.js @@ -0,0 +1,4 @@ +export default (state, linkId) => { + const ids = state.nodes[linkId].animOptionIds + return ids +} diff --git a/src/selectors/getInputLinkAudioOptionIds.js b/src/selectors/getInputLinkAudioOptionIds.js new file mode 100644 index 00000000..9905c97e --- /dev/null +++ b/src/selectors/getInputLinkAudioOptionIds.js @@ -0,0 +1,4 @@ +export default (state, linkId) => { + const ids = state.nodes[linkId].audioOptionIds + return ids +} diff --git a/src/selectors/getInputLinkIdsSeperated.js b/src/selectors/getInputLinkIdsSeperated.js index 5f006b14..5cf59428 100644 --- a/src/selectors/getInputLinkIdsSeperated.js +++ b/src/selectors/getInputLinkIdsSeperated.js @@ -6,10 +6,10 @@ export default (state, nodeId) => { const ids = state.nodes[nodeId].inputLinkIds const obj = { alwaysActive: [], - toggledActive: [] + toggledActive: [], } for (let i = 0; i < ids.length; i++) { - const link = state.inputLinks[ids[i]] + const link = state.nodes[ids[i]] if (link.input.type === 'midi') { obj.alwaysActive.push(link.id) } else { diff --git a/src/selectors/getInputLinkLfoOptionIds.js b/src/selectors/getInputLinkLfoOptionIds.js index a60f5ca5..870940bf 100644 --- a/src/selectors/getInputLinkLfoOptionIds.js +++ b/src/selectors/getInputLinkLfoOptionIds.js @@ -1,15 +1,36 @@ +import getNodes from './getNodes' + export default (state, linkId) => { - const link = state.inputLinks[linkId] + const link = state.nodes[linkId] + const optionIds = link.lfoOptionIds if (link.input && link.input.id === 'lfo') { + const optionNodes = getNodes(state, optionIds) + const shapeOpt = optionNodes.find(node => node.key === 'shape') + const isNoise = shapeOpt.value === 'noise' + + // Only show "rate" option for shots if (link.nodeType === 'shot') { - return link.lfoOptionIds.filter(id => { - return state.nodes[id].key === 'rate' + const typesForShot = ['rate'] + if (isNoise) { + // If its noise, also show the "seed" option + typesForShot.push('seed') + } + return optionIds.filter(id => { + return typesForShot.includes(state.nodes[id].key) }) } else { - return link.lfoOptionIds + // For params, show all options if noise + if (isNoise) { + return optionIds + } else { + // If its not noise, omit the "seed" option + return optionIds.filter(id => { + return state.nodes[id].key !== 'seed' + }) + } } } - return undefined + return optionIds } diff --git a/src/selectors/getInputLinkMidiOptionIds.js b/src/selectors/getInputLinkMidiOptionIds.js index f7048035..0cbef60d 100644 --- a/src/selectors/getInputLinkMidiOptionIds.js +++ b/src/selectors/getInputLinkMidiOptionIds.js @@ -1,7 +1,7 @@ import getNodesValues from './getNodesValues' export default (state, linkId) => { - const ids = state.inputLinks[linkId].midiOptionIds + const ids = state.nodes[linkId].midiOptionIds const vals = getNodesValues(state, ids) if (vals.controlType === 'abs') { diff --git a/src/selectors/getInputLinkModifierIds.js b/src/selectors/getInputLinkModifierIds.js index 207fe84e..f9e46e04 100644 --- a/src/selectors/getInputLinkModifierIds.js +++ b/src/selectors/getInputLinkModifierIds.js @@ -1,5 +1,5 @@ export default (state, id) => { - const link = state.inputLinks[id] + const link = state.nodes[id] if (!link.input) return undefined diff --git a/src/selectors/getIsAuxOpen.js b/src/selectors/getIsAuxOpen.js new file mode 100644 index 00000000..d9b0bcbf --- /dev/null +++ b/src/selectors/getIsAuxOpen.js @@ -0,0 +1 @@ +export default (state, id) => state.ui.auxOpen.includes(id) diff --git a/src/selectors/getIsInputLinkActive.js b/src/selectors/getIsInputLinkActive.js index 33470456..84251c93 100644 --- a/src/selectors/getIsInputLinkActive.js +++ b/src/selectors/getIsInputLinkActive.js @@ -1,5 +1,5 @@ export default (state, id) => { - const link = state.inputLinks[id] + const link = state.nodes[id] if (link.input.type === 'midi') return true const node = state.nodes[link.nodeId] return node.activeInputLinkId === id diff --git a/src/selectors/getIsNodeOpen.js b/src/selectors/getIsNodeOpen.js new file mode 100644 index 00000000..558dba1c --- /dev/null +++ b/src/selectors/getIsNodeOpen.js @@ -0,0 +1,24 @@ +import getNode from './getNode' +import getNodeAncestors from './getNodeAncestors' + +export default (state, nodeId, panelId) => { + let openedNodeId + + switch (panelId) { + case 'overview': + openedNodeId = state.ui.openedNode + break + case 'macros': + openedNodeId = state.macros.openedId + break + case 'sketch': + default: + const node = getNode(state, nodeId) + openedNodeId = state.sketches[node.sketchId].openedNodeId + } + + if (!openedNodeId) return false + + const ancestors = getNodeAncestors(state, openedNodeId) + return ancestors.some(node => node.id === nodeId) +} diff --git a/src/selectors/getIsSketchNodeOpened.js b/src/selectors/getIsSketchNodeOpened.js deleted file mode 100644 index 998c9d72..00000000 --- a/src/selectors/getIsSketchNodeOpened.js +++ /dev/null @@ -1,7 +0,0 @@ -export default (state, sketchId, nodeId, nodeType, notInSketch) => { - if (notInSketch) { - return state.ui.openedNode === nodeId - } else { - return state.sketches[sketchId].openedNodes[nodeType] === nodeId - } -} diff --git a/src/selectors/getLearningMacro.js b/src/selectors/getLearningMacro.js new file mode 100644 index 00000000..35399a9a --- /dev/null +++ b/src/selectors/getLearningMacro.js @@ -0,0 +1,3 @@ +export default state => { + return state.nodes[state.macros.learningId] +} diff --git a/src/selectors/getMacro.js b/src/selectors/getMacro.js deleted file mode 100644 index 2b4c9f8c..00000000 --- a/src/selectors/getMacro.js +++ /dev/null @@ -1 +0,0 @@ -export default (state, id) => state.macros.items[id] diff --git a/src/selectors/getMacroNodeLearning.js b/src/selectors/getMacroNodeLearning.js deleted file mode 100644 index b3a319fc..00000000 --- a/src/selectors/getMacroNodeLearning.js +++ /dev/null @@ -1,4 +0,0 @@ -export default state => { - const macro = state.macros.items[state.macros.learningId] - return macro && state.nodes[macro.nodeId] -} diff --git a/src/selectors/getMacroTargetParamLink.js b/src/selectors/getMacroTargetParamLink.js index 8734071c..2c64c472 100644 --- a/src/selectors/getMacroTargetParamLink.js +++ b/src/selectors/getMacroTargetParamLink.js @@ -1,2 +1,2 @@ export default (state, macroId, paramId) => - state.macros.items[macroId].targetParamLinks[paramId] + state.nodes[macroId].targetParamLinks[paramId] diff --git a/src/selectors/getMacroTargetParamLinks.js b/src/selectors/getMacroTargetParamLinks.js deleted file mode 100644 index 14cec9fd..00000000 --- a/src/selectors/getMacroTargetParamLinks.js +++ /dev/null @@ -1,4 +0,0 @@ -export default (state, linkIds) => { - const links = state.macroTargetParamLinks - return linkIds.map(id => links[id]) -} diff --git a/src/selectors/getMacros.js b/src/selectors/getMacros.js index a3ed2aa4..9c0997ef 100644 --- a/src/selectors/getMacros.js +++ b/src/selectors/getMacros.js @@ -1,3 +1 @@ -import { values } from 'lodash' - -export default state => values(state.macros.items) +export default state => state.macros.nodeIds.map(id => state.nodes[id]) diff --git a/src/selectors/getModuleSketchIds.js b/src/selectors/getModuleSketchIds.js new file mode 100644 index 00000000..269a4dbb --- /dev/null +++ b/src/selectors/getModuleSketchIds.js @@ -0,0 +1,22 @@ +import getScenes from './getScenes' +import getSketch from './getSketch' + +export default (state, moduleId) => { + const items = [] + const scenes = getScenes(state) + + scenes.forEach(scene => { + scene.sketchIds.forEach(sketchId => { + const sketch = getSketch(state, sketchId) + + if (sketch.moduleId === moduleId) { + items.push({ + sceneId: scene.id, + sketchId, + }) + } + }) + }) + + return items +} diff --git a/src/selectors/getNode.js b/src/selectors/getNode.js index 60651d6f..e796500e 100644 --- a/src/selectors/getNode.js +++ b/src/selectors/getNode.js @@ -1 +1,9 @@ -export default (state, nodeId) => state.nodes[nodeId] +export default (state, nodeId) => { + if (!nodeId) return undefined + + const node = state.nodes[nodeId] + if (node === undefined) { + console.warn(`[HEDRON] getNode() couldn't find node for nodeId ${nodeId}`) + } + return node +} diff --git a/src/selectors/getNodeAncestors.js b/src/selectors/getNodeAncestors.js new file mode 100644 index 00000000..667125bc --- /dev/null +++ b/src/selectors/getNodeAncestors.js @@ -0,0 +1,18 @@ +import getNode from './getNode' + +export default (state, nodeId) => { + const arr = [] + + const addNode = nodeId => { + const node = getNode(state, nodeId) + + if (node !== undefined) { + arr.push(node) + if (node.parentNodeId) addNode(node.parentNodeId) + } + } + + addNode(nodeId) + + return arr +} diff --git a/src/selectors/getNodeInputOptions.js b/src/selectors/getNodeInputOptions.js index 267d93e6..32bd762d 100644 --- a/src/selectors/getNodeInputOptions.js +++ b/src/selectors/getNodeInputOptions.js @@ -1,55 +1,47 @@ export default (state, nodeId) => { - const node = state.nodes[nodeId] + const nodeType = state.nodes[nodeId].type + + // List of options + // exclude: remove options for those node types + // include: ONLY allow these node types const options = [ { - value: false, - label: 'Choose', - disabled: true + value: 'audio', + label: 'Audio', + exclude: ['linkableAction'], }, { - value: 'audio_0', - type: 'audio', - label: 'Low' + value: 'midi', + type: 'midi', + label: 'MIDI', }, { - value: 'audio_1', - type: 'audio', - label: 'Low-Mid' + value: 'lfo', + label: 'LFO', + exclude: ['shot', 'linkableAction'], }, { - value: 'audio_2', - type: 'audio', - label: 'Mid' + value: 'anim', + type: 'anim', + label: 'Anim', + exclude: ['linkableAction', 'shot'], }, { - value: 'audio_3', - type: 'audio', - label: 'High' + value: 'seq-step', + label: 'Sequencer', + include: ['shot'], }, - { - value: 'midi', - type: 'midi', - label: 'MIDI' - } ] - if (node.type !== 'shot') { - options.push( - { - value: 'lfo', - label: 'LFO' - } - ) - } - - if (node.type === 'shot') { - options.push( - { - value: 'seq-step', - label: 'Sequencer' - } - ) - } + const filteredOptions = options.filter(opt => { + if (opt.include) { + return opt.include.includes(nodeType) + } else if (opt.exclude) { + return !opt.exclude.includes(nodeType) + } else { + return true + } + }) - return options + return filteredOptions } diff --git a/src/selectors/getOpenedMacroNode.js b/src/selectors/getOpenedMacroNode.js new file mode 100644 index 00000000..72969749 --- /dev/null +++ b/src/selectors/getOpenedMacroNode.js @@ -0,0 +1,5 @@ +import getNode from './getNode' + +export default (state) => { + return getNode(state, state.macros.openedId) +} diff --git a/src/selectors/getOpenedSketchNode.js b/src/selectors/getOpenedSketchNode.js new file mode 100644 index 00000000..40bc4109 --- /dev/null +++ b/src/selectors/getOpenedSketchNode.js @@ -0,0 +1,8 @@ +import getSelectedSketchId from './getSelectedSketchId' +import getNode from './getNode' + +export default (state) => { + const sketchId = getSelectedSketchId(state) + const sketch = state.sketches[sketchId] + return sketch !== undefined ? getNode(state, sketch.openedNodeId) : undefined +} diff --git a/src/selectors/getParamInfoText.js b/src/selectors/getParamInfoText.js index c4d6b789..9b387d01 100644 --- a/src/selectors/getParamInfoText.js +++ b/src/selectors/getParamInfoText.js @@ -7,7 +7,7 @@ export default (state, nodeId) => { let info = '' for (let i = 0; i < linkIds.length; i++) { - info += state.inputLinks[linkIds[i]].title + info += state.nodes[linkIds[i]].title if (i !== linkIds.length - 1) info += ', ' } return info diff --git a/src/selectors/getProjectSettings.js b/src/selectors/getProjectSettings.js new file mode 100644 index 00000000..b66067c3 --- /dev/null +++ b/src/selectors/getProjectSettings.js @@ -0,0 +1 @@ +export default state => state.settings diff --git a/src/selectors/getSelectedSketchId.js b/src/selectors/getSelectedSketchId.js index d690c953..59efaffa 100644 --- a/src/selectors/getSelectedSketchId.js +++ b/src/selectors/getSelectedSketchId.js @@ -3,5 +3,5 @@ import getCurrentSceneId from './getCurrentSceneId' export default state => { const sceneId = getCurrentSceneId(state) const scene = state.scenes.items[sceneId] - return scene ? scene.selectedSketchId : undefined + return scene ? scene.selectedSketchId : false } diff --git a/src/selectors/getSketchParams.js b/src/selectors/getSketchParams.js index 1a4246f2..8d35b06d 100644 --- a/src/selectors/getSketchParams.js +++ b/src/selectors/getSketchParams.js @@ -1,10 +1,18 @@ +const lerp = (v0, v1, t) => { + return (1 - t) * v0 + t * v1 +} + const getSingle = (state, sketchId) => { const sketchParams = state.sketches[sketchId].paramIds const params = {} sketchParams.forEach((id) => { const param = state.nodes[id] - params[param.key] = param.value + if (param.min !== undefined && param.max !== undefined) { + params[param.key] = lerp(param.min, param.max, param.value) + } else { + params[param.key] = param.value + } }) return params diff --git a/src/selectors/getSketchShotIds.js b/src/selectors/getSketchShotIds.js index fef54a02..c1376165 100644 --- a/src/selectors/getSketchShotIds.js +++ b/src/selectors/getSketchShotIds.js @@ -1,2 +1,2 @@ export default (state, sketchId) => -state.sketches[sketchId].shotIds + state.sketches[sketchId].shotIds diff --git a/src/selectors/getUiOpenedNodeId.js b/src/selectors/getUiOpenedNodeId.js new file mode 100644 index 00000000..14904027 --- /dev/null +++ b/src/selectors/getUiOpenedNodeId.js @@ -0,0 +1 @@ +export default state => state.ui.openedNode diff --git a/src/selectors/getVisibleSketchParamIds.js b/src/selectors/getVisibleSketchParamIds.js new file mode 100644 index 00000000..e3df1a62 --- /dev/null +++ b/src/selectors/getVisibleSketchParamIds.js @@ -0,0 +1,7 @@ +import getNodes from './getNodes' + +export default (state, sketchId) => { + const nodes = getNodes(state, state.sketches[sketchId].paramIds).filter(node => !node.hidden) + return nodes.map(node => node.id) +} + diff --git a/src/store/anims/actions.js b/src/store/anims/actions.js new file mode 100644 index 00000000..585b88e8 --- /dev/null +++ b/src/store/anims/actions.js @@ -0,0 +1,8 @@ +export function uAnimStart (linkId) { + return { + type: 'U_ANIM_START', + payload: { + linkId, + }, + } +} diff --git a/src/store/anims/listener.js b/src/store/anims/listener.js new file mode 100644 index 00000000..3a9fd97e --- /dev/null +++ b/src/store/anims/listener.js @@ -0,0 +1,35 @@ +import getInputLink from '../../selectors/getInputLink' +import getNode from '../../selectors/getNode' +import getNodesValues from '../../selectors/getNodesValues' +import { nodeValueUpdate } from '../nodes/actions' +import TWEEN from '@tweenjs/tween.js' +import { get } from 'lodash' + +const handleAnimStart = (action, store) => { + const state = store.getState() + const inputLink = getInputLink(state, action.payload.linkId) + const node = getNode(state, inputLink.nodeId) + const opts = getNodesValues(state, inputLink.animOptionIds) + const duration = opts.duration * 10000 + const easing = get(TWEEN.Easing, opts.curve) + + const props = { + nodeValue: node.value, + } + + new TWEEN.Tween(props) + .to({ nodeValue: opts.targetVal }, duration) + .easing(easing) + .onUpdate(() => { + store.dispatch(nodeValueUpdate(inputLink.nodeId, props.nodeValue)) + }) + .start() +} + +export default (action, store) => { + switch (action.type) { + case 'U_ANIM_START': + handleAnimStart(action, store) + break + } +} diff --git a/src/store/availableModules/_test/actions.spec.js b/src/store/availableModules/_test/actions.spec.js index 3b040a1a..179dc2de 100644 --- a/src/store/availableModules/_test/actions.spec.js +++ b/src/store/availableModules/_test/actions.spec.js @@ -9,14 +9,14 @@ test('(Action Creator) availableModulesReplaceAll', (t) => { { key: 'rotX', title: 'Rotation X', - defaultValue: 0.5 + defaultValue: 0.5, }, { key: 'rotY', title: 'Rotation Y', - defaultValue: 0.5 - } - ] + defaultValue: 0.5, + }, + ], }, swirly: { defaultTitle: 'Swirly', @@ -24,22 +24,22 @@ test('(Action Creator) availableModulesReplaceAll', (t) => { { key: 'swirlRate', title: 'Swirl Rate', - defaultValue: 0.1 + defaultValue: 0.1, }, { key: 'scale', title: 'Scale', - defaultValue: 0.1 - } - ] - } + defaultValue: 0.1, + }, + ], + }, } let actual = a.availableModulesReplaceAll(modules) let expected = { type: 'AVAILABLE_MODULES_REPLACE_ALL', payload: { - modules - } + modules, + }, } t.deepEqual(actual, expected, 'Creates action to update available modules') t.end() diff --git a/src/store/availableModules/_test/reducer.spec.js b/src/store/availableModules/_test/reducer.spec.js index c882595d..8c655612 100644 --- a/src/store/availableModules/_test/reducer.spec.js +++ b/src/store/availableModules/_test/reducer.spec.js @@ -14,14 +14,14 @@ test('(Reducer) availableModulesReducer - Updates modules on AVAILABLE_MODULES_R { key: 'rotX', title: 'Rotation X', - defaultValue: 0.5 + defaultValue: 0.5, }, { key: 'rotY', title: 'Rotation Y', - defaultValue: 0.5 - } - ] + defaultValue: 0.5, + }, + ], }, swirly: { defaultTitle: 'Swirly', @@ -29,22 +29,22 @@ test('(Reducer) availableModulesReducer - Updates modules on AVAILABLE_MODULES_R { key: 'swirlRate', title: 'Swirl Rate', - defaultValue: 0.1 + defaultValue: 0.1, }, { key: 'scale', title: 'Scale', - defaultValue: 0.1 - } - ] - } + defaultValue: 0.1, + }, + ], + }, } const actual = availableModulesReducer(originalState, { type: 'AVAILABLE_MODULES_REPLACE_ALL', payload: { - modules - } + modules, + }, }) t.deepEqual(actual, modules) diff --git a/src/store/availableModules/actions.js b/src/store/availableModules/actions.js index ea11d0dc..681755c6 100644 --- a/src/store/availableModules/actions.js +++ b/src/store/availableModules/actions.js @@ -1,6 +1,6 @@ export function availableModulesReplaceAll (modules) { return { type: 'AVAILABLE_MODULES_REPLACE_ALL', - payload: { modules } + payload: { modules }, } } diff --git a/src/store/clock/_test/reducer.spec.js b/src/store/clock/_test/reducer.spec.js index d5e41bd3..7ba270f2 100644 --- a/src/store/clock/_test/reducer.spec.js +++ b/src/store/clock/_test/reducer.spec.js @@ -9,11 +9,11 @@ test('(Reducer) clockReducer - - Increases beat on CLOCK_BEAT_INC', (t) => { let originalState, expectedState, actualState originalState = { - beat: 1 + beat: 1, } expectedState = { - beat: 2 + beat: 2, } actualState = paramsReducer(originalState, a.clockBeatInc()) @@ -21,7 +21,7 @@ test('(Reducer) clockReducer - - Increases beat on CLOCK_BEAT_INC', (t) => { t.deepEqual(actualState, expectedState) expectedState = { - beat: 3 + beat: 3, } actualState = paramsReducer(actualState, a.clockBeatInc()) @@ -35,11 +35,11 @@ test('(Reducer) clockReducer - resets beat on CLOCK_RESET', (t) => { let originalState, expectedState, actualState originalState = { - beat: 100 + beat: 100, } expectedState = { - beat: 0 + beat: 0, } actualState = paramsReducer(originalState, a.clockReset()) @@ -53,11 +53,11 @@ test('(Reducer) clockReducer - loops back to 0 after 64 beats', (t) => { let originalState, expectedState, actualState originalState = { - beat: 62 + beat: 62, } expectedState = { - beat: 63 + beat: 63, } actualState = paramsReducer(originalState, a.clockBeatInc()) @@ -65,7 +65,7 @@ test('(Reducer) clockReducer - loops back to 0 after 64 beats', (t) => { t.deepEqual(actualState, expectedState) expectedState = { - beat: 0 + beat: 0, } actualState = paramsReducer(actualState, a.clockBeatInc()) @@ -79,11 +79,11 @@ test('(Reducer) clockReducer - updates BPM on CLOCK_BPM_UPDATE', (t) => { let originalState, expectedState, actualState originalState = { - bpm: undefined + bpm: undefined, } expectedState = { - bpm: 120 + bpm: 120, } actualState = paramsReducer(originalState, a.clockBpmUpdate(120)) @@ -91,7 +91,7 @@ test('(Reducer) clockReducer - updates BPM on CLOCK_BPM_UPDATE', (t) => { t.deepEqual(actualState, expectedState) expectedState = { - bpm: 110 + bpm: 110, } actualState = paramsReducer(actualState, a.clockBpmUpdate(110)) diff --git a/src/store/clock/_test/sagas.spec.js b/src/store/clock/_test/sagas.spec.js index 4ddab7ff..fdd12c44 100644 --- a/src/store/clock/_test/sagas.spec.js +++ b/src/store/clock/_test/sagas.spec.js @@ -33,7 +33,7 @@ test('(Saga) clockUpdate (off beat)', (t) => { const info = { pulses: 1, beats: 1, - delta: 0.1 + delta: 0.1, } t.deepEqual( @@ -55,7 +55,7 @@ test('(Saga) clockUpdate (on beat)', (t) => { const info = { pulses: 0, beats: 1, - delta: 0.1 + delta: 0.1, } generator.next(info) @@ -79,7 +79,7 @@ test('(Saga) clockUpdate (on bar)', (t) => { const info = { pulses: 0, beats: 0, - delta: 0.1 + delta: 0.1, } generator.next(info) diff --git a/src/store/clock/actions.js b/src/store/clock/actions.js index 1b2b7fcb..3671b0a8 100644 --- a/src/store/clock/actions.js +++ b/src/store/clock/actions.js @@ -1,12 +1,12 @@ export function clockPulse () { return { - type: 'CLOCK_PULSE' + type: 'CLOCK_PULSE', } } export function clockBeatInc () { return { - type: 'CLOCK_BEAT_INC' + type: 'CLOCK_BEAT_INC', } } @@ -14,19 +14,19 @@ export function clockBpmUpdate (bpm) { return { type: 'CLOCK_BPM_UPDATE', payload: { - bpm - } + bpm, + }, } } export function clockReset () { return { - type: 'CLOCK_RESET' + type: 'CLOCK_RESET', } } export function clockSnap () { return { - type: 'CLOCK_SNAP' + type: 'CLOCK_SNAP', } } diff --git a/src/store/clock/reducer.js b/src/store/clock/reducer.js index 15eefa33..6bd02a80 100644 --- a/src/store/clock/reducer.js +++ b/src/store/clock/reducer.js @@ -1,6 +1,6 @@ const defaultState = { beat: 0, - bpm: 0 + bpm: 0, } const clockReducer = (state = defaultState, action) => { diff --git a/src/store/clock/sagas.js b/src/store/clock/sagas.js index 2cd281db..e9abc22d 100644 --- a/src/store/clock/sagas.js +++ b/src/store/clock/sagas.js @@ -1,32 +1,42 @@ -import 'babel-polyfill' +import '@babel/polyfill' import now from 'performance-now' import { takeEvery, put, call } from 'redux-saga/effects' import { inputFired } from '../inputs/actions' import * as a from './actions' const ppqn = 24 -let pulses, delta, beats, lastBar, totalBeats +let pulses, beats, lastBar, totalBeats let seqStepCount = 0 // Sequencer step count const ppSeqStep = ppqn / 8 // Pulses per 8th beat const seqStepPerBar = ppSeqStep * 8 * 4 export const clockReset = () => { pulses = 0 - delta = 0 beats = 0 totalBeats = 0 seqStepCount = 0 lastBar = now() } -export const clockSnap = () => { + +export function* clockSnap () { + // Get how many sequence pulses since last sequence step + const seqMod = seqStepCount % ppqn + if (pulses > ppqn * 0.5) { + // Increase the beat beats++ totalBeats++ + // Increase sequence pulses so it snaps to next beat + seqStepCount += ppqn - seqMod - 1 + seqStepCount %= seqStepPerBar + // Pulse will be 0 on next pulse, triggering clock beat behaviour pulses = -1 } else { + // Decrease sequence pulses so it snaps to current beat + seqStepCount -= seqMod + // Beat won't change on next pulse pulses = 0 } - delta = totalBeats } export const newPulse = () => { @@ -44,12 +54,11 @@ export const newPulse = () => { beats = 0 } } - delta = pulses / ppqn + totalBeats return { pulses, beats, - delta, - seqStepCount + seqStepCount, + delta: pulses / ppqn + totalBeats, } } @@ -63,7 +72,7 @@ export const calcBpm = () => { export function* clockUpdate () { const info = yield call(newPulse) yield put(inputFired('lfo', info.delta, { - type: 'lfo' + type: 'lfo', })) if (info.seqStepCount % ppSeqStep === 0) { diff --git a/src/store/displays/_test/reducer.spec.js b/src/store/displays/_test/reducer.spec.js index 46518dc0..6e6c49ed 100644 --- a/src/store/displays/_test/reducer.spec.js +++ b/src/store/displays/_test/reducer.spec.js @@ -10,22 +10,22 @@ test('(Reducer) displaysReducer - Updates deviceList on displaysListUpdate', (t) let actual, expectedState const originalState = { - list: [] + list: [], } deepFreeze(originalState) const newList = [ { - foo: 'bar' + foo: 'bar', }, { - lorem: 'ipsum' - } + lorem: 'ipsum', + }, ] expectedState = { - list: newList + list: newList, } actual = displaysReducer(originalState, a.displaysListUpdate(newList)) diff --git a/src/store/displays/actions.js b/src/store/displays/actions.js index 24d41055..1819b0c8 100644 --- a/src/store/displays/actions.js +++ b/src/store/displays/actions.js @@ -1,6 +1,6 @@ export function displaysListUpdate (deviceList) { return { type: 'DISPLAYS_LIST_UPDATE', - payload: { deviceList } + payload: { deviceList }, } } diff --git a/src/store/displays/reducer.js b/src/store/displays/reducer.js index 17ce7396..2dca5903 100644 --- a/src/store/displays/reducer.js +++ b/src/store/displays/reducer.js @@ -1,5 +1,5 @@ const defaultState = { - list: [] + list: [], } const displaysReducer = (state = defaultState, action) => { @@ -9,7 +9,7 @@ const displaysReducer = (state = defaultState, action) => { case 'DISPLAYS_LIST_UPDATE': { return { ...state, - list: p.deviceList + list: p.deviceList, } } default: diff --git a/src/store/inputLinks/_test/reducer.spec.js b/src/store/inputLinks/_test/reducer.spec.js deleted file mode 100644 index ba030454..00000000 --- a/src/store/inputLinks/_test/reducer.spec.js +++ /dev/null @@ -1,176 +0,0 @@ -import test from 'tape' -import deepFreeze from 'deep-freeze' -import inputLinkReducer from '../reducer' -import { returnsPreviousState } from '../../../testUtils' -import * as a from '../actions' - -returnsPreviousState(inputLinkReducer) - -test('(Reducer) inputLinkReducer - Adds link on rInputLinkCreate()', (t) => { - let originalState, expectedState, actualState - - originalState = { - '01': { - foo: 'bar' - }, - '02': { - lorem: 'ipsum' - } - } - - deepFreeze(originalState) - - expectedState = { - '01': { - foo: 'bar' - }, - '02': { - lorem: 'ipsum' - }, - '03': { - bar: 'foo' - } - } - - actualState = inputLinkReducer(originalState, a.rInputLinkCreate('03', { bar: 'foo' })) - - t.deepEqual(actualState, expectedState) - - t.end() -}) - -test('(Reducer) inputLinkReducer - Removes link on rInputLinkDelete()', (t) => { - let originalState, expectedState, actualState - - originalState = { - '01': { - foo: 'bar' - }, - '02': { - lorem: 'ipsum' - }, - '03': { - bar: 'foo' - } - } - - deepFreeze(originalState) - - expectedState = { - '01': { - foo: 'bar' - }, - '02': { - lorem: 'ipsum' - } - } - - actualState = inputLinkReducer(originalState, a.rInputLinkDelete('03')) - - t.deepEqual(actualState, expectedState) - - t.end() -}) - -test('(Reducer) inputLinkReducer - Replaces all on inputLinksReplaceAll()', (t) => { - let originalState, expectedState, actualState - - originalState = { - '01': { - foo: 'bar' - }, - '02': { - lorem: 'ipsum' - }, - '03': { - bar: 'foo' - } - } - - deepFreeze(originalState) - - expectedState = { - 'XX': { - foo: 'woo' - }, - 'YY': { - lorem: 'wee' - } - } - - actualState = inputLinkReducer(originalState, a.inputLinksReplaceAll({ - 'XX': { - foo: 'woo' - }, - 'YY': { - lorem: 'wee' - } - })) - - t.deepEqual(actualState, expectedState) - - t.end() -}) - -test('(Reducer) inputLinkReducer - handle inputLinkShotArm / inputLinkShotDisarm', (t) => { - let originalState, expectedState, actualState - - originalState = { - '01': { - id: '01' - }, - '02': { - id: '02', - armed: true - } - } - - deepFreeze(originalState) - - expectedState = { - '01': { - id: '01', - armed: true - }, - '02': { - id: '02', - armed: true - } - } - - actualState = inputLinkReducer(originalState, a.inputLinkShotArm('01')) - - t.deepEqual(actualState, expectedState) - - expectedState = { - '01': { - id: '01', - armed: true - }, - '02': { - id: '02', - armed: false - } - } - - actualState = inputLinkReducer(actualState, a.inputLinkShotDisarm('02')) - - t.deepEqual(actualState, expectedState) - - expectedState = { - '01': { - id: '01', - armed: true - }, - '02': { - id: '02', - armed: true - } - } - - actualState = inputLinkReducer(actualState, a.inputLinkShotArm('02')) - - t.deepEqual(actualState, expectedState) - - t.end() -}) diff --git a/src/store/inputLinks/_test/sagas.spec.js b/src/store/inputLinks/_test/sagas.spec.js index 78defca7..d7facdca 100644 --- a/src/store/inputLinks/_test/sagas.spec.js +++ b/src/store/inputLinks/_test/sagas.spec.js @@ -1,3 +1,7 @@ +/* +DISABLING BECAUSE THIS WONT BE SAGA FOR MUCH LONGER +ALSO WILL BE CHANGING TEST LIB + import 'babel-polyfill' import test from 'tape' import { select, put, call } from 'redux-saga/effects' @@ -21,7 +25,7 @@ proxyquire.noCallThru() const getAll = sinon.stub() const { inputLinkCreate } = proxyquire('../sagas', { - '../../externals/modifiers': { getAll } + '../../externals/modifiers': { getAll }, }) test('(Saga) inputLinkCreate', (t) => { @@ -49,7 +53,7 @@ test('(Saga) inputLinkCreate', (t) => { ) const node = { - type: 'FOO' + type: 'FOO', } t.deepEqual( @@ -63,15 +67,15 @@ test('(Saga) inputLinkCreate', (t) => { config: { title: ['Fooey'], defaultValue: [0.2], - type: 'audio' - } + type: 'audio', + }, }, bar: { config: { title: ['Barey1', 'Barey2'], - defaultValue: [0.5, 0.5] - } - } + defaultValue: [0.5, 0.5], + }, + }, } t.deepEqual( @@ -97,7 +101,7 @@ test('(Saga) inputLinkCreate', (t) => { value: 0.2, type: 'audio', inputLinkIds: [], - subNode: true + subNode: true, } t.deepEqual( @@ -121,7 +125,7 @@ test('(Saga) inputLinkCreate', (t) => { value: 0.5, type: undefined, inputLinkIds: [], - subNode: true + subNode: true, } t.deepEqual( @@ -145,7 +149,7 @@ test('(Saga) inputLinkCreate', (t) => { value: 0.5, type: undefined, inputLinkIds: [], - subNode: true + subNode: true, } t.deepEqual( @@ -173,7 +177,7 @@ test('(Saga) inputLinkCreate', (t) => { title: inputId, input: { id: inputId, - type: inputType + type: inputType, }, nodeId, deviceId, @@ -183,10 +187,10 @@ test('(Saga) inputLinkCreate', (t) => { lfoOptionIds: [], midiOptionIds: [], linkableActions: { - toggleActivate: actionId + toggleActivate: actionId, }, linkType: 'node', - sequencerGridId: undefined + sequencerGridId: undefined, } t.deepEqual( @@ -236,7 +240,7 @@ test('(Saga) inputLinkCreate - LFO', (t) => { ) const node = { - type: 'FOO' + type: 'FOO', } t.deepEqual( @@ -250,15 +254,15 @@ test('(Saga) inputLinkCreate - LFO', (t) => { config: { title: ['Fooey'], defaultValue: [0.2], - type: 'audio' - } + type: 'audio', + }, }, bar: { config: { title: ['Barey1', 'Barey2'], - defaultValue: [0.5, 0.5] - } - } + defaultValue: [0.5, 0.5], + }, + }, } t.deepEqual( @@ -284,7 +288,7 @@ test('(Saga) inputLinkCreate - LFO', (t) => { value: 0.5, type: undefined, inputLinkIds: [], - subNode: true + subNode: true, } t.deepEqual( @@ -308,7 +312,7 @@ test('(Saga) inputLinkCreate - LFO', (t) => { value: 0.5, type: undefined, inputLinkIds: [], - subNode: true + subNode: true, } t.deepEqual( @@ -327,13 +331,13 @@ test('(Saga) inputLinkCreate - LFO', (t) => { { id: 'LFO1', key: 'shape', - value: 'sine' + value: 'sine', }, { id: 'LFO2', key: 'rate', - value: 1 - } + value: 1, + }, ] t.deepEqual( @@ -341,7 +345,7 @@ test('(Saga) inputLinkCreate - LFO', (t) => { put(uNodeCreate('LFO1', { key: 'shape', id: 'LFO1', - value: 'sine' + value: 'sine', })), 'Dispatch node create action' ) @@ -351,7 +355,7 @@ test('(Saga) inputLinkCreate - LFO', (t) => { put(uNodeCreate('LFO2', { key: 'rate', id: 'LFO2', - value: 1 + value: 1, })), 'Dispatch node create action' ) @@ -375,7 +379,7 @@ test('(Saga) inputLinkCreate - LFO', (t) => { title: inputId, input: { id: inputId, - type: inputType + type: inputType, }, nodeId, deviceId, @@ -385,10 +389,10 @@ test('(Saga) inputLinkCreate - LFO', (t) => { lfoOptionIds: ['LFO1', 'LFO2'], midiOptionIds: [], linkableActions: { - toggleActivate: actionId + toggleActivate: actionId, }, linkType: 'node', - sequencerGridId: undefined + sequencerGridId: undefined, } t.deepEqual( @@ -437,7 +441,7 @@ test('(Saga) inputLinkCreate (type midi)', (t) => { ) const node = { - type: 'FOO' + type: 'FOO', } t.deepEqual( @@ -457,20 +461,20 @@ test('(Saga) inputLinkCreate (type midi)', (t) => { const midiOpts = [ { id: 'MIDI1', - key: 'bar' + key: 'bar', }, { id: 'MIDI2', key: 'controlType', - value: 'abs' - } + value: 'abs', + }, ] t.deepEqual( generator.next(midiOpts).value, put(uNodeCreate('MIDI1', { id: 'MIDI1', - key: 'bar' + key: 'bar', })), 'Dispatch node create action' ) @@ -480,7 +484,7 @@ test('(Saga) inputLinkCreate (type midi)', (t) => { put(uNodeCreate('MIDI2', { id: 'MIDI2', key: 'controlType', - value: controlType + value: controlType, })), 'Dispatch node create action (with value as passed in controlType)' ) @@ -504,7 +508,7 @@ test('(Saga) inputLinkCreate (type midi)', (t) => { title: inputId, input: { id: inputId, - type: inputType + type: inputType, }, nodeId, bankIndex, @@ -514,10 +518,10 @@ test('(Saga) inputLinkCreate (type midi)', (t) => { lfoOptionIds: [], midiOptionIds: ['MIDI1', 'MIDI2'], linkableActions: { - toggleActivate: actionId + toggleActivate: actionId, }, linkType: 'node', - sequencerGridId: undefined + sequencerGridId: undefined, } t.deepEqual( @@ -565,7 +569,7 @@ test('(Saga) inputLinkCreate (id seq-step)', (t) => { ) const node = { - type: 'shot' + type: 'shot', } t.deepEqual( @@ -577,15 +581,15 @@ test('(Saga) inputLinkCreate (id seq-step)', (t) => { const seqOptions = { grid: { id: 'SEQ01', - grid: [0, 1, 0, 1] - } + grid: [0, 1, 0, 1], + }, } t.deepEqual( generator.next(seqOptions).value, put(uNodeCreate('SEQ01', { id: 'SEQ01', - grid: [0, 1, 0, 1] + grid: [0, 1, 0, 1], })), 'Dispatch node create action' ) @@ -609,7 +613,7 @@ test('(Saga) inputLinkCreate (id seq-step)', (t) => { title: inputId, input: { id: inputId, - type: inputType + type: inputType, }, nodeId, deviceId, @@ -619,10 +623,10 @@ test('(Saga) inputLinkCreate (id seq-step)', (t) => { lfoOptionIds: [], midiOptionIds: [], linkableActions: { - toggleActivate: actionId + toggleActivate: actionId, }, sequencerGridId: 'SEQ01', - linkType: 'node' + linkType: 'node', } t.deepEqual( @@ -693,7 +697,7 @@ test('(Saga) inputLinkCreate (linkableAction)', (t) => { title: inputId, input: { id: inputId, - type: inputType + type: inputType, }, nodeId, nodeType: undefined, @@ -704,7 +708,7 @@ test('(Saga) inputLinkCreate (linkableAction)', (t) => { midiOptionIds: [], linkableActions: {}, linkType: 'linkableAction', - sequencerGridId: undefined + sequencerGridId: undefined, } t.deepEqual( @@ -728,3 +732,5 @@ test('(Saga) inputLinkCreate (linkableAction)', (t) => { t.equal(generator.next().done, true, 'Generator ends') t.end() }) + +*/ diff --git a/src/store/inputLinks/actions.js b/src/store/inputLinks/actions.js index 006b2c8d..157ed7af 100644 --- a/src/store/inputLinks/actions.js +++ b/src/store/inputLinks/actions.js @@ -1,23 +1,21 @@ -export function uInputLinkCreate (nodeId, inputId, inputType, deviceId, controlType) { +export function uInputLinkCreate (nodeId, inputId, inputType, meta = {}) { return { type: 'U_INPUT_LINK_CREATE', payload: { nodeId, inputId, inputType, - deviceId, - controlType - } + meta, + }, } } -export function rInputLinkCreate (id, link) { +export function rInputLinkAdd (id, link) { return { - type: 'R_INPUT_LINK_CREATE', + type: 'R_INPUT_LINK_ADD', payload: { id, - link - } + }, } } @@ -25,8 +23,8 @@ export function uInputLinkDelete (id) { return { type: 'U_INPUT_LINK_DELETE', payload: { - id - } + id, + }, } } @@ -34,19 +32,17 @@ export function rInputLinkDelete (id) { return { type: 'R_INPUT_LINK_DELETE', payload: { - id - } + id, + }, } } -export function uInputLinkUpdate (linkId, inputId, inputType) { +export function uInputLinkUpdateMidiInput (linkId) { return { - type: 'U_INPUT_LINK_UPDATE', + type: 'U_INPUT_LINK_UPDATE_MIDI_INPUT', payload: { linkId, - inputId, - inputType - } + }, } } @@ -54,35 +50,7 @@ export function inputLinksReplaceAll (links) { return { type: 'INPUT_LINKS_REPLACE_ALL', payload: { - links - } - } -} - -export function rInputLinkUpdate (linkId, input) { - return { - type: 'R_INPUT_LINK_UPDATE', - payload: { - linkId, - input - } - } -} - -export function inputLinkShotArm (id) { - return { - type: 'INPUT_LINK_SHOT_ARM', - payload: { - id - } - } -} - -export function inputLinkShotDisarm (id) { - return { - type: 'INPUT_LINK_SHOT_DISARM', - payload: { - id - } + links, + }, } } diff --git a/src/store/inputLinks/listener.js b/src/store/inputLinks/listener.js new file mode 100644 index 00000000..e3810511 --- /dev/null +++ b/src/store/inputLinks/listener.js @@ -0,0 +1,34 @@ +import getInputLink from '../../selectors/getInputLink' +import getNodes from '../../selectors/getNodes' +import { constructMidiId } from '../../utils/midiMessage' +import { inputAssignedLinkCreate, inputAssignedLinkDelete } from '../inputs/actions' +import { nodeUpdate } from '../nodes/actions' + +const handleUpdateMidiInput = (action, store) => { + const state = store.getState() + const link = getInputLink(state, action.payload.linkId) + const opts = getNodes(state, link.midiOptionIds) + + let messageType, noteNum, channel + + opts.forEach(opt => { + if (opt.key === 'messageType') messageType = opt.value + if (opt.key === 'noteNum') noteNum = opt.value + if (opt.key === 'channel') channel = opt.value + }) + + const newInputId = constructMidiId(messageType, noteNum, channel) + + store.dispatch(inputAssignedLinkDelete(link.input.id, link.id)) + store.dispatch(inputAssignedLinkCreate(newInputId, link.id)) + store.dispatch(nodeUpdate(link.id, { input: { id: newInputId, type: 'midi' } })) +} + +export default (action, store) => { + switch (action.type) { + case 'U_INPUT_LINK_UPDATE_MIDI_INPUT': + handleUpdateMidiInput(action, store) + break + } +} + diff --git a/src/store/inputLinks/reducer.js b/src/store/inputLinks/reducer.js index 8e6d7cee..eb28b66d 100644 --- a/src/store/inputLinks/reducer.js +++ b/src/store/inputLinks/reducer.js @@ -1,39 +1,26 @@ -const defaultState = {} +const defaultState = { + nodeIds: [], +} import _ from 'lodash' const inputLinkReducer = (state = defaultState, action) => { const p = action.payload switch (action.type) { - case 'R_INPUT_LINK_CREATE': { + case 'R_INPUT_LINK_ADD': { return { ...state, - [p.id]: p.link + nodeIds: _.union(state.nodeIds, [p.nodeId]), } } case 'R_INPUT_LINK_DELETE': { - return _.omit(state, [p.id]) - } - case 'INPUT_LINKS_REPLACE_ALL': { - return p.links - } - case 'INPUT_LINK_SHOT_ARM': { return { ...state, - [p.id] : { - ...state[p.id], - armed: true - } + nodeIds: state.nodeIds.filter(item => item !== p.nodeId), } } - case 'INPUT_LINK_SHOT_DISARM': { - return { - ...state, - [p.id] : { - ...state[p.id], - armed: false - } - } + case 'INPUT_LINKS_REPLACE_ALL': { + return p.links } default: return state diff --git a/src/store/inputLinks/sagas.js b/src/store/inputLinks/sagas.js index d0145138..1dace8c2 100644 --- a/src/store/inputLinks/sagas.js +++ b/src/store/inputLinks/sagas.js @@ -2,17 +2,17 @@ import { select, put, call, takeEvery } from 'redux-saga/effects' import { getDefaultModifierIds } from './selectors' import getInputLink from '../../selectors/getInputLink' import getNode from '../../selectors/getNode' -import { rInputLinkCreate, rInputLinkDelete } from './actions' +import { rInputLinkAdd, rInputLinkDelete } from './actions' +import { uAnimStart } from '../anims/actions' import { rNodeCreate, uNodeCreate, uNodeDelete, uNodeInputLinkAdd, - nodeInputLinkRemove, nodeActiveInputLinkToggle } from '../nodes/actions' + nodeInputLinkRemove, nodeActiveInputLinkToggle, rNodeDelete } from '../nodes/actions' import { inputAssignedLinkCreate, inputAssignedLinkDelete } from '../inputs/actions' -import { linkableActionCreate, linkableActionInputLinkAdd, - linkableActionInputLinkRemove, linkableActionDelete } from '../linkableActions/actions' import lfoGenerateOptions from '../../utils/lfoGenerateOptions' import midiGenerateOptions from '../../utils/midiGenerateOptions' import sequencerGenerateOptions from '../../utils/sequencerGenerateOptions' +import animGenerateOptions from '../../utils/animGenerateOptions' +import audioGenerateOptions from '../../utils/audioGenerateOptions' import { midiStartLearning } from '../midi/actions' -import getCurrentBankIndex from '../../selectors/getCurrentBankIndex' import { getAll } from '../../externals/modifiers' import uid from 'uid' @@ -24,11 +24,16 @@ import uid from 'uid' */ export function* inputLinkCreate (action) { const p = action.payload + const m = p.meta const modifierIds = [] const lfoOptionIds = [] const midiOptionIds = [] + const animOptionIds = [] + const audioOptionIds = [] let linkableActions = {} - let bankIndex, node, nodeType, linkType, sequencerGridId + let nodeType, linkType, sequencerGridId + const node = yield select(getNode, p.nodeId) + const sketchId = node.sketchId if (p.inputId === 'midi') { yield put(midiStartLearning(p.nodeId, p.inputType)) @@ -38,9 +43,8 @@ export function* inputLinkCreate (action) { linkType = 'linkableAction' } else { linkType = 'node' - node = yield select(getNode, p.nodeId) nodeType = node.type - if (p.inputType !== 'midi' && p.inputId !== 'seq-step') { + if (p.inputType !== 'midi' && p.inputId !== 'seq-step' && p.inputId !== 'anim') { const modifiers = yield call(getAll) const defaultModifierIds = yield select(getDefaultModifierIds) @@ -53,13 +57,15 @@ export function* inputLinkCreate (action) { const modifierId = yield call(uid) const modifier = { id: modifierId, + parentNodeId: linkId, + sketchId, key: id, title: config.title[j], value: config.defaultValue[j], passToNext: j < config.title.length - 1, inputLinkIds: [], type: config.type, - subNode: true + subNode: true, } modifierIds.push(modifierId) @@ -70,11 +76,26 @@ export function* inputLinkCreate (action) { } } + if (p.inputId === 'audio') { + const audioOpts = yield call(audioGenerateOptions) + + for (let key in audioOpts) { + const item = audioOpts[key] + item.sketchId = sketchId + item.parentNodeId = linkId + audioOptionIds.push(item.id) + + yield put(uNodeCreate(item.id, item)) + } + } + if (p.inputId === 'lfo') { const lfoOpts = yield call(lfoGenerateOptions) for (let key in lfoOpts) { const item = lfoOpts[key] + item.sketchId = sketchId + item.parentNodeId = linkId lfoOptionIds.push(item.id) yield put(uNodeCreate(item.id, item)) @@ -88,56 +109,88 @@ export function* inputLinkCreate (action) { } if (p.inputType === 'midi' || linkType === 'linkableAction') { - bankIndex = yield select(getCurrentBankIndex, p.deviceId) - if (linkType === 'node') { - const midiOpts = yield call(midiGenerateOptions) + const midiOpts = yield call(midiGenerateOptions, linkId) for (let key in midiOpts) { const item = midiOpts[key] + item.sketchId = sketchId + item.parentNodeId = linkId midiOptionIds.push(item.id) - if (item.key === 'controlType' && p.controlType) { - item.value = p.controlType - } + if (item.key === 'controlType' && m.controlType) item.value = m.controlType + if (item.key === 'channel' && m.channel) item.value = m.channel + if (item.key === 'noteNum' && m.noteNum) item.value = m.noteNum + if (item.key === 'messageType' && m.messageType) item.value = m.messageType yield put(uNodeCreate(item.id, item)) } } } + if (p.inputType === 'anim') { + const animStartActionId = yield call(uid) + const node = { + type: 'linkableAction', + title: 'Start Anim', + action: uAnimStart(linkId), + sketchId, + parentNodeId: linkId, + } + yield put(uNodeCreate(animStartActionId, node)) + linkableActions.animStart = animStartActionId + + const animOpts = yield call(animGenerateOptions) + + for (let key in animOpts) { + const item = animOpts[key] + animOptionIds.push(item.id) + item.sketchId = sketchId + item.parentNodeId = linkId + + yield put(uNodeCreate(item.id, item)) + } + } + if (linkType === 'node') { const toggleActionId = yield call(uid) - yield put(linkableActionCreate(toggleActionId, nodeActiveInputLinkToggle(p.nodeId, linkId))) + const node = { + type: 'linkableAction', + title: 'Toggle Activate', + action: nodeActiveInputLinkToggle(p.nodeId, linkId), + sketchId, + parentNodeId: linkId, + } + yield put(uNodeCreate(toggleActionId, node)) linkableActions.toggleActivate = toggleActionId } const link = { title: p.inputId, + type: 'inputLink', input: { id: p.inputId, - type: p.inputType + type: p.inputType, }, id: linkId, nodeId: p.nodeId, + sketchId, + parentNodeId: p.nodeId, nodeType, - deviceId: p.deviceId, - bankIndex, modifierIds, lfoOptionIds, midiOptionIds, + audioOptionIds, linkableActions, sequencerGridId, - linkType + linkType, + animOptionIds, } - yield put(rInputLinkCreate(linkId, link)) - if (linkType === 'node') { - yield put(uNodeInputLinkAdd(p.nodeId, linkId)) - } else if (linkType === 'linkableAction') { - yield put(linkableActionInputLinkAdd(p.nodeId, linkId)) - } - yield put(inputAssignedLinkCreate(p.inputId, linkId, p.deviceId)) + yield put(rNodeCreate(linkId, link)) + yield put(rInputLinkAdd(linkId)) + yield put(uNodeInputLinkAdd(p.nodeId, linkId)) + yield put(inputAssignedLinkCreate(p.inputId, linkId)) } } @@ -156,16 +209,13 @@ export function* inputLinkDelete (action) { } } - if (link.linkType === 'linkableAction') { - yield put(linkableActionInputLinkRemove(nodeId, p.id)) - } else { - yield put(nodeInputLinkRemove(nodeId, p.id)) - } + yield put(nodeInputLinkRemove(nodeId, p.id)) for (const key in link.linkableActions) { - yield put(linkableActionDelete(link.linkableActions[key])) + yield put(uNodeDelete(link.linkableActions[key])) } + yield put(rNodeDelete(p.id)) yield put(rInputLinkDelete(p.id)) } diff --git a/src/store/inputs/_test/reducer.spec.js b/src/store/inputs/_test/reducer.spec.js index cd1d2b5c..f31fc97b 100644 --- a/src/store/inputs/_test/reducer.spec.js +++ b/src/store/inputs/_test/reducer.spec.js @@ -11,66 +11,66 @@ test('(Reducer) inputsReducer - Updates value on INPUT_FIRED', (t) => { const originalState = { audio_0: { - value: 0 + value: 0, }, audio_1: { - value: 0 - } + value: 0, + }, } expectedState = { audio_0: { - value: 0.9 + value: 0.9, }, audio_1: { - value: 0 - } + value: 0, + }, } actual = inputsReducer(originalState, { type: 'INPUT_FIRED', payload: { inputId: 'audio_0', - value: 0.9 - } + value: 0.9, + }, }) t.deepEqual(actual, expectedState) expectedState = { audio_0: { - value: 0.9 + value: 0.9, }, audio_1: { - value: 0.4 - } + value: 0.4, + }, } actual = inputsReducer(actual, { type: 'INPUT_FIRED', payload: { inputId: 'audio_1', - value: 0.4 - } + value: 0.4, + }, }) t.deepEqual(actual, expectedState) expectedState = { audio_0: { - value: 0.9 + value: 0.9, }, audio_1: { - value: 0.4 - } + value: 0.4, + }, } actual = inputsReducer(actual, { type: 'INPUT_FIRED', payload: { inputId: 'audio_XXXX', - value: 0.9 - } + value: 0.9, + }, }) t.deepEqual(actual, expectedState, 'does nothing if input doesnt exist in state') @@ -83,29 +83,29 @@ test('(Reducer) inputsReducer - Replaces all on INPUTS_REPLACE_ALL', (t) => { const originalState = { audio_0: { - value: 0 + value: 0, }, audio_1: { - value: 0 - } + value: 0, + }, } deepFreeze(originalState) expectedState = { audio_X: { - value: 0.9 + value: 0.9, }, audio_T: { - value: 0.5 - } + value: 0.5, + }, } actual = inputsReducer(originalState, { type: 'INPUTS_REPLACE_ALL', payload: { - inputs: expectedState - } + inputs: expectedState, + }, }) t.deepEqual(actual, expectedState) @@ -118,11 +118,11 @@ test('(Reducer) inputsReducer - Adds node and device on inputAssignedLinkCreate' const originalState = { audio_0: { - assignedLinkIds: [] + assignedLinkIds: [], }, audio_1: { - assignedLinkIds: [] - } + assignedLinkIds: [], + }, } deepFreeze(originalState) @@ -130,63 +130,55 @@ test('(Reducer) inputsReducer - Adds node and device on inputAssignedLinkCreate' expectedState = { audio_0: { assignedLinkIds: ['XX'], - deviceId: 'AAA' }, audio_1: { - assignedLinkIds: [] - } + assignedLinkIds: [], + }, } - actual = inputsReducer(originalState, a.inputAssignedLinkCreate('audio_0', 'XX', 'AAA')) + actual = inputsReducer(originalState, a.inputAssignedLinkCreate('audio_0', 'XX')) t.deepEqual(actual, expectedState) expectedState = { audio_0: { assignedLinkIds: ['XX'], - deviceId: 'AAA' }, audio_1: { assignedLinkIds: ['YY'], - deviceId: 'BBB' - } + }, } - actual = inputsReducer(actual, a.inputAssignedLinkCreate('audio_1', 'YY', 'BBB')) + actual = inputsReducer(actual, a.inputAssignedLinkCreate('audio_1', 'YY')) t.deepEqual(actual, expectedState) expectedState = { audio_0: { assignedLinkIds: ['XX'], - deviceId: 'AAA' }, audio_1: { assignedLinkIds: ['YY', 'ZZ'], - deviceId: 'BBB' - } + }, } - actual = inputsReducer(actual, a.inputAssignedLinkCreate('audio_1', 'ZZ', 'BBB')) + actual = inputsReducer(actual, a.inputAssignedLinkCreate('audio_1', 'ZZ')) t.deepEqual(actual, expectedState) expectedState = { audio_0: { assignedLinkIds: ['XX'], - deviceId: 'AAA' }, audio_1: { assignedLinkIds: ['YY', 'ZZ'], - deviceId: 'BBB' }, midi_XXX: { assignedLinkIds: ['AA'], - deviceId: 'CCC' - } + }, } - actual = inputsReducer(actual, a.inputAssignedLinkCreate('midi_XXX', 'AA', 'CCC')) + actual = inputsReducer(actual, a.inputAssignedLinkCreate('midi_XXX', 'AA')) t.deepEqual(actual, expectedState, 'Adds input and assigns node when input doesnt exist') @@ -198,22 +190,22 @@ test('(Reducer) inputsReducer - Deletes link on INPUT_ASSIGNED_LINK_DELETE', (t) const originalState = { audio_0: { - assignedLinkIds: ['XX'] + assignedLinkIds: ['XX'], }, audio_1: { - assignedLinkIds: ['YY', 'ZZ'] - } + assignedLinkIds: ['YY', 'ZZ'], + }, } deepFreeze(originalState) expectedState = { audio_0: { - assignedLinkIds: ['XX'] + assignedLinkIds: ['XX'], }, audio_1: { - assignedLinkIds: ['ZZ'] - } + assignedLinkIds: ['ZZ'], + }, } actual = inputsReducer(originalState, a.inputAssignedLinkDelete('audio_1', 'YY')) @@ -222,11 +214,11 @@ test('(Reducer) inputsReducer - Deletes link on INPUT_ASSIGNED_LINK_DELETE', (t) expectedState = { audio_0: { - assignedLinkIds: [] + assignedLinkIds: [], }, audio_1: { - assignedLinkIds: ['ZZ'] - } + assignedLinkIds: ['ZZ'], + }, } actual = inputsReducer(actual, a.inputAssignedLinkDelete('audio_0', 'XX')) diff --git a/src/store/inputs/_test/sagas.spec.js b/src/store/inputs/_test/sagas.spec.js index d7187f6f..3bbbb1f3 100644 --- a/src/store/inputs/_test/sagas.spec.js +++ b/src/store/inputs/_test/sagas.spec.js @@ -1,34 +1,34 @@ -import 'babel-polyfill' +import '@babel/polyfill' import test from 'tape' import sinon from 'sinon' -import { select, takeEvery, put, call } from 'redux-saga/effects' +import { takeEvery } from 'redux-saga/effects' import proxyquire from 'proxyquire' -import { getAssignedLinks } from '../selectors' -import { nodeValuesBatchUpdate, nodeShotFired } from '../../nodes/actions' -import { inputLinkShotDisarm, inputLinkShotArm } from '../../inputLinks/actions' -import { projectError } from '../../project/actions' +// import { getAssignedLinks } from '../selectors' +// import { nodeValuesBatchUpdate, nodeShotFired } from '../../nodes/actions' +// import { inputLinkShotDisarm, inputLinkShotArm } from '../../inputLinks/actions' +// import { projectError } from '../../project/actions' -import getNodes from '../../../selectors/getNodes' -import getNodesValues from '../../../selectors/getNodesValues' -import getNode from '../../../selectors/getNode' -import getLinkableAction from '../../../selectors/getLinkableAction' -import lfoProcess from '../../../utils/lfoProcess' -import midiValueProcess from '../../../utils/midiValueProcess' -import debounceInput from '../../../utils/debounceInput' +// import getNodes from '../../../selectors/getNodes' +// import getNodesValues from '../../../selectors/getNodesValues' +// import getNode from '../../../selectors/getNode' +// import getLinkableAction from '../../../selectors/getLinkableAction' +// import lfoProcess from '../../../utils/lfoProcess' +// import midiValueProcess from '../../../utils/midiValueProcess' +// import debounceInput from '../../../utils/debounceInput' proxyquire.noCallThru() const modifiers = { - work: sinon.stub() + work: sinon.stub(), } const { watchInputs, handleInput } = proxyquire('../sagas', { '../../externals/modifiers': { - work: modifiers.work - } + work: modifiers.work, + }, }) test('(Saga) watchInputs', (t) => { @@ -40,965 +40,1039 @@ test('(Saga) watchInputs', (t) => { t.end() }) -test('(Saga) handleInput (no modifiers)', (t) => { - const payload = { - value: 0.2, - inputId: 'audio_0' - } - - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'audio_0'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'XX' - }, - { - nodeId: 'YY' - } - ] - - t.deepEqual( - generator.next(links).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 0.2 - }, - { - id: 'YY', - value: 0.2 - } - ], undefined)), - '2. Dispatches batch node update action' - ) - - t.deepEqual( - generator.throw({ message: 'Error!' }).value, - put(projectError('Error!')), - 'Dispatches project error if some error' - ) - - t.end() -}) - -test('(Saga) handleInput (modifiers)', (t) => { - let modifiedValue, modifierNodes - - const meta = { - type: 'audio' - } - - const payload = { - value: 0.2, - inputId: 'audio_0', - meta - } - - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'audio_0'), - '1. Gets assigned links' - ) - - const nodes = [ - { - nodeId: 'XX', - modifierIds: ['yyy', 'zzz', 'aa1', 'aa2'] - } - ] - - t.deepEqual( - generator.next(nodes).value, - select(getNodes, ['yyy', 'zzz', 'aa1', 'aa2']), - '2.x Get Modifiers (nodes)' - ) - - modifierNodes = [ - { - id: 'yyy', - key: 'foo', - value: 0.5, - passToNext: false, - type: 'audio' - }, - { - id: 'zzz', - key: 'bar', - passToNext: false, - value: 0.7 - }, - { - id: 'zzz', - key: 'bar', - passToNext: true, - value: 0.2 - }, - { - id: 'zzz', - key: 'bar', - passToNext: false, - value: 0.3 - } - ] - - t.deepEqual( - generator.next(modifierNodes).value, - call(modifiers.work, 'foo', [0.5], 0.2), - '2.x get value after going through first modifier' - ) - - modifiedValue = 0.1 - - t.deepEqual( - generator.next(modifiedValue).value, - call(modifiers.work, 'bar', [0.7], 0.1), - '2.x get value after going through second modifier' - ) - - modifiedValue = 0.9 - - t.deepEqual( - generator.next(modifiedValue).value, - call(modifiers.work, 'bar', [0.2, 0.3], 0.9), - '2.x work modifier with multiple values' - ) - - modifiedValue = 0.9 - - t.deepEqual( - generator.next(modifiedValue).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 0.9 - } - ], meta)), - '2. Dispatches batch node update action' - ) - - t.deepEqual( - generator.throw({ message: 'Error!' }).value, - put(projectError('Error!')), - 'Dispatches project error if some error' - ) - - t.end() -}) - -test('(Saga) handleInput (ignore audio type modifiers)', (t) => { - let modifiedValue, modifierNodes - const payload = { - value: 0.2, - inputId: 'midi_xxx' - } - - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'midi_xxx'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'XX', - modifierIds: ['yyy', 'zzz'] - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNodes, ['yyy', 'zzz']), - '2.x Get Modifiers (nodes)' - ) - - modifierNodes = [ - { - id: 'yyy', - key: 'foo', - value: 0.5, - type: 'audio' - }, - { - id: 'zzz', - key: 'bar', - value: 0.7 - } - ] - - t.deepEqual( - generator.next(modifierNodes).value, - call(modifiers.work, 'bar', [0.7], 0.2), - '2.x ignore first modifier, get second' - ) - - modifiedValue = 0.9 - - t.deepEqual( - generator.next(modifiedValue).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 0.9 - } - ], undefined)), - '2. Dispatches batch node update action' - ) - - t.deepEqual( - generator.throw({ message: 'Error!' }).value, - put(projectError('Error!')), - 'Dispatches project error if some error' - ) - - t.end() -}) - -test('(Saga) handleInput (lfo)', (t) => { - const payload = { - value: 0.555, - inputId: 'lfo' - } - - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'lfo'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'XX', - lfoOptionIds: ['yyy', 'zzz'] - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNodesValues, ['yyy', 'zzz']), - '2 Get Options values (nodes)' - ) - - const optionValues = { - shape: 'sine', - rate: 2, - phase: 0.25 - } - - t.deepEqual( - generator.next(optionValues).value, - call(lfoProcess, 0.555, 'sine', 2, 0.25), - '3. get value after going through first modifier' - ) - - const lfoValue = 0.9 - - t.deepEqual( - generator.next(lfoValue).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 0.9 - } - ], undefined)), - '4. Dispatches batch node update action' - ) - t.deepEqual( - generator.throw({ message: 'Error!' }).value, - put(projectError('Error!')), - 'Dispatches project error if some error' - ) - - t.end() -}) - -test('(Saga) handleInput (shot - noteOn)', (t) => { - const meta = { 'noteOn': true } - const payload = { - value: 0.5, - inputId: 'midi_xxx', - meta - } - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'midi_xxx'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'XX', - nodeType: 'shot' - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'XX'), - '1.1 Get node' - ) - - const node = { - sketchId: 'fooSketch', - method: 'barMethod' - } - - t.deepEqual( - generator.next(node).value, - put(nodeShotFired('XX', 'fooSketch', 'barMethod')), - '4. Dispatches node shot fired action' - ) - - t.deepEqual( - generator.next().value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 0.5 - } - ], meta)), - '5. Dispatches batch node update action' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) - -test('(Saga) handleInput (macro - noteOn)', (t) => { - const meta = { 'noteOn': true } - const payload = { - value: 0.5, - inputId: 'midi_xxx', - meta - } - - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'midi_xxx'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'XX', - nodeType: 'macro' - } - ] - - t.deepEqual( - generator.next(links).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 1 - } - ], meta)), - '5. Dispatches batch node update action with value of 1' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) - -test('(Saga) handleInput (shot - seq-step sequencer - not in sequence)', (t) => { - const payload = { - value: 12, - inputId: 'seq-step' - } - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'seq-step'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'XX', - nodeType: 'shot', - sequencerGridId: 'SEQ01' - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'XX'), - '1.1 Get node' - ) - - const node = { - sketchId: 'fooSketch', - method: 'barMethod' - } - - t.deepEqual( - generator.next(node).value, - select(getNode, 'SEQ01'), - '2 Get node for sequencer grid' - ) - - const seqNode = { - value: [ - 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 // index 12 is "0" - ] - } - - t.equal(generator.next(seqNode).done, true, 'generator ends (doesnt update node)') - - t.end() -}) - -test('(Saga) handleInput (shot - seq-step sequencer - in sequence)', (t) => { - const payload = { - value: 5, - inputId: 'seq-step' - } - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'seq-step'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'XX', - nodeType: 'shot', - sequencerGridId: 'SEQ01' - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'XX'), - '1.1 Get node' - ) - - const node = { - sketchId: 'fooSketch', - method: 'barMethod' - } - - t.deepEqual( - generator.next(node).value, - select(getNode, 'SEQ01'), - '2 Get node for sequencer grid' - ) - - const seqNode = { - value: [ - 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1 // index 5 is "1" - ] - } - - t.deepEqual( - generator.next(seqNode).value, - put(nodeShotFired('XX', 'fooSketch', 'barMethod')), - '4. Dispatches node shot fired action' - ) - - t.equal(generator.next().done, true, 'generator ends (doesnt update node)') - - t.end() -}) - -test('(Saga) handleInput (midi)', (t) => { - const meta = { type: 'midi' } - const payload = { - value: 0.5, - inputId: 'midi_xxx', - meta - } - - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 5 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'midi_xxx'), - '1. Gets assigned links' - ) - - const links = [ - { - nodeId: 'YY', - deviceId: 'D2', - midiOptionIds: ['MIDI1'] - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'YY'), - 'Gets node because matches with current bank' - ) - - const node = { - value: 0.7 - } - - t.deepEqual( - generator.next(node).value, - select(getNodesValues, ['MIDI1']), - 'Get midi option nodes' - ) - - const midiOptionNodes = { - foo: 0.11, - bar: 0.33 - } - - t.deepEqual( - generator.next(midiOptionNodes).value, - call(midiValueProcess, node, 0.5, midiOptionNodes, messageCount), - 'Calls midiValueProcess using nodeValue, midi action value and number of messages' - ) - - const val = 0.75 - - t.deepEqual( - generator.next(val).value, - put(nodeValuesBatchUpdate([ - { - id: 'YY', - value: val - } - ], meta)), - 'Dispatches batch node update action with newly generated value' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) - -test('(Saga) handleInput (shot - audio val is over 0.333, armed)', (t) => { - const meta = { type: 'audio' } - const payload = { - value: 1, - inputId: 'audio_1', - meta - } - - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'audio_1'), - '1. Gets assigned nodes' - ) - - const links = [ - { - id: 'LINK1', - nodeId: 'XX', - nodeType: 'shot', - armed: true - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'XX'), - '1.1 Get node' - ) - - const node = { - sketchId: 'fooSketch', - method: 'barMethod' - } - - t.deepEqual( - generator.next(node).value, - put(nodeShotFired('XX', 'fooSketch', 'barMethod')), - '4. Dispatches input link shot fired action' - ) - - t.deepEqual( - generator.next().value, - put(inputLinkShotDisarm('LINK1')), - '5. Dispatches input link disarm action' - ) - - t.deepEqual( - generator.next(links).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 1 - } - ], meta)), - '6. Dispatches batch node update action' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) - -test('(Saga) handleInput (shot - audio val is over 0.333, disarmed)', (t) => { - const meta = { type: 'audio' } - const payload = { - value: 1, - inputId: 'audio_1', - meta - } - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'audio_1'), - '1. Gets assigned links' - ) - - const links = [ - { - id: 'LINK1', - nodeId: 'XX', - nodeType: 'shot', - armed: false - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'XX'), - '1.1 Get node' - ) - - const node = { - sketchId: 'fooSketch', - method: 'barMethod' - } - - t.deepEqual( - generator.next(node).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 1 - } - ], meta)), - '6. Dispatches batch node update action' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) - -test('(Saga) handleInput (shot - audio val is under 0.333, armed)', (t) => { - const meta = { type: 'audio' } - const payload = { - value: 0.2, - inputId: 'audio_1', - meta - } - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'audio_1'), - '1. Gets assigned nodes' - ) - - const links = [ - { - id: 'LINK1', - nodeId: 'XX', - nodeType: 'shot', - armed: true - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'XX'), - '1.1 Get node' - ) - - const node = { - sketchId: 'fooSketch', - method: 'barMethod' - } - - t.deepEqual( - generator.next(node).value, - put(inputLinkShotArm('LINK1')), - '5. Dispatches input link arm action' - ) - - t.deepEqual( - generator.next(links).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 0.2 - } - ], meta)), - '6. Dispatches batch node update action' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) - -test('(Saga) handleInput (shot - audio val is under 0.333, disarmed)', (t) => { - const meta = { type: 'audio' } - const payload = { - value: 0.2, - inputId: 'audio_1', - meta - } - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'audio_1'), - '1. Gets assigned links' - ) - - const links = [ - { - id: 'LINK1', - nodeId: 'XX', - nodeType: 'shot', - armed: false - } - ] - - t.deepEqual( - generator.next(links).value, - select(getNode, 'XX'), - '1.1 Get node' - ) - - const node = { - sketchId: 'fooSketch', - method: 'barMethod' - } - - t.deepEqual( - generator.next(node).value, - put(inputLinkShotArm('LINK1')), - '5. Dispatches input link arm action' - ) - - t.deepEqual( - generator.next(links).value, - put(nodeValuesBatchUpdate([ - { - id: 'XX', - value: 0.2 - } - ], meta)), - '6. Dispatches node update action' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) - -test('(Saga) handleInput - linkType is "linkableAction"', (t) => { - const meta = { type: 'midi' } - const payload = { - value: 0.4, - inputId: 'midi_xxx', - meta - } - const generator = handleInput({ - payload - }) - - t.deepEqual( - generator.next().value, - call(debounceInput, payload), - '0. Call debounceInput' - ) - - const messageCount = 1 - - t.deepEqual( - generator.next(messageCount).value, - select(getAssignedLinks, 'midi_xxx'), - '1. Gets assigned links' - ) - - const links = [ - { - id: 'LINK1', - nodeId: 'NN', - linkType: 'linkableAction' - } - ] - - t.deepEqual( - generator.next(links).value, - select(getLinkableAction, 'NN'), - '1.1 Get linkableAction' - ) - - const linkableAction = { - action: { foo: 'bar' } - } - - t.deepEqual( - generator.next(linkableAction).value, - put({ foo: 'bar' }), - '6. Dispatch action from linkableAction' - ) - - t.equal(generator.next().done, true, 'generator ends') - - t.end() -}) +// TODO: Convert these over to jest +// test('(Saga) handleInput (no modifiers)', (t) => { +// const payload = { +// value: 0.2, +// inputId: 'audio_0', +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'audio_0'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'XX', +// }, +// { +// nodeId: 'YY', +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.2, +// }, +// { +// id: 'YY', +// value: 0.2, +// }, +// ], undefined)), +// '2. Dispatches batch node update action' +// ) + +// t.deepEqual( +// generator.throw({ message: 'Error!' }).value, +// put(projectError('Error!')), +// 'Dispatches project error if some error' +// ) + +// t.end() +// }) + +// test('(Saga) handleInput (modifiers)', (t) => { +// let modifiedValue, modifierNodes + +// const meta = { +// type: 'audio', +// } + +// const payload = { +// value: 0.2, +// inputId: 'audio_0', +// meta, +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'audio_0'), +// '1. Gets assigned links' +// ) + +// const nodes = [ +// { +// nodeId: 'XX', +// modifierIds: ['yyy', 'zzz', 'aa1', 'aa2'], +// }, +// ] + +// t.deepEqual( +// generator.next(nodes).value, +// select(getNodes, ['yyy', 'zzz', 'aa1', 'aa2']), +// '2.x Get Modifiers (nodes)' +// ) + +// modifierNodes = [ +// { +// id: 'yyy', +// key: 'foo', +// value: 0.5, +// passToNext: false, +// type: 'audio', +// }, +// { +// id: 'zzz', +// key: 'bar', +// passToNext: false, +// value: 0.7, +// }, +// { +// id: 'zzz', +// key: 'bar', +// passToNext: true, +// value: 0.2, +// }, +// { +// id: 'zzz', +// key: 'bar', +// passToNext: false, +// value: 0.3, +// }, +// ] + +// t.deepEqual( +// generator.next(modifierNodes).value, +// call(modifiers.work, 'foo', [0.5], 0.2), +// '2.x get value after going through first modifier' +// ) + +// modifiedValue = 0.1 + +// t.deepEqual( +// generator.next(modifiedValue).value, +// call(modifiers.work, 'bar', [0.7], 0.1), +// '2.x get value after going through second modifier' +// ) + +// modifiedValue = 0.9 + +// t.deepEqual( +// generator.next(modifiedValue).value, +// call(modifiers.work, 'bar', [0.2, 0.3], 0.9), +// '2.x work modifier with multiple values' +// ) + +// modifiedValue = 0.9 + +// t.deepEqual( +// generator.next(modifiedValue).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.9, +// }, +// ], meta)), +// '2. Dispatches batch node update action' +// ) + +// t.deepEqual( +// generator.throw({ message: 'Error!' }).value, +// put(projectError('Error!')), +// 'Dispatches project error if some error' +// ) + +// t.end() +// }) + +// test('(Saga) handleInput (ignore audio type modifiers)', (t) => { +// let modifiedValue, modifierNodes +// const payload = { +// value: 0.2, +// inputId: 'midi_xxx', +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'midi_xxx'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'XX', +// modifierIds: ['yyy', 'zzz'], +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNodes, ['yyy', 'zzz']), +// '2.x Get Modifiers (nodes)' +// ) + +// modifierNodes = [ +// { +// id: 'yyy', +// key: 'foo', +// value: 0.5, +// type: 'audio', +// }, +// { +// id: 'zzz', +// key: 'bar', +// value: 0.7, +// }, +// ] + +// t.deepEqual( +// generator.next(modifierNodes).value, +// call(modifiers.work, 'bar', [0.7], 0.2), +// '2.x ignore first modifier, get second' +// ) + +// modifiedValue = 0.9 + +// t.deepEqual( +// generator.next(modifiedValue).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.9, +// }, +// ], undefined)), +// '2. Dispatches batch node update action' +// ) + +// t.deepEqual( +// generator.throw({ message: 'Error!' }).value, +// put(projectError('Error!')), +// 'Dispatches project error if some error' +// ) + +// t.end() +// }) + +// test('(Saga) handleInput (lfo)', (t) => { +// const payload = { +// value: 0.555, +// inputId: 'lfo', +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'lfo'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'XX', +// lfoOptionIds: ['yyy', 'zzz'], +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNodesValues, ['yyy', 'zzz']), +// '2 Get Options values (nodes)' +// ) + +// const optionValues = { +// shape: 'sine', +// rate: 2, +// phase: 0.25, +// seed: 1, +// } + +// t.deepEqual( +// generator.next(optionValues).value, +// call(lfoProcess, 0.555, 'sine', 2, 0.25, 1), +// '3. get value after going through first modifier' +// ) + +// const lfoValue = 0.9 + +// t.deepEqual( +// generator.next(lfoValue).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.9, +// }, +// ], undefined)), +// '4. Dispatches batch node update action' +// ) +// t.deepEqual( +// generator.throw({ message: 'Error!' }).value, +// put(projectError('Error!')), +// 'Dispatches project error if some error' +// ) + +// t.end() +// }) + +// test('(Saga) handleInput (lfo - noise seed is -1)', (t) => { +// const payload = { +// value: 0.555, +// inputId: 'lfo', +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'lfo'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// id: 'LINK_ID', +// nodeId: 'XX', +// lfoOptionIds: ['yyy', 'zzz'], +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNodesValues, ['yyy', 'zzz']), +// '2 Get Options values (nodes)' +// ) + +// const optionValues = { +// shape: 'noise', +// rate: 2, +// phase: 0.25, +// seed: -1, +// } + +// t.deepEqual( +// generator.next(optionValues).value, +// call(lfoProcess, 0.555, 'noise', 2, 0.25, 'LINK_ID'), +// '3. get value after going through first modifier, noise seed should match ID of link' +// ) + +// const lfoValue = 0.9 + +// t.deepEqual( +// generator.next(lfoValue).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.9, +// }, +// ], undefined)), +// '4. Dispatches batch node update action' +// ) +// t.deepEqual( +// generator.throw({ message: 'Error!' }).value, +// put(projectError('Error!')), +// 'Dispatches project error if some error' +// ) + +// t.end() +// }) + +// test('(Saga) handleInput (shot - noteOn)', (t) => { +// const meta = { 'noteOn': true } +// const payload = { +// value: 0.5, +// inputId: 'midi_xxx', +// meta, +// } +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'midi_xxx'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'XX', +// nodeType: 'shot', +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'XX'), +// '1.1 Get node' +// ) + +// const node = { +// sketchId: 'fooSketch', +// method: 'barMethod', +// } + +// t.deepEqual( +// generator.next(node).value, +// put(nodeShotFired('XX', 'fooSketch', 'barMethod')), +// '4. Dispatches node shot fired action' +// ) + +// t.deepEqual( +// generator.next().value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.5, +// }, +// ], meta)), +// '5. Dispatches batch node update action' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) + +// test('(Saga) handleInput (macro - noteOn)', (t) => { +// const meta = { 'noteOn': true } +// const payload = { +// value: 0.5, +// inputId: 'midi_xxx', +// meta, +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'midi_xxx'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'XX', +// nodeType: 'macro', +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 1, +// }, +// ], meta)), +// '5. Dispatches batch node update action with value of 1' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) + +// test('(Saga) handleInput (shot - seq-step sequencer - not in sequence)', (t) => { +// const payload = { +// value: 12, +// inputId: 'seq-step', +// } +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'seq-step'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'XX', +// nodeType: 'shot', +// sequencerGridId: 'SEQ01', +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'XX'), +// '1.1 Get node' +// ) + +// const node = { +// sketchId: 'fooSketch', +// method: 'barMethod', +// } + +// t.deepEqual( +// generator.next(node).value, +// select(getNode, 'SEQ01'), +// '2 Get node for sequencer grid' +// ) + +// const seqNode = { +// value: [ +// 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, // index 12 is "0" +// ], +// } + +// t.equal(generator.next(seqNode).done, true, 'generator ends (doesnt update node)') + +// t.end() +// }) + +// test('(Saga) handleInput (shot - seq-step sequencer - in sequence)', (t) => { +// const payload = { +// value: 5, +// inputId: 'seq-step', +// } +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'seq-step'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'XX', +// nodeType: 'shot', +// sequencerGridId: 'SEQ01', +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'XX'), +// '1.1 Get node' +// ) + +// const node = { +// sketchId: 'fooSketch', +// method: 'barMethod', +// } + +// t.deepEqual( +// generator.next(node).value, +// select(getNode, 'SEQ01'), +// '2 Get node for sequencer grid' +// ) + +// const seqNode = { +// value: [ +// 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, // index 5 is "1" +// ], +// } + +// t.deepEqual( +// generator.next(seqNode).value, +// put(nodeShotFired('XX', 'fooSketch', 'barMethod')), +// '4. Dispatches node shot fired action' +// ) + +// t.equal(generator.next().done, true, 'generator ends (doesnt update node)') + +// t.end() +// }) + +// test('(Saga) handleInput (midi)', (t) => { +// const meta = { type: 'midi' } +// const payload = { +// value: 0.5, +// inputId: 'midi_xxx', +// meta, +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 5 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'midi_xxx'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// nodeId: 'YY', +// deviceId: 'D2', +// midiOptionIds: ['MIDI1'], +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'YY'), +// 'Gets node because matches with current bank' +// ) + +// const node = { +// value: 0.7, +// } + +// t.deepEqual( +// generator.next(node).value, +// select(getNodesValues, ['MIDI1']), +// 'Get midi option nodes' +// ) + +// const midiOptionNodes = { +// foo: 0.11, +// bar: 0.33, +// } + +// t.deepEqual( +// generator.next(midiOptionNodes).value, +// call(midiValueProcess, node, 0.5, midiOptionNodes, messageCount), +// 'Calls midiValueProcess using nodeValue, midi action value and number of messages' +// ) + +// const val = 0.75 + +// t.deepEqual( +// generator.next(val).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'YY', +// value: val, +// }, +// ], meta)), +// 'Dispatches batch node update action with newly generated value' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) + +// test('(Saga) handleInput (shot - audio val is over 0.333, armed)', (t) => { +// const meta = { type: 'audio' } +// const payload = { +// value: 1, +// inputId: 'audio_1', +// meta, +// } + +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'audio_1'), +// '1. Gets assigned nodes' +// ) + +// const links = [ +// { +// id: 'LINK1', +// nodeId: 'XX', +// nodeType: 'shot', +// armed: true, +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'XX'), +// '1.1 Get node' +// ) + +// const node = { +// sketchId: 'fooSketch', +// method: 'barMethod', +// } + +// t.deepEqual( +// generator.next(node).value, +// put(nodeShotFired('XX', 'fooSketch', 'barMethod')), +// '4. Dispatches input link shot fired action' +// ) + +// t.deepEqual( +// generator.next().value, +// put(inputLinkShotDisarm('LINK1')), +// '5. Dispatches input link disarm action' +// ) + +// t.deepEqual( +// generator.next(links).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 1, +// }, +// ], meta)), +// '6. Dispatches batch node update action' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) + +// test('(Saga) handleInput (shot - audio val is over 0.333, disarmed)', (t) => { +// const meta = { type: 'audio' } +// const payload = { +// value: 1, +// inputId: 'audio_1', +// meta, +// } +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'audio_1'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// id: 'LINK1', +// nodeId: 'XX', +// nodeType: 'shot', +// armed: false, +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'XX'), +// '1.1 Get node' +// ) + +// const node = { +// sketchId: 'fooSketch', +// method: 'barMethod', +// } + +// t.deepEqual( +// generator.next(node).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 1, +// }, +// ], meta)), +// '6. Dispatches batch node update action' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) + +// test('(Saga) handleInput (shot - audio val is under 0.333, armed)', (t) => { +// const meta = { type: 'audio' } +// const payload = { +// value: 0.2, +// inputId: 'audio_1', +// meta, +// } +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'audio_1'), +// '1. Gets assigned nodes' +// ) + +// const links = [ +// { +// id: 'LINK1', +// nodeId: 'XX', +// nodeType: 'shot', +// armed: true, +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'XX'), +// '1.1 Get node' +// ) + +// const node = { +// sketchId: 'fooSketch', +// method: 'barMethod', +// } + +// t.deepEqual( +// generator.next(node).value, +// put(inputLinkShotArm('LINK1')), +// '5. Dispatches input link arm action' +// ) + +// t.deepEqual( +// generator.next(links).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.2, +// }, +// ], meta)), +// '6. Dispatches batch node update action' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) + +// test('(Saga) handleInput (shot - audio val is under 0.333, disarmed)', (t) => { +// const meta = { type: 'audio' } +// const payload = { +// value: 0.2, +// inputId: 'audio_1', +// meta, +// } +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'audio_1'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// id: 'LINK1', +// nodeId: 'XX', +// nodeType: 'shot', +// armed: false, +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getNode, 'XX'), +// '1.1 Get node' +// ) + +// const node = { +// sketchId: 'fooSketch', +// method: 'barMethod', +// } + +// t.deepEqual( +// generator.next(node).value, +// put(inputLinkShotArm('LINK1')), +// '5. Dispatches input link arm action' +// ) + +// t.deepEqual( +// generator.next(links).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'XX', +// value: 0.2, +// }, +// ], meta)), +// '6. Dispatches node update action' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) + +// test('(Saga) handleInput - linkType is "linkableAction"', (t) => { +// const meta = { type: 'midi' } +// const payload = { +// value: 0.4, +// inputId: 'midi_xxx', +// meta, +// } +// const generator = handleInput({ +// payload, +// }) + +// t.deepEqual( +// generator.next().value, +// call(debounceInput, payload), +// '0. Call debounceInput' +// ) + +// const messageCount = 1 + +// t.deepEqual( +// generator.next(messageCount).value, +// select(getAssignedLinks, 'midi_xxx'), +// '1. Gets assigned links' +// ) + +// const links = [ +// { +// id: 'LINK1', +// nodeId: 'NN', +// linkType: 'linkableAction', +// }, +// ] + +// t.deepEqual( +// generator.next(links).value, +// select(getLinkableAction, 'NN'), +// '1.1 Get linkableAction' +// ) + +// const linkableAction = { +// action: { foo: 'bar' }, +// } + +// t.deepEqual( +// generator.next(linkableAction).value, +// put({ foo: 'bar' }), +// '6. Dispatch action from linkableAction' +// ) + +// t.equal(generator.next().done, true, 'generator ends') + +// t.end() +// }) diff --git a/src/store/inputs/_test/selectors.spec.js b/src/store/inputs/_test/selectors.spec.js index 5f3bfc85..b455de48 100644 --- a/src/store/inputs/_test/selectors.spec.js +++ b/src/store/inputs/_test/selectors.spec.js @@ -6,32 +6,30 @@ test('(Selector) inputs - getAssignedLinks', (t) => { const state = { inputs: { audio_0: { - assignedLinkIds: ['XX', 'YY', 'ZZ'] - } + assignedLinkIds: ['XX', 'YY', 'ZZ'], + }, }, nodes: { + XX: { nodeId: 'nx' }, + YY: { nodeId: 'ny' }, + ZZ: { nodeId: 'nz' }, nx: { - activeInputLinkId: 'XX' + activeInputLinkId: 'XX', }, ny: { - activeInputLinkId: 'YY' + activeInputLinkId: 'YY', }, nz: { - activeInputLinkId: 'ZZ' - } + activeInputLinkId: 'ZZ', + }, }, - inputLinks: { - XX: { nodeId: 'nx' }, - YY: { nodeId: 'ny' }, - ZZ: { nodeId: 'nz' } - } } deepFreeze(state) const expected = [ { nodeId: 'nx' }, { nodeId: 'ny' }, - { nodeId: 'nz' } + { nodeId: 'nz' }, ] const actual = getAssignedLinks(state, 'audio_0') @@ -44,25 +42,23 @@ test('(Selector) inputs - getAssignedLinks - input doesnt exist', (t) => { const state = { inputs: { foo_input: { - assignedLinkIds: ['XX', 'YY', 'ZZ'] - } + assignedLinkIds: ['XX', 'YY', 'ZZ'], + }, }, nodes: { nx: { - activeInputLinkId: 'XX' + activeInputLinkId: 'XX', }, ny: { - activeInputLinkId: 'YY' + activeInputLinkId: 'YY', }, nz: { - activeInputLinkId: 'ZZ' - } - }, - inputLinks: { + activeInputLinkId: 'ZZ', + }, XX: { nodeId: 'nx' }, YY: { nodeId: 'ny' }, - ZZ: { nodeId: 'nz' } - } + ZZ: { nodeId: 'nz' }, + }, } deepFreeze(state) @@ -78,31 +74,29 @@ test('(Selector) inputs - getAssignedLinks - one input link isnt active', (t) => const state = { inputs: { foo_input: { - assignedLinkIds: ['XX', 'YY', 'ZZ'] - } + assignedLinkIds: ['XX', 'YY', 'ZZ'], + }, }, nodes: { nx: { - activeInputLinkId: 'XX' + activeInputLinkId: 'XX', }, ny: { - activeInputLinkId: 'YY' + activeInputLinkId: 'YY', }, nz: { - activeInputLinkId: '@@' - } - }, - inputLinks: { + activeInputLinkId: '@@', + }, XX: { nodeId: 'nx' }, YY: { nodeId: 'ny' }, - ZZ: { nodeId: 'nz' } - } + ZZ: { nodeId: 'nz' }, + }, } deepFreeze(state) const expected = [ { nodeId: 'nx' }, - { nodeId: 'ny' } + { nodeId: 'ny' }, ] const actual = getAssignedLinks(state, 'foo_input') @@ -115,26 +109,24 @@ test('(Selector) inputs - getAssignedLinks - link type midi', (t) => { const state = { inputs: { foo_input: { - assignedLinkIds: ['XX', 'YY'] - } + assignedLinkIds: ['XX', 'YY'], + }, }, nodes: { nx: { - activeInputLinkId: undefined + activeInputLinkId: undefined, }, ny: { - activeInputLinkId: undefined - } - }, - inputLinks: { + activeInputLinkId: undefined, + }, XX: { nodeId: 'nx', input: { - type: 'midi' - } + type: 'midi', + }, }, - YY: { nodeId: 'ny' } - } + YY: { nodeId: 'ny' }, + }, } deepFreeze(state) @@ -142,9 +134,9 @@ test('(Selector) inputs - getAssignedLinks - link type midi', (t) => { { nodeId: 'nx', input: { - type: 'midi' - } - } + type: 'midi', + }, + }, ] const actual = getAssignedLinks(state, 'foo_input') @@ -157,134 +149,35 @@ test('(Selector) inputs - getAssignedLinks - link type midi', (t) => { const state = { inputs: { foo_input: { - assignedLinkIds: ['XX', 'YY'] - } + assignedLinkIds: ['XX', 'YY'], + }, }, nodes: { nx: { - activeInputLinkId: undefined + activeInputLinkId: undefined, }, ny: { - activeInputLinkId: undefined - } - }, - inputLinks: { + activeInputLinkId: undefined, + }, XX: { nodeId: 'nx' }, YY: { nodeId: '@@', - linkType: 'linkableAction' - } - } - } - deepFreeze(state) - - const expected = [ - { - nodeId: '@@', - linkType: 'linkableAction' - } - ] - - const actual = getAssignedLinks(state, 'foo_input') - - t.deepEqual(actual, expected, 'Always returns input link with linkType of linkableAction, even if inactive') - t.end() -}) - -test('(Selector) inputs - getAssignedLinks - link has device Id and bank index (doesnt match current)', (t) => { - const state = { - inputs: { - foo_input: { - assignedLinkIds: ['XX', 'YY'], - deviceId: 'DEVICE_1' - } - }, - midi: { - devices: { - DEVICE_1: { - bankIndex: 1 - } - } - }, - nodes: { - nx: { - activeInputLinkId: 'XX' - }, - ny: { - activeInputLinkId: 'YY' - } - }, - inputLinks: { - XX: { - nodeId: 'nx', - deviceId: 'DEVICE_1', - bankIndex: 2 - }, - YY: { nodeId: 'ny' } - } - } - deepFreeze(state) - - const expected = [ - { - nodeId: 'ny' - } - ] - - const actual = getAssignedLinks(state, 'foo_input') - - t.deepEqual(actual, expected, 'Doesnt return one of the links because bankIndex doesnt match') - t.end() -}) - -test('(Selector) inputs - getAssignedLinks - link has device Id and bank index (does match current)', (t) => { - const state = { - inputs: { - foo_input: { - assignedLinkIds: ['XX', 'YY'], - deviceId: 'DEVICE_1' - } - }, - midi: { - devices: { - DEVICE_1: { - bankIndex: 1 - } - } - }, - nodes: { - nx: { - activeInputLinkId: 'XX' + linkType: 'linkableAction', }, - ny: { - activeInputLinkId: 'YY' - } }, - inputLinks: { - XX: { - nodeId: 'nx', - deviceId: 'DEVICE_1', - bankIndex: 1 - }, - YY: { nodeId: 'ny' } - } } deepFreeze(state) const expected = [ { - nodeId: 'nx', - deviceId: 'DEVICE_1', - bankIndex: 1 + nodeId: '@@', + linkType: 'linkableAction', }, - { - nodeId: 'ny' - } ] const actual = getAssignedLinks(state, 'foo_input') - t.deepEqual(actual, expected, 'Doesnt return one of the links because bankIndex doesnt match') + t.deepEqual(actual, expected, 'Always returns input link with linkType of linkableAction, even if inactive') t.end() }) @@ -292,10 +185,10 @@ test('(Selector) inputs - getAssignedLinks - inputLinks dont exist', (t) => { const state = { inputs: { audio_0: { - assignedLinkIds: ['XX', 'YY', 'ZZ'] - } + assignedLinkIds: ['XX', 'YY', 'ZZ'], + }, }, - inputLinks: {} + inputLinks: {}, } t.throws(getAssignedLinks.bind(null, state, 'audio_0'), Error, 'Throws an error') diff --git a/src/store/inputs/actions.js b/src/store/inputs/actions.js index 38b2c72a..2da25ed3 100644 --- a/src/store/inputs/actions.js +++ b/src/store/inputs/actions.js @@ -1,27 +1,27 @@ export function inputFired (inputId, value, meta) { return { type: 'INPUT_FIRED', - payload: { inputId, value, meta } + payload: { inputId, value, meta }, } } export function inputsReplaceAll (inputs) { return { type: 'INPUTS_REPLACE_ALL', - payload: { inputs } + payload: { inputs }, } } -export function inputAssignedLinkCreate (inputId, linkId, deviceId) { +export function inputAssignedLinkCreate (inputId, linkId) { return { type: 'INPUT_ASSIGNED_LINK_CREATE', - payload: { inputId, linkId, deviceId } + payload: { inputId, linkId }, } } export function inputAssignedLinkDelete (inputId, linkId) { return { type: 'INPUT_ASSIGNED_LINK_DELETE', - payload: { inputId, linkId } + payload: { inputId, linkId }, } } diff --git a/src/store/inputs/reducer.js b/src/store/inputs/reducer.js index ba3cb2b6..9548b8b6 100644 --- a/src/store/inputs/reducer.js +++ b/src/store/inputs/reducer.js @@ -1,24 +1,12 @@ const defaultState = { - audio_0: { - value: 0, - assignedLinkIds: [] - }, - audio_1: { - value: 0, - assignedLinkIds: [] - }, - audio_2: { - value: 0, - assignedLinkIds: [] - }, - audio_3: { - value: 0, - assignedLinkIds: [] + audio: { + value: [0, 0, 0, 0], + assignedLinkIds: [], }, lfo: { value: 0, - assignedLinkIds: [] - } + assignedLinkIds: [], + }, } const inputsReducer = (state = defaultState, action) => { @@ -42,16 +30,14 @@ const inputsReducer = (state = defaultState, action) => { [p.inputId]: { ...state[p.inputId], assignedLinkIds: [...state[p.inputId].assignedLinkIds, p.linkId], - deviceId: p.deviceId - } + }, } } else { return { ...state, [p.inputId]: { assignedLinkIds: [p.linkId], - deviceId: p.deviceId - } + }, } } } @@ -61,8 +47,8 @@ const inputsReducer = (state = defaultState, action) => { [p.inputId]: { ...state[p.inputId], assignedLinkIds: state[p.inputId].assignedLinkIds - .filter((id) => id !== p.linkId) - } + .filter((id) => id !== p.linkId), + }, } } default: diff --git a/src/store/inputs/sagas.js b/src/store/inputs/sagas.js index 1d4076cb..8534a0b6 100644 --- a/src/store/inputs/sagas.js +++ b/src/store/inputs/sagas.js @@ -1,11 +1,9 @@ import { select, takeEvery, put, call } from 'redux-saga/effects' import { getAssignedLinks } from './selectors' -import { nodeValuesBatchUpdate, nodeShotFired } from '../nodes/actions' -import { inputLinkShotDisarm, inputLinkShotArm } from '../inputLinks/actions' +import { nodeValuesBatchUpdate, nodeShotFired, rNodeInputLinkShotDisarm, rNodeInputLinkShotArm } from '../nodes/actions' import { projectError } from '../project/actions' import getNodes from '../../selectors/getNodes' import getNode from '../../selectors/getNode' -import getLinkableAction from '../../selectors/getLinkableAction' import getNodesValues from '../../selectors/getNodesValues' import lfoProcess from '../../utils/lfoProcess' import midiValueProcess from '../../utils/midiValueProcess' @@ -23,25 +21,29 @@ export function* handleInput (action) { for (let i = 0; i < links.length; i++) { let skip + const linkNode = yield select(getNode, links[i].nodeId) - if (links[i].linkType === 'linkableAction') { - const linkableAction = yield select(getLinkableAction, links[i].nodeId) - yield put(linkableAction.action) + if (linkNode.type === 'linkableAction') { + yield put(linkNode.action) } else { let value = p.value let modifiers if (inputType === 'midi') { - const currNode = yield select(getNode, links[i].nodeId) - let midiValue = value - value = currNode.value + value = linkNode.value const options = yield select(getNodesValues, links[i].midiOptionIds) - value = yield call(midiValueProcess, currNode, midiValue, options, messageCount) + value = yield call(midiValueProcess, linkNode, midiValue, options, messageCount) } if (p.inputId === 'lfo') { let o = yield select(getNodesValues, links[i].lfoOptionIds) - value = yield call(lfoProcess, value, o.shape, o.rate, o.phase) + const seed = o.seed === -1 ? links[i].id : o.seed + value = yield call(lfoProcess, value, o.shape, o.rate, o.phase, seed) + } + + if (p.inputId === 'audio') { + const o = yield select(getNodesValues, links[i].audioOptionIds) + value = p.value[o.audioBand] } if (links[i].modifierIds && links[i].modifierIds.length) { @@ -62,22 +64,19 @@ export function* handleInput (action) { switch (links[i].nodeType) { case 'shot': { - const nodeId = links[i].nodeId - const node = yield select(getNode, nodeId) - if (p.meta && p.meta.noteOn) { - yield put(nodeShotFired(nodeId, node.sketchId, node.method)) + yield put(nodeShotFired(links[i].nodeId, linkNode.sketchId, linkNode.method)) } else if (p.inputId === 'seq-step') { const seqNode = yield select(getNode, links[i].sequencerGridId) if (seqNode.value[value] === 1) { - yield put(nodeShotFired(nodeId, node.sketchId, node.method)) + yield put(nodeShotFired(links[i].nodeId, linkNode.sketchId, linkNode.method)) } skip = true } else if (value > 0.333 && links[i].armed) { - yield put(nodeShotFired(nodeId, node.sketchId, node.method)) - yield put(inputLinkShotDisarm(links[i].id)) + yield put(nodeShotFired(links[i].nodeId, linkNode.sketchId, linkNode.method)) + yield put(rNodeInputLinkShotDisarm(links[i].id)) } else if (value < 0.333) { - yield put(inputLinkShotArm(links[i].id)) + yield put(rNodeInputLinkShotArm(links[i].id)) } break } @@ -91,7 +90,7 @@ export function* handleInput (action) { if (!skip) { values.push({ id: links[i].nodeId, - value + value, }) } } diff --git a/src/store/inputs/selectors.js b/src/store/inputs/selectors.js index 8aa8a1d5..48c7e746 100644 --- a/src/store/inputs/selectors.js +++ b/src/store/inputs/selectors.js @@ -1,24 +1,13 @@ -import getCurrentBankIndex from '../../selectors/getCurrentBankIndex' - export const getAssignedLinks = (state, inputId) => { let arr = [] - let currBankIndex const input = state.inputs[inputId] const ids = input && input.assignedLinkIds if (!ids || ids.length === 0) return arr - const deviceId = input && input.deviceId - - if (deviceId) { - currBankIndex = getCurrentBankIndex(state, deviceId) - } - for (let i = 0; i < ids.length; i++) { const id = ids[i] - const link = state.inputLinks[id] + const link = state.nodes[id] const node = state.nodes[link.nodeId] - const matchedBankIndex = - link.bankIndex === undefined || link.bankIndex === currBankIndex const isActive = link.linkType === 'linkableAction' || @@ -29,7 +18,7 @@ export const getAssignedLinks = (state, inputId) => { throw (new Error(`getAssignedLinks: Missing assigned link for input ${inputId}: ${id}`)) } - if (matchedBankIndex && isActive) { + if (isActive) { arr.push(link) } } diff --git a/src/store/linkableActions/actions.js b/src/store/linkableActions/actions.js deleted file mode 100644 index 80e698d1..00000000 --- a/src/store/linkableActions/actions.js +++ /dev/null @@ -1,34 +0,0 @@ -export function linkableActionCreate (id, action) { - return { - type: 'LINKABLE_ACTION_CREATE', - payload: { id, action } - } -} - -export function linkableActionDelete (id) { - return { - type: 'LINKABLE_ACTION_DELETE', - payload: { id } - } -} - -export function rLinkableActionDelete (id) { - return { - type: 'R_LINKABLE_ACTION_DELETE', - payload: { id } - } -} - -export function linkableActionInputLinkAdd (id, linkId) { - return { - type: 'LINKABLE_ACTION_INPUT_LINK_ADD', - payload: { id, linkId } - } -} - -export function linkableActionInputLinkRemove (id, linkId) { - return { - type: 'LINKABLE_ACTION_INPUT_LINK_REMOVE', - payload: { id, linkId } - } -} diff --git a/src/store/linkableActions/listener.js b/src/store/linkableActions/listener.js deleted file mode 100644 index a7a2980b..00000000 --- a/src/store/linkableActions/listener.js +++ /dev/null @@ -1,22 +0,0 @@ -import { rLinkableActionDelete } from './actions' -import { uInputLinkDelete } from '../inputLinks/actions' -import getLinkableAction from '../../selectors/getLinkableAction' - -const handleDelete = (action, store) => { - const state = store.getState() - const p = action.payload - const linkableAction = getLinkableAction(state, p.id) - linkableAction.inputLinkIds.forEach(id => { - store.dispatch(uInputLinkDelete(id)) - }) - - store.dispatch(rLinkableActionDelete(p.id)) -} - -export default (action, store) => { - switch (action.type) { - case 'LINKABLE_ACTION_DELETE': - handleDelete(action, store) - break - } -} diff --git a/src/store/linkableActions/reducer.js b/src/store/linkableActions/reducer.js deleted file mode 100644 index 8f7822ec..00000000 --- a/src/store/linkableActions/reducer.js +++ /dev/null @@ -1,45 +0,0 @@ -const defaultState = {} -import _ from 'lodash' - -const linkableActionsReducer = (state = defaultState, action) => { - const p = action.payload - - switch (action.type) { - case 'LINKABLE_ACTION_CREATE': { - return { - ...state, - [p.id]: { - id: p.id, - action: p.action, - inputLinkIds: [] - } - } - } - case 'R_LINKABLE_ACTION_DELETE': { - return _.omit(state, [p.id]) - } - case 'LINKABLE_ACTION_INPUT_LINK_ADD': { - return { - ...state, - [p.id]: { - ...state[p.id], - inputLinkIds: [...state[p.id].inputLinkIds, p.linkId] - } - } - } - case 'LINKABLE_ACTION_INPUT_LINK_REMOVE': { - return { - ...state, - [p.id]: { - ...state[p.id], - inputLinkIds: state[p.id].inputLinkIds - .filter((id) => id !== p.linkId) - } - } - } - default: - return state - } -} - -export default linkableActionsReducer diff --git a/src/store/macros/_test/reducer.spec.js b/src/store/macros/_test/reducer.spec.js index 6089672e..6f74f2d1 100644 --- a/src/store/macros/_test/reducer.spec.js +++ b/src/store/macros/_test/reducer.spec.js @@ -1,44 +1,7 @@ -import test from 'tape' -import deepFreeze from 'deep-freeze' +// import test from 'tape' +// import deepFreeze from 'deep-freeze' import macroReducer from '../reducer' import { returnsPreviousState } from '../../../testUtils' -import * as a from '../actions' +// import * as a from '../actions' returnsPreviousState(macroReducer) - -test('(Reducer) macroReducer - Adds macro on rMacroCreate()', (t) => { - let originalState, expectedState, actualState - - originalState = { - items: { - '01': { - id: '01', - nodeId: 'xxx', - targetParamLinks: [] - } - } - } - - deepFreeze(originalState) - - expectedState = { - items: { - '01': { - id: '01', - nodeId: 'xxx', - targetParamLinks: [] - }, - '02': { - id: '02', - nodeId: 'yyy', - targetParamLinks: [] - } - } - } - - actualState = macroReducer(originalState, a.rMacroCreate('02', 'yyy')) - - t.deepEqual(actualState, expectedState) - - t.end() -}) diff --git a/src/store/macros/_test/sagas.spec.js b/src/store/macros/_test/sagas.spec.js index 651cc781..97ea556e 100644 --- a/src/store/macros/_test/sagas.spec.js +++ b/src/store/macros/_test/sagas.spec.js @@ -1,1060 +1,1060 @@ -import 'babel-polyfill' -import test from 'tape' -import getNode from '../../../selectors/getNode' -import getMacro from '../../../selectors/getMacro' -import { shouldItLearn } from '../utils' -import getMacroTargetParamLink from '../../../selectors/getMacroTargetParamLink' -import getMacroLearningId from '../../../selectors/getMacroLearningId' -import getMacroLastId from '../../../selectors/getMacroLastId' -import macroInterpolate from '../../../utils/macroInterpolate' -import isInputTypeHuman from '../../../utils/isInputTypeHuman' -import { select, put, call } from 'redux-saga/effects' -import { - rNodeCreate, nodeValueUpdate, rNodeConnectedMacroAdd, - nodeValuesBatchUpdate -} from '../../nodes/actions' -import { - rMacroTargetParamLinkUpdateStartValue, rMacroUpdateLastId, rMacroOpenToggle, - uMacroCreate, rMacroCreate, uMacroTargetParamLinkAdd, rMacroTargetParamLinkCreate -} from '../actions' -import { uiEditingOpen } from '../../ui/actions' -import { - macroCreate, macroTargetParamLinkAdd, macroProcess, handleNodeValueUpdate, - macroLearnFromParam, handleNodeValueBatchUpdate -} from '../sagas' -import uid from 'uid' - -test('(Saga) macroLearnFromParam (link doesnt exist)', (t) => { - const paramId = 'XXX' - const newVal = 0.5 - const action = nodeValueUpdate(paramId, newVal) - const macroId = 'LEARNINGID' - - const generator = macroLearnFromParam(action.payload, macroId) - - t.deepEqual( - generator.next().value, - select(getMacroTargetParamLink, macroId, paramId), - '0. Check for link' - ) - - let link - - t.deepEqual( - generator.next(link).value, - call(macroTargetParamLinkAdd, uMacroTargetParamLinkAdd(macroId, paramId)), - '1. Create new macro link' - ) - - t.deepEqual( - generator.next().value, - select(getMacroTargetParamLink, macroId, paramId), - '2. Get new link' - ) - - link = { - id: 'LINKID', - nodeId: 'NODEID' - } - - t.deepEqual( - generator.next(link).value, - put(nodeValueUpdate('NODEID', newVal)), - '1. Dispatch action to update link value' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test('(Saga) macroLearnFromParam (link does exist)', (t) => { - const paramId = 'XXX' - const newVal = 0.5 - const action = nodeValueUpdate(paramId, newVal) - const macroId = 'LEARNINGID' - - const generator = macroLearnFromParam(action.payload, macroId) - - t.deepEqual( - generator.next().value, - select(getMacroTargetParamLink, macroId, paramId), - '0. Check for link' - ) - - const link = { - id: 'LINKID', - nodeId: 'NODEID' - } - - t.deepEqual( - generator.next(link).value, - put(nodeValueUpdate('NODEID', newVal)), - '1. Dispatch action to update link value' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test(`(Saga) handleNodeValueUpdate (does nothing if node type isn't macro and sender isn't human)`, (t) => { - const nodeId = 'XXX' - const newVal = 0.5 - const action = nodeValueUpdate(nodeId, newVal, { type: 'alien' }) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next(isHuman).value, - select(getNode, 'XXX'), - '0. Get node' - ) - - const node = { - type: '@@@' - } - - t.deepEqual( - generator.next(node).value, - call(isInputTypeHuman, 'alien'), - '0. Check if input type is human' - ) - - const isHuman = false - - t.equal(generator.next(isHuman).done, true, 'Generator ends') - t.end() -}) - -test(`(Saga) handleNodeValueUpdate - (does nothing if node type isnt a macro AND is human AND it shouldnt learn - AND it doesnt have any connectedMacroIds)`, (t) => { - const nodeId = 'XXX' - const newVal = 0.5 - const action = nodeValueUpdate(nodeId, newVal) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next().value, - select(getNode, 'XXX'), - '0. Get node' - ) - - const node = { - type: 'foo', - connectedMacroIds: [] - } - - t.deepEqual( - generator.next(node).value, - call(isInputTypeHuman, undefined), - '0. Check if input type is human' - ) - - const isHuman = true - - t.deepEqual( - generator.next(isHuman).value, - select(getMacroLearningId), - '1. Check macro learning Id' - ) - - const id = true - - t.deepEqual( - generator.next(id).value, - call(shouldItLearn, id, node, action.payload), - '2. Check if node should learn' - ) - - const learn = false - - t.equal(generator.next(learn).done, true, 'Generator ends') - t.end() -}) - -test(`(Saga) handleNodeValueUpdate (does nothing if input is from a macro and node type is macro)`, (t) => { - const nodeId = 'XXX' - const newVal = 0.5 - const action = nodeValueUpdate(nodeId, newVal, { type: 'macro' }) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next().value, - select(getNode, 'XXX'), - '0. Get node' - ) - - const node = { - type: 'macro' - } - - t.equal(generator.next(node).done, true, 'Generator ends') - t.end() -}) - -test('(Saga) handleNodeValueUpdate (call macroProcess if node is macro)', (t) => { - const nodeId = 'XXX' - const newVal = 0.5 - const action = nodeValueUpdate(nodeId, newVal) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next().value, - select(getNode, 'XXX'), - '0. Get node' - ) - - const node = { - type: 'macro' - } - - t.deepEqual( - generator.next(node).value, - call(macroProcess, action.payload, node), - '2. Call macroProcess, passing in action payload and node' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test(`(Saga) handleNodeValueUpdate -(Reset macro and start values and ALL links for connected macros if has connectedMacroIds)`, (t) => { - const paramId = 'PARAMID' - const newVal = 0.5 - const action = nodeValueUpdate(paramId, newVal) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next().value, - select(getNode, paramId), - '0. Get node' - ) - - const node = { - type: 'foo', - connectedMacroIds: ['macro01', 'macro02'] - } - - t.deepEqual( - generator.next(node).value, - call(isInputTypeHuman, undefined), - '0. Check if input type is human' - ) - - const isHuman = true - - t.deepEqual( - generator.next(isHuman).value, - select(getMacroLearningId), - '1. Check macro learning Id' - ) - - const id = true - - t.deepEqual( - generator.next(id).value, - call(shouldItLearn, id, node, action.payload), - '2. Check if node should learn' - ) - - const learn = false - - t.deepEqual( - generator.next(learn).value, - select(getMacro, 'macro01'), - '3.0 Get macro' - ) - - const macro = { - nodeId: 'n1', - targetParamLinks: { - foo: { - startValue: 0.5 - }, - bar: { - startValue: 0.1 - } - } - } - - t.deepEqual( - generator.next(macro).value, - select(getNode, 'n1'), - '4.0 Get node' - ) - - const macroNode = { - value: 0.5 - } - - t.deepEqual( - generator.next(macroNode).value, - put(rMacroTargetParamLinkUpdateStartValue('macro01', 'foo', false)), - '5.1 Reset macro link' - ) - - t.deepEqual( - generator.next(macro).value, - put(rMacroTargetParamLinkUpdateStartValue('macro01', 'bar', false)), - '5.2 Reset macro link' - ) - - t.deepEqual( - generator.next().value, - put(nodeValueUpdate('n1', false, { type: 'macro' })), - '4.2 Reset macro node with "false" and meta type: macro to stop it from processing the macro' - ) - - t.deepEqual( - generator.next(learn).value, - select(getMacro, 'macro02'), - '6.0 Get macro' - ) - - const macro2 = { - nodeId: 'n2', - targetParamLinks: { - lorem: { - startValue: 0.1 - } - } - } - - t.deepEqual( - generator.next(macro2).value, - select(getNode, 'n2'), - '6.0 Get node' - ) - - const macroNode2 = { - value: 0.2 - } - - t.deepEqual( - generator.next(macroNode2).value, - put(rMacroTargetParamLinkUpdateStartValue('macro02', 'lorem', false)), - '4.1 Reset macro link' - ) - - t.deepEqual( - generator.next().value, - put(nodeValueUpdate('n2', false, { type: 'macro' })), - '4.2 Reset macro node with "false" and meta type: macro to stop it from processing the macro' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test(`(Saga) handleNodeValueUpdate -(Reset macro and start values and ALL links -for connected macros if has connectedMacroIds, -when action called via another macro, -except for the macro being called)`, (t) => { - const paramId = 'PARAMID' - const newVal = 0.5 - const action = nodeValueUpdate(paramId, newVal, { type: 'macro', macroId: 'macro01' }) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next().value, - select(getNode, paramId), - '0. Get node' - ) - - const node = { - type: 'foo', - connectedMacroIds: ['macro01', 'macro02'] - } - - t.deepEqual( - generator.next(node).value, - call(isInputTypeHuman, 'macro'), - '0. Check if input type is human' - ) - - const isHuman = true - - t.deepEqual( - generator.next(isHuman).value, - select(getMacroLearningId), - '1. Check macro learning Id' - ) - - const id = true - - t.deepEqual( - generator.next(id).value, - call(shouldItLearn, id, node, action.payload), - '2. Check if node should learn' - ) - - const learn = false - - t.deepEqual( - generator.next(learn).value, - select(getMacro, 'macro02'), - '4.0 Get macro' - ) - - const macro2 = { - nodeId: 'n2', - targetParamLinks: { - lorem: { - startValue: 0.5 - } - } - } - - t.deepEqual( - generator.next(macro2).value, - select(getNode, 'n2'), - '6.0 Get node' - ) - - const macroNode2 = { - value: 0.2 - } - - t.deepEqual( - generator.next(macroNode2).value, - put(rMacroTargetParamLinkUpdateStartValue('macro02', 'lorem', false)), - '4.1 Reset macro link' - ) - - t.deepEqual( - generator.next().value, - put(nodeValueUpdate('n2', false, { type: 'macro' })), - '4.2 Reset macro node, meta type: macro to stop it from processing the macro' - ) - - t.equal(generator.next().done, true, 'Generator ends (dont reset macro)') - t.end() -}) - -test(`(Saga) handleNodeValueUpdate -(Dont Reset macro or start values for links if macro node -is already set to false, as this signifies it has already been reset)`, (t) => { - const paramId = 'PARAMID' - const newVal = 0.5 - const action = nodeValueUpdate(paramId, newVal, { type: 'macro', macroId: 'macro01' }) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next().value, - select(getNode, paramId), - '0. Get node' - ) - - const node = { - type: 'foo', - connectedMacroIds: ['macro05'] - } - - t.deepEqual( - generator.next(node).value, - call(isInputTypeHuman, 'macro'), - '0. Check if input type is human' - ) - - const isHuman = true - - t.deepEqual( - generator.next(isHuman).value, - select(getMacroLearningId), - '1. Check macro learning Id' - ) - - const id = true - - t.deepEqual( - generator.next(id).value, - call(shouldItLearn, id, node, action.payload), - '2. Check if node should learn' - ) - - const learn = false - - t.deepEqual( - generator.next(learn).value, - select(getMacro, 'macro05'), - '4.0 Get macro' - ) - - const macro2 = { - nodeId: 'n2', - targetParamLinks: { - lorem: { - startValue: 0.5 - } - } - } - - t.deepEqual( - generator.next(macro2).value, - select(getNode, 'n2'), - '6.0 Get node' - ) - - const macroNode2 = { - value: false - } - - t.equal(generator.next(macroNode2).done, true, 'Generator ends (dont reset macro)') - t.end() -}) - -test('(Saga) handleNodeValueUpdate (call macroLearnFromParam if learning ID and not a macro)', (t) => { - const nodeId = 'XXX' - const newVal = 0.5 - const action = nodeValueUpdate(nodeId, newVal) - const generator = handleNodeValueUpdate(action) - - t.deepEqual( - generator.next().value, - select(getNode, 'XXX'), - '0. Get node' - ) - - const node = { - type: 'foo' - } - - t.deepEqual( - generator.next(node).value, - call(isInputTypeHuman, undefined), - '0. Check if input type is human' - ) - - const isHuman = true - - t.deepEqual( - generator.next(isHuman).value, - select(getMacroLearningId), - '1. Check macro learning Id' - ) - - const id = 'XXX' - - t.deepEqual( - generator.next(id).value, - call(shouldItLearn, id, node, action.payload), - '2. Check if node should learn' - ) - - const learn = true - - t.deepEqual( - generator.next(learn).value, - call(macroLearnFromParam, action.payload, id), - '2. Call macroLearnFromParam, passing in action payload and learningId' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test('(Saga) macroProcess (update linked params with correct val, start vals exist)', (t) => { - const nodeId = 'XXX' - const newVal = 0.5 - - const node = { - type: 'macro', - macroId: 'YYY' - } - - const generator = macroProcess(nodeValueUpdate(nodeId, newVal).payload, node) - - t.deepEqual( - generator.next(node).value, - select(getMacro, 'YYY'), - '1. Get macro' - ) - - const macro = { - targetParamLinks: { - p1: { - nodeId: 'n1', - paramId: 'p1', - startValue: 0.2 - }, - p2: { - nodeId: 'n2', - paramId: 'p2', - startValue: 0.5 - } - } - } - - t.deepEqual( - generator.next(macro).value, - select(getNode, 'n1'), - '3.0 Get node for link 1' - ) - - const node1 = { - value: 0.3 - } - - t.deepEqual( - generator.next(node1).value, - // start value, target value, interp value - call(macroInterpolate, 0.2, 0.3, 0.5), - '3.1 Call interpolation function' - ) - - const val1 = 0.22222 - - t.deepEqual( - generator.next(val1).value, - select(getNode, 'n2'), - '3.0 Get node for link 2' - ) - - const node2 = { - value: 0.6 - } - - t.deepEqual( - generator.next(node2).value, - // start value, target value, interp value - call(macroInterpolate, 0.5, 0.6, 0.5), - '3.1 Call interpolation function' - ) - - const val2 = 0.88888 - - t.deepEqual( - generator.next(val2).value, - put(nodeValuesBatchUpdate([ - { - id: 'p1', - value: val1 - }, - { - id: 'p2', - value: val2 - } - ], { type: 'macro', macroId: 'YYY' })), - '4 Update values in one action' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test('(Saga) macroProcess (update linked params with correct val, start vals dont exist)', (t) => { - const nodeId = 'XXX' - const macroId = 'YYY' - const newVal = 0.5 - const node = { - type: 'macro', - macroId - } - - const generator = macroProcess(nodeValueUpdate(nodeId, newVal).payload, node) - - t.deepEqual( - generator.next(node).value, - select(getMacro, 'YYY'), - '1. Get macro' - ) - - const macro = { - targetParamLinks: { - p1: { - id: 'l1', - nodeId: 'n1', - paramId: 'p1', - startValue: false - } - } - } - - t.deepEqual( - generator.next(macro).value, - select(getNode, 'p1'), - '3.0 No start value, get param val' - ) - - const param = { - value: 0.8 - } - - t.deepEqual( - generator.next(param).value, - put(rMacroTargetParamLinkUpdateStartValue(macroId, 'p1', 0.8)), - '3.1 Update startValue for link' - ) - - t.deepEqual( - generator.next().value, - select(getNode, 'n1'), - '3.2 Get node for link 1' - ) - - const node1 = { - value: 0.3 - } - - t.deepEqual( - generator.next(node1).value, - // start value, target value, interp value - call(macroInterpolate, 0.8, 0.3, 0.5), - '3.3 Call interpolation function' - ) - - const val = 0.88888 - - t.deepEqual( - generator.next(val).value, - put(nodeValuesBatchUpdate([ - { - id: 'p1', - value: val - } - ], { type: 'macro', macroId: 'YYY' })), - '4 Update values in one action' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test('(Saga) macroCreate', (t) => { - const generator = macroCreate(uMacroCreate()) - - t.deepEqual( - generator.next().value, - call(uid), - '0. Generate unique ID for macro' - ) - - const UID1 = 'XX1' - - t.deepEqual( - generator.next(UID1).value, - call(uid), - '1. Generate unique ID for node' - ) - - const UID2 = 'XX2' - - t.deepEqual( - generator.next(UID2).value, - put(rNodeCreate('XX2', { - title: 'New Macro', - type: 'macro', - macroId: UID1, - value: 0, - isOpen: true - })), - '2. Create node item in state' - ) - - t.deepEqual( - generator.next().value, - put(rMacroCreate('XX1', 'XX2')), - '3. Create macro item in state' - ) - - t.deepEqual( - generator.next().value, - put(rMacroOpenToggle('XX1')), - '4. Open newly created macro' - ) - - t.deepEqual( - generator.next().value, - put(uiEditingOpen('nodeTitle', 'XX2')), - '5. Open macro title edit' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test('(Saga) macroTargetParamLinkAdd', (t) => { - const paramId = 'PARAM01' - const macroId = 'MACRO01' - const generator = macroTargetParamLinkAdd(uMacroTargetParamLinkAdd(macroId, paramId)) - - t.deepEqual( - generator.next().value, - select(getNode, paramId), - '0. Get param (node)' - ) - - const param = { - title: 'Foo Param' - } - - t.deepEqual( - generator.next(param).value, - call(uid), - '1. Generate unique ID for node' - ) - - const nodeId = 'NODE01' - - t.deepEqual( - generator.next(nodeId).value, - put(rNodeCreate(nodeId, { - title: 'Foo Param', - type: 'macroTargetParamLink' - })), - '2. Create node item in state' - ) - - t.deepEqual( - generator.next().value, - put(rMacroTargetParamLinkCreate(macroId, paramId, nodeId)), - '3. Create param link in state' - ) - - t.deepEqual( - generator.next().value, - put(rNodeConnectedMacroAdd(paramId, macroId)), - '4. Add macro id to param node' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test('(Saga) handleNodeValueBatchUpdate - Any type apart from macro, loop through', (t) => { - const meta = { type: '@@@' } - const generator = handleNodeValueBatchUpdate( - nodeValuesBatchUpdate([ - { - id: 'xx', - value: 0.1 - }, - { - id: 'yy', - value: 0.2 - } - ], meta) - ) - - t.deepEqual( - generator.next().value, - call(handleNodeValueUpdate, { - payload: { - meta, - id: 'xx', - value: 0.1 - } - }), - '3.1 Call node update handle saga' - ) - - t.deepEqual( - generator.next().value, - call(handleNodeValueUpdate, { - payload: { - meta, - id: 'yy', - value: 0.2 - } - }), - '3.2 Call node update handle saga' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test(`(Saga) handleNodeValueBatchUpdate - do nothing if macro value isnt false -AND lastId matches`, (t) => { - const generator = handleNodeValueBatchUpdate( - nodeValuesBatchUpdate([ - { - id: 'xx', - value: 0.1 - }, - { - id: 'yy', - value: 0.2 - } - ], { type: 'macro', macroId: 'fooMacro' }) - ) - - t.deepEqual( - generator.next().value, - select(getMacro, 'fooMacro'), - '1. Get macro' - ) - - const macro = { - nodeId: 'node1' - } - - t.deepEqual( - generator.next(macro).value, - select(getNode, 'node1'), - '2. Get node' - ) - - const node = { - value: 0.5 - } - - t.deepEqual( - generator.next(node).value, - select(getMacroLastId), - '1. Get macro last id' - ) - - const lastId = 'fooMacro' - - t.equal(generator.next(lastId).done, true, 'Generator ends') - t.end() -}) - -test('(Saga) handleNodeValueBatchUpdate - loop through param values if macro value is false', (t) => { - const meta = { type: 'macro', macroId: 'fooMacro' } - const generator = handleNodeValueBatchUpdate( - nodeValuesBatchUpdate([ - { - id: 'xx', - value: 0.1 - }, - { - id: 'yy', - value: 0.2 - } - ], meta) - ) - - t.deepEqual( - generator.next().value, - select(getMacro, 'fooMacro'), - '1. Get macro' - ) - - const macro = { - nodeId: 'node1' - } - - t.deepEqual( - generator.next(macro).value, - select(getNode, 'node1'), - '2. Get node' - ) - - const node = { - value: false - } - - t.deepEqual( - generator.next(node).value, - call(handleNodeValueUpdate, { - payload: { - meta, - id: 'xx', - value: 0.1 - } - }), - '3.1 Call node update handle saga' - ) - - t.deepEqual( - generator.next(node).value, - call(handleNodeValueUpdate, { - payload: { - meta, - id: 'yy', - value: 0.2 - } - }), - '3.2 Call node update handle saga' - ) - - t.deepEqual( - generator.next().value, - put(rMacroUpdateLastId(meta.macroId)), - '4. Dispatch action to set this macro as last one' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) - -test(`(Saga) handleNodeValueBatchUpdate - loop through param values if macro value isnt false -BUT lastId doesnt match`, (t) => { - const meta = { type: 'macro', macroId: 'fooMacro' } - const generator = handleNodeValueBatchUpdate( - nodeValuesBatchUpdate([ - { - id: 'xx', - value: 0.1 - }, - { - id: 'yy', - value: 0.2 - } - ], meta) - ) - - t.deepEqual( - generator.next().value, - select(getMacro, 'fooMacro'), - '1. Get macro' - ) - - const macro = { - nodeId: 'node1' - } - - t.deepEqual( - generator.next(macro).value, - select(getNode, 'node1'), - '2. Get node' - ) - - const node = { - value: 0.2 - } - - t.deepEqual( - generator.next(node).value, - select(getMacroLastId), - '1. Get macro last id' - ) - - const lastId = '@@@@@@' - - t.deepEqual( - generator.next(lastId).value, - call(handleNodeValueUpdate, { - payload: { - meta, - id: 'xx', - value: 0.1 - } - }), - '3.1 Call node update handle saga' - ) - - t.deepEqual( - generator.next(node).value, - call(handleNodeValueUpdate, { - payload: { - meta, - id: 'yy', - value: 0.2 - } - }), - '3.2 Call node update handle saga' - ) - - t.deepEqual( - generator.next().value, - put(rMacroUpdateLastId(meta.macroId)), - '4. Dispatch action to set this macro as last one' - ) - - t.equal(generator.next().done, true, 'Generator ends') - t.end() -}) +// TODO: Convert over to jest +// import '@babel/polyfill' +// import test from 'tape' +// import getNode from '../../../selectors/getNode' +// import { shouldItLearn } from '../utils' +// import getMacroTargetParamLink from '../../../selectors/getMacroTargetParamLink' +// import getMacroLearningId from '../../../selectors/getMacroLearningId' +// import getMacroLastId from '../../../selectors/getMacroLastId' +// import macroInterpolate from '../../../utils/macroInterpolate' +// import isInputTypeHuman from '../../../utils/isInputTypeHuman' +// import { select, put, call } from 'redux-saga/effects' +// import { +// rNodeCreate, nodeValueUpdate, rNodeConnectedMacroAdd, +// nodeValuesBatchUpdate, +// } from '../../nodes/actions' +// import { +// rMacroTargetParamLinkUpdateStartValue, rMacroUpdateLastId, rMacroOpenToggle, +// uMacroCreate, rMacroCreate, uMacroTargetParamLinkAdd, rMacroTargetParamLinkCreate, +// } from '../actions' +// import { uiEditingOpen } from '../../ui/actions' +// import { +// macroCreate, macroTargetParamLinkAdd, macroProcess, handleNodeValueUpdate, +// macroLearnFromParam, handleNodeValueBatchUpdate, +// } from '../sagas' +// import uid from 'uid' + +// test('(Saga) macroLearnFromParam (link doesnt exist)', (t) => { +// const paramId = 'XXX' +// const newVal = 0.5 +// const action = nodeValueUpdate(paramId, newVal) +// const macroId = 'LEARNINGID' + +// const generator = macroLearnFromParam(action.payload, macroId) + +// t.deepEqual( +// generator.next().value, +// select(getMacroTargetParamLink, macroId, paramId), +// '0. Check for link' +// ) + +// let link + +// t.deepEqual( +// generator.next(link).value, +// call(macroTargetParamLinkAdd, uMacroTargetParamLinkAdd(macroId, paramId)), +// '1. Create new macro link' +// ) + +// t.deepEqual( +// generator.next().value, +// select(getMacroTargetParamLink, macroId, paramId), +// '2. Get new link' +// ) + +// link = { +// id: 'LINKID', +// nodeId: 'NODEID', +// } + +// t.deepEqual( +// generator.next(link).value, +// put(nodeValueUpdate('NODEID', newVal)), +// '1. Dispatch action to update link value' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) macroLearnFromParam (link does exist)', (t) => { +// const paramId = 'XXX' +// const newVal = 0.5 +// const action = nodeValueUpdate(paramId, newVal) +// const macroId = 'LEARNINGID' + +// const generator = macroLearnFromParam(action.payload, macroId) + +// t.deepEqual( +// generator.next().value, +// select(getMacroTargetParamLink, macroId, paramId), +// '0. Check for link' +// ) + +// const link = { +// id: 'LINKID', +// nodeId: 'NODEID', +// } + +// t.deepEqual( +// generator.next(link).value, +// put(nodeValueUpdate('NODEID', newVal)), +// '1. Dispatch action to update link value' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test(`(Saga) handleNodeValueUpdate (does nothing if node type isn't macro and sender isn't human)`, (t) => { +// const nodeId = 'XXX' +// const newVal = 0.5 +// const action = nodeValueUpdate(nodeId, newVal, { type: 'alien' }) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next(isHuman).value, +// select(getNode, 'XXX'), +// '0. Get node' +// ) + +// const node = { +// type: '@@@', +// } + +// t.deepEqual( +// generator.next(node).value, +// call(isInputTypeHuman, 'alien'), +// '0. Check if input type is human' +// ) + +// const isHuman = false + +// t.equal(generator.next(isHuman).done, true, 'Generator ends') +// t.end() +// }) + +// test(`(Saga) handleNodeValueUpdate +// (does nothing if node type isnt a macro AND is human AND it shouldnt learn +// AND it doesnt have any connectedMacroIds)`, (t) => { +// const nodeId = 'XXX' +// const newVal = 0.5 +// const action = nodeValueUpdate(nodeId, newVal) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next().value, +// select(getNode, 'XXX'), +// '0. Get node' +// ) + +// const node = { +// type: 'foo', +// connectedMacroIds: [], +// } + +// t.deepEqual( +// generator.next(node).value, +// call(isInputTypeHuman, undefined), +// '0. Check if input type is human' +// ) + +// const isHuman = true + +// t.deepEqual( +// generator.next(isHuman).value, +// select(getMacroLearningId), +// '1. Check macro learning Id' +// ) + +// const id = true + +// t.deepEqual( +// generator.next(id).value, +// call(shouldItLearn, id, node, action.payload), +// '2. Check if node should learn' +// ) + +// const learn = false + +// t.equal(generator.next(learn).done, true, 'Generator ends') +// t.end() +// }) + +// test(`(Saga) handleNodeValueUpdate (does nothing if input is from a macro and node type is macro)`, (t) => { +// const nodeId = 'XXX' +// const newVal = 0.5 +// const action = nodeValueUpdate(nodeId, newVal, { type: 'macro' }) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next().value, +// select(getNode, 'XXX'), +// '0. Get node' +// ) + +// const node = { +// type: 'macro', +// } + +// t.equal(generator.next(node).done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) handleNodeValueUpdate (call macroProcess if node is macro)', (t) => { +// const nodeId = 'XXX' +// const newVal = 0.5 +// const action = nodeValueUpdate(nodeId, newVal) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next().value, +// select(getNode, 'XXX'), +// '0. Get node' +// ) + +// const node = { +// type: 'macro', +// } + +// t.deepEqual( +// generator.next(node).value, +// call(macroProcess, action.payload, node), +// '2. Call macroProcess, passing in action payload and node' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test(`(Saga) handleNodeValueUpdate +// (Reset macro and start values and ALL links for connected macros if has connectedMacroIds)`, (t) => { +// const paramId = 'PARAMID' +// const newVal = 0.5 +// const action = nodeValueUpdate(paramId, newVal) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next().value, +// select(getNode, paramId), +// '0. Get node' +// ) + +// const node = { +// type: 'foo', +// connectedMacroIds: ['macro01', 'macro02'], +// } + +// t.deepEqual( +// generator.next(node).value, +// call(isInputTypeHuman, undefined), +// '0. Check if input type is human' +// ) + +// const isHuman = true + +// t.deepEqual( +// generator.next(isHuman).value, +// select(getMacroLearningId), +// '1. Check macro learning Id' +// ) + +// const id = true + +// t.deepEqual( +// generator.next(id).value, +// call(shouldItLearn, id, node, action.payload), +// '2. Check if node should learn' +// ) + +// const learn = false + +// t.deepEqual( +// generator.next(learn).value, +// select(getMacro, 'macro01'), +// '3.0 Get macro' +// ) + +// const macro = { +// nodeId: 'n1', +// targetParamLinks: { +// foo: { +// startValue: 0.5, +// }, +// bar: { +// startValue: 0.1, +// }, +// }, +// } + +// t.deepEqual( +// generator.next(macro).value, +// select(getNode, 'n1'), +// '4.0 Get node' +// ) + +// const macroNode = { +// value: 0.5, +// } + +// t.deepEqual( +// generator.next(macroNode).value, +// put(rMacroTargetParamLinkUpdateStartValue('macro01', 'foo', false)), +// '5.1 Reset macro link' +// ) + +// t.deepEqual( +// generator.next(macro).value, +// put(rMacroTargetParamLinkUpdateStartValue('macro01', 'bar', false)), +// '5.2 Reset macro link' +// ) + +// t.deepEqual( +// generator.next().value, +// put(nodeValueUpdate('n1', false, { type: 'macro' })), +// '4.2 Reset macro node with "false" and meta type: macro to stop it from processing the macro' +// ) + +// t.deepEqual( +// generator.next(learn).value, +// select(getMacro, 'macro02'), +// '6.0 Get macro' +// ) + +// const macro2 = { +// nodeId: 'n2', +// targetParamLinks: { +// lorem: { +// startValue: 0.1, +// }, +// }, +// } + +// t.deepEqual( +// generator.next(macro2).value, +// select(getNode, 'n2'), +// '6.0 Get node' +// ) + +// const macroNode2 = { +// value: 0.2, +// } + +// t.deepEqual( +// generator.next(macroNode2).value, +// put(rMacroTargetParamLinkUpdateStartValue('macro02', 'lorem', false)), +// '4.1 Reset macro link' +// ) + +// t.deepEqual( +// generator.next().value, +// put(nodeValueUpdate('n2', false, { type: 'macro' })), +// '4.2 Reset macro node with "false" and meta type: macro to stop it from processing the macro' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test(`(Saga) handleNodeValueUpdate +// (Reset macro and start values and ALL links +// for connected macros if has connectedMacroIds, +// when action called via another macro, +// except for the macro being called)`, (t) => { +// const paramId = 'PARAMID' +// const newVal = 0.5 +// const action = nodeValueUpdate(paramId, newVal, { type: 'macro', macroId: 'macro01' }) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next().value, +// select(getNode, paramId), +// '0. Get node' +// ) + +// const node = { +// type: 'foo', +// connectedMacroIds: ['macro01', 'macro02'], +// } + +// t.deepEqual( +// generator.next(node).value, +// call(isInputTypeHuman, 'macro'), +// '0. Check if input type is human' +// ) + +// const isHuman = true + +// t.deepEqual( +// generator.next(isHuman).value, +// select(getMacroLearningId), +// '1. Check macro learning Id' +// ) + +// const id = true + +// t.deepEqual( +// generator.next(id).value, +// call(shouldItLearn, id, node, action.payload), +// '2. Check if node should learn' +// ) + +// const learn = false + +// t.deepEqual( +// generator.next(learn).value, +// select(getMacro, 'macro02'), +// '4.0 Get macro' +// ) + +// const macro2 = { +// nodeId: 'n2', +// targetParamLinks: { +// lorem: { +// startValue: 0.5, +// }, +// }, +// } + +// t.deepEqual( +// generator.next(macro2).value, +// select(getNode, 'n2'), +// '6.0 Get node' +// ) + +// const macroNode2 = { +// value: 0.2, +// } + +// t.deepEqual( +// generator.next(macroNode2).value, +// put(rMacroTargetParamLinkUpdateStartValue('macro02', 'lorem', false)), +// '4.1 Reset macro link' +// ) + +// t.deepEqual( +// generator.next().value, +// put(nodeValueUpdate('n2', false, { type: 'macro' })), +// '4.2 Reset macro node, meta type: macro to stop it from processing the macro' +// ) + +// t.equal(generator.next().done, true, 'Generator ends (dont reset macro)') +// t.end() +// }) + +// test(`(Saga) handleNodeValueUpdate +// (Dont Reset macro or start values for links if macro node +// is already set to false, as this signifies it has already been reset)`, (t) => { +// const paramId = 'PARAMID' +// const newVal = 0.5 +// const action = nodeValueUpdate(paramId, newVal, { type: 'macro', macroId: 'macro01' }) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next().value, +// select(getNode, paramId), +// '0. Get node' +// ) + +// const node = { +// type: 'foo', +// connectedMacroIds: ['macro05'], +// } + +// t.deepEqual( +// generator.next(node).value, +// call(isInputTypeHuman, 'macro'), +// '0. Check if input type is human' +// ) + +// const isHuman = true + +// t.deepEqual( +// generator.next(isHuman).value, +// select(getMacroLearningId), +// '1. Check macro learning Id' +// ) + +// const id = true + +// t.deepEqual( +// generator.next(id).value, +// call(shouldItLearn, id, node, action.payload), +// '2. Check if node should learn' +// ) + +// const learn = false + +// t.deepEqual( +// generator.next(learn).value, +// select(getMacro, 'macro05'), +// '4.0 Get macro' +// ) + +// const macro2 = { +// nodeId: 'n2', +// targetParamLinks: { +// lorem: { +// startValue: 0.5, +// }, +// }, +// } + +// t.deepEqual( +// generator.next(macro2).value, +// select(getNode, 'n2'), +// '6.0 Get node' +// ) + +// const macroNode2 = { +// value: false, +// } + +// t.equal(generator.next(macroNode2).done, true, 'Generator ends (dont reset macro)') +// t.end() +// }) + +// test('(Saga) handleNodeValueUpdate (call macroLearnFromParam if learning ID and not a macro)', (t) => { +// const nodeId = 'XXX' +// const newVal = 0.5 +// const action = nodeValueUpdate(nodeId, newVal) +// const generator = handleNodeValueUpdate(action) + +// t.deepEqual( +// generator.next().value, +// select(getNode, 'XXX'), +// '0. Get node' +// ) + +// const node = { +// type: 'foo', +// } + +// t.deepEqual( +// generator.next(node).value, +// call(isInputTypeHuman, undefined), +// '0. Check if input type is human' +// ) + +// const isHuman = true + +// t.deepEqual( +// generator.next(isHuman).value, +// select(getMacroLearningId), +// '1. Check macro learning Id' +// ) + +// const id = 'XXX' + +// t.deepEqual( +// generator.next(id).value, +// call(shouldItLearn, id, node, action.payload), +// '2. Check if node should learn' +// ) + +// const learn = true + +// t.deepEqual( +// generator.next(learn).value, +// call(macroLearnFromParam, action.payload, id), +// '2. Call macroLearnFromParam, passing in action payload and learningId' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) macroProcess (update linked params with correct val, start vals exist)', (t) => { +// const nodeId = 'XXX' +// const newVal = 0.5 + +// const node = { +// type: 'macro', +// macroId: 'YYY', +// } + +// const generator = macroProcess(nodeValueUpdate(nodeId, newVal).payload, node) + +// t.deepEqual( +// generator.next(node).value, +// select(getMacro, 'YYY'), +// '1. Get macro' +// ) + +// const macro = { +// targetParamLinks: { +// p1: { +// nodeId: 'n1', +// paramId: 'p1', +// startValue: 0.2, +// }, +// p2: { +// nodeId: 'n2', +// paramId: 'p2', +// startValue: 0.5, +// }, +// }, +// } + +// t.deepEqual( +// generator.next(macro).value, +// select(getNode, 'n1'), +// '3.0 Get node for link 1' +// ) + +// const node1 = { +// value: 0.3, +// } + +// t.deepEqual( +// generator.next(node1).value, +// // start value, target value, interp value +// call(macroInterpolate, 0.2, 0.3, 0.5), +// '3.1 Call interpolation function' +// ) + +// const val1 = 0.22222 + +// t.deepEqual( +// generator.next(val1).value, +// select(getNode, 'n2'), +// '3.0 Get node for link 2' +// ) + +// const node2 = { +// value: 0.6, +// } + +// t.deepEqual( +// generator.next(node2).value, +// // start value, target value, interp value +// call(macroInterpolate, 0.5, 0.6, 0.5), +// '3.1 Call interpolation function' +// ) + +// const val2 = 0.88888 + +// t.deepEqual( +// generator.next(val2).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'p1', +// value: val1, +// }, +// { +// id: 'p2', +// value: val2, +// }, +// ], { type: 'macro', macroId: 'YYY' })), +// '4 Update values in one action' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) macroProcess (update linked params with correct val, start vals dont exist)', (t) => { +// const nodeId = 'XXX' +// const macroId = 'YYY' +// const newVal = 0.5 +// const node = { +// type: 'macro', +// macroId, +// } + +// const generator = macroProcess(nodeValueUpdate(nodeId, newVal).payload, node) + +// t.deepEqual( +// generator.next(node).value, +// select(getMacro, 'YYY'), +// '1. Get macro' +// ) + +// const macro = { +// targetParamLinks: { +// p1: { +// id: 'l1', +// nodeId: 'n1', +// paramId: 'p1', +// startValue: false, +// }, +// }, +// } + +// t.deepEqual( +// generator.next(macro).value, +// select(getNode, 'p1'), +// '3.0 No start value, get param val' +// ) + +// const param = { +// value: 0.8, +// } + +// t.deepEqual( +// generator.next(param).value, +// put(rMacroTargetParamLinkUpdateStartValue(macroId, 'p1', 0.8)), +// '3.1 Update startValue for link' +// ) + +// t.deepEqual( +// generator.next().value, +// select(getNode, 'n1'), +// '3.2 Get node for link 1' +// ) + +// const node1 = { +// value: 0.3, +// } + +// t.deepEqual( +// generator.next(node1).value, +// // start value, target value, interp value +// call(macroInterpolate, 0.8, 0.3, 0.5), +// '3.3 Call interpolation function' +// ) + +// const val = 0.88888 + +// t.deepEqual( +// generator.next(val).value, +// put(nodeValuesBatchUpdate([ +// { +// id: 'p1', +// value: val, +// }, +// ], { type: 'macro', macroId: 'YYY' })), +// '4 Update values in one action' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) macroCreate', (t) => { +// const generator = macroCreate(uMacroCreate()) + +// t.deepEqual( +// generator.next().value, +// call(uid), +// '0. Generate unique ID for macro' +// ) + +// const UID1 = 'XX1' + +// t.deepEqual( +// generator.next(UID1).value, +// call(uid), +// '1. Generate unique ID for node' +// ) + +// const UID2 = 'XX2' + +// t.deepEqual( +// generator.next(UID2).value, +// put(rNodeCreate('XX2', { +// title: 'New Macro', +// type: 'macro', +// macroId: UID1, +// value: 0, +// isOpen: true, +// })), +// '2. Create node item in state' +// ) + +// t.deepEqual( +// generator.next().value, +// put(rMacroCreate('XX1', 'XX2')), +// '3. Create macro item in state' +// ) + +// t.deepEqual( +// generator.next().value, +// put(rMacroOpenToggle('XX1')), +// '4. Open newly created macro' +// ) + +// t.deepEqual( +// generator.next().value, +// put(uiEditingOpen('nodeTitle', 'XX2')), +// '5. Open macro title edit' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) macroTargetParamLinkAdd', (t) => { +// const paramId = 'PARAM01' +// const macroId = 'MACRO01' +// const generator = macroTargetParamLinkAdd(uMacroTargetParamLinkAdd(macroId, paramId)) + +// t.deepEqual( +// generator.next().value, +// select(getNode, paramId), +// '0. Get param (node)' +// ) + +// const param = { +// title: 'Foo Param', +// } + +// t.deepEqual( +// generator.next(param).value, +// call(uid), +// '1. Generate unique ID for node' +// ) + +// const nodeId = 'NODE01' + +// t.deepEqual( +// generator.next(nodeId).value, +// put(rNodeCreate(nodeId, { +// title: 'Foo Param', +// type: 'macroTargetParamLink', +// })), +// '2. Create node item in state' +// ) + +// t.deepEqual( +// generator.next().value, +// put(rMacroTargetParamLinkCreate(macroId, paramId, nodeId)), +// '3. Create param link in state' +// ) + +// t.deepEqual( +// generator.next().value, +// put(rNodeConnectedMacroAdd(paramId, macroId)), +// '4. Add macro id to param node' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) handleNodeValueBatchUpdate - Any type apart from macro, loop through', (t) => { +// const meta = { type: '@@@' } +// const generator = handleNodeValueBatchUpdate( +// nodeValuesBatchUpdate([ +// { +// id: 'xx', +// value: 0.1, +// }, +// { +// id: 'yy', +// value: 0.2, +// }, +// ], meta) +// ) + +// t.deepEqual( +// generator.next().value, +// call(handleNodeValueUpdate, { +// payload: { +// meta, +// id: 'xx', +// value: 0.1, +// }, +// }), +// '3.1 Call node update handle saga' +// ) + +// t.deepEqual( +// generator.next().value, +// call(handleNodeValueUpdate, { +// payload: { +// meta, +// id: 'yy', +// value: 0.2, +// }, +// }), +// '3.2 Call node update handle saga' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test(`(Saga) handleNodeValueBatchUpdate - do nothing if macro value isnt false +// AND lastId matches`, (t) => { +// const generator = handleNodeValueBatchUpdate( +// nodeValuesBatchUpdate([ +// { +// id: 'xx', +// value: 0.1, +// }, +// { +// id: 'yy', +// value: 0.2, +// }, +// ], { type: 'macro', macroId: 'fooMacro' }) +// ) + +// t.deepEqual( +// generator.next().value, +// select(getMacro, 'fooMacro'), +// '1. Get macro' +// ) + +// const macro = { +// nodeId: 'node1', +// } + +// t.deepEqual( +// generator.next(macro).value, +// select(getNode, 'node1'), +// '2. Get node' +// ) + +// const node = { +// value: 0.5, +// } + +// t.deepEqual( +// generator.next(node).value, +// select(getMacroLastId), +// '1. Get macro last id' +// ) + +// const lastId = 'fooMacro' + +// t.equal(generator.next(lastId).done, true, 'Generator ends') +// t.end() +// }) + +// test('(Saga) handleNodeValueBatchUpdate - loop through param values if macro value is false', (t) => { +// const meta = { type: 'macro', macroId: 'fooMacro' } +// const generator = handleNodeValueBatchUpdate( +// nodeValuesBatchUpdate([ +// { +// id: 'xx', +// value: 0.1, +// }, +// { +// id: 'yy', +// value: 0.2, +// }, +// ], meta) +// ) + +// t.deepEqual( +// generator.next().value, +// select(getMacro, 'fooMacro'), +// '1. Get macro' +// ) + +// const macro = { +// nodeId: 'node1', +// } + +// t.deepEqual( +// generator.next(macro).value, +// select(getNode, 'node1'), +// '2. Get node' +// ) + +// const node = { +// value: false, +// } + +// t.deepEqual( +// generator.next(node).value, +// call(handleNodeValueUpdate, { +// payload: { +// meta, +// id: 'xx', +// value: 0.1, +// }, +// }), +// '3.1 Call node update handle saga' +// ) + +// t.deepEqual( +// generator.next(node).value, +// call(handleNodeValueUpdate, { +// payload: { +// meta, +// id: 'yy', +// value: 0.2, +// }, +// }), +// '3.2 Call node update handle saga' +// ) + +// t.deepEqual( +// generator.next().value, +// put(rMacroUpdateLastId(meta.macroId)), +// '4. Dispatch action to set this macro as last one' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) + +// test(`(Saga) handleNodeValueBatchUpdate - loop through param values if macro value isnt false +// BUT lastId doesnt match`, (t) => { +// const meta = { type: 'macro', macroId: 'fooMacro' } +// const generator = handleNodeValueBatchUpdate( +// nodeValuesBatchUpdate([ +// { +// id: 'xx', +// value: 0.1, +// }, +// { +// id: 'yy', +// value: 0.2, +// }, +// ], meta) +// ) + +// t.deepEqual( +// generator.next().value, +// select(getMacro, 'fooMacro'), +// '1. Get macro' +// ) + +// const macro = { +// nodeId: 'node1', +// } + +// t.deepEqual( +// generator.next(macro).value, +// select(getNode, 'node1'), +// '2. Get node' +// ) + +// const node = { +// value: 0.2, +// } + +// t.deepEqual( +// generator.next(node).value, +// select(getMacroLastId), +// '1. Get macro last id' +// ) + +// const lastId = '@@@@@@' + +// t.deepEqual( +// generator.next(lastId).value, +// call(handleNodeValueUpdate, { +// payload: { +// meta, +// id: 'xx', +// value: 0.1, +// }, +// }), +// '3.1 Call node update handle saga' +// ) + +// t.deepEqual( +// generator.next(node).value, +// call(handleNodeValueUpdate, { +// payload: { +// meta, +// id: 'yy', +// value: 0.2, +// }, +// }), +// '3.2 Call node update handle saga' +// ) + +// t.deepEqual( +// generator.next().value, +// put(rMacroUpdateLastId(meta.macroId)), +// '4. Dispatch action to set this macro as last one' +// ) + +// t.equal(generator.next().done, true, 'Generator ends') +// t.end() +// }) diff --git a/src/store/macros/actions.js b/src/store/macros/actions.js index d64d6cef..b137f3a3 100644 --- a/src/store/macros/actions.js +++ b/src/store/macros/actions.js @@ -1,102 +1,98 @@ export function macrosReplaceAll (macros) { return { type: 'MACROS_REPLACE_ALL', - payload: { macros } + payload: { macros }, } } export function uMacroCreate () { return { - type: 'U_MACRO_CREATE' + type: 'U_MACRO_CREATE', } } -export function uMacroDelete (id) { +export function uMacroDelete (nodeId) { return { type: 'U_MACRO_DELETE', - payload: { id } + payload: { nodeId }, } } -export function rMacroDelete (id) { +export function rMacroAdd (nodeId) { + return { + type: 'R_MACRO_ADD', + payload: { nodeId }, + } +} + +export function rMacroDelete (nodeId) { return { type: 'R_MACRO_DELETE', - payload: { id } + payload: { nodeId }, } } export function rMacroUpdateLastId (id) { return { type: 'R_MACRO_UPDATE_LAST_ID', - payload: { id } + payload: { id }, } } export function uMacroTargetParamLinkAdd (macroId, paramId) { return { type: 'U_MACRO_TARGET_PARAM_LINK_ADD', - payload: { macroId, paramId } - } -} - -export function rMacroTargetParamLinkAdd (macroId, linkId) { - return { - type: 'R_MACRO_TARGET_PARAM_LINK_ADD', - payload: { macroId, linkId } + payload: { macroId, paramId }, } } -export function rMacroCreate (id, nodeId) { +export function rMacroOpenToggle (id) { return { - type: 'R_MACRO_CREATE', - payload: { id, nodeId } + type: 'R_MACRO_OPEN_TOGGLE', + payload: { id }, } } -export function rMacroOpenToggle (id) { +export function rMacroClose () { return { - type: 'R_MACRO_OPEN_TOGGLE', - payload: { id } + type: 'R_MACRO_CLOSE', } } export function rMacroLearningToggle (id) { return { type: 'R_MACRO_LEARNING_TOGGLE', - payload: { id } + payload: { id }, } } export function rMacroLearningStop () { return { - type: 'R_MACRO_LEARNING_STOP' - } -} - -export function rMacroTargetParamLinkCreate (macroId, paramId, nodeId) { - return { - type: 'R_MACRO_TARGET_PARAM_LINK_CREATE', - payload: { macroId, paramId, nodeId } + type: 'R_MACRO_LEARNING_STOP', } } export function uMacroTargetParamLinkDelete (macroId, paramId) { return { type: 'U_MACRO_TARGET_PARAM_LINK_DELETE', - payload: { macroId, paramId } + payload: { macroId, paramId }, } } -export function rMacroTargetParamLinkDelete (macroId, paramId) { +export function uMacroAddAllForSketch (id) { return { - type: 'R_MACRO_TARGET_PARAM_LINK_DELETE', - payload: { macroId, paramId } + type: 'U_MACRO_ADD_ALL_FOR_SKETCH', + payload: { + id, + }, } } -export function rMacroTargetParamLinkUpdateStartValue (macroId, paramId, value) { +export function uMacroAddAllForScene (id) { return { - type: 'R_MACRO_TARGET_PARAM_LINK_UPDATE_START_VALUE', - payload: { macroId, paramId, value } + type: 'U_MACRO_ADD_ALL_FOR_SCENE', + payload: { + id, + }, } } diff --git a/src/store/macros/reducer.js b/src/store/macros/reducer.js index a4ba38d7..246ec7df 100644 --- a/src/store/macros/reducer.js +++ b/src/store/macros/reducer.js @@ -1,106 +1,56 @@ -import { omit } from 'lodash' +import { union } from 'lodash' const defaultState = { learningId: false, openedId: undefined, lastId: undefined, - items: {} + nodeIds: [], } const macroReducer = (state = defaultState, action) => { const p = action.payload switch (action.type) { - case 'R_MACRO_CREATE': { + case 'R_MACRO_ADD': { return { ...state, - items: { - ...state.items, - [p.id]: { - id: p.id, - nodeId: p.nodeId, - targetParamLinks: {} - } - } + nodeIds: union(state.nodeIds, [p.nodeId]), } } case 'R_MACRO_DELETE': { return { ...state, - items: omit(state.items, [p.id]) + nodeIds: state.nodeIds.filter(item => item !== p.nodeId), } } case 'R_MACRO_LEARNING_TOGGLE': { return { ...state, - learningId: state.learningId !== false ? false : p.id + learningId: state.learningId !== false ? false : p.id, } } case 'R_MACRO_LEARNING_STOP': { return { ...state, - learningId: false + learningId: false, } } - case 'R_MACRO_TARGET_PARAM_LINK_CREATE': { - return { - ...state, - items: { - ...state.items, - [p.macroId]: { - ...state.items[p.macroId], - targetParamLinks: { - ...state.items[p.macroId].targetParamLinks, - [p.paramId]: { - nodeId: p.nodeId, - paramId: p.paramId, - startValue: false - } - } - } - } - } - } - case 'R_MACRO_TARGET_PARAM_LINK_DELETE': { - return { - ...state, - items: { - ...state.items, - [p.macroId]: { - ...state.items[p.macroId], - targetParamLinks: omit(state.items[p.macroId].targetParamLinks, [p.paramId]) - } - } - } - } - case 'R_MACRO_TARGET_PARAM_LINK_UPDATE_START_VALUE': { + case 'R_MACRO_OPEN_TOGGLE': { return { ...state, - items: { - ...state.items, - [p.macroId]: { - ...state.items[p.macroId], - targetParamLinks: { - ...state.items[p.macroId].targetParamLinks, - [p.paramId]: { - ...state.items[p.macroId].targetParamLinks[p.paramId], - startValue: p.value - } - } - } - } + openedId: p.id !== state.openedId ? p.id : undefined, } } - case 'R_MACRO_OPEN_TOGGLE': { + case 'R_MACRO_CLOSE': { return { ...state, - openedId: p.id !== state.openedId ? p.id : undefined + openedId: undefined, } } case 'R_MACRO_UPDATE_LAST_ID': { return { ...state, - lastId: p.id + lastId: p.id, } } case 'MACROS_REPLACE_ALL': { diff --git a/src/store/macros/sagas.js b/src/store/macros/sagas.js index 128a3ebc..28a5cea2 100644 --- a/src/store/macros/sagas.js +++ b/src/store/macros/sagas.js @@ -1,18 +1,20 @@ import { select, put, call, takeEvery } from 'redux-saga/effects' import getNode from '../../selectors/getNode' -import getMacro from '../../selectors/getMacro' +import getSketch from '../../selectors/getSketch' import { shouldItLearn } from './utils' import getMacroLearningId from '../../selectors/getMacroLearningId' import getMacroTargetParamLink from '../../selectors/getMacroTargetParamLink' import getMacroLastId from '../../selectors/getMacroLastId' +import getSelectedSketchId from '../../selectors/getSelectedSketchId' +import getCurrentScene from '../../selectors/getCurrentScene' import macroInterpolate from '../../utils/macroInterpolate' import isInputTypeHuman from '../../utils/isInputTypeHuman' import { rNodeCreate, nodeValueUpdate, uNodeDelete, rNodeConnectedMacroAdd, - rNodeConnectedMacroRemove, nodeValuesBatchUpdate + rNodeConnectedMacroRemove, nodeValuesBatchUpdate, rNodeMacroTargetParamLinkCreate, + rNodeMacroTargetParamLinkDelete, rNodeMacroTargetParamLinkUpdateStartValue, } from '../nodes/actions' -import { rMacroCreate, rMacroDelete, rMacroTargetParamLinkCreate, rMacroTargetParamLinkDelete, - rMacroTargetParamLinkUpdateStartValue, uMacroTargetParamLinkAdd, rMacroLearningToggle, - rMacroUpdateLastId, rMacroOpenToggle +import { rMacroAdd, rMacroDelete, uMacroTargetParamLinkAdd, rMacroLearningToggle, + rMacroUpdateLastId, rMacroOpenToggle, } from './actions' import { uiEditingOpen } from '../ui/actions' import { projectError } from '../project/actions' @@ -20,31 +22,29 @@ import { projectError } from '../project/actions' import uid from 'uid' export function* macroCreate (action) { - const macroId = yield call(uid) const nodeId = yield call(uid) yield put(rNodeCreate(nodeId, { title: 'New Macro', type: 'macro', - isOpen: true, - macroId: macroId, - value: 0 + targetParamLinks: {}, + value: 0, })) - yield put(rMacroCreate(macroId, nodeId)) - yield put(rMacroOpenToggle(macroId)) + yield put(rMacroAdd(nodeId)) + yield put(rMacroOpenToggle(nodeId)) yield put(uiEditingOpen('nodeTitle', nodeId)) } export function* macroDelete (action) { - const macroId = action.payload.id - const macro = yield select(getMacro, macroId) + const nodeId = action.payload.nodeId + const node = yield select(getNode, nodeId) yield put(rMacroLearningToggle(false)) - yield put(rMacroDelete(macroId)) - yield put(uNodeDelete(macro.nodeId)) + yield put(rMacroDelete(nodeId)) + yield put(uNodeDelete(nodeId)) - for (const linkId in macro.targetParamLinks) { - const link = macro.targetParamLinks[linkId] + for (const linkId in node.targetParamLinks) { + const link = node.targetParamLinks[linkId] yield put(uNodeDelete(link.nodeId)) - yield put(rNodeConnectedMacroRemove(link.paramId, macroId)) + yield put(rNodeConnectedMacroRemove(link.paramId, nodeId)) } } @@ -54,16 +54,16 @@ export function* macroTargetParamLinkAdd (action) { const nodeId = yield call(uid) yield put(rNodeCreate(nodeId, { title: param.title, - type: 'macroTargetParamLink' + type: 'macroTargetParamLink', })) - yield put(rMacroTargetParamLinkCreate(p.macroId, p.paramId, nodeId)) + yield put(rNodeMacroTargetParamLinkCreate(p.macroId, p.paramId, nodeId)) yield put(rNodeConnectedMacroAdd(p.paramId, p.macroId)) } export function* macroTargetParamLinkDelete (action) { const p = action.payload const link = yield select(getMacroTargetParamLink, p.macroId, p.paramId) - yield put(rMacroTargetParamLinkDelete(p.macroId, p.paramId)) + yield put(rNodeMacroTargetParamLinkDelete(p.macroId, p.paramId)) yield put(uNodeDelete(link.nodeId)) yield put(rNodeConnectedMacroRemove(p.paramId, p.macroId)) } @@ -85,8 +85,7 @@ it is a macro type node: - the param value is updated with new interpolated value */ export function* macroProcess (p, node) { - const m = yield select(getMacro, node.macroId) - const links = m.targetParamLinks + const links = node.targetParamLinks const keys = Object.keys(links) const values = [] @@ -96,19 +95,19 @@ export function* macroProcess (p, node) { if (startValue === false) { const p = yield select(getNode, l.paramId) startValue = p.value - yield put(rMacroTargetParamLinkUpdateStartValue(node.macroId, l.paramId, startValue)) + yield put(rNodeMacroTargetParamLinkUpdateStartValue(node.id, l.paramId, startValue)) } const n = yield select(getNode, l.nodeId) const val = yield call(macroInterpolate, startValue, n.value, p.value) values.push( { id: l.paramId, - value: val + value: val, } ) } - yield put(nodeValuesBatchUpdate(values, { type: 'macro', macroId: node.macroId })) + yield put(nodeValuesBatchUpdate(values, { type: 'macro', macroId: node.id })) } export function* macroLearnFromParam (p, macroId) { @@ -139,14 +138,14 @@ export function* handleNodeValueUpdate (action) { const node = yield select(getNode, p.id) if (node.type === 'macro' && senderType !== 'macro') { - // Normal behaviour, simple process of macro using value of node + // Normal behaviour, simple process of macro using value of node yield call(macroProcess, p, node) } else if (node.type !== 'macro') { const isHuman = yield call(isInputTypeHuman, senderType) if (isHuman) { const learningId = yield select(getMacroLearningId) - // Learning logic here + // Learning logic here const learn = yield call(shouldItLearn, learningId, node, p) if (learn) { yield call(macroLearnFromParam, p, learningId) @@ -160,15 +159,14 @@ export function* handleNodeValueUpdate (action) { // If this action has not come from the macro assigned to it // then reset that macro and relevant start vals if (senderMacroId !== macroId) { - const macro = yield select(getMacro, macroId) - const node = yield select(getNode, macro.nodeId) + const node = yield select(getNode, macroId) if (node.value !== false) { - for (const key in macro.targetParamLinks) { - yield put(rMacroTargetParamLinkUpdateStartValue(macroId, key, false)) + for (const key in node.targetParamLinks) { + yield put(rNodeMacroTargetParamLinkUpdateStartValue(macroId, key, false)) } - yield put(nodeValueUpdate(macro.nodeId, false, { type: 'macro' })) + yield put(nodeValueUpdate(macroId, false, { type: 'macro' })) } } } @@ -192,8 +190,7 @@ export function* handleNodeValueBatchUpdate (action) { // Macro stuff doesnt necessarily have to go through the loop // if already has done, so we check to see if (!doLoop) { - const macro = yield select(getMacro, p.meta.macroId) - const node = yield select(getNode, macro.nodeId) + const node = yield select(getNode, p.meta.macroId) // Do loop if macro value is false if (node.value === false) { @@ -215,8 +212,8 @@ export function* handleNodeValueBatchUpdate (action) { payload: { meta: p.meta, id: node.id, - value: node.value - } + value: node.value, + }, }) } @@ -227,11 +224,42 @@ export function* handleNodeValueBatchUpdate (action) { } } +export function* macroAddAllForSketch (macroId, sketchId) { + const sketch = yield select(getSketch, sketchId) + + for (const paramId of sketch.paramIds) { + const param = yield select(getNode, paramId) + const p = { + id: param.id, + value: param.value, + } + yield call(macroLearnFromParam, p, macroId) + } +} + +export function* handleMacroAddAllForSketch () { + const macroId = yield select(getMacroLearningId) + const sketchId = yield select(getSelectedSketchId) + + yield call(macroAddAllForSketch, macroId, sketchId) +} + +export function* handleMacroAddAllForScene () { + const macroId = yield select(getMacroLearningId) + const scene = yield select(getCurrentScene) + + for (const sketchId of scene.sketchIds) { + yield call(macroAddAllForSketch, macroId, sketchId) + } +} + export function* watchMacros () { yield takeEvery('U_MACRO_CREATE', macroCreate) yield takeEvery('U_MACRO_DELETE', macroDelete) yield takeEvery('U_MACRO_TARGET_PARAM_LINK_ADD', macroTargetParamLinkAdd) yield takeEvery('U_MACRO_TARGET_PARAM_LINK_DELETE', macroTargetParamLinkDelete) + yield takeEvery('U_MACRO_ADD_ALL_FOR_SKETCH', handleMacroAddAllForSketch) + yield takeEvery('U_MACRO_ADD_ALL_FOR_SCENE', handleMacroAddAllForScene) yield takeEvery('NODE_VALUE_UPDATE', handleNodeValueUpdate) yield takeEvery('NODE_VALUES_BATCH_UPDATE', handleNodeValueBatchUpdate) } diff --git a/src/store/macros/utils.js b/src/store/macros/utils.js index 6ffa503a..3e45e2ba 100644 --- a/src/store/macros/utils.js +++ b/src/store/macros/utils.js @@ -1,6 +1,12 @@ import isInputTypeHuman from '../../utils/isInputTypeHuman' +// TODO: Boolean not yet supported type of node value +// but putting in for future's sake +const allowedTypes = ['number', 'boolean'] + export const shouldItLearn = (learningId, node, payload) => { + if (!allowedTypes.includes(typeof node.value)) return false + const pType = payload.meta && payload.meta.type if (pType && (!isInputTypeHuman(pType) || pType === 'macro')) { return false diff --git a/src/store/midi/_test/reducer.spec.js b/src/store/midi/_test/reducer.spec.js index 66496910..524828f4 100644 --- a/src/store/midi/_test/reducer.spec.js +++ b/src/store/midi/_test/reducer.spec.js @@ -11,7 +11,7 @@ test('(Reducer) midiReducer', (t) => { originalState = { learning: false, - devices: {} + devices: {}, } deepFreeze(originalState) @@ -19,9 +19,9 @@ test('(Reducer) midiReducer', (t) => { expectedState = { learning: { id: 'XXX', - type: 'foo' + type: 'foo', }, - devices: {} + devices: {}, } actualState = midiReducer(originalState, a.midiStartLearning('XXX', 'foo')) @@ -30,7 +30,7 @@ test('(Reducer) midiReducer', (t) => { expectedState = { learning: false, - devices: {} + devices: {}, } actualState = midiReducer(originalState, a.midiStopLearning()) @@ -40,17 +40,15 @@ test('(Reducer) midiReducer', (t) => { const devices = { xxx: { title: 'Foo', - bankIndex: 0 }, yyy: { title: 'Bar', - bankIndex: 0 - } + }, } expectedState = { learning: false, - devices + devices, } actualState = midiReducer(actualState, a.midiUpdateDevices(devices)) @@ -59,7 +57,7 @@ test('(Reducer) midiReducer', (t) => { const lastMessage = { data: [0, 1, 2], - timeStamp: 100 + timeStamp: 100, } expectedState = { @@ -68,38 +66,16 @@ test('(Reducer) midiReducer', (t) => { xxx: { title: 'Foo', lastMessage, - bankIndex: 0 }, yyy: { title: 'Bar', - bankIndex: 0 - } - } + }, + }, } actualState = midiReducer(actualState, a.midiMessage('xxx', lastMessage)) t.deepEqual(actualState, expectedState, 'updates message info') - expectedState = { - learning: false, - devices: { - xxx: { - title: 'Foo', - lastMessage, - bankIndex: 3 - }, - yyy: { - title: 'Bar', - bankIndex: 1 - } - } - } - - actualState = midiReducer(actualState, a.midiDeviceBankChange('yyy', 1)) - actualState = midiReducer(actualState, a.midiDeviceBankChange('xxx', 3)) - - t.deepEqual(actualState, expectedState, 'changes bank') - t.end() }) diff --git a/src/store/midi/actions.js b/src/store/midi/actions.js index 4405e057..6d09d5f2 100644 --- a/src/store/midi/actions.js +++ b/src/store/midi/actions.js @@ -1,13 +1,13 @@ export function midiStartLearning (nodeId, type) { return { type: 'MIDI_START_LEARNING', - payload: { nodeId, type } + payload: { nodeId, type }, } } export function midiStopLearning () { return { - type: 'MIDI_STOP_LEARNING' + type: 'MIDI_STOP_LEARNING', } } @@ -15,8 +15,8 @@ export function midiUpdateDevices (devices) { return { type: 'MIDI_UPDATE_DEVICES', payload: { - devices - } + devices, + }, } } @@ -25,21 +25,12 @@ export function midiMessage (id, message) { type: 'MIDI_MESSAGE', payload: { id, - message + message, }, meta: { debounce: { - time: 100 - } - } - } -} - -export function midiDeviceBankChange (id, index) { - return { - type: 'MIDI_DEVICE_BANK_CHANGE', - payload: { - id, index - } + time: 100, + }, + }, } } diff --git a/src/store/midi/reducer.js b/src/store/midi/reducer.js index d33845a2..33b0d61a 100644 --- a/src/store/midi/reducer.js +++ b/src/store/midi/reducer.js @@ -1,6 +1,6 @@ const defaultState = { learning: false, - devices: {} + devices: {}, } const midiReducer = (state = defaultState, action) => { @@ -12,32 +12,20 @@ const midiReducer = (state = defaultState, action) => { ...state, learning: { id: p.nodeId, - type: p.type - } + type: p.type, + }, } } case 'MIDI_STOP_LEARNING': { return { ...state, - learning: false + learning: false, } } case 'MIDI_UPDATE_DEVICES': { return { ...state, - devices: p.devices - } - } - case 'MIDI_DEVICE_BANK_CHANGE': { - return { - ...state, - devices: { - ...state.devices, - [p.id]: { - ...state.devices[p.id], - bankIndex: p.index - } - } + devices: p.devices, } } case 'MIDI_MESSAGE': { @@ -47,9 +35,9 @@ const midiReducer = (state = defaultState, action) => { ...state.devices, [p.id]: { ...state.devices[p.id], - lastMessage: p.message - } - } + lastMessage: p.message, + }, + }, } } default: diff --git a/src/store/nodes/_test/reducer.spec.js b/src/store/nodes/_test/reducer.spec.js index c61f743f..53046e31 100644 --- a/src/store/nodes/_test/reducer.spec.js +++ b/src/store/nodes/_test/reducer.spec.js @@ -13,34 +13,34 @@ test('(Reducer) nodesReducer - Updates correct node value on NODE_VALUE_UPDATE', '01': { title: 'Rotation X', key: 'rotX', - value: 0.1 + value: 0.1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.2 - } + value: 0.2, + }, } expectedState = { '01': { title: 'Rotation X', key: 'rotX', - value: 1 + value: 1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.2 - } + value: 0.2, + }, } actualState = nodesReducer(originalState, { type: 'NODE_VALUE_UPDATE', payload: { id: '01', - value: 1 - } + value: 1, + }, }) t.deepEqual(actualState, expectedState) @@ -49,21 +49,21 @@ test('(Reducer) nodesReducer - Updates correct node value on NODE_VALUE_UPDATE', '01': { title: 'Rotation X', key: 'rotX', - value: 1 + value: 1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 2 - } + value: 2, + }, } actualState = nodesReducer(actualState, { type: 'NODE_VALUE_UPDATE', payload: { id: '02', - value: 2 - } + value: 2, + }, }) t.deepEqual(actualState, expectedState) @@ -78,13 +78,13 @@ test('(Reducer) nodesReducer - does not mutate value on NODE_VALUE_UPDATE when m '01': { title: 'Rotation X', key: 'rotX', - value: 0.1 + value: 0.1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.2 - } + value: 0.2, + }, } deepFreeze(originalState) @@ -93,13 +93,13 @@ test('(Reducer) nodesReducer - does not mutate value on NODE_VALUE_UPDATE when m '01': { title: 'Rotation X', key: 'rotX', - value: 1 + value: 1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.2 - } + value: 0.2, + }, } actualState = nodesReducer(originalState, { @@ -108,9 +108,9 @@ test('(Reducer) nodesReducer - does not mutate value on NODE_VALUE_UPDATE when m id: '01', value: 1, meta: { - dontMutate: true - } - } + dontMutate: true, + }, + }, }) t.deepEqual(actualState, expectedState) @@ -119,13 +119,13 @@ test('(Reducer) nodesReducer - does not mutate value on NODE_VALUE_UPDATE when m '01': { title: 'Rotation X', key: 'rotX', - value: 1 + value: 1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 2 - } + value: 2, + }, } actualState = nodesReducer(actualState, { @@ -134,9 +134,9 @@ test('(Reducer) nodesReducer - does not mutate value on NODE_VALUE_UPDATE when m id: '02', value: 2, meta: { - dontMutate: true - } - } + dontMutate: true, + }, + }, }) t.deepEqual(actualState, expectedState) @@ -151,65 +151,65 @@ test('(Reducer) nodesReducer - Updates multiple node values on nodeValuesBatchUp '01': { title: 'Rotation X', key: 'rotX', - value: 0.1 + value: 0.1, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.2 + value: 0.2, }, '03': { title: 'Rotation Z', key: 'rotZ', - value: 0.3 + value: 0.3, }, '04': { title: 'Scale', key: 'scale', - value: 0.4 - } + value: 0.4, + }, } expectedState = { '01': { title: 'Rotation X', key: 'rotX', - value: 0.11 + value: 0.11, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.22 + value: 0.22, }, '03': { title: 'Rotation Z', key: 'rotZ', - value: 0.33 + value: 0.33, }, '04': { title: 'Scale', key: 'scale', - value: 0.44 - } + value: 0.44, + }, } actualState = nodesReducer(originalState, a.nodeValuesBatchUpdate([ { id: '01', - value: 0.11 + value: 0.11, }, { id: '02', - value: 0.22 + value: 0.22, }, { id: '03', - value: 0.33 + value: 0.33, }, { id: '04', - value: 0.44 - } + value: 0.44, + }, ])) t.deepEqual(actualState, expectedState) @@ -218,34 +218,34 @@ test('(Reducer) nodesReducer - Updates multiple node values on nodeValuesBatchUp '01': { title: 'Rotation X', key: 'rotX', - value: 0.11 + value: 0.11, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.5 + value: 0.5, }, '03': { title: 'Rotation Z', key: 'rotZ', - value: 0.6 + value: 0.6, }, '04': { title: 'Scale', key: 'scale', - value: 0.44 - } + value: 0.44, + }, } actualState = nodesReducer(actualState, a.nodeValuesBatchUpdate([ { id: '02', - value: 0.5 + value: 0.5, }, { id: '03', - value: 0.6 - } + value: 0.6, + }, ])) t.deepEqual(actualState, expectedState) @@ -254,30 +254,30 @@ test('(Reducer) nodesReducer - Updates multiple node values on nodeValuesBatchUp '01': { title: 'Rotation X', key: 'rotX', - value: 0.11 + value: 0.11, }, '02': { title: 'Rotation Y', key: 'rotY', - value: 0.7 + value: 0.7, }, '03': { title: 'Rotation Z', key: 'rotZ', - value: 0.6 + value: 0.6, }, '04': { title: 'Scale', key: 'scale', - value: 0.44 - } + value: 0.44, + }, } actualState = nodesReducer(actualState, a.nodeValuesBatchUpdate([ { id: '02', - value: 0.7 - } + value: 0.7, + }, ])) t.deepEqual(actualState, expectedState) @@ -293,14 +293,14 @@ test('(Reducer) nodesReducer - Adds input link id on rNodeInputLinkAdd()', (t) = title: 'Rotation X', key: 'rotX', value: 0.1, - inputLinkIds: [] + inputLinkIds: [], }, '02': { title: 'Rotation Y', key: 'rotY', value: 0.2, - inputLinkIds: [] - } + inputLinkIds: [], + }, } deepFreeze(originalState) @@ -331,7 +331,7 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '01', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 + shotCount: 0, }, '02': { title: 'Rotation Y', @@ -340,8 +340,8 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '02', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 - } + shotCount: 0, + }, } expectedState = { @@ -352,7 +352,7 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '01', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 + shotCount: 0, }, '02': { title: 'Rotation Y', @@ -361,7 +361,7 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '02', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 + shotCount: 0, }, '03': { title: 'Rotation X', @@ -370,8 +370,8 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '03', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 - } + shotCount: 0, + }, } actualState = nodesReducer(originalState, { @@ -382,9 +382,9 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties title: 'Rotation X', key: 'rotX', value: 0.2, - id: '03' - } - } + id: '03', + }, + }, }) t.deepEqual(actualState, expectedState) @@ -397,7 +397,7 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '01', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 + shotCount: 0, }, '02': { title: 'Rotation Y', @@ -406,7 +406,7 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '02', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 + shotCount: 0, }, '03': { title: 'Rotation X', @@ -415,7 +415,7 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '03', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 + shotCount: 0, }, '04': { title: 'Scale', @@ -424,8 +424,8 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '04', inputLinkIds: [], connectedMacroIds: [], - shotCount: 0 - } + shotCount: 0, + }, } actualState = nodesReducer(actualState, { @@ -434,9 +434,9 @@ test('(Reducer) nodesReducer - Adds node on R_NODE_CREATE, adds extra properties id: '04', node: { title: 'Scale', - key: 'scale' - } - } + key: 'scale', + }, + }, }) t.deepEqual(actualState, expectedState) @@ -452,14 +452,14 @@ test('(Reducer) nodesReducer - Removes node on R_NODE_DELETE', (t) => { title: 'Rotation X', key: 'rotX', value: 0.1, - id: '01' + id: '01', }, '02': { title: 'Rotation Y', key: 'rotY', value: 0.2, - id: '02' - } + id: '02', + }, } expectedState = { @@ -467,15 +467,15 @@ test('(Reducer) nodesReducer - Removes node on R_NODE_DELETE', (t) => { title: 'Rotation X', key: 'rotX', value: 0.1, - id: '01' - } + id: '01', + }, } actualState = nodesReducer(originalState, { type: 'R_NODE_DELETE', payload: { - id: '02' - } + id: '02', + }, }) t.deepEqual(actualState, expectedState) @@ -485,8 +485,8 @@ test('(Reducer) nodesReducer - Removes node on R_NODE_DELETE', (t) => { actualState = nodesReducer(actualState, { type: 'R_NODE_DELETE', payload: { - id: '01' - } + id: '01', + }, }) t.deepEqual(actualState, expectedState) @@ -501,26 +501,26 @@ test('(Reducer) nodesReducer - Replaces nodes on NODES_REPLACE_ALL', (t) => { sAA: { moduleId: 'dog', title: 'Dog 1', - nodeIds: ['p22', 'p02'] + nodeIds: ['p22', 'p02'], }, sBB: { moduleId: 'cat', title: 'Cat 1', - nodeIds: ['p55', 'p04'] - } + nodeIds: ['p55', 'p04'], + }, } originalState = { s01: { moduleId: 'cubey', title: 'Cubey 1', - nodeIds: ['p01', 'p02'] + nodeIds: ['p01', 'p02'], }, s02: { moduleId: 'swirly', title: 'Swirly 1', - nodeIds: ['p03', 'p04'] - } + nodeIds: ['p03', 'p04'], + }, } deepFreeze(originalState) @@ -528,8 +528,8 @@ test('(Reducer) nodesReducer - Replaces nodes on NODES_REPLACE_ALL', (t) => { actual = nodesReducer(originalState, { type: 'NODES_REPLACE_ALL', payload: { - nodes: newNodes - } + nodes: newNodes, + }, }) t.deepEqual(actual, newNodes, 'Replaces all nodes') @@ -546,15 +546,15 @@ test('(Reducer) nodesReducer - Updates correct node value on R_NODE_INPUT_UPDATE key: 'rotX', value: 0.1, input: { - id: 'audio_0' - } + id: 'audio_0', + }, }, '02': { title: 'Rotation Y', key: 'rotY', value: 0.2, - input: undefined - } + input: undefined, + }, } deepFreeze(originalState) @@ -565,17 +565,17 @@ test('(Reducer) nodesReducer - Updates correct node value on R_NODE_INPUT_UPDATE key: 'rotX', value: 0.1, input: { - id: 'audio_0' - } + id: 'audio_0', + }, }, '02': { title: 'Rotation Y', key: 'rotY', value: 0.2, input: { - id: 'audio_1' - } - } + id: 'audio_1', + }, + }, } actualState = nodesReducer(originalState, { @@ -583,9 +583,9 @@ test('(Reducer) nodesReducer - Updates correct node value on R_NODE_INPUT_UPDATE payload: { nodeId: '02', input: { - id: 'audio_1' - } - } + id: 'audio_1', + }, + }, }) t.deepEqual(actualState, expectedState) @@ -596,17 +596,17 @@ test('(Reducer) nodesReducer - Updates correct node value on R_NODE_INPUT_UPDATE key: 'rotX', value: 0.1, input: { - id: 'audio_3' - } + id: 'audio_3', + }, }, '02': { title: 'Rotation Y', key: 'rotY', value: 0.2, input: { - id: 'audio_1' - } - } + id: 'audio_1', + }, + }, } actualState = nodesReducer(actualState, { @@ -614,9 +614,9 @@ test('(Reducer) nodesReducer - Updates correct node value on R_NODE_INPUT_UPDATE payload: { nodeId: '01', input: { - id: 'audio_3' - } - } + id: 'audio_3', + }, + }, }) t.deepEqual(actualState, expectedState) @@ -634,15 +634,15 @@ test('(Reducer) nodesReducer - opens/closes node on NODE_OPEN_TOGGLE', (t) => { value: 0.1, isOpen: true, input: { - id: 'audio_0' - } + id: 'audio_0', + }, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, - input: undefined - } + input: undefined, + }, } deepFreeze(originalState) @@ -654,22 +654,22 @@ test('(Reducer) nodesReducer - opens/closes node on NODE_OPEN_TOGGLE', (t) => { value: 0.1, isOpen: true, input: { - id: 'audio_0' - } + id: 'audio_0', + }, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: true, - input: undefined - } + input: undefined, + }, } actualState = nodesReducer(originalState, { type: 'NODE_OPEN_TOGGLE', payload: { - id: '02' - } + id: '02', + }, }) t.deepEqual(actualState, expectedState) @@ -681,22 +681,22 @@ test('(Reducer) nodesReducer - opens/closes node on NODE_OPEN_TOGGLE', (t) => { value: 0.1, isOpen: false, input: { - id: 'audio_0' - } + id: 'audio_0', + }, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: true, - input: undefined - } + input: undefined, + }, } actualState = nodesReducer(actualState, { type: 'NODE_OPEN_TOGGLE', payload: { - id: '01' - } + id: '01', + }, }) t.deepEqual(actualState, expectedState) @@ -714,17 +714,17 @@ test('(Reducer) nodesReducer - changes openedLinkId on NODE_OPEN_TAB', (t) => { value: 0.1, isOpen: true, input: { - id: 'audio_0' + id: 'audio_0', }, - openedLinkId: undefined + openedLinkId: undefined, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, input: undefined, - openedLinkId: 1 - } + openedLinkId: 1, + }, } deepFreeze(originalState) @@ -736,17 +736,17 @@ test('(Reducer) nodesReducer - changes openedLinkId on NODE_OPEN_TAB', (t) => { value: 0.1, isOpen: true, input: { - id: 'audio_0' + id: 'audio_0', }, - openedLinkId: 2 + openedLinkId: 2, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, input: undefined, - openedLinkId: 1 - } + openedLinkId: 1, + }, } actualState = nodesReducer(originalState, a.nodeTabOpen('01', 2)) @@ -760,17 +760,17 @@ test('(Reducer) nodesReducer - changes openedLinkId on NODE_OPEN_TAB', (t) => { value: 0.1, isOpen: true, input: { - id: 'audio_0' + id: 'audio_0', }, - openedLinkId: 2 + openedLinkId: 2, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, input: undefined, - openedLinkId: 5 - } + openedLinkId: 5, + }, } actualState = nodesReducer(actualState, a.nodeTabOpen('02', 5)) @@ -788,14 +788,14 @@ test('(Reducer) nodesReducer - changes activeInputLinkId on nodeActiveInputLinkT title: 'Rotation X', key: 'rotX', value: 0.1, - isOpen: true + isOpen: true, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, - input: undefined - } + input: undefined, + }, } deepFreeze(originalState) @@ -806,14 +806,14 @@ test('(Reducer) nodesReducer - changes activeInputLinkId on nodeActiveInputLinkT key: 'rotX', value: 0.1, isOpen: true, - activeInputLinkId: 'XX' + activeInputLinkId: 'XX', }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, - input: undefined - } + input: undefined, + }, } actualState = nodesReducer(originalState, a.nodeActiveInputLinkToggle('01', 'XX')) @@ -826,14 +826,14 @@ test('(Reducer) nodesReducer - changes activeInputLinkId on nodeActiveInputLinkT key: 'rotX', value: 0.1, isOpen: true, - activeInputLinkId: 'YY' + activeInputLinkId: 'YY', }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, - input: undefined - } + input: undefined, + }, } actualState = nodesReducer(actualState, a.nodeActiveInputLinkToggle('01', 'YY')) @@ -846,14 +846,14 @@ test('(Reducer) nodesReducer - changes activeInputLinkId on nodeActiveInputLinkT key: 'rotX', value: 0.1, isOpen: true, - activeInputLinkId: undefined + activeInputLinkId: undefined, }, '02': { title: 'Rotation Y', key: 'rotY', isOpen: false, - input: undefined - } + input: undefined, + }, } actualState = nodesReducer(actualState, a.nodeActiveInputLinkToggle('01', 'YY')) diff --git a/src/store/nodes/_test/sagas.spec.js b/src/store/nodes/_test/sagas.spec.js index c69268eb..ef59916c 100644 --- a/src/store/nodes/_test/sagas.spec.js +++ b/src/store/nodes/_test/sagas.spec.js @@ -1,4 +1,4 @@ -import 'babel-polyfill' +import '@babel/polyfill' import test from 'tape' import { select, put } from 'redux-saga/effects' import getNode from '../../../selectors/getNode' @@ -12,7 +12,7 @@ proxyquire.noCallThru() const getAll = sinon.stub() const { nodeCreate, nodeDelete } = proxyquire('../sagas', { - 'modifiers': { getAll } + 'modifiers': { getAll }, }) test('(Saga) nodeCreate - param node', (t) => { @@ -20,7 +20,7 @@ test('(Saga) nodeCreate - param node', (t) => { const node = { foo: 'bar' } const generator = nodeCreate({ - payload: { id: nodeId, node } + payload: { id: nodeId, node }, }) t.deepEqual( @@ -37,7 +37,7 @@ test('(Saga) nodeDelete (no inputLinks)', (t) => { const nodeId = 'XXX' const generator = nodeDelete({ - payload: { nodeId } + payload: { nodeId }, }) t.deepEqual( @@ -48,7 +48,7 @@ test('(Saga) nodeDelete (no inputLinks)', (t) => { const node = { id: 'XXX', - inputLinksIds: [] + inputLinksIds: [], } t.deepEqual( @@ -65,7 +65,7 @@ test('(Saga) nodeDelete (has inputlinks)', (t) => { const nodeId = 'XXX' const generator = nodeDelete({ - payload: { nodeId } + payload: { nodeId }, }) t.deepEqual( @@ -76,7 +76,7 @@ test('(Saga) nodeDelete (has inputlinks)', (t) => { const node = { id: 'XXX', - inputLinkIds: ['l1', 'l2'] + inputLinkIds: ['l1', 'l2'], } t.deepEqual( diff --git a/src/store/nodes/_test/selectors.spec.js b/src/store/nodes/_test/selectors.spec.js index f8007a96..ea94b368 100644 --- a/src/store/nodes/_test/selectors.spec.js +++ b/src/store/nodes/_test/selectors.spec.js @@ -7,10 +7,10 @@ test('(Selector) project - getNodeInputId', (t) => { nodes: { XXX: { input: { - id: 'audio_0' - } - } - } + id: 'audio_0', + }, + }, + }, } deepFreeze(state) @@ -24,9 +24,9 @@ test('(Selector) project - getNodeInputId (no input)', (t) => { const state = { nodes: { XXX: { - input: false - } - } + input: false, + }, + }, } deepFreeze(state) diff --git a/src/store/nodes/actions.js b/src/store/nodes/actions.js index 413d432f..56290e51 100644 --- a/src/store/nodes/actions.js +++ b/src/store/nodes/actions.js @@ -3,8 +3,8 @@ export function uNodeCreate (id, node) { type: 'U_NODE_CREATE', payload: { id, - node - } + node, + }, } } @@ -13,8 +13,8 @@ export function rNodeCreate (id, node) { type: 'R_NODE_CREATE', payload: { id, - node - } + node, + }, } } @@ -22,8 +22,8 @@ export function uNodeDelete (nodeId) { return { type: 'U_NODE_DELETE', payload: { - nodeId - } + nodeId, + }, } } @@ -31,8 +31,8 @@ export function rNodeDelete (id) { return { type: 'R_NODE_DELETE', payload: { - id - } + id, + }, } } @@ -41,8 +41,8 @@ export function uNodeInputLinkAdd (id, linkId) { type: 'U_NODE_INPUT_LINK_ADD', payload: { id, - linkId - } + linkId, + }, } } @@ -51,8 +51,8 @@ export function rNodeInputLinkAdd (id, linkId) { type: 'R_NODE_INPUT_LINK_ADD', payload: { id, - linkId - } + linkId, + }, } } @@ -61,8 +61,8 @@ export function nodeInputLinkRemove (id, linkId) { type: 'NODE_INPUT_LINK_REMOVE', payload: { id, - linkId - } + linkId, + }, } } @@ -72,8 +72,8 @@ export function nodeValueUpdate (id, value, meta) { payload: { id, value, - meta - } + meta, + }, } } @@ -82,8 +82,8 @@ export function nodeValuesBatchUpdate (values, meta) { type: 'NODE_VALUES_BATCH_UPDATE', payload: { values, - meta - } + meta, + }, } } @@ -91,8 +91,8 @@ export function nodesReplaceAll (nodes) { return { type: 'NODES_REPLACE_ALL', payload: { - nodes - } + nodes, + }, } } @@ -102,8 +102,8 @@ export function uNodeInputUpdate (nodeId, inputId, inputType) { payload: { nodeId, inputId, - inputType - } + inputType, + }, } } @@ -112,22 +112,22 @@ export function rNodeInputUpdate (nodeId, input) { type: 'R_NODE_INPUT_UPDATE', payload: { nodeId, - input - } + input, + }, } } export function rNodeConnectedMacroAdd (id, macroId) { return { type: 'R_NODE_CONNECTED_MACRO_ADD', - payload: { id, macroId } + payload: { id, macroId }, } } export function rNodeConnectedMacroRemove (id, macroId) { return { type: 'R_NODE_CONNECTED_MACRO_REMOVE', - payload: { id, macroId } + payload: { id, macroId }, } } @@ -135,8 +135,8 @@ export function nodeOpenToggle (id) { return { type: 'NODE_OPEN_TOGGLE', payload: { - id - } + id, + }, } } @@ -144,8 +144,8 @@ export function nodeTabOpen (nodeId, linkId) { return { type: 'NODE_TAB_OPEN', payload: { - nodeId, linkId - } + nodeId, linkId, + }, } } @@ -153,8 +153,8 @@ export function nodeActiveInputLinkToggle (nodeId, linkId) { return { type: 'NODE_ACTIVE_INPUT_LINK_TOGGLE', payload: { - nodeId, linkId - } + nodeId, linkId, + }, } } @@ -162,8 +162,8 @@ export function nodeShotFired (nodeId, sketchId, method) { return { type: 'NODE_SHOT_FIRED', payload: { - nodeId, sketchId, method - } + nodeId, sketchId, method, + }, } } @@ -172,7 +172,68 @@ export function nodeUpdate (nodeId, obj) { type: 'NODE_UPDATE', payload: { nodeId, - obj - } + obj, + }, + } +} + +export function nodeResetRange (nodeId) { + return { + type: 'NODE_RESET_RANGE', + payload: { + nodeId, + }, + } +} + +export function uNodeOpenInPanel (nodeId, panelId) { + return { + type: 'U_NODE_OPEN_IN_PANEL', + payload: { + nodeId, panelId, + }, + } +} + +/* Macros */ + +export function rNodeMacroTargetParamLinkCreate (macroId, paramId, paramLinkId) { + return { + type: 'R_NODE_MACRO_TARGET_PARAM_LINK_CREATE', + payload: { macroId, paramId, paramLinkId }, + } +} + +export function rNodeMacroTargetParamLinkDelete (macroId, paramId) { + return { + type: 'R_NODE_MACRO_TARGET_PARAM_LINK_DELETE', + payload: { macroId, paramId }, + } +} + +export function rNodeMacroTargetParamLinkUpdateStartValue (macroId, paramId, value) { + return { + type: 'R_NODE_MACRO_TARGET_PARAM_LINK_UPDATE_START_VALUE', + payload: { macroId, paramId, value }, + } +} + +/* input links */ + +export function rNodeInputLinkShotArm (linkId) { + return { + type: 'R_NODE_INPUT_LINK_SHOT_ARM', + payload: { + linkId, + }, + } +} + +export function rNodeInputLinkShotDisarm (linkId) { + return { + type: 'R_NODE_INPUT_LINK_SHOT_DISARM', + payload: { + linkId, + }, } } diff --git a/src/store/nodes/listener.js b/src/store/nodes/listener.js new file mode 100644 index 00000000..105875f7 --- /dev/null +++ b/src/store/nodes/listener.js @@ -0,0 +1,27 @@ +import { uSketchNodeOpenedToggle } from '../../store/sketches/actions' +import { uiNodeToggleOpen } from '../../store/ui/actions' +import { rMacroOpenToggle } from '../../store/macros/actions' + +const handleOpenPanel = (action, store) => { + const p = action.payload + + switch (p.panelId) { + case 'overview': + store.dispatch(uiNodeToggleOpen(p.nodeId)) + break + case 'macros': + store.dispatch(rMacroOpenToggle(p.nodeId)) + break + case 'sketch': + default: + store.dispatch(uSketchNodeOpenedToggle(p.nodeId)) + } +} + +export default (action, store) => { + switch (action.type) { + case 'U_NODE_OPEN_IN_PANEL': + handleOpenPanel(action, store) + break + } +} diff --git a/src/store/nodes/reducer.js b/src/store/nodes/reducer.js index 286f3fc1..468d0fe0 100644 --- a/src/store/nodes/reducer.js +++ b/src/store/nodes/reducer.js @@ -16,8 +16,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.id]: { ...state[p.id], - value: p.value - } + value: p.value, + }, } } else { // Intentionally mutating state as these values are updating @@ -46,8 +46,8 @@ const nodesReducer = (state = defaultState, action) => { inputLinkIds: [], shotCount: 0, connectedMacroIds: [], - ...p.node - } + ...p.node, + }, } } case 'R_NODE_INPUT_LINK_ADD': { @@ -58,8 +58,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.id]: { ...state[p.id], - inputLinkIds: [...state[p.id].inputLinkIds, p.linkId] - } + inputLinkIds: [...state[p.id].inputLinkIds, p.linkId], + }, } } case 'NODE_INPUT_LINK_REMOVE': { @@ -71,8 +71,8 @@ const nodesReducer = (state = defaultState, action) => { [p.id]: { ...state[p.id], inputLinkIds: state[p.id].inputLinkIds - .filter((id) => id !== p.linkId) - } + .filter((id) => id !== p.linkId), + }, } } case 'R_NODE_CONNECTED_MACRO_ADD': { @@ -84,8 +84,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.id]: { ...state[p.id], - connectedMacroIds: [...state[p.id].connectedMacroIds, p.macroId] - } + connectedMacroIds: [...state[p.id].connectedMacroIds, p.macroId], + }, } } case 'R_NODE_CONNECTED_MACRO_REMOVE': { @@ -98,8 +98,8 @@ const nodesReducer = (state = defaultState, action) => { [p.id]: { ...state[p.id], connectedMacroIds: state[p.id].connectedMacroIds - .filter((id) => id !== p.macroId) - } + .filter((id) => id !== p.macroId), + }, } } case 'NODES_REPLACE_ALL': { @@ -110,8 +110,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.nodeId]: { ...state[p.nodeId], - input: p.input - } + input: p.input, + }, } } case 'NODE_OPEN_TOGGLE': { @@ -119,8 +119,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.id]: { ...state[p.id], - isOpen: !state[p.id].isOpen - } + isOpen: !state[p.id].isOpen, + }, } } case 'NODE_TAB_OPEN': { @@ -128,8 +128,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.nodeId]: { ...state[p.nodeId], - openedLinkId: p.linkId - } + openedLinkId: p.linkId, + }, } } case 'NODE_ACTIVE_INPUT_LINK_TOGGLE': { @@ -137,8 +137,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.nodeId]: { ...state[p.nodeId], - activeInputLinkId: p.linkId !== state[p.nodeId].activeInputLinkId ? p.linkId : undefined - } + activeInputLinkId: p.linkId !== state[p.nodeId].activeInputLinkId ? p.linkId : undefined, + }, } } case 'NODE_SHOT_FIRED': { @@ -146,8 +146,8 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.nodeId]: { ...state[p.nodeId], - shotCount: state[p.nodeId].shotCount + 1 - } + shotCount: state[p.nodeId].shotCount + 1, + }, } } case 'NODE_UPDATE': { @@ -155,10 +155,83 @@ const nodesReducer = (state = defaultState, action) => { ...state, [p.nodeId]: { ...state[p.nodeId], - ...p.obj - } + ...p.obj, + }, + } + } + case 'NODE_RESET_RANGE': { + return { + ...state, + [p.nodeId]: { + ...state[p.nodeId], + min: state[p.nodeId].defaultMin, + max: state[p.nodeId].defaultMax, + }, + } + } + + /* Macros */ + case 'R_NODE_MACRO_TARGET_PARAM_LINK_CREATE': { + return { + ...state, + [p.macroId]: { + ...state[p.macroId], + targetParamLinks: { + ...state[p.macroId].targetParamLinks, + [p.paramId]: { + nodeId: p.paramLinkId, + paramId: p.paramId, + startValue: false, + }, + }, + }, + } + } + case 'R_NODE_MACRO_TARGET_PARAM_LINK_DELETE': { + return { + ...state, + [p.macroId]: { + ...state[p.macroId], + targetParamLinks: _.omit(state[p.macroId].targetParamLinks, [p.paramId]), + }, + } + } + case 'R_NODE_MACRO_TARGET_PARAM_LINK_UPDATE_START_VALUE': { + return { + ...state, + [p.macroId]: { + ...state[p.macroId], + targetParamLinks: { + ...state[p.macroId].targetParamLinks, + [p.paramId]: { + ...state[p.macroId].targetParamLinks[p.paramId], + startValue: p.value, + }, + }, + }, } } + + /* input links */ + case 'R_NODE_INPUT_LINK_SHOT_ARM': { + return { + ...state, + [p.linkId] : { + ...state[p.linkId], + armed: true, + }, + } + } + case 'R_NODE_INPUT_LINK_SHOT_DISARM': { + return { + ...state, + [p.linkId] : { + ...state[p.linkId], + armed: false, + }, + } + } + default: return state } diff --git a/src/store/project/_test/reducer.spec.js b/src/store/project/_test/reducer.spec.js index 71ecfe94..051fde90 100644 --- a/src/store/project/_test/reducer.spec.js +++ b/src/store/project/_test/reducer.spec.js @@ -9,33 +9,33 @@ test('(Reducer) projectReducer - Updates filepath on PROJECT_FILEPATH_UPDATE', ( let actual, expectedState const originalState = { - filePath: undefined + filePath: undefined, } deepFreeze(originalState) expectedState = { - filePath: 'some/path' + filePath: 'some/path', } actual = projectReducer(originalState, { type: 'PROJECT_FILEPATH_UPDATE', payload: { - filePath: 'some/path' - } + filePath: 'some/path', + }, }) t.deepEqual(actual, expectedState) expectedState = { - filePath: 'some/other/path' + filePath: 'some/other/path', } actual = projectReducer(actual, { type: 'PROJECT_FILEPATH_UPDATE', payload: { - filePath: 'some/other/path' - } + filePath: 'some/other/path', + }, }) t.deepEqual(actual, expectedState) diff --git a/src/store/project/_test/sagas.spec.js b/src/store/project/_test/sagas.spec.js index 973a8b27..0d8893bd 100644 --- a/src/store/project/_test/sagas.spec.js +++ b/src/store/project/_test/sagas.spec.js @@ -1,4 +1,4 @@ -import 'babel-polyfill' +import '@babel/polyfill' import test from 'tape' import { call, select, takeEvery, put } from 'redux-saga/effects' import { watchProject, saveProject, loadProjectRequest, @@ -6,7 +6,7 @@ import { watchProject, saveProject, loadProjectRequest, import { getProjectData, getProjectFilepath } from '../selectors' import { save, load } from '../../../utils/file' import { projectLoadSuccess, projectRehydrate, projectError, projectSaveAs, - projectErrorAdd, projectErrorPopupOpen, projectFilepathUpdate + projectErrorAdd, projectErrorPopupOpen, projectFilepathUpdate, } from '../actions' import history from '../../../history' @@ -117,7 +117,7 @@ test('(Saga) loadProject', (t) => { const projectData = { project: { - sketchesPath: 'sketches_path' + sketchesPath: 'sketches_path', }, inputs: '@@inputs', sketches: '@@sketches', @@ -126,9 +126,9 @@ test('(Saga) loadProject', (t) => { inputLinks: '@@inputLinks', router: { location: { - pathname: '/foo/bar' - } - } + pathname: '/foo/bar', + }, + }, } t.deepEqual( @@ -179,7 +179,7 @@ test('(Saga) handleProjectError (popup error)', (t) => { const errorMessage = 'foo error!' const meta = { popup: true, - code: 'FOO' + code: 'FOO', } const generator = handleProjectError( projectError(errorMessage, meta) diff --git a/src/store/project/_test/selectors.spec.js b/src/store/project/_test/selectors.spec.js index 46d9ab52..e0169670 100644 --- a/src/store/project/_test/selectors.spec.js +++ b/src/store/project/_test/selectors.spec.js @@ -11,7 +11,7 @@ test('(Selector) project - getProjectData', (t) => { sketches: '@@sketches', params: '@@params', displays: '@@displays', - clock: '@@clock' + clock: '@@clock', } deepFreeze(state) @@ -19,7 +19,7 @@ test('(Selector) project - getProjectData', (t) => { project: '@@project', inputs: '@@inputs', sketches: '@@sketches', - params: '@@params' + params: '@@params', } const actual = getProjectData(state) @@ -31,8 +31,8 @@ test('(Selector) project - getProjectData', (t) => { test('(Selector) project - getProjectFilepath', (t) => { const state = { project: { - filePath: 'some/path' - } + filePath: 'some/path', + }, } deepFreeze(state) diff --git a/src/store/project/actions.js b/src/store/project/actions.js index 8deb55a5..101cd87a 100644 --- a/src/store/project/actions.js +++ b/src/store/project/actions.js @@ -1,24 +1,24 @@ export function projectSave () { return { - type: 'PROJECT_SAVE' + type: 'PROJECT_SAVE', } } export function projectLoad () { return { - type: 'PROJECT_LOAD' + type: 'PROJECT_LOAD', } } export function projectSaveAs () { return { - type: 'PROJECT_SAVE_AS' + type: 'PROJECT_SAVE_AS', } } export function projectLoadRequest () { return { - type: 'PROJECT_LOAD_REQUEST' + type: 'PROJECT_LOAD_REQUEST', } } @@ -26,8 +26,8 @@ export function projectRehydrate (data) { return { type: 'PROJECT_REHYDRATE', payload: { - data - } + data, + }, } } @@ -35,8 +35,8 @@ export function projectLoadSuccess (data) { return { type: 'PROJECT_LOAD_SUCCESS', payload: { - data - } + data, + }, } } @@ -44,8 +44,8 @@ export function projectFilepathUpdate (filePath) { return { type: 'PROJECT_FILEPATH_UPDATE', payload: { - filePath - } + filePath, + }, } } @@ -54,8 +54,8 @@ export function projectChooseSketchesFolder (disableRedirect, createSceneAfter) type: 'PROJECT_CHOOSE_SKETCHES_FOLDER', payload: { disableRedirect, - createSceneAfter - } + createSceneAfter, + }, } } @@ -63,8 +63,8 @@ export function projectSketchesPathUpdate (path) { return { type: 'PROJECT_SKETCHES_PATH_UPDATE', payload: { - path - } + path, + }, } } @@ -72,8 +72,8 @@ export function projectError (message, meta) { return { type: 'PROJECT_ERROR', payload: { - message, meta - } + message, meta, + }, } } @@ -81,8 +81,8 @@ export function projectErrorAdd (message) { return { type: 'PROJECT_ERROR_ADD', payload: { - message - } + message, + }, } } @@ -91,13 +91,13 @@ export function projectErrorPopupOpen (message, code) { type: 'PROJECT_ERROR_POPUP_OPEN', payload: { message, - code - } + code, + }, } } export function projectErrorPopupClose (message, type) { return { - type: 'PROJECT_ERROR_POPUP_CLOSE' + type: 'PROJECT_ERROR_POPUP_CLOSE', } } diff --git a/src/store/project/reducer.js b/src/store/project/reducer.js index 6a7bc420..1b0a2458 100644 --- a/src/store/project/reducer.js +++ b/src/store/project/reducer.js @@ -2,7 +2,7 @@ const defaultState = { filePath: undefined, sketchesPath: undefined, errors: [], - errorPopup: false + errorPopup: false, } const projectReducer = (state = defaultState, action) => { @@ -12,19 +12,19 @@ const projectReducer = (state = defaultState, action) => { case 'PROJECT_FILEPATH_UPDATE': { return { ...state, - filePath: p.filePath + filePath: p.filePath, } } case 'PROJECT_SKETCHES_PATH_UPDATE': { return { ...state, - sketchesPath: p.path + sketchesPath: p.path, } } case 'PROJECT_ERROR_ADD': { return { ...state, - errors: [...state.errors, p.message] + errors: [...state.errors, p.message], } } case 'PROJECT_ERROR_POPUP_OPEN': { @@ -32,14 +32,14 @@ const projectReducer = (state = defaultState, action) => { ...state, errorPopup: { message: p.message, - code: p.code - } + code: p.code, + }, } } case 'PROJECT_ERROR_POPUP_CLOSE': { return { ...state, - errorPopup: false + errorPopup: false, } } default: diff --git a/src/store/project/sagas.js b/src/store/project/sagas.js index e55906f5..2d8a2af6 100644 --- a/src/store/project/sagas.js +++ b/src/store/project/sagas.js @@ -4,18 +4,18 @@ import { getProjectData, getProjectFilepath } from './selectors' import getCurrentSceneId from '../../selectors/getCurrentSceneId' import { projectLoadSuccess, projectRehydrate, projectError, projectSaveAs, projectErrorAdd, projectErrorPopupOpen, projectErrorPopupClose, - projectSave, projectLoadRequest, projectFilepathUpdate, projectSketchesPathUpdate + projectSave, projectLoadRequest, projectFilepathUpdate, projectSketchesPathUpdate, } from './actions' import { uSceneCreate } from '../scenes/actions' import history from '../../history' import { remote } from 'electron' const fileFilters = [ - { name: 'JSON', extensions: ['json'] } + { name: 'JSON', extensions: ['json'] }, ] export function* saveAsProject (dispatch) { remote.dialog.showSaveDialog({ - filters: fileFilters + filters: fileFilters, }, filePath => { if (filePath) { @@ -42,7 +42,7 @@ export function* saveProject () { export function* loadProject (dispatch) { remote.dialog.showOpenDialog({ - filters: fileFilters + filters: fileFilters, }, filePath => { if (filePath) { @@ -70,7 +70,7 @@ export function* chooseSketchesFolder (dispatch, action) { const p = action.payload const sceneId = yield select(getCurrentSceneId) remote.dialog.showOpenDialog({ - properties: ['openDirectory'] + properties: ['openDirectory'], }, filePath => { if (filePath) { diff --git a/src/store/rootListener.js b/src/store/rootListener.js index 90e3c232..668ff10e 100644 --- a/src/store/rootListener.js +++ b/src/store/rootListener.js @@ -1,15 +1,21 @@ +import nodesListener from './nodes/listener' import scenesListener from './scenes/listener' import sketchesListener from './sketches/listener' -import linkableActionsListener from './linkableActions/listener' +import inputLinkListener from './inputLinks/listener' +import animListener from './anims/listener' import engineListener from '../engine/listener' +import fileWatchListener from '../fileWatch/listener' export default { types: 'all', handleAction (action, dispatched, store) { + nodesListener(action, store) scenesListener(action, store) sketchesListener(action, store) - linkableActionsListener(action, store) + inputLinkListener(action, store) engineListener(action, store) - } + animListener(action, store) + fileWatchListener(action, store) + }, } diff --git a/src/store/rootReducer.js b/src/store/rootReducer.js index e73a7f2a..b9f84d9e 100644 --- a/src/store/rootReducer.js +++ b/src/store/rootReducer.js @@ -17,24 +17,23 @@ import availableModulesReducer from './availableModules/reducer' import displaysReducer from './displays/reducer' import macroReducer from './macros/reducer' import uiReducer from './ui/reducer' -import linkableActionsReducer from './linkableActions/reducer' import settingsReducer from './settings/reducer' const ignoreList = [ 'CLOCK_PULSE', 'CLOCK_BEAT_INC', 'CLOCK_BPM_UPDATE', 'INPUT_FIRED', - 'NODE_VALUE_UPDATE', 'NODE_VALUES_BATCH_UPDATE' + 'NODE_VALUE_UPDATE', 'NODE_RANGE_UPDATE', 'NODE_VALUES_BATCH_UPDATE', ] const reducers = combineReducers({ - nodes: ignoreActions(nodesReducer, difference(ignoreList, ['NODE_VALUE_UPDATE', 'NODE_VALUES_BATCH_UPDATE'])), + nodes: ignoreActions(nodesReducer, difference(ignoreList, + ['NODE_VALUE_UPDATE', 'NODE_RANGE_UPDATE', 'NODE_VALUES_BATCH_UPDATE'])), availableModules: ignoreActions(availableModulesReducer, ignoreList), scenes: ignoreActions(scenesReducer, ignoreList), sketches: ignoreActions(sketchesReducer, ignoreList), project: ignoreActions(projectReducer, ignoreList), inputs: ignoreActions(inputsReducer, difference(ignoreList, ['INPUT_FIRED'])), inputLinks: ignoreActions(inputLinkReducer, ignoreList), - linkableActions: ignoreActions(linkableActionsReducer, ignoreList), clock: ignoreActions(clockReducer, difference(ignoreList, ['CLOCK_PULSE', 'CLOCK_BEAT_INC', 'CLOCK_BPM_UPDATE'])), midi: ignoreActions(midiReducer, ignoreList), displays: ignoreActions(displaysReducer, ignoreList), @@ -42,14 +41,14 @@ const reducers = combineReducers({ ui: ignoreActions(uiReducer, ignoreList), router: ignoreActions(routerReducer, ignoreList), settings: ignoreActions(settingsReducer, ignoreList), - form: ignoreActions(formReducer, ignoreList) + form: ignoreActions(formReducer, ignoreList), }) const rootReducer = (state = {}, action) => action.type === 'PROJECT_REHYDRATE' -? { - ...state, - ...action.payload.data -} -: reducers(state, action) + ? { + ...state, + ...action.payload.data, + } + : reducers(state, action) export default rootReducer diff --git a/src/store/rootSaga.js b/src/store/rootSaga.js index 6c38e428..cb6d4e25 100644 --- a/src/store/rootSaga.js +++ b/src/store/rootSaga.js @@ -15,6 +15,6 @@ export default function* rootSaga (dispatch) { fork(watchNodes), fork(watchClock), fork(watchWindows), - fork(watchMacros) + fork(watchMacros), ] } diff --git a/src/store/scenes/actions.js b/src/store/scenes/actions.js index cb83a34f..821ec679 100644 --- a/src/store/scenes/actions.js +++ b/src/store/scenes/actions.js @@ -1,48 +1,48 @@ export function rSceneSelectCurrent (id) { return { type: 'R_SCENE_SELECT_CURRENT', - payload: { id } + payload: { id }, } } export function rSceneSelectChannel (id, channel) { return { type: 'R_SCENE_SELECT_CHANNEL', - payload: { id, channel } + payload: { id, channel }, } } export function sceneClearChannel (id) { return { type: 'SCENE_CLEAR_CHANNEL', - payload: { id } + payload: { id }, } } export function uSceneCreate () { return { - type: 'U_SCENE_CREATE' + type: 'U_SCENE_CREATE', } } export function uSceneSelectChannel (id, type) { return { type: 'U_SCENE_SELECT_CHANNEL', - payload: { id, type } + payload: { id, type }, } } export function rSceneCreate (id, scene) { return { type: 'R_SCENE_CREATE', - payload: { id, scene } + payload: { id, scene }, } } export function sceneRename (id, title) { return { type: 'SCENE_RENAME', - payload: { id, title } + payload: { id, title }, } } @@ -50,8 +50,8 @@ export function uSceneDelete (id) { return { type: 'U_SCENE_DELETE', payload: { - id - } + id, + }, } } @@ -59,8 +59,8 @@ export function rSceneDelete (id) { return { type: 'R_SCENE_DELETE', payload: { - id - } + id, + }, } } @@ -68,8 +68,8 @@ export function sceneSketchSelect (id, sketchId) { return { type: 'SCENE_SKETCH_SELECT', payload: { - id, sketchId - } + id, sketchId, + }, } } @@ -77,8 +77,8 @@ export function rSceneSketchAdd (id, sketchId) { return { type: 'R_SCENE_SKETCH_ADD', payload: { - id, sketchId - } + id, sketchId, + }, } } @@ -86,7 +86,7 @@ export function rSceneSketchRemove (id, sketchId) { return { type: 'R_SCENE_SKETCH_REMOVE', payload: { - id, sketchId - } + id, sketchId, + }, } } diff --git a/src/store/scenes/listener.js b/src/store/scenes/listener.js index c43e9c1d..4c0dad0b 100644 --- a/src/store/scenes/listener.js +++ b/src/store/scenes/listener.js @@ -3,7 +3,6 @@ import { rSceneCreate, rSceneDelete, rSceneSelectCurrent, rSceneSelectChannel, sceneClearChannel } from './actions' import { generateSceneLinkableActionIds } from './utils' import { engineSceneAdd, engineSceneRemove } from '../../engine/actions' -import { linkableActionCreate, linkableActionDelete } from '../linkableActions/actions' import { uSketchDelete } from '../sketches/actions' import { uiEditingOpen } from '../ui/actions' import getScene from '../../selectors/getScene' @@ -11,6 +10,7 @@ import getScenes from '../../selectors/getScenes' import getChannelSceneId from '../../selectors/getChannelSceneId' import getSceneCrossfaderValue from '../../selectors/getSceneCrossfaderValue' import history from '../../history' +import { rNodeCreate, uNodeDelete } from '../nodes/actions' const handleSceneCreate = (action, store) => { const state = store.getState() @@ -22,7 +22,12 @@ const handleSceneCreate = (action, store) => { const linkableActionIds = {} for (const key in la) { - store.dispatch(linkableActionCreate(la[key].id, la[key].action)) + const node = { + type: 'linkableAction', + action: la[key].action, + title: la[key].title, + } + store.dispatch(rNodeCreate(la[key].id, node)) linkableActionIds[key] = la[key].id } @@ -31,7 +36,7 @@ const handleSceneCreate = (action, store) => { title: 'New Scene', selectedSketchId: false, sketchIds: [], - linkableActionIds + linkableActionIds, } store.dispatch(rSceneCreate(id, scene)) @@ -60,7 +65,7 @@ const handleSceneDelete = (action, store) => { // Delete linkableActions for (const key in scene.linkableActionIds) { const id = scene.linkableActionIds[key] - store.dispatch(linkableActionDelete(id)) + store.dispatch(uNodeDelete(id)) } store.dispatch(sceneClearChannel(p.id)) diff --git a/src/store/scenes/reducer.js b/src/store/scenes/reducer.js index 05813a9d..4d99df60 100644 --- a/src/store/scenes/reducer.js +++ b/src/store/scenes/reducer.js @@ -5,8 +5,8 @@ const defaultState = { currentSceneId: false, channels: { A: false, - B: false - } + B: false, + }, } const scenesReducer = (state = defaultState, action) => { @@ -21,14 +21,14 @@ const scenesReducer = (state = defaultState, action) => { channels: { ...state.channels, [p.channel]: p.id, - [otherChannel]: otherChannelId === p.id ? false : otherChannelId - } + [otherChannel]: otherChannelId === p.id ? false : otherChannelId, + }, } } case 'R_SCENE_SELECT_CURRENT': { return { ...state, - currentSceneId: p.id + currentSceneId: p.id, } } case 'R_SCENE_CREATE': { @@ -36,14 +36,14 @@ const scenesReducer = (state = defaultState, action) => { ...state, items: { ...state.items, - [p.id]: p.scene - } + [p.id]: p.scene, + }, } } case 'R_SCENE_DELETE': { return { ...state, - items: _.omit(state.items, [p.id]) + items: _.omit(state.items, [p.id]), } } case 'R_SCENE_SKETCH_ADD': { @@ -53,9 +53,9 @@ const scenesReducer = (state = defaultState, action) => { ...state.items, [p.id]: { ...state.items[p.id], - sketchIds: _.union(state.items[p.id].sketchIds, [p.sketchId]) - } - } + sketchIds: _.union(state.items[p.id].sketchIds, [p.sketchId]), + }, + }, } } case 'R_SCENE_SKETCH_REMOVE': { @@ -65,9 +65,9 @@ const scenesReducer = (state = defaultState, action) => { ...state.items, [p.id]: { ...state.items[p.id], - sketchIds: state.items[p.id].sketchIds.filter(item => item !== p.sketchId) - } - } + sketchIds: state.items[p.id].sketchIds.filter(item => item !== p.sketchId), + }, + }, } } case 'SCENE_RENAME': { @@ -77,9 +77,9 @@ const scenesReducer = (state = defaultState, action) => { ...state.items, [p.id]: { ...state.items[p.id], - title: p.title - } - } + title: p.title, + }, + }, } } case 'SCENE_SKETCH_SELECT': { @@ -89,9 +89,9 @@ const scenesReducer = (state = defaultState, action) => { ...state.items, [p.id]: { ...state.items[p.id], - selectedSketchId: p.sketchId - } - } + selectedSketchId: p.sketchId, + }, + }, } } default: diff --git a/src/store/scenes/utils.js b/src/store/scenes/utils.js index 77d8e279..2ee7f67b 100644 --- a/src/store/scenes/utils.js +++ b/src/store/scenes/utils.js @@ -4,22 +4,27 @@ import { rSceneSelectChannel, uSceneSelectChannel, sceneClearChannel } from './a export const generateSceneLinkableActionIds = id => ({ addToA: { action: rSceneSelectChannel(id, 'A'), - id: uid() + id: uid(), + title: 'Add to A', }, addToB: { action: rSceneSelectChannel(id, 'B'), - id: uid() + id: uid(), + title: 'Add to B', }, addToActive: { action: uSceneSelectChannel(id, 'active'), - id: uid() + id: uid(), + title: 'Add to Active', }, addToOpposite: { action: uSceneSelectChannel(id, 'opposite'), - id: uid() + id: uid(), + title: 'Add to Opposite', }, clear: { action: sceneClearChannel(id), - id: uid() - } + id: uid(), + title: 'Clear', + }, }) diff --git a/src/store/setCoreState.js b/src/store/setCoreState.js index ff92add7..0432f831 100644 --- a/src/store/setCoreState.js +++ b/src/store/setCoreState.js @@ -10,7 +10,7 @@ export default store => { title: 'Scene Crossfader', id: 'sceneCrossfader', value: 0, - type: 'param' + type: 'param', } )) @@ -24,31 +24,72 @@ export default store => { options: [ { value: 'mix', - label: 'Mix' + label: 'Mix', }, { value: 'A', - label: 'A' + label: 'A', }, { value: 'B', - label: 'B' - } - ] + label: 'B', + }, + ], } )) - store.dispatch(uNodeCreate('audioNormalizeLevels', { - title: 'Normalize Levels', - type: 'param', - value: 0.5, - id: 'audioNormalizeLevels' + store.dispatch(uNodeCreate('sketchOrganization', { + title: 'Sketch Organization', + type: 'select', + value: 'category', + id: 'sketchOrganization', + options:[ + { + value: 'folder', + label: 'Folder', + }, + { + value: 'category', + label: 'Category', + }, + { + value: 'author', + label: 'Author', + }, + ], })) store.dispatch(uNodeCreate('audioLevelsFalloff', { title: 'Levels Falloff', type: 'param', value: 1, - id: 'audioLevelsFalloff' + id: 'audioLevelsFalloff', + })) + store.dispatch(uNodeCreate('audioLevelsPower', { + title: 'Levels Power', + type: 'param', + value: 0.25, + min: 0.5, + max: 3, + id: 'audioLevelsPower', + })) + store.dispatch(uNodeCreate('audioLevelsSmoothing', { + title: 'Levels Smoothing', + type: 'param', + value: 0, + id: 'audioLevelsSmoothing', + })) + + store.dispatch(uNodeCreate('audioNormalizeLevels', { + title: 'Normalize Levels', + type: 'param', + value: 0.5, + id: 'audioNormalizeLevels', + })) + store.dispatch(uNodeCreate('audioNormalizeRangeFalloff', { + title: 'Normalized Range Falloff', + type: 'param', + value: 0.01, + id: 'audioNormalizeRangeFalloff', })) } diff --git a/src/store/settings/actions.js b/src/store/settings/actions.js index 154dc419..eddbd948 100644 --- a/src/store/settings/actions.js +++ b/src/store/settings/actions.js @@ -1,6 +1,6 @@ export function settingsUpdate (items) { return { type: 'SETTINGS_UPDATE', - payload: { items } + payload: { items }, } } diff --git a/src/store/settings/reducer.js b/src/store/settings/reducer.js index 62fbcee7..efc1cb5f 100644 --- a/src/store/settings/reducer.js +++ b/src/store/settings/reducer.js @@ -4,7 +4,8 @@ const defaultState = { aspectW: 16, aspectH: 9, antialias: false, - throttledFPS: 60 + throttledFPS: 60, + watchSketchesDir: true, } const settingsReducer = (state = defaultState, action) => { @@ -14,7 +15,7 @@ const settingsReducer = (state = defaultState, action) => { case 'SETTINGS_UPDATE': { return { ...state, - ...p.items + ...p.items, } } default: diff --git a/src/store/sketches/_test/actions.spec.js b/src/store/sketches/_test/actions.spec.js index 8eacf859..ab5065bc 100644 --- a/src/store/sketches/_test/actions.spec.js +++ b/src/store/sketches/_test/actions.spec.js @@ -7,8 +7,8 @@ test('(Action Creator) sketchCreate', (t) => { type: 'SKETCH_CREATE', payload: { id: 'XXX', - sketch: { foo: 'bar' } - } + sketch: { foo: 'bar' }, + }, } t.deepEqual(actual, expected, 'Creates action to add a sketch') t.end() @@ -19,8 +19,8 @@ test('(Action Creator) sketchDelete', (t) => { let expected = { type: 'SKETCH_DELETE', payload: { - id: 'XXX' - } + id: 'XXX', + }, } t.deepEqual(actual, expected, 'Creates action to remove a sketch') t.end() @@ -32,8 +32,8 @@ test('(Action Creator) sketchesReplaceAll', (t) => { let expected = { type: 'SKETCHES_REPLACE_ALL', payload: { - sketches - } + sketches, + }, } t.deepEqual(actual, expected, 'Creates action to replace all sketches') t.end() diff --git a/src/store/sketches/_test/reducer.spec.js b/src/store/sketches/_test/reducer.spec.js index 58613d88..6d477dc8 100644 --- a/src/store/sketches/_test/reducer.spec.js +++ b/src/store/sketches/_test/reducer.spec.js @@ -1,7 +1,7 @@ import test from 'tape' import deepFreeze from 'deep-freeze' import sketchesReducer from '../reducer' -import { sketchNodeOpenedToggle } from '../actions' +import { rSketchNodeOpenedToggle } from '../actions' import { returnsPreviousState } from '../../../testUtils' returnsPreviousState(sketchesReducer) @@ -11,8 +11,8 @@ test('(Reducer) sketchesReducer - Adds new sketch on SKETCH_CREATE', (t) => { s01: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p01', 'p02'] - } + paramIds: ['p01', 'p02'], + }, } deepFreeze(originalState) @@ -21,13 +21,13 @@ test('(Reducer) sketchesReducer - Adds new sketch on SKETCH_CREATE', (t) => { s01: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p01', 'p02'] + paramIds: ['p01', 'p02'], }, UID0: { moduleId: 'swirly', title: 'Swirly', - paramIds: ['UID1', 'UID2'] - } + paramIds: ['UID1', 'UID2'], + }, } const actual = sketchesReducer(originalState, { @@ -37,9 +37,9 @@ test('(Reducer) sketchesReducer - Adds new sketch on SKETCH_CREATE', (t) => { sketch: { moduleId: 'swirly', title: 'Swirly', - paramIds: ['UID1', 'UID2'] - } - } + paramIds: ['UID1', 'UID2'], + }, + }, }) t.deepEqual(actual, expectedState, 'Adds new item') @@ -53,13 +53,13 @@ test('(Reducer) sketchesReducer - Removes sketch on SKETCH_DELETE', (t) => { s01: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p01', 'p02'] + paramIds: ['p01', 'p02'], }, s02: { moduleId: 'swirly', title: 'Swirly 1', - paramIds: ['p03', 'p04'] - } + paramIds: ['p03', 'p04'], + }, } deepFreeze(originalState) @@ -68,15 +68,15 @@ test('(Reducer) sketchesReducer - Removes sketch on SKETCH_DELETE', (t) => { s01: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p01', 'p02'] - } + paramIds: ['p01', 'p02'], + }, } actual = sketchesReducer(originalState, { type: 'SKETCH_DELETE', payload: { - id: 's02' - } + id: 's02', + }, }) t.deepEqual(actual, expectedState, 'Removes item') @@ -86,8 +86,8 @@ test('(Reducer) sketchesReducer - Removes sketch on SKETCH_DELETE', (t) => { actual = sketchesReducer(actual, { type: 'SKETCH_DELETE', payload: { - id: 's01' - } + id: 's01', + }, }) t.deepEqual(actual, expectedState, 'Removes item') @@ -102,31 +102,31 @@ test('(Reducer) sketchesReducer - Replaces sketches on SKETCHES_REPLACE_ALL', (t sAA: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p11', 'p2'] + paramIds: ['p11', 'p2'], }, sBB: { moduleId: 'swirly', title: 'Swirly 1', - paramIds: ['p03', 'p04'] + paramIds: ['p03', 'p04'], }, sCC: { moduleId: 'swirly', title: 'Swirly 2', - paramIds: ['p55', 'p04'] - } + paramIds: ['p55', 'p04'], + }, } originalState = { s01: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p01', 'p02'] + paramIds: ['p01', 'p02'], }, s02: { moduleId: 'swirly', title: 'Swirly 1', - paramIds: ['p03', 'p04'] - } + paramIds: ['p03', 'p04'], + }, } deepFreeze(originalState) @@ -134,8 +134,8 @@ test('(Reducer) sketchesReducer - Replaces sketches on SKETCHES_REPLACE_ALL', (t actual = sketchesReducer(originalState, { type: 'SKETCHES_REPLACE_ALL', payload: { - sketches: newSketches - } + sketches: newSketches, + }, }) t.deepEqual(actual, newSketches, 'Replaces all sketches') @@ -150,31 +150,31 @@ test('(Reducer) sketchesReducer - Replaces sketches on SKETCHES_REPLACE_ALL', (t sAA: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p11', 'p2'] + paramIds: ['p11', 'p2'], }, sBB: { moduleId: 'swirly', title: 'Swirly 1', - paramIds: ['p03', 'p04'] + paramIds: ['p03', 'p04'], }, sCC: { moduleId: 'swirly', title: 'Swirly 2', - paramIds: ['p55', 'p04'] - } + paramIds: ['p55', 'p04'], + }, } originalState = { s01: { moduleId: 'cubey', title: 'Cubey 1', - paramIds: ['p01', 'p02'] + paramIds: ['p01', 'p02'], }, s02: { moduleId: 'swirly', title: 'Swirly 1', - paramIds: ['p03', 'p04'] - } + paramIds: ['p03', 'p04'], + }, } deepFreeze(originalState) @@ -182,8 +182,8 @@ test('(Reducer) sketchesReducer - Replaces sketches on SKETCHES_REPLACE_ALL', (t actual = sketchesReducer(originalState, { type: 'SKETCHES_REPLACE_ALL', payload: { - sketches: newSketches - } + sketches: newSketches, + }, }) t.deepEqual(actual, newSketches, 'Replaces all sketches') @@ -199,16 +199,14 @@ test('(Reducer) sketchesReducer - SKETCH_NODE_OPENED_TOGGLE', (t) => { moduleId: 'cubey', title: 'Cubey 1', paramIds: ['p01', 'p02'], - openedNodes: {} + openedNodeId: undefined, }, s02: { moduleId: 'swirly', title: 'Swirly 1', paramIds: ['p03', 'p04'], - openedNodes: { - param: 'p03' - } - } + openedNodeId: 'p03', + }, } expected = { @@ -216,23 +214,19 @@ test('(Reducer) sketchesReducer - SKETCH_NODE_OPENED_TOGGLE', (t) => { moduleId: 'cubey', title: 'Cubey 1', paramIds: ['p01', 'p02'], - openedNodes: { - param: 'p01' - } + openedNodeId: 'p01', }, s02: { moduleId: 'swirly', title: 'Swirly 1', paramIds: ['p03', 'p04'], - openedNodes: { - param: 'p03' - } - } + openedNodeId: 'p03', + }, } deepFreeze(original) - actual = sketchesReducer(original, sketchNodeOpenedToggle('s01', 'p01', 'param')) + actual = sketchesReducer(original, rSketchNodeOpenedToggle('s01', 'p01')) t.deepEqual(actual, expected, 'Adds param id when undefined') @@ -241,21 +235,17 @@ test('(Reducer) sketchesReducer - SKETCH_NODE_OPENED_TOGGLE', (t) => { moduleId: 'cubey', title: 'Cubey 1', paramIds: ['p01', 'p02'], - openedNodes: { - param: 'p02' - } + openedNodeId: 'p02', }, s02: { moduleId: 'swirly', title: 'Swirly 1', paramIds: ['p03', 'p04'], - openedNodes: { - param: 'p03' - } - } + openedNodeId: 'p03', + }, } - actual = sketchesReducer(actual, sketchNodeOpenedToggle('s01', 'p02', 'param')) + actual = sketchesReducer(actual, rSketchNodeOpenedToggle('s01', 'p02')) t.deepEqual(actual, expected, 'Changes param id when different') @@ -264,47 +254,19 @@ test('(Reducer) sketchesReducer - SKETCH_NODE_OPENED_TOGGLE', (t) => { moduleId: 'cubey', title: 'Cubey 1', paramIds: ['p01', 'p02'], - openedNodes: { - param: 'p02' - } + openedNodeId: 'p02', }, s02: { moduleId: 'swirly', title: 'Swirly 1', paramIds: ['p03', 'p04'], - openedNodes: { - param: undefined - } - } - } - - actual = sketchesReducer(actual, sketchNodeOpenedToggle('s02', 'p03', 'param')) - - t.deepEqual(actual, expected, 'Switches param id to undefined if receives the same id') - - expected = { - s01: { - moduleId: 'cubey', - title: 'Cubey 1', - paramIds: ['p01', 'p02'], - openedNodes: { - param: 'p02', - shot: 'sh01' - } + openedNodeId: undefined, }, - s02: { - moduleId: 'swirly', - title: 'Swirly 1', - paramIds: ['p03', 'p04'], - openedNodes: { - param: undefined - } - } } - actual = sketchesReducer(actual, sketchNodeOpenedToggle('s01', 'sh01', 'shot')) + actual = sketchesReducer(actual, rSketchNodeOpenedToggle('s02', 'p03')) - t.deepEqual(actual, expected, 'Handles adding shot id') + t.deepEqual(actual, expected, 'Switches param id to undefined if receives the same id') t.end() }) diff --git a/src/store/sketches/actions.js b/src/store/sketches/actions.js index 4958659f..55044411 100644 --- a/src/store/sketches/actions.js +++ b/src/store/sketches/actions.js @@ -1,35 +1,35 @@ export function uSketchCreate (moduleId, sceneId) { return { type: 'U_SKETCH_CREATE', - payload: { moduleId, sceneId } + payload: { moduleId, sceneId }, } } export function uSketchDelete (id, sceneId) { return { type: 'U_SKETCH_DELETE', - payload: { id, sceneId } + payload: { id, sceneId }, } } -export function uSketchReimport (id) { +export function uSketchReloadFile (id) { return { - type: 'U_SKETCH_REIMPORT', - payload: { id } + type: 'U_SKETCH_RELOAD_FILE', + payload: { id }, } } export function sketchCreate (id, sketch) { return { type: 'SKETCH_CREATE', - payload: { id, sketch } + payload: { id, sketch }, } } export function sketchDelete (id) { return { type: 'SKETCH_DELETE', - payload: { id } + payload: { id }, } } @@ -37,21 +37,35 @@ export function sketchesReplaceAll (sketches) { return { type: 'SKETCHES_REPLACE_ALL', payload: { - sketches - } + sketches, + }, } } -export function sketchNodeOpenedToggle (sketchId, nodeId, nodeType) { +export function uSketchNodeOpenedToggle (nodeId) { return { - type: 'SKETCH_NODE_OPENED_TOGGLE', - payload: { sketchId, nodeId, nodeType } + type: 'U_SKETCH_NODE_OPENED_TOGGLE', + payload: { nodeId }, + } +} + +export function rSketchNodeOpenedToggle (sketchId, nodeId) { + return { + type: 'R_SKETCH_NODE_OPENED_TOGGLE', + payload: { sketchId, nodeId }, + } +} + +export function sketchNodeOpenedClose (sketchId) { + return { + type: 'SKETCH_NODE_OPENED_CLOSE', + payload: { sketchId }, } } export function sketchUpdate (sketchId, obj) { return { type: 'SKETCH_UPDATE', - payload: { sketchId, obj } + payload: { sketchId, obj }, } } diff --git a/src/store/sketches/listener.js b/src/store/sketches/listener.js index c25a6c64..99bfe8e4 100644 --- a/src/store/sketches/listener.js +++ b/src/store/sketches/listener.js @@ -1,4 +1,7 @@ -import { sketchCreate, sketchDelete, sketchUpdate } from './actions' +import uid from 'uid' +import path from 'path' + +import { sketchCreate, sketchDelete, sketchUpdate, rSketchNodeOpenedToggle } from './actions' import { rSceneSketchAdd, rSceneSketchRemove, sceneSketchSelect } from '../scenes/actions' import { uNodeCreate, uNodeDelete, nodeUpdate } from '../nodes/actions' import { engineSceneSketchAdd, engineSceneSketchDelete } from '../../engine/actions' @@ -10,7 +13,35 @@ import getSketchParamIds from '../../selectors/getSketchParamIds' import getSketchShotIds from '../../selectors/getSketchShotIds' import getCurrentSceneId from '../../selectors/getCurrentSceneId' import history from '../../history' -import uid from 'uid' +import getSketchesPath from '../../selectors/getSketchesPath' +import getModuleSketchIds from '../../selectors/getModuleSketchIds' +import { reloadSingleSketchModule, removeSketchFromScene, + addSketchToScene, reloadSingleSketchConfig } from '../../engine' +import { uMacroTargetParamLinkDelete } from '../macros/actions' + +const generateParamFromConfig = (paramConfig, id, sketchId) => ({ + id, + sketchId, + title: paramConfig.title ? paramConfig.title : paramConfig.key, + type: 'param', + key: paramConfig.key, + value: paramConfig.defaultValue, + hidden: paramConfig.hidden === undefined ? false : paramConfig.hidden, + min: paramConfig.defaultMin ? paramConfig.defaultMin : 0, + max: paramConfig.defaultMax ? paramConfig.defaultMax : 1, + defaultMin: paramConfig.defaultMin ? paramConfig.defaultMin : 0, + defaultMax: paramConfig.defaultMax ? paramConfig.defaultMax : 1, + inputLinkIds: [], +}) + +const paramDelete = (paramId, store) => { + const state = store.getState() + const param = getNode(state, paramId) + param.connectedMacroIds.forEach(macroId => { + store.dispatch(uMacroTargetParamLinkDelete(macroId, param.id)) + }) + store.dispatch(uNodeDelete(paramId)) +} const handleSketchCreate = (action, store) => { let uniqueId @@ -34,14 +65,12 @@ const handleSketchCreate = (action, store) => { uniqueId = uid() paramIds.push(uniqueId) - store.dispatch(uNodeCreate(uniqueId, { - title: param.title, - type: 'param', - key: param.key, - value: param.defaultValue, - id: uniqueId, - inputLinkIds - })) + store.dispatch( + uNodeCreate( + uniqueId, + generateParamFromConfig(param, uniqueId, uniqueSketchId) + ) + ) } } @@ -57,7 +86,7 @@ const handleSketchCreate = (action, store) => { title: shot.title, method: shot.method, sketchId: uniqueSketchId, - inputLinkIds + inputLinkIds, })) } } @@ -67,7 +96,6 @@ const handleSketchCreate = (action, store) => { moduleId: moduleId, paramIds, shotIds, - openedNodes: {} })) store.dispatch(sceneSketchSelect(sceneId, uniqueSketchId)) @@ -87,7 +115,7 @@ const handleSketchDelete = (action, store) => { store.dispatch(rSceneSketchRemove(sceneId, id)) for (let i = 0; i < paramIds.length; i++) { - store.dispatch(uNodeDelete(paramIds[i])) + paramDelete(paramIds[i], store) } const shotIds = getSketchShotIds(state, id) @@ -107,28 +135,51 @@ const handleSketchDelete = (action, store) => { history.push('/scenes/view/' + sceneId) } -const handleSketchReimport = (action, store) => { +const handleSketchNodeOpenedToggle = (action, store) => { + const state = store.getState() + const node = getNode(state, action.payload.nodeId) + store.dispatch(rSketchNodeOpenedToggle(node.sketchId, node.id)) +} + +const sketchReimport = (sketchId, store) => { const state = store.getState() - const id = action.payload.id - const sketch = getSketch(state, id) - const module = getModule(state, sketch.moduleId) + const sketch = getSketch(state, sketchId) + const sketchModule = getModule(state, sketch.moduleId) let paramIds = sketch.paramIds let shotIds = sketch.shotIds const sketchParams = {} const sketchShots = {} - for (let i = 0; i < paramIds.length; i++) { + const moduleParams = sketchModule.params + const moduleShots = sketchModule.shots + + // loop through current params (backwards because we might delete some!) + for (let i = paramIds.length - 1; i > -1; i--) { const param = getNode(state, paramIds[i]) - sketchParams[param.key] = param + const found = moduleParams.find(moduleParam => moduleParam.key === param.key) + + if (found) { + sketchParams[param.key] = param + } else { + // if param doesnt match with new params, remove the node + paramIds = paramIds.filter(id => param.id !== id) + paramDelete(param.id, store) + } } - for (let i = 0; i < shotIds.length; i++) { + // loop through current shots (backwards because we might delete some!) + for (let i = shotIds.length - 1; i > -1; i--) { const shot = getNode(state, shotIds[i]) - sketchShots[shot.method] = shot - } + const found = moduleShots.find(moduleShot => moduleShot.method === shot.method) - const moduleParams = module.params - const moduleShots = module.shots + if (found) { + sketchShots[shot.method] = shot + } else { + // if shot doesnt match with new shots, remove the node + shotIds = shotIds.filter(id => shot.id !== id) + store.dispatch(uNodeDelete(shot.id)) + } + } // Look through the loaded module's params for new ones for (let i = 0; i < moduleParams.length; i++) { @@ -139,20 +190,23 @@ const handleSketchReimport = (action, store) => { // If module param doesnt exist in sketch, it needs to be created const uniqueId = uid() paramIds = [ - ...paramIds.slice(0, i), uniqueId, ...paramIds.slice(i) + ...paramIds.slice(0, i), uniqueId, ...paramIds.slice(i), ] - store.dispatch(uNodeCreate(uniqueId, { - title: moduleParam.title, - type: 'param', - key: moduleParam.key, - value: moduleParam.defaultValue, - id: uniqueId, - inputLinkIds: [] - })) + store.dispatch( + uNodeCreate( + uniqueId, + generateParamFromConfig(moduleParam, uniqueId, sketchId) + ) + ) } else { - // If param does exist, the title may still change + // If param does exist, some properties may have changed (e.g. title, defaultMin, defaultMax, hidden) const id = sketchParam.id - store.dispatch(nodeUpdate(id, { title: moduleParam.title })) + store.dispatch(nodeUpdate(id, { + title: moduleParam.title ? moduleParam.title : moduleParam.key, + defaultMin: moduleParam.defaultMin ? moduleParam.defaultMin : 0, + defaultMax: moduleParam.defaultMax ? moduleParam.defaultMax : 1, + hidden: moduleParam.hidden === undefined ? false : moduleParam.hidden, + })) } } @@ -165,7 +219,7 @@ const handleSketchReimport = (action, store) => { // If module shot doesnt exist in sketch, it needs to be created const uniqueId = uid() shotIds = [ - ...shotIds.slice(0, i), uniqueId, ...shotIds.slice(i) + ...shotIds.slice(0, i), uniqueId, ...shotIds.slice(i), ] store.dispatch(uNodeCreate(uniqueId, { id: uniqueId, @@ -173,8 +227,8 @@ const handleSketchReimport = (action, store) => { type: 'shot', title: moduleShot.title, method: moduleShot.method, - sketchId: id, - inputLinkIds: [] + sketchId: sketchId, + inputLinkIds: [], })) } else { // If param does exist, the title may still change @@ -183,7 +237,66 @@ const handleSketchReimport = (action, store) => { } } - store.dispatch(sketchUpdate(id, { paramIds, shotIds })) + store.dispatch(sketchUpdate(sketchId, { paramIds, shotIds })) +} + +// Reload the index file for a sketch module but not the config +const moduleReloadFile = (moduleId, state) => { + const sketchesPath = getSketchesPath(state) + const moduleFilePathArray = getModule(state, moduleId).filePathArray + const moduleSketchIds = getModuleSketchIds(state, moduleId) + + const modulePath = path.join(sketchesPath, moduleFilePathArray.join('/'), moduleId) + + // Reload updated module into app + reloadSingleSketchModule(modulePath, moduleId, moduleFilePathArray) + + // Loop all sketches that are of this module, remove them from webGL scene and add them again + moduleSketchIds.forEach(obj => { + // These funcs only affect the scene, not the application state, so won't destroy params etc + removeSketchFromScene(obj.sceneId, obj.sketchId) + addSketchToScene(obj.sceneId, obj.sketchId, moduleId) + }) +} + +const handleModuleReloadFile = (action, store) => { + const state = store.getState() + moduleReloadFile(action.payload.moduleId, state) +} + +// Reload config file and update params for all sketches using that module +// Also reloads module +const handleConfigReloadFile = (action, store) => { + const state = store.getState() + const moduleId = action.payload.moduleId + const sketchesPath = getSketchesPath(state) + const moduleSketchIds = getModuleSketchIds(state, moduleId) + const moduleFilePathArray = getModule(state, moduleId).filePathArray + const modulePath = path.join(sketchesPath, moduleFilePathArray.join('/'), moduleId) + + moduleSketchIds.forEach(obj => { + reloadSingleSketchConfig(modulePath, moduleId, moduleFilePathArray) + sketchReimport(obj.sketchId, store) + }) + + moduleReloadFile(moduleId, state) +} + +// Reload config file and update params for just one sketch using that module +// Also reloads module +const handleSketchReimport = (action, store) => { + const state = store.getState() + const sketchId = action.payload.id + const sketch = getSketch(state, sketchId) + const moduleId = sketch.moduleId + + const sketchesPath = getSketchesPath(state) + const moduleFilePathArray = getModule(state, moduleId).filePathArray + const modulePath = path.join(sketchesPath, moduleFilePathArray.join('/'), moduleId) + + reloadSingleSketchConfig(modulePath, moduleId, moduleFilePathArray) + sketchReimport(sketchId, store) + moduleReloadFile(moduleId, state) } export default (action, store) => { @@ -194,8 +307,17 @@ export default (action, store) => { case 'U_SKETCH_DELETE': handleSketchDelete(action, store) break - case 'U_SKETCH_REIMPORT': + case 'U_SKETCH_NODE_OPENED_TOGGLE': + handleSketchNodeOpenedToggle(action, store) + break + case 'U_SKETCH_RELOAD_FILE': handleSketchReimport(action, store) break + case 'FILE_SKETCH_MODULE_CHANGED': + handleModuleReloadFile(action, store) + break + case 'FILE_SKETCH_CONFIG_CHANGED': + handleConfigReloadFile(action, store) + break } } diff --git a/src/store/sketches/reducer.js b/src/store/sketches/reducer.js index f8336c5f..dd78348b 100644 --- a/src/store/sketches/reducer.js +++ b/src/store/sketches/reducer.js @@ -9,7 +9,7 @@ const sketchesReducer = (state = defaultState, action) => { case 'SKETCH_CREATE': { return { ...state, - [p.id]: p.sketch + [p.id]: p.sketch, } } case 'SKETCH_DELETE': { @@ -18,16 +18,22 @@ const sketchesReducer = (state = defaultState, action) => { case 'SKETCHES_REPLACE_ALL': { return p.sketches } - case 'SKETCH_NODE_OPENED_TOGGLE': { + case 'R_SKETCH_NODE_OPENED_TOGGLE': { return { ...state, [p.sketchId]: { ...state[p.sketchId], - openedNodes: { - ...state[p.sketchId].openedNodes, - [p.nodeType]: p.nodeId !== state[p.sketchId].openedNodes[p.nodeType] ? p.nodeId : undefined - } - } + openedNodeId: p.nodeId !== state[p.sketchId].openedNodeId ? p.nodeId : undefined, + }, + } + } + case 'SKETCH_NODE_OPENED_CLOSE': { + return { + ...state, + [p.sketchId]: { + ...state[p.sketchId], + openedNodeId: undefined, + }, } } case 'SKETCH_UPDATE': { @@ -35,8 +41,8 @@ const sketchesReducer = (state = defaultState, action) => { ...state, [p.sketchId]: { ...state[p.sketchId], - ...p.obj - } + ...p.obj, + }, } } default: diff --git a/src/store/ui/actions.js b/src/store/ui/actions.js index 86d2631a..6423e36d 100644 --- a/src/store/ui/actions.js +++ b/src/store/ui/actions.js @@ -2,8 +2,8 @@ export function uiPanelResize (panelName, value) { return { type: 'UI_PANEL_RESIZE', payload: { - panelName, value - } + panelName, value, + }, } } @@ -11,8 +11,8 @@ export function uiEditingOpen (type, id) { return { type: 'UI_EDITING_OPEN', payload: { - type, id - } + type, id, + }, } } @@ -20,14 +20,14 @@ export function uiEditingToggle (type, id) { return { type: 'UI_EDITING_TOGGLE', payload: { - type, id - } + type, id, + }, } } export function uiEditingClose () { return { - type: 'UI_EDITING_CLOSE' + type: 'UI_EDITING_CLOSE', } } @@ -35,7 +35,22 @@ export function uiNodeToggleOpen (id) { return { type: 'UI_NODE_TOGGLE_OPEN', payload: { - id - } + id, + }, + } +} + +export function uiNodeClose () { + return { + type: 'UI_NODE_CLOSE', + } +} + +export function uiAuxToggleOpen (id) { + return { + type: 'UI_AUX_TOGGLE_OPEN', + payload: { + id, + }, } } diff --git a/src/store/ui/reducer.js b/src/store/ui/reducer.js index 1d9bc70f..821626d9 100644 --- a/src/store/ui/reducer.js +++ b/src/store/ui/reducer.js @@ -1,11 +1,14 @@ import { LOCATION_CHANGE } from 'react-router-redux' +import _ from 'lodash' const defaultState = { panelWidths: { - left: 50 + left: 50, }, isEditing: false, - openedNode: false + openedNode: false, + auxOpen: [], + addSketchOpen: {}, } const uiReducer = (state = defaultState, action) => { @@ -17,8 +20,8 @@ const uiReducer = (state = defaultState, action) => { ...state, panelWidths: { ...state.panelWidths, - left: p.value - } + left: p.value, + }, } } case 'UI_EDITING_OPEN': { @@ -26,33 +29,56 @@ const uiReducer = (state = defaultState, action) => { ...state, isEditing: { id: p.id, - type: p.type - } + type: p.type, + }, } } case 'UI_EDITING_TOGGLE': { + const newEditing = { + id: p.id, + type: p.type, + } + return { ...state, - isEditing: state.isEditing + isEditing: _.isEqual(state.isEditing, newEditing) ? false - : { - id: p.id, - type: p.type - } + : newEditing, } } case 'UI_EDITING_CLOSE': case LOCATION_CHANGE: - { - return { - ...state, - isEditing: false - } + { + return { + ...state, + isEditing: false, } + } case 'UI_NODE_TOGGLE_OPEN': { return { ...state, - openedNode: p.id === state.openedNode ? false : p.id + openedNode: p.id === state.openedNode ? false : p.id, + } + } + case 'UI_NODE_CLOSE': { + return { + ...state, + openedNode: false, + } + } + case 'UI_AUX_TOGGLE_OPEN': { + let items = state.auxOpen + // If item exists, remove + if (items.includes(p.id)) { + items = items.filter(item => item !== p.id) + } else { + // If item doesn't exist, add + items = [ ...items, p.id ] + } + + return { + ...state, + auxOpen: items, } } default: diff --git a/src/store/windows/_test/actions.spec.js b/src/store/windows/_test/actions.spec.js index df4354a1..5f6414fb 100644 --- a/src/store/windows/_test/actions.spec.js +++ b/src/store/windows/_test/actions.spec.js @@ -6,8 +6,8 @@ test('(Action Creator) windowSendOutput', (t) => { let expected = { type: 'WINDOW_SEND_OUTPUT', payload: { - index: 1 - } + index: 1, + }, } t.deepEqual(actual, expected, 'Creates action to send visual output to external monitor') t.end() diff --git a/src/store/windows/actions.js b/src/store/windows/actions.js index 9cd75cf7..5f1f3d71 100644 --- a/src/store/windows/actions.js +++ b/src/store/windows/actions.js @@ -2,7 +2,7 @@ export function windowSendOutput (index) { return { type: 'WINDOW_SEND_OUTPUT', payload: { - index - } + index, + }, } } diff --git a/src/style.css b/src/style.css index f9d2eca1..823a4c50 100644 --- a/src/style.css +++ b/src/style.css @@ -12,6 +12,15 @@ html { body { margin: 0; font-size: 0.8rem; + overflow: hidden; +} + +p a { + color: #DA5782; +} + +p { + margin-top: 0; } ul { @@ -24,50 +33,17 @@ h1, h2, h3, h4, h5, h6 { margin: 0 0 0.5rem; } -.Select-arrow-zone { - padding-right: 0; -} - -.Select-control { - background: #222222 !important; - text-transform: uppercase; - font-size: 0.5rem; - border: 0; - border-radius: 0; - height: auto; - cursor: pointer; -} - -.Select-input { - height: 1rem -} - -.Select-value { - line-height: 1rem !important; +::-webkit-scrollbar-track +{ + background-color: #333; } -.Select-value-label { - color: white !important; +::-webkit-scrollbar +{ + width: 5px; } -.Select-menu-outer { - max-height: 300px; - background: #222222 !important; - color: white; - z-index: 5; -} -.Select-menu { - max-height: 300px; - background: #222222 !important; -} -.Select-option { - background: #222222; -} -.Select-option.is-focused { - background: #333; - color: white; -} -.Select-option.is-selected { - background: white; - color: black; +::-webkit-scrollbar-thumb +{ + background-color: #DA5782; } diff --git a/src/testUtils/index.js b/src/testUtils/index.js index e76bb881..ca214a40 100644 --- a/src/testUtils/index.js +++ b/src/testUtils/index.js @@ -10,8 +10,8 @@ export const returnsPreviousState = (reducer) => { 'lorem': ['ipsum', 'dollar'], 'hello': { world1: 1, - world2: 2 - } + world2: 2, + }, } deepFreeze(expectedState) diff --git a/src/utils/animGenerateOptions/index.js b/src/utils/animGenerateOptions/index.js new file mode 100644 index 00000000..46044e40 --- /dev/null +++ b/src/utils/animGenerateOptions/index.js @@ -0,0 +1,65 @@ +import uid from 'uid' + +// Generate all tween.js options for easing funcs +const easeCurves = [ + 'Quadratic', + 'Cubic', + 'Quartic', + 'Quintic', + 'Sinusoidal', + 'Exponential', + 'Circular', + 'Elastic', + 'Back', + 'Bounce', +] + +const modes = [ 'In', 'Out', 'InOut' ] + +const curveOptions = [ + { + value: 'Linear.None', + label: 'Linear', + }, +] + +easeCurves.forEach(curve => { + modes.forEach(mode => { + const val = `${curve}.${mode}` + curveOptions.push({ + value: val, + label: val, + }) + }) +}) + +export default () => { + return [ + { + title: 'Target Val', + id: uid(), + key: 'targetVal', + value: 1, + inputLinkIds: [], + subNode: true, + }, + { + title: 'Curve', + id: uid(), + key: 'curve', + value: 'Linear.None', + type: 'select', + inputLinkIds: [], + subNode: true, + options: curveOptions, + }, + { + title: 'Duration', + id: uid(), + key: 'duration', + value: 0, + inputLinkIds: [], + subNode: true, + }, + ] +} diff --git a/src/utils/audioGenerateOptions/index.js b/src/utils/audioGenerateOptions/index.js new file mode 100644 index 00000000..ec36cdd4 --- /dev/null +++ b/src/utils/audioGenerateOptions/index.js @@ -0,0 +1,33 @@ +import uid from 'uid' + +export default () => { + return [ + { + title: 'Audio Band', + key: 'audioBand', + type: 'select', + id: uid(), + value: 0, + inputLinkIds: [], + subNode: true, + options: [ + { + value: 0, + label: 'Low', + }, + { + value: 1, + label: 'Low-Mid', + }, + { + value: 2, + label: 'Mid', + }, + { + value: 3, + label: 'High', + }, + ], + }, + ] +} diff --git a/src/utils/debounceInput/index.js b/src/utils/debounceInput/index.js index 0b793843..9262e154 100644 --- a/src/utils/debounceInput/index.js +++ b/src/utils/debounceInput/index.js @@ -3,7 +3,7 @@ const hashTable = {} const startTimer = (hash, count) => { hashTable[hash] = { pass: false, - count: 0 + count: 0, } requestAnimationFrame(() => { @@ -22,7 +22,7 @@ export default (p) => { startTimer(p.inputId) return v.count + 1 } else { - hashTable[p.inputId].count ++ + hashTable[p.inputId].count++ return false } } diff --git a/src/utils/file/_test/file.save.spec.js b/src/utils/file/_test/file.save.spec.js index 4f523c5f..818df634 100644 --- a/src/utils/file/_test/file.save.spec.js +++ b/src/utils/file/_test/file.save.spec.js @@ -4,14 +4,14 @@ import proxyquire from 'proxyquire' const spies = { write: sinon.spy(), - read: sinon.spy() + read: sinon.spy(), } const file = proxyquire('../', { jsonfile: { writeFile: spies.write, - readFile: spies.read - } + readFile: spies.read, + }, }) test('(Util) file.save', (t) => { diff --git a/src/utils/getMidiMode/index.js b/src/utils/getMidiMode/index.js index dc23b8aa..1076a8c7 100644 --- a/src/utils/getMidiMode/index.js +++ b/src/utils/getMidiMode/index.js @@ -12,7 +12,7 @@ const allRels = [1, 63, 65, 127] const relVals = [ [1, 127], // rel1 [65, 63], // rel2 - [1, 65] // rel3 + [1, 65], // rel3 ] let storedVals = [] diff --git a/src/utils/lfoGenerateOptions/index.js b/src/utils/lfoGenerateOptions/index.js index 8bf0eeaa..84aa3e68 100644 --- a/src/utils/lfoGenerateOptions/index.js +++ b/src/utils/lfoGenerateOptions/index.js @@ -13,29 +13,29 @@ export default () => { options: [ { value: 'sine', - label: 'Sine' + label: 'Sine', }, { value: 'square', - label: 'Square' + label: 'Square', }, { value: 'sawtooth', - label: 'Sawtooth' + label: 'Sawtooth', }, { value: 'rSawtooth', - label: 'Revese Sawtooth' + label: 'Revese Sawtooth', }, { value: 'triangle', - label: 'Triangle' + label: 'Triangle', }, { value: 'noise', - label: 'Noise' - } - ] + label: 'Noise', + }, + ], }, { title: 'Rate', @@ -48,49 +48,49 @@ export default () => { options: [ { value: 32, - label: '32' + label: '32', }, { value: 16, - label: '16' + label: '16', }, { value: 8, - label: '8' + label: '8', }, { value: 4, - label: '4' + label: '4', }, { value: 2, - label: '2' + label: '2', }, { value: 1, - label: '1' + label: '1', }, { value: 1 / 2, - label: '1/2' + label: '1/2', }, { value: 1 / 4, - label: '1/4' + label: '1/4', }, { value: 1 / 8, - label: '1/8' + label: '1/8', }, { value: 1 / 16, - label: '1/16' + label: '1/16', }, { value: 1 / 32, - label: '1/32' - } - ] + label: '1/32', + }, + ], }, { title: 'Phase', @@ -98,7 +98,26 @@ export default () => { key: 'phase', value: 0, inputLinkIds: [], - subNode: true - } + subNode: true, + }, + { + title: 'Seed', + id: uid(), + key: 'seed', + value: -1, + type: 'select', + inputLinkIds: [], + subNode: true, + options: (() => { + let options = [] + for (let i = -1; i < 25; i++) { + options.push({ + value: i, + label: i === -1 ? 'auto' : i.toString(), + }) + } + return options + })(), + }, ] } diff --git a/src/utils/lfoProcess/index.js b/src/utils/lfoProcess/index.js index 3f47bef1..84e38313 100644 --- a/src/utils/lfoProcess/index.js +++ b/src/utils/lfoProcess/index.js @@ -2,7 +2,7 @@ import OneDimensionalNoise from '../oneDimensionalNoise' const Noise = new OneDimensionalNoise() const PI2 = Math.PI * 2 -export default (delta, shape, rate, phase) => { +export default (delta, shape, rate, phase, id) => { const x = delta * rate + phase let y @@ -23,7 +23,7 @@ export default (delta, shape, rate, phase) => { y = Math.abs((x % 1) * 2 - 1) break case 'noise': - y = Noise.getValue(x) + y = Noise.getValue(x, id) break } diff --git a/src/utils/midiGenerateOptions/index.js b/src/utils/midiGenerateOptions/index.js index 4a68ffb9..b2200f80 100644 --- a/src/utils/midiGenerateOptions/index.js +++ b/src/utils/midiGenerateOptions/index.js @@ -1,6 +1,8 @@ import uid from 'uid' +import { midiNotes, messageTypes } from '../midiMessage' +import { uInputLinkUpdateMidiInput } from '../../store/inputLinks/actions' -export default () => { +export default linkId => { return [ { title: 'MIDI Sensitivity', @@ -8,7 +10,7 @@ export default () => { id: uid(), value: 0.5, inputLinkIds: [], - subNode: true + subNode: true, }, { title: 'Control Type', @@ -21,21 +23,61 @@ export default () => { options: [ { value: 'abs', - label: 'Absolute' + label: 'Absolute', }, { value: 'rel1', - label: 'Relative 1' + label: 'Relative 1', }, { value: 'rel2', - label: 'Relative 2' + label: 'Relative 2', }, { value: 'rel3', - label: 'Relative 3' + label: 'Relative 3', + }, + ], + }, + { + title: 'Note', + key: 'noteNum', + type: 'select', + id: uid(), + inputLinkIds: [], + subNode: true, + options: midiNotes.map((label, value) => ({ value, label })), + onChangeAction: uInputLinkUpdateMidiInput(linkId), + }, + { + title: 'Message Type', + key: 'messageType', + type: 'select', + id: uid(), + inputLinkIds: [], + subNode: true, + options: Object.keys(messageTypes).map(key => ( + { + value: messageTypes[key].key, + label: messageTypes[key].title, + } + )), + onChangeAction: uInputLinkUpdateMidiInput(linkId), + }, + { + title: 'Channel', + key: 'channel', + type: 'select', + id: uid(), + inputLinkIds: [], + subNode: true, + options: Array(16).fill(0).map((value, index) => ( + { + value: index, + label: index + 1, } - ] - } + )), + onChangeAction: uInputLinkUpdateMidiInput(linkId), + }, ] } diff --git a/src/utils/midiMessage/_test/constructMidiId.test.js b/src/utils/midiMessage/_test/constructMidiId.test.js new file mode 100644 index 00000000..006d95d6 --- /dev/null +++ b/src/utils/midiMessage/_test/constructMidiId.test.js @@ -0,0 +1,33 @@ +const { constructMidiId } = require('../') + +test('Returns concatinated id based on input paramaters', () => { + let type, note, channel, expected, actual + + type = 'controlChange' + note = 100 + channel = 0 + actual = constructMidiId(type, note, channel) + expected = 'midi_176_100' + + expect(actual).toBe(expected) + + type = 'controlChange' + note = 100 + channel = 1 + actual = constructMidiId(type, note, channel) + expected = 'midi_177_100' + + type = 'programChange' + note = 127 + channel = 0 + actual = constructMidiId(type, note, channel) + expected = 'midi_192_127' + + type = 'programChange' + note = 127 + channel = 10 + actual = constructMidiId(type, note, channel) + expected = 'midi_202_127' + + expect(actual).toBe(expected) +}) diff --git a/src/utils/midiMessage/_test/midiNotes.test.js b/src/utils/midiMessage/_test/midiNotes.test.js new file mode 100644 index 00000000..c49e2453 --- /dev/null +++ b/src/utils/midiMessage/_test/midiNotes.test.js @@ -0,0 +1,20 @@ +const { midiNotes } = require('../') + +test('Returns text for midi note', () => { + let expected, actual + + expected = '0 - C (-1)' + actual = midiNotes[0] + + expect(actual).toBe(expected) + + expected = '27 - D# (1)' + actual = midiNotes[27] + + expect(actual).toBe(expected) + + expected = '60 - C (4)' + actual = midiNotes[60] + + expect(actual).toBe(expected) +}) diff --git a/src/utils/midiMessage/_test/processMidiData.test.js b/src/utils/midiMessage/_test/processMidiData.test.js new file mode 100644 index 00000000..afa0d7ba --- /dev/null +++ b/src/utils/midiMessage/_test/processMidiData.test.js @@ -0,0 +1,109 @@ +const { processMidiData } = require('../') + +test('Returns correct value as a number between 0 and 1', () => { + let data, expected, actual + + data = [0, 0, 127] + + expected = 1 + actual = processMidiData(data).value + + expect(actual).toBe(expected) + + data = [0, 0, 0] + + expected = 0 + actual = processMidiData(data).value + + expect(actual).toBe(expected) +}) + +test('Returns correct type', () => { + let data, expected, actual + + data = [176, 0, 0] + + expected = 'controlChange' + actual = processMidiData(data).messageType + + expect(actual).toBe(expected) + + data = [180, 0, 0] + + expected = 'controlChange' + actual = processMidiData(data).messageType + + expect(actual).toBe(expected) + + data = [144, 0, 1] + + expected = 'noteOn' + actual = processMidiData(data).messageType + + data = [147, 0, 1] + + expected = 'noteOn' + actual = processMidiData(data).messageType + + expect(actual).toBe(expected) + + data = [144, 0, 0] // If last value is 0, it becomes a noteOf + + expected = 'noteOff' + actual = processMidiData(data).messageType + + expect(actual).toBe(expected) + + data = [128, 0, 1] + + expected = 'noteOff' + actual = processMidiData(data).messageType + + expect(actual).toBe(expected) + + data = [248, 0, 1] + + expected = 'timingClock' + actual = processMidiData(data).messageType + + expect(actual).toBe(expected) +}) + +test('Returns id as a concatination of the first two vals', () => { + let data, expected, actual + + data = [176, 100, 0] + + expected = 'midi_176_100' + actual = processMidiData(data).id + + expect(actual).toBe(expected) + + data = [88, 0, 0] + + expected = 'midi_88_0' + actual = processMidiData(data).id + + data = [8, 80, 0] + + expected = 'midi_8_80' + actual = processMidiData(data).id + + expect(actual).toBe(expected) +}) + +test('Returns channel', () => { + let data, expected, actual + + data = [176, 100, 0] + + expected = 0 + actual = processMidiData(data).channel + + data = [186, 100, 0] + + expected = 10 + actual = processMidiData(data).channel + + expect(actual).toBe(expected) +}) diff --git a/src/utils/midiMessage/_test/processMidiId.test.js b/src/utils/midiMessage/_test/processMidiId.test.js new file mode 100644 index 00000000..c46d1f5b --- /dev/null +++ b/src/utils/midiMessage/_test/processMidiId.test.js @@ -0,0 +1,23 @@ +const { processMidiId, processMidiData } = require('../') + +test('Returns same as processMidiData. Params entered are split by _, last val always being 1', () => { + let id, expected, actual + + id = 'midi_1_0' + + expected = processMidiData([1, 0, 1]) + actual = processMidiId(id) + expect(actual).toEqual(expected) + + id = 'midi_0_1' + + expected = processMidiData([0, 1, 1]) + actual = processMidiId(id) + expect(actual).toEqual(expected) + + id = 'midi_127_0' + + expected = processMidiData([127, 0, 1]) + actual = processMidiId(id) + expect(actual).toEqual(expected) +}) diff --git a/src/utils/midiMessage/index.js b/src/utils/midiMessage/index.js new file mode 100644 index 00000000..39a98599 --- /dev/null +++ b/src/utils/midiMessage/index.js @@ -0,0 +1,70 @@ +const noteLetters = [ + 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B', +] + +export const midiNotes = new Array(128) + +for (let i = 0; i < 128; i++) { + const letter = noteLetters[i % noteLetters.length] + const octave = Math.floor(i / noteLetters.length) - 1 + midiNotes[i] = `${i} - ${letter} (${octave})` +} + +export const messageTypes = { + // These represent ranges of 16 + '80': { key: 'noteOff', title: 'Note Off' }, + '90': { key: 'noteOn', title: 'Note On' }, + 'b0': { key: 'controlChange', title: 'Control Change' }, + 'c0': { key: 'programChange', title: 'Program Change' }, +} + +export const processMidiData = data => { + let value, messageType, id + + const d0 = data[0] // messageType + channel + const d1 = data[1] // Note number + const d2 = data[2] // Velocity + + const channel = d0 & 0x0f + + // If the midi message is less than 240, it involves channels + if (d0 < 0xf0) { + // Erase the first bit as this relates to channel + const code = d0 & 0xf0 + const messageTypeObj = messageTypes[code.toString(16)] + if (messageTypeObj !== undefined) { + messageType = messageTypeObj.key + + // If it's a noteOn but value is 0, make it a noteOff + if (messageType === 'noteOn' && d2 === 0) { + messageType = 'noteOff' + } + } + } else if (d0 === 248) { + messageType = 'timingClock' + } + + if (d2 !== undefined) { + value = d2 / 127 + } + + if (d0 !== undefined && d1 !== undefined) { + id = `midi_${d0}_${d1}` + } + + return { + value, id, messageType, channel, noteNum: d1, + } +} + +export const constructMidiId = (messageType, noteNum, channel) => { + const typeHex = Object.keys(messageTypes).find(hex => messageTypes[hex].key === messageType) + return `midi_${parseInt(typeHex, 16) + channel}_${noteNum}` +} + +export const processMidiId = id => { + const parts = id.split('_') + const data = [parseInt(parts[1]), parseInt(parts[2]), 1] + + return processMidiData(data) +} diff --git a/src/utils/midiValueProcess/_test/midiValueProcess.spec.js b/src/utils/midiValueProcess/_test/midiValueProcess.spec.js index 3ba905f3..272ca1f9 100644 --- a/src/utils/midiValueProcess/_test/midiValueProcess.spec.js +++ b/src/utils/midiValueProcess/_test/midiValueProcess.spec.js @@ -8,7 +8,7 @@ test('(Util) midiValueProcess - getValue() - absolute', (t) => { midiValue = 0.1 midiOptions = { controlType: 'abs', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 @@ -21,7 +21,7 @@ test('(Util) midiValueProcess - getValue() - absolute', (t) => { midiValue = 0.5 midiOptions = { controlType: 'abs', - sensitivity: 0.2 + sensitivity: 0.2, } messageCount = 4 @@ -39,7 +39,7 @@ test('(Util) midiValueProcess - getValue() - rel1', (t) => { midiValue = 1 // 127 is DOWN (rel1) midiOptions = { controlType: 'rel1', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 @@ -52,7 +52,7 @@ test('(Util) midiValueProcess - getValue() - rel1', (t) => { midiValue = 1 // 1 is DOWN (rel1) midiOptions = { controlType: 'rel1', - sensitivity: 0.1 + sensitivity: 0.1, } messageCount = 3 @@ -65,7 +65,7 @@ test('(Util) midiValueProcess - getValue() - rel1', (t) => { midiValue = 1 // 1 is DOWN (rel1) midiOptions = { controlType: 'rel1', - sensitivity: 0.8 + sensitivity: 0.8, } messageCount = 3 @@ -78,7 +78,7 @@ test('(Util) midiValueProcess - getValue() - rel1', (t) => { midiValue = 0.1 // 1 is DOWN (rel1) - so this is UP midiOptions = { controlType: 'rel1', - sensitivity: 0.6 + sensitivity: 0.6, } messageCount = 2 @@ -91,7 +91,7 @@ test('(Util) midiValueProcess - getValue() - rel1', (t) => { midiValue = 0.1 // 1 is DOWN (rel1) - so this is UP midiOptions = { controlType: 'rel1', - sensitivity: 0.8 + sensitivity: 0.8, } messageCount = 5 @@ -110,7 +110,7 @@ test('(Util) midiValueProcess - getValue() - rel2', (t) => { midiValue = 0.4960629921 // DOWN (rel2) midiOptions = { controlType: 'rel2', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 @@ -126,12 +126,12 @@ test('(Util) midiValueProcess - type is not select', (t) => { node = { value: 0.5, - type: 'foo' + type: 'foo', } midiValue = 0.4960629921 // DOWN (rel2) midiOptions = { controlType: 'rel2', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 @@ -150,42 +150,42 @@ test('(Util) midiValueProcess - type is select, controlType abs', (t) => { type: 'select', options: [ { - value: 'one' + value: 'one', }, { - value: 'two' + value: 'two', }, { - value: 'three' + value: 'three', }, { - value: 'four' + value: 'four', }, { - value: 'five' + value: 'five', }, { - value: 'six' + value: 'six', }, { - value: 'seven' + value: 'seven', }, { - value: 'eight' + value: 'eight', }, { - value: 'nine' + value: 'nine', }, { - value: 'ten' - } - ] + value: 'ten', + }, + ], } midiValue = 0.05 midiOptions = { controlType: 'abs', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 5 @@ -197,7 +197,7 @@ test('(Util) midiValueProcess - type is select, controlType abs', (t) => { midiValue = 0.65 midiOptions = { controlType: 'abs', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 2 @@ -216,42 +216,42 @@ test('(Util) midiValueProcess - type is select, controlType rel1', (t) => { type: 'select', options: [ { - value: 'one' + value: 'one', }, { - value: 'two' + value: 'two', }, { - value: 'three' + value: 'three', }, { - value: 'four' + value: 'four', }, { - value: 'five' + value: 'five', }, { - value: 'six' + value: 'six', }, { - value: 'seven' + value: 'seven', }, { - value: 'eight' + value: 'eight', }, { - value: 'nine' + value: 'nine', }, { - value: 'ten' - } - ] + value: 'ten', + }, + ], } midiValue = 1 // DOWN midiOptions = { controlType: 'rel1', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 @@ -263,7 +263,7 @@ test('(Util) midiValueProcess - type is select, controlType rel1', (t) => { midiValue = 0.5 // UP midiOptions = { controlType: 'rel1', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 @@ -278,7 +278,7 @@ test('(Util) midiValueProcess - type is select, controlType rel1', (t) => { midiValue = 1 // DOWN midiOptions = { controlType: 'rel1', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 @@ -293,7 +293,7 @@ test('(Util) midiValueProcess - type is select, controlType rel1', (t) => { midiValue = 0.5 // UP midiOptions = { controlType: 'rel1', - sensitivity: 0.5 + sensitivity: 0.5, } messageCount = 1 diff --git a/src/utils/midiValueProcess/index.js b/src/utils/midiValueProcess/index.js index b7967dbb..23c4d3b4 100644 --- a/src/utils/midiValueProcess/index.js +++ b/src/utils/midiValueProcess/index.js @@ -5,7 +5,7 @@ const $ = n => Math.round(n / 127 * 1000) / 1000 const downs = { rel1: $(127), rel2: $(63), - rel3: $(65) + rel3: $(65), } const isInc = (controlType, midiValue) => diff --git a/src/utils/oneDimensionalNoise/index.js b/src/utils/oneDimensionalNoise/index.js index 80bdda41..d3cd80ae 100644 --- a/src/utils/oneDimensionalNoise/index.js +++ b/src/utils/oneDimensionalNoise/index.js @@ -3,31 +3,43 @@ // Must be power of 2 to work with bitwise modulo const MAX_VERTICES = 512 const MAX_VERTICES_MASK = MAX_VERTICES - 1 +const BUFFERS_COUNT = 'abcdefghijklmnopqrstuvwyxz'.length function lerp (a, b, t) { return a * (1 - t) + b * t } class OneDimensionalNoise { - constructor (scale) { - this.buffer = [] - this.call = 0 - - for (let i = 0; i < MAX_VERTICES; ++i) { - this.buffer.push(Math.random()) + constructor () { + this.buffers = [] + + for (let i = 0; i < BUFFERS_COUNT; ++i) { + this.buffers[i] = [] + for (let j = 0; j < MAX_VERTICES; j++) { + this.buffers[i].push(Math.random()) + } } } - getValue (x) { + getValue (x, id) { const xFloor = Math.floor(x) const t = x - xFloor const tRemapSmoothstep = t * t * (3 - 2 * t) + const isSeed = typeof (id) === 'number' + const bufferId = (isSeed ? id : id.charCodeAt(0)) & BUFFERS_COUNT + + let offset = 0 + if (!isSeed) { + for (let i = 1; i < id.length; i++) { + offset += id.charCodeAt(i) + } + } // Modulo using & - const xMin = xFloor & MAX_VERTICES_MASK + const xMin = (xFloor + offset) & MAX_VERTICES_MASK const xMax = (xMin + 1) & MAX_VERTICES_MASK - const y = lerp(this.buffer[xMin], this.buffer[xMax], tRemapSmoothstep) + const y = lerp(this.buffers[bufferId][xMin], this.buffers[bufferId][xMax], tRemapSmoothstep) return y } diff --git a/src/utils/processMidiMessage/index.js b/src/utils/processMidiMessage/index.js deleted file mode 100644 index 2aa88fc8..00000000 --- a/src/utils/processMidiMessage/index.js +++ /dev/null @@ -1,35 +0,0 @@ -export default message => { - let value, type, id - - const d0 = message.data[0] - const d1 = message.data[1] - const d2 = message.data[2] - - if (d0 >= 128 && d0 < 144 || - d0 >= 144 && d0 < 160 && d2 === 0 - ) { - type = 'noteOff' - } else if (d0 >= 144 && d0 < 160) { - type = 'noteOn' - } else if (d0 >= 160 && d0 < 176) { - type = 'polyPressure' - } else if (d0 >= 176 && d0 < 192) { - type = 'controlChange' - } else if (d0 >= 192 && d0 < 208) { - type = 'programChange' - } else if (d0 === 248) { - type = 'timingClock' - } - - if (d2 !== undefined) { - value = d2 / 127 - } - - if (d0 !== undefined && d1 !== undefined) { - id = 'midi_' + d0.toString() + d1.toString() - } - - return { - value, id, type - } -} diff --git a/src/utils/sequencerGenerateOptions/index.js b/src/utils/sequencerGenerateOptions/index.js index 83220f73..fc6ee0ef 100644 --- a/src/utils/sequencerGenerateOptions/index.js +++ b/src/utils/sequencerGenerateOptions/index.js @@ -8,8 +8,8 @@ export default () => { 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0 - ] - } + 1, 0, 0, 0, 0, 0, 0, 0, + ], + }, } } diff --git a/src/utils/theme/index.js b/src/utils/theme/index.js index 261e5fef..0f8f3d68 100644 --- a/src/utils/theme/index.js +++ b/src/utils/theme/index.js @@ -9,5 +9,5 @@ export default { actionColor1: '#DA5782', channelAColor: '#E35A59', channelBColor: '#24965C', - dangerColor: 'red' + dangerColor: 'red', } diff --git a/src/utils/withDeferRender/index.js b/src/utils/withDeferRender/index.js index f74d1507..33687b49 100644 --- a/src/utils/withDeferRender/index.js +++ b/src/utils/withDeferRender/index.js @@ -5,9 +5,13 @@ const delay = 70 const withDeferRender = Presentational => { class DeferRender extends Component { - state = { - shouldRender: false - }; + constructor () { + super() + + this.state = { + shouldRender: false, + } + } componentDidMount () { this.t = setTimeout(() => { @@ -26,7 +30,7 @@ const withDeferRender = Presentational => { } DeferRender.propTypes = { - index: PropTypes.number.isRequired + index: PropTypes.number.isRequired, } return DeferRender diff --git a/yarn.lock b/yarn.lock index 89145281..7ca8206d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,1212 +2,1728 @@ # yarn lockfile v1 -"7zip-bin-linux@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/7zip-bin-linux/-/7zip-bin-linux-1.1.0.tgz#2ca309fd6a2102e18bd81e3a5d91b39db9adab71" - -"7zip-bin-mac@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz#3e68778bbf0926adc68159427074505d47555c02" - -"7zip-bin-win@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz#8acfc28bb34e53a9476b46ae85a97418e6035c20" - -"7zip-bin@^2.2.7": - version "2.2.7" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-2.2.7.tgz#724802b8d6bda0bf2cfe61a4b86a820efc8ece93" - optionalDependencies: - "7zip-bin-linux" "^1.1.0" - "7zip-bin-mac" "^1.0.1" - "7zip-bin-win" "^2.1.1" +"7zip-bin@~4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-4.1.0.tgz#33eff662a5c39c0c2061170cc003c5120743fff0" + integrity sha512-AsnBZN3a8/JcNt+KPkGGODaA4c7l3W5+WpeKgGSbstSLxqWtTXqd1ieJGBQ8IFCtRg8DmmKUcSkIkUc0A4p3YA== "7zip@0.0.6": version "0.0.6" resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" -"@types/node@*": - version "4.0.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-4.0.35.tgz#2b96b8e67bea7451e6e1ba8b65eaeb8f223261ed" +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + integrity sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g== + dependencies: + "@babel/highlight" "7.0.0-beta.44" -"@types/node@^8.0.24": - version "8.0.53" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.53.tgz#396b35af826fa66aad472c8cb7b8d5e277f4e6d8" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.1.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.3.tgz#d090d157b7c5060d05a05acaebc048bd2b037947" + integrity sha512-w445QGI2qd0E0GlSnq6huRZWPMmQGCp5gd5ZWS4hagn0EiwzxD5QMFkpchyusAyVC1n27OKXzQ0/88aVU9n4xQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.3.3" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.3.3" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.3.3" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" + integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.2" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.2.2" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" -"@types/webpack-env@^1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.2.tgz#c290b99dbef74df21b06671aea36e355bf3b27e1" +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + integrity sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ== + dependencies: + "@babel/types" "7.0.0-beta.44" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" -JSONStream@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.4.tgz#91657dfe6ff857483066132b4618b62e8f4887bd" +"@babel/generator@^7.0.0", "@babel/generator@^7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.3.tgz#185962ade59a52e00ca2bdfcfd1d58e528d4e39e" + integrity sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A== dependencies: - jsonparse "0.0.5" - through ">=2.2.7 <3" + "@babel/types" "^7.3.3" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" -abab@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" +"@babel/generator@^7.2.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.2.tgz#fff31a7b2f2f3dad23ef8e01be45b0d5c2fc0132" + integrity sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ== + dependencies: + "@babel/types" "^7.3.2" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" -abbrev@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-create-class-features-plugin@^7.3.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.2.tgz#ba1685603eb1c9f2f51c9106d5180135c163fe73" + integrity sha512-tdW8+V8ceh2US4GsYdNVNoohq5uVwOf9k6krjwW4E1lINcHgttnWcNqgdoessn12dAy8QkbezlbQh2nXISNY+A== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.2.3" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + integrity sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg== + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + integrity sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw== + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" -accepts@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" + "@babel/types" "^7.0.0" -acorn-dynamic-import@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.1.tgz#23f671eb6e650dab277fef477c321b1178a8cca2" +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== dependencies: - acorn "^4.0.3" + "@babel/types" "^7.0.0" -acorn-globals@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" +"@babel/helper-module-imports@7.0.0-beta.35": + version "7.0.0-beta.35" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.35.tgz#308e350e731752cdb4d0f058df1d704925c64e0a" + integrity sha512-vaC1KyIZSuyWb3Lj277fX0pxivyHwuDU4xZsofqgYAbkDxNieMg2vuhzP5AgMweMY7fCQUMTi+BgPqTLjkxXFg== dependencies: - acorn "^5.0.0" + "@babel/types" "7.0.0-beta.35" + lodash "^4.2.0" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== dependencies: - acorn "^3.0.4" + "@babel/types" "^7.0.0" -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" -acorn@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" -acorn@^5.0.0, acorn@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -acorn@^5.1.2: - version "5.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" -ajv-keywords@^2.0.0, ajv-keywords@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" + integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.2.3" + "@babel/types" "^7.0.0" -ajv@^4.7.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" -ajv@^4.9.1: - version "4.11.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.3.tgz#ce30bdb90d1254f762c75af915fb3a63e7183d22" +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + integrity sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + "@babel/types" "7.0.0-beta.44" -ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + "@babel/types" "^7.0.0" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" +"@babel/helper-wrap-function@^7.1.0", "@babel/helper-wrap-function@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" +"@babel/helpers@^7.2.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" + integrity sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.3.0" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + integrity sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: - string-width "^2.0.0" + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +"@babel/parser@^7.0.0", "@babel/parser@^7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.3.tgz#092d450db02bdb6ccb1ca8ffd47d8774a91aef87" + integrity sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg== -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" +"@babel/parser@^7.2.2", "@babel/parser@^7.2.3": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.2.tgz#95cdeddfc3992a6ca2a1315191c1679ca32c55cd" + integrity sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd" + integrity sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +"@babel/plugin-proposal-export-namespace-from@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.2.0.tgz#308fd4d04ff257fc3e4be090550840eeabad5dd9" + integrity sha512-DZUxbHYxQ5fUFIkMEnh75ogEdBLPfL+mQUqrO2hNY2LGm+tqFnxE924+mhAcCOh/8za8AaZsWHbq6bBoS3TAzA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-namespace-from" "^7.2.0" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +"@babel/plugin-proposal-function-sent@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.2.0.tgz#f707d78551f49162e152d477fba32357341915d1" + integrity sha512-qQBDKRSCu1wGJi3jbngs18vrujVQA4F+OkSuIQYRhE6y19jcPzeEIGOc683mCQXDUR3BQCz8JyCupIwv+IRFmA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-wrap-function" "^7.2.0" + "@babel/plugin-syntax-function-sent" "^7.2.0" -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" +"@babel/plugin-proposal-json-strings@^7.0.0", "@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +"@babel/plugin-proposal-numeric-separator@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.2.0.tgz#646854daf4cd22fd6733f6076013a936310443ac" + integrity sha512-DohMOGDrZiMKS7LthjUZNNcWl8TAf5BZDwZAH4wpm55FuJTHgfqPGdibg7rZDmont/8Yg0zA03IgT6XLeP+4sg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-numeric-separator" "^7.2.0" -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.3.1": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz#6d1859882d4d778578e41f82cc5d7bf3d5daf6c1" + integrity sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA== dependencies: - color-convert "^1.9.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== dependencies: - arrify "^1.0.0" - micromatch "^2.1.5" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -app-package-builder@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/app-package-builder/-/app-package-builder-1.3.3.tgz#252489ebd9e99fded822d01c7d6042d37aa6d844" +"@babel/plugin-proposal-throw-expressions@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.2.0.tgz#2d9e452d370f139000e51db65d0a85dc60c64739" + integrity sha512-adsydM8DQF4i5DLNO4ySAU5VtHTPewOtNBV3u7F4lNMPADFF9bWQ+iDtUUe8+033cYCUz+bFlQdXQJmJOwoLpw== dependencies: - bluebird-lst "^1.0.5" - builder-util "^3.2.0" - builder-util-runtime "^2.5.0" - fs-extra-p "^4.4.4" - int64-buffer "^0.1.9" - js-yaml "^3.10.0" - rabin-bindings "~1.7.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-throw-expressions" "^7.2.0" -aproba@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" -are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" + "@babel/helper-plugin-utils" "^7.0.0" -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" +"@babel/plugin-syntax-dynamic-import@^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: - sprintf-js "~1.0.2" + "@babel/helper-plugin-utils" "^7.0.0" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" +"@babel/plugin-syntax-export-namespace-from@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.2.0.tgz#8d257838c6b3b779db52c0224443459bd27fb039" + integrity sha512-1zGA3UNch6A+A11nIzBVEaE3DDJbjfB+eLIcf0GGOh/BJr/8NxL3546MGhV/r0RhH4xADFIEso39TKCfEMlsGA== dependencies: - arr-flatten "^1.0.1" + "@babel/helper-plugin-utils" "^7.0.0" -arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" +"@babel/plugin-syntax-function-sent@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.2.0.tgz#91474d4d400604e4c6cbd4d77cd6cb3b8565576c" + integrity sha512-2MOVuJ6IMAifp2cf0RFkHQaOvHpbBYyWCvgtF/WVqXhTd7Bgtov8iXVCadLXp2FN1BrI2EFl+JXuwXy0qr3KoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" +"@babel/plugin-syntax-import-meta@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.2.0.tgz#2333ef4b875553a3bcd1e93f8ebc09f5b9213a40" + integrity sha512-Hq6kFSZD7+PHkmBN8bCpHR6J8QEoCuEV/B38AIQscYjgMZkGlXB7cHNFzP5jR4RCh5545yP1ujHdmO7hAgKtBA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +"@babel/plugin-syntax-numeric-separator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.2.0.tgz#7470fe070c2944469a756752a69a6963135018be" + integrity sha512-DroeVNkO/BnGpL2R7+ZNZqW+E24aR/4YWxP3Qb15d6lPU8KDzF8HlIUIRCOJRn4X77/oyW4mJY+7FHfY82NLtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-flatten@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" +"@babel/plugin-syntax-throw-expressions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.2.0.tgz#79001ee2afe1b174b1733cdc2fc69c9a46a0f1f8" + integrity sha512-ngwynuqu1Rx0JUS9zxSDuPgW1K8TyVZCi2hHehrL4vyjqE7RGoNHWlZsS7KQT2vw9Yjk4YLa0+KldBXTRdPLRg== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + "@babel/helper-plugin-utils" "^7.0.0" -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" +"@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" + integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== dependencies: - array-uniq "^1.0.1" + "@babel/helper-plugin-utils" "^7.0.0" -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" +"@babel/plugin-transform-block-scoping@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" + integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +"@babel/plugin-transform-classes@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" + integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" -array.prototype.find@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" + "@babel/helper-plugin-utils" "^7.0.0" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz#f2f5520be055ba1c38c41c0e094d8a461dd78f2d" + integrity sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" -asar-integrity@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.2.3.tgz#b238a68ef1218561b4904db8400c0943fbc62c62" +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== dependencies: - bluebird-lst "^1.0.5" - fs-extra-p "^4.4.4" + "@babel/helper-plugin-utils" "^7.0.0" -asn1.js@^4.0.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== dependencies: - util "0.10.3" + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -ast-types@0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +"@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" + integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -async-exit-hook@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" -async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50" + integrity sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw== + dependencies: + regexp-tree "^0.1.0" -async@^2.1.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== dependencies: - lodash "^4.14.0" + "@babel/helper-plugin-utils" "^7.0.0" -async@^2.4.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== dependencies: - lodash "^4.14.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +"@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" + integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -autoprefixer@^6.0.0, autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" + "@babel/helper-plugin-utils" "^7.0.0" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" -aws4@^1.2.1, aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" -babel-code-frame@^6.11.0, babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^3.0.0" + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" -babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" + regenerator-transform "^0.13.3" -babel-core@^6.24.1, babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" +"@babel/plugin-transform-runtime@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" + integrity sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw== dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" -babel-eslint@^7.1.1: - version "7.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" +"@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" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" + "@babel/helper-plugin-utils" "^7.0.0" -babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.6" - trim-right "^1.0.1" + "@babel/helper-plugin-utils" "^7.0.0" -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" + "@babel/helper-plugin-utils" "^7.0.0" -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" +"@babel/polyfill@^7.0.0": + version "7.2.5" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" + integrity sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug== dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" + core-js "^2.5.7" + regenerator-runtime "^0.12.0" -babel-helper-evaluate-path@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz#0bb2eb01996c0cef53c5e8405e999fe4a0244c08" +"@babel/preset-env@^7.2.3", "@babel/preset-env@^7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.1.tgz#389e8ca6b17ae67aaf9a2111665030be923515db" + integrity sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" +"@babel/preset-react@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" +"@babel/register@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" + integrity sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g== dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-flip-expressions@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz#160d2090a3d9f9c64a750905321a0bc218f884ec" + core-js "^2.5.7" + find-cache-dir "^1.0.0" + home-or-tmp "^3.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" +"@babel/runtime@^7.1.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" + integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + regenerator-runtime "^0.13.2" -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" +"@babel/runtime@^7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.1.tgz#574b03e8e8a9898eaf4a872a92ea20b7846f6f2a" + integrity sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + regenerator-runtime "^0.12.0" -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + integrity sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-is-nodes-equiv@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + lodash "^4.2.0" -babel-helper-is-void-0@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz#6ed0ada8a9b1c5b6e88af6b47c1b3b5c080860eb" +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + integrity sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA== + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" -babel-helper-mark-eval-scopes@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz#7648aaf2ec92aae9b09a20ad91e8df5e1fcc94b2" +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" + integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.2.3" + "@babel/types" "^7.2.2" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@7.0.0-beta.35": + version "7.0.0-beta.35" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.35.tgz#cf933a9a9a38484ca724b335b88d83726d5ab960" + integrity sha512-y9XT11CozHDgjWcTdxmhSj13rJVXpa5ZXwjjOiTedjaM0ba5ItqdS02t31EhPl7HtOWxsZkYCCUNrSfrOisA6w== + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + integrity sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" +"@babel/types@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0" + integrity sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw== dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" +"@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.2.tgz#424f5be4be633fff33fb83ab8d67e4a8290f5a2f" + integrity sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ== dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" -babel-helper-remove-or-void@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz#8e46ad5b30560d57d7510b3fd93f332ee7c67386" +"@babel/types@^7.3.3": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.3.tgz#6c44d1cdac2a7625b624216657d5bc6c107ab436" + integrity sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" +"@emotion/is-prop-valid@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc" + integrity sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA== dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + "@emotion/memoize" "0.7.1" -babel-helper-to-multiple-sequence-expressions@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz#d1a419634c6cb301f27858c659167cfee0a9d318" +"@emotion/memoize@0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f" + integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg== -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" +"@emotion/unitless@^0.7.0": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.3.tgz#6310a047f12d21a1036fb031317219892440416f" + integrity sha512-4zAPlpDEh2VwXswwr/t8xGNDGg8RQiPxtxZ3qQEXyQsBV39ptTdESCjuBvGze1nLMVrxmTIKmnO/nAV8Tqjjzg== -babel-loader@^6.3.2: - version "6.4.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" - dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.16" - mkdirp "^0.5.1" - object-assign "^4.0.1" +"@posthtml/esm@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@posthtml/esm/-/esm-1.0.0.tgz#09bcb28a02438dcee22ad1970ca1d85a000ae0cf" + integrity sha512-dEVG+ITnvqKGa4v040tP+n8LOKOqr94qjLva7bE5pnfm2KHJwsKz69J4KMxgWLznbpBJzy8vQfCayEk3vLZnZQ== -babel-loader@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" +"@tweenjs/tween.js@^17.2.0": + version "17.2.0" + resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-17.2.0.tgz#21f89b709bafc4b303adae7a83b4f35a0d9e4796" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" +"@types/node@*": + version "4.0.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-4.0.35.tgz#2b96b8e67bea7451e6e1ba8b65eaeb8f223261ed" -babel-minify-webpack-plugin@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-minify-webpack-plugin/-/babel-minify-webpack-plugin-0.2.0.tgz#ef9694d11a1b8ab8f3204d89f5c9278dd28fc2a9" - dependencies: - babel-core "^6.24.1" - babel-preset-minify "^0.2.0" - webpack-sources "^1.0.1" +"@types/node@^8.0.24": + version "8.10.43" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.43.tgz#8d3281a33c92a56038b05d9460a65bc1dcd5735b" + integrity sha512-5m5W13HR2k3cu88mpzlnPBBv5+GyMHtj4F0P83RG4mqoC0AYVYHVMHfF3SgwKNtqEZiZQASMxU92QsLEekKcnw== -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" +"@types/q@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.1.tgz#48fd98c1561fe718b61733daed46ff115b496e18" + integrity sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA== + +"@types/webpack-env@^1.13.6": + version "1.13.7" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.7.tgz#137a4e57aa31ab57b1baf66f5dc3b6bf085e9944" + integrity sha512-rzi6fw7hhxPcCoNVsgysHFlKnhYYvVj7AJwdAO0HQNP5vg9sY0DoRRC1pfuCQm94cOa1sab82HGUtdFlWHIhBg== + +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== + +JSONStream@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.4.tgz#91657dfe6ff857483066132b4618b62e8f4887bd" dependencies: - babel-runtime "^6.22.0" + jsonparse "0.0.5" + through ">=2.2.7 <3" -babel-plugin-component@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/babel-plugin-component/-/babel-plugin-component-0.10.1.tgz#cfac25045e5c6e1353e89f05ff5a675af9712759" +abab@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" -babel-plugin-minify-builtins@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz#317f824b0907210b6348671bb040ca072e2e0c82" +abbrev@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" dependencies: - babel-helper-evaluate-path "^0.2.0" + mime-types "~2.1.11" + negotiator "0.6.1" -babel-plugin-minify-constant-folding@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz#8c70b528b2eb7c13e94d95c8789077d4cdbc3970" +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: - babel-helper-evaluate-path "^0.2.0" + mime-types "~2.1.18" + negotiator "0.6.1" -babel-plugin-minify-dead-code-elimination@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz#e8025ee10a1e5e4f202633a6928ce892c33747e3" +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@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" dependencies: - babel-helper-evaluate-path "^0.2.0" - babel-helper-mark-eval-scopes "^0.2.0" - babel-helper-remove-or-void "^0.2.0" - lodash.some "^4.6.0" + acorn "^5.0.0" -babel-plugin-minify-flip-comparisons@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz#0c9c8e93155c8f09dedad8118b634c259f709ef5" +acorn-jsx@^5.0.0: + 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@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" + +acorn@^5.1.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" + +acorn@^6.0.5: + version "6.0.7" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.7.tgz#490180ce18337270232d9488a44be83d9afb7fd3" + integrity sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw== + +acorn@^6.0.7: + version "6.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.1.tgz#3ed8422d6dec09e6121cc7a843ca86a330a86b51" + integrity sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= + +ajv-keywords@^3.1.0, ajv-keywords@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c" + integrity sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g== + +ajv@^4.9.1: + version "4.11.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.3.tgz#ce30bdb90d1254f762c75af915fb3a63e7183d22" dependencies: - babel-helper-is-void-0 "^0.2.0" + co "^4.6.0" + json-stable-stringify "^1.0.1" -babel-plugin-minify-guarded-expressions@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz#8a8c950040fce3e258a12e6eb21eab94ad7235ab" +ajv@^5.1.0, ajv@^5.2.3: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: - babel-helper-flip-expressions "^0.2.0" + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" -babel-plugin-minify-infinity@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz#30960c615ddbc657c045bb00a1d8eb4af257cf03" +ajv@^6.1.0, ajv@^6.7.0: + version "6.8.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.8.1.tgz#0890b93742985ebf8973cd365c5b23920ce3cb20" + integrity sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -babel-plugin-minify-mangle-names@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz#719892297ff0106a6ec1a4b0fc062f1f8b6a8529" +ajv@^6.10.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== dependencies: - babel-helper-mark-eval-scopes "^0.2.0" + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -babel-plugin-minify-numeric-literals@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz#5746e851700167a380c05e93f289a7070459a0d1" +ajv@^6.5.5: + version "6.7.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" + integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -babel-plugin-minify-replace@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz#3c1f06bc4e6d3e301eacb763edc1be611efc39b0" +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" -babel-plugin-minify-simplify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz#21ceec4857100c5476d7cef121f351156e5c9bc0" - dependencies: - babel-helper-flip-expressions "^0.2.0" - babel-helper-is-nodes-equiv "^0.0.1" - babel-helper-to-multiple-sequence-expressions "^0.2.0" +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -babel-plugin-minify-type-constructors@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz#7f3b6458be0863cfd59e9985bed6d134aa7a2e17" +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= dependencies: - babel-helper-is-void-0 "^0.2.0" + string-width "^2.0.0" -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" +ansi-colors@^3.0.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" -babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" +ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" + color-convert "^1.9.0" -babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" + arrify "^1.0.0" + micromatch "^2.1.5" -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" + micromatch "^3.1.4" + normalize-path "^2.1.1" -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" +anymatch@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.0.1.tgz#a47b8a9e3c3f7f17420276e05ef39746ac1777df" + integrity sha512-WQdpV5fo7XSY76HPN4pqdUl13Q282JsV0gQ8OnIxQsqDEHDZJCBkQ89fL1Mb3tNiPzGQnxMHM5G2iG3k9O6yng== dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" + normalize-path "^3.0.0" + picomatch "^2.0.4" -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" +app-builder-bin@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-2.6.3.tgz#428557e8fd517ef6272b3d85593ebb288c2aed90" + integrity sha512-JL8C41e6yGIchFsHP/q15aGNedAaUakLhkV6ER0Yxafx08sRnlDnlkAkEIKjX7edg/4i7swpGa6CBv1zX9GgCA== -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" +app-builder-lib@20.38.5, app-builder-lib@~20.38.5: + version "20.38.5" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-20.38.5.tgz#bdfbbc35e10571c6cf1f62daae95991d27686a03" + integrity sha512-vVgM9d9twwlhr+8vNAJOAD9dyVBRk7reuVa1BE1OmvaHb1M+fS8KpvcDKVdBqX9KDHy7zSc57mnIcHgax4/XMA== dependencies: - babel-runtime "^6.22.0" + "7zip-bin" "~4.1.0" + app-builder-bin "2.6.3" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.6" + builder-util "9.6.2" + builder-util-runtime "8.1.1" + chromium-pickle-js "^0.2.0" + debug "^4.1.1" + ejs "^2.6.1" + electron-osx-sign "0.4.11" + electron-publish "20.38.5" + fs-extra-p "^7.0.0" + hosted-git-info "^2.7.1" + is-ci "^2.0.0" + isbinaryfile "^4.0.0" + js-yaml "^3.12.1" + lazy-val "^1.0.3" + minimatch "^3.0.4" + normalize-package-data "^2.4.0" + plist "^3.0.1" + read-config-file "3.2.1" + sanitize-filename "^1.6.1" + semver "^5.6.0" + temp-file "^3.3.2" -babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" + default-require-extensions "^2.0.0" -babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" + delegates "^1.0.0" + readable-stream "^2.0.6" -babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: - babel-runtime "^6.22.0" + sprintf-js "~1.0.2" -babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" + arr-flatten "^1.0.1" -babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" -babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" -babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" -babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" +array.prototype.find@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90" dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + define-properties "^1.1.2" + es-abstract "^1.7.0" -babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" -babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" +asn1.js@^4.0.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== dependencies: - babel-runtime "^6.22.0" + safer-buffer "~2.1.0" -babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" + util "0.10.3" -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -babel-plugin-transform-inline-consecutive-adds@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz#15dae78921057f4004f8eafd79e15ddc5f12f426" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -babel-plugin-transform-member-expression-literals@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz#e06ae305cf48d819822e93a70d79269f04d89eec" +async-each@^1.0.0, async-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -babel-plugin-transform-merge-sibling-variables@^6.8.6: - version "6.8.6" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz#6d21efa5ee4981f71657fae716f9594bb2622aef" +async-each@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -babel-plugin-transform-minify-booleans@^6.8.3: - version "6.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz#5906ed776d3718250519abf1bace44b0b613ddf9" +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -babel-plugin-transform-property-literals@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz#67ed5930b34805443452c8b9690c7ebe1e206c40" +async@^2.5.0, async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: - esutils "^2.0.2" + lodash "^4.17.11" -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" - dependencies: - babel-runtime "^6.22.0" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" +autoprefixer@^6.0.0, autoprefixer@^6.3.1: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" -babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -babel-plugin-transform-regexp-constructors@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz#6aa5dd0acc515db4be929bbcec4ed4c946c534a3" +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-plugin-transform-remove-console@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz#fde9d2d3d725530b0fadd8d31078402410386810" +aws4@^1.6.0, aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -babel-plugin-transform-remove-debugger@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz#809584d412bf918f071fdf41e1fdb15ea89cdcd5" +babel-code-frame@^6.11.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" -babel-plugin-transform-remove-undefined@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz#94f052062054c707e8d094acefe79416b63452b1" +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - babel-helper-evaluate-path "^0.2.0" + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" -babel-plugin-transform-simplify-comparison-operators@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz#a838786baf40cc33a93b95ae09e05591227e43bf" +babel-eslint@8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" + integrity sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA== + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.1.0.tgz#441e23ef75ded3bd547e300ac3194cef87b55190" + integrity sha512-MLcagnVrO9ybQGLEfZUqnOzv36iQzU7Bj4elm39vCukumLVSfoX+tRy3/jW7lUKc7XdpRmB/jech6L/UCsSZjw== + dependencies: + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.1.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-loader@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" + integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw== + dependencies: + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + util.promisify "^1.0.0" -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: babel-runtime "^6.22.0" - babel-types "^6.24.1" -babel-plugin-transform-undefined-to-void@^6.8.3: - version "6.8.3" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz#fc52707f6ee1ddc71bb91b0d314fbefdeef9beb4" +babel-plugin-component@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-component/-/babel-plugin-component-1.1.1.tgz#9b023a23ff5c9aae0fd56c5a18b9cab8c4d45eea" + integrity sha512-WUw887kJf2GH80Ng/ZMctKZ511iamHNqPhd9uKo14yzisvV7Wt1EckIrb8oq/uCz3B3PpAW7Xfl7AkTLDYT6ag== + dependencies: + "@babel/helper-module-imports" "7.0.0-beta.35" -babel-polyfill@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" +babel-plugin-istanbul@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz#7981590f1956d75d67630ba46f0c22493588c893" + integrity sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ== dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" + find-up "^3.0.0" + istanbul-lib-instrument "^3.0.0" + test-exclude "^5.0.0" -babel-preset-env@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" +babel-plugin-jest-hoist@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz#dfecc491fb15e2668abbd690a697a8fd1411a7f8" + integrity sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw== -babel-preset-es2015@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.24.1" - babel-plugin-transform-es2015-classes "^6.24.1" - babel-plugin-transform-es2015-computed-properties "^6.24.1" - babel-plugin-transform-es2015-destructuring "^6.22.0" - babel-plugin-transform-es2015-duplicate-keys "^6.24.1" - babel-plugin-transform-es2015-for-of "^6.22.0" - babel-plugin-transform-es2015-function-name "^6.24.1" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-plugin-transform-es2015-modules-systemjs "^6.24.1" - babel-plugin-transform-es2015-modules-umd "^6.24.1" - babel-plugin-transform-es2015-object-super "^6.24.1" - babel-plugin-transform-es2015-parameters "^6.24.1" - babel-plugin-transform-es2015-shorthand-properties "^6.24.1" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.24.1" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.22.0" - babel-plugin-transform-es2015-unicode-regex "^6.24.1" - babel-plugin-transform-regenerator "^6.24.1" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" +"babel-plugin-styled-components@>= 1", babel-plugin-styled-components@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.0.tgz#ff1f42ad2cc78c21f26b62266b8f564dbc862939" + integrity sha512-sQVKG8irFXx14ZfaK1bBePirfkacl3j8nZwSZK+ZjsbnadRHKQTbhXbe/RB1vT6Vgkz45E+V95LBq4KqdhZUNw== dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-syntax-jsx "^6.18.0" + lodash "^4.17.10" -babel-preset-minify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc" - dependencies: - babel-plugin-minify-builtins "^0.2.0" - babel-plugin-minify-constant-folding "^0.2.0" - babel-plugin-minify-dead-code-elimination "^0.2.0" - babel-plugin-minify-flip-comparisons "^0.2.0" - babel-plugin-minify-guarded-expressions "^0.2.0" - babel-plugin-minify-infinity "^0.2.0" - babel-plugin-minify-mangle-names "^0.2.0" - babel-plugin-minify-numeric-literals "^0.2.0" - babel-plugin-minify-replace "^0.2.0" - babel-plugin-minify-simplify "^0.2.0" - babel-plugin-minify-type-constructors "^0.2.0" - babel-plugin-transform-inline-consecutive-adds "^0.2.0" - babel-plugin-transform-member-expression-literals "^6.8.5" - babel-plugin-transform-merge-sibling-variables "^6.8.6" - babel-plugin-transform-minify-booleans "^6.8.3" - babel-plugin-transform-property-literals "^6.8.5" - babel-plugin-transform-regexp-constructors "^0.2.0" - babel-plugin-transform-remove-console "^6.8.5" - babel-plugin-transform-remove-debugger "^6.8.5" - babel-plugin-transform-remove-undefined "^0.2.0" - babel-plugin-transform-simplify-comparison-operators "^6.8.5" - babel-plugin-transform-undefined-to-void "^6.8.3" - lodash.isplainobject "^4.0.6" - -babel-preset-react@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - -babel-preset-stage-2@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.22.0, babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" +babel-plugin-syntax-jsx@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + +babel-preset-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz#83bc564fdcd4903641af65ec63f2f5de6b04132e" + integrity sha512-FfNLDxFWsNX9lUmtwY7NheGlANnagvxq8LZdl5PKnVG3umP+S/g0XbVBfwtA4Ai3Ri/IMkWabBz3Tyk9wdspcw== dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.1.0" -babel-runtime@^6.18.0, babel-runtime@^6.22.0: +babel-runtime@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" dependencies: @@ -1221,7 +1737,7 @@ babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.7.0: +babel-template@^6.7.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: @@ -1231,7 +1747,7 @@ babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.7.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.16.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.16.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -1245,16 +1761,7 @@ babel-traverse@^6.16.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-tr invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.19.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.22.0.tgz#2a447e8d0ea25d2512409e4175479fd78cc8b1db" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -1263,7 +1770,12 @@ babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" -babylon@^6.12.0, babylon@^6.17.0, babylon@^6.18.0: +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + integrity sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g== + +babylon@^6.12.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1274,42 +1786,59 @@ balanced-match@^0.4.0, balanced-match@^0.4.1, balanced-match@^0.4.2: balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" +base64-js@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + batch@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" -bindings@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" - -bl@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" - dependencies: - readable-stream "^2.0.5" +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== block-stream@*: version "0.0.9" @@ -1317,20 +1846,38 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird-lst@^1.0.3, bluebird-lst@^1.0.4, bluebird-lst@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.5.tgz#bebc83026b7e92a72871a3dc599e219cbfb002a9" +bluebird-lst@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.6.tgz#89bc4de0a357373605c8781f293f7b06d454f869" + integrity sha512-CBWFoPuUPpcvMUxfyr8DKdI5d4kjxFl1h39+VbKxP3KJWJHEsLtuT4pPLkjpxCGU6Ask21tvbnftWXdqIxYldQ== dependencies: - bluebird "^3.5.1" + bluebird "^3.5.2" -bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" +bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" @@ -1342,7 +1889,7 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boolbase@~1.0.0: +boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -1355,18 +1902,21 @@ boom@2.x.x: boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= dependencies: hoek "4.x.x" boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== dependencies: hoek "4.x.x" boxen@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.2.tgz#3f1d4032c30ffea9d4b02c322eaf2ea741dcbce5" + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" @@ -1374,7 +1924,7 @@ boxen@^1.2.1: cli-boxes "^1.0.0" string-width "^2.0.0" term-size "^1.2.0" - widest-line "^1.0.0" + widest-line "^2.0.0" brace-expansion@^1.0.0: version "1.1.6" @@ -1384,8 +1934,9 @@ brace-expansion@^1.0.0: concat-map "0.0.1" brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1398,6 +1949,29 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.0.7" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.7.tgz#6677fa5e4901bdbf9c9ec2a748e28dca407a9bfc" @@ -1406,6 +1980,13 @@ browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" @@ -1464,12 +2045,44 @@ browserslist@^1.1.1, browserslist@^1.1.3, browserslist@^1.3.6, browserslist@^1.5 caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^2.1.2: - version "2.5.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.5.1.tgz#68e4bc536bbcc6086d62843a2ffccea8396821c6" +browserslist@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" + integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== + dependencies: + caniuse-lite "^1.0.30000929" + electron-to-chromium "^1.3.103" + node-releases "^1.1.3" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: - caniuse-lite "^1.0.30000744" - electron-to-chromium "^1.3.24" + node-int64 "^0.4.0" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-indexof@^1.0.0: version "1.1.1" @@ -1478,6 +2091,7 @@ buffer-indexof@^1.0.0: buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + integrity sha1-mXjOMXOIxkmth5MCjDR37wRKi1E= buffer-xor@^1.0.2: version "1.0.3" @@ -1491,46 +2105,38 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.0.3: - version "5.0.8" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.8.tgz#84daa52e7cf2fa8ce4195bc5cf0f7809e0930b24" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -builder-util-runtime@2.5.0, builder-util-runtime@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-2.5.0.tgz#22373d4faab8d89e0b077630aef76538deb38476" +builder-util-runtime@8.1.1, builder-util-runtime@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.1.1.tgz#f2f6fc43e33d26892bd491667fc746ad69bccc50" + integrity sha512-+ieS4PMB33vVE2S3ZNWBEQJ1zKmAs/agrBdh7XadE1lKLjrH4aXYuOh9OOGdxqIRldhlhNBaF+yKMMEFOdNVig== dependencies: - bluebird-lst "^1.0.5" - debug "^3.1.0" - fs-extra-p "^4.4.4" + bluebird-lst "^1.0.6" + debug "^4.1.1" + fs-extra-p "^7.0.0" sax "^1.2.4" -builder-util@3.2.0, builder-util@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-3.2.0.tgz#08900f046c6b09c22a1f235f18644ae9eb963bc4" - dependencies: - "7zip-bin" "^2.2.7" - bluebird-lst "^1.0.5" - builder-util-runtime "^2.5.0" - chalk "^2.3.0" - debug "^3.1.0" - fs-extra-p "^4.4.4" - ini "^1.3.4" - is-ci "^1.0.10" - js-yaml "^3.10.0" - lazy-val "^1.0.2" - node-emoji "^1.8.1" - semver "^5.4.1" - source-map-support "^0.5.0" +builder-util@9.6.2, builder-util@~9.6.2: + version "9.6.2" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-9.6.2.tgz#3366aefea1b5ce292840be727a094e96fa25802f" + integrity sha512-cWl/0/Q851lesMmXp1IjreeAX1QAWA9e+iU2IT61oh+CvMYJnDwao2m9ZCHammdw2zllrwWu4fOC3gvsb/yOCw== + dependencies: + "7zip-bin" "~4.1.0" + app-builder-bin "2.6.3" + bluebird-lst "^1.0.6" + builder-util-runtime "^8.1.1" + chalk "^2.4.2" + debug "^4.1.1" + fs-extra-p "^7.0.0" + is-ci "^2.0.0" + js-yaml "^3.12.1" + source-map-support "^0.5.10" stat-mode "^0.2.2" - temp-file "^2.0.3" - tunnel-agent "^0.6.0" + temp-file "^3.3.2" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +builtin-modules@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.0.0.tgz#1e587d44b006620d90286cc7a9238bbc6129cab1" + integrity sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg== builtin-status-codes@^3.0.0: version "3.0.0" @@ -1540,15 +2146,50 @@ bytes@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cacache@^11.0.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: - callsites "^0.2.0" + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +callsites@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== camel-case@3.0.x: version "3.0.0" @@ -1560,25 +2201,25 @@ camel-case@3.0.x: camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== caniuse-api@^1.5.2: version "1.6.1" @@ -1597,24 +2238,27 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000646" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000646.tgz#c724b90d61df24286e015fc528d062073c00def4" -caniuse-lite@^1.0.30000744: - version "1.0.30000752" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000752.tgz#0a79df520669d92ddc7f57406eed935948263130" +caniuse-lite@^1.0.30000929: + version "1.0.30000935" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz#d1b59df00b46f4921bb84a8a34c1d172b346df59" + integrity sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ== + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= + dependencies: + rsvp "^3.3.3" capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= chalk@0.5.1: version "0.5.1" @@ -1636,7 +2280,16 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, 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" + +chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: @@ -1648,7 +2301,12 @@ change-emitter@^0.1.2: version "0.1.6" resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" -chokidar@1.6.0, chokidar@^1.6.0: +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.0.tgz#90c32ad4802901d7713de532dc284e96a63ad058" dependencies: @@ -1663,32 +2321,67 @@ chokidar@1.6.0, chokidar@^1.6.0: optionalDependencies: fsevents "^1.0.0" -chokidar@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" +chokidar@^2.0.0, chokidar@^2.0.2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.0.tgz#5fcb70d0b28ebe0867eb0f09d5f6a08f29a1efa0" + integrity sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ== dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.0" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +chokidar@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.0.tgz#6b538f0fd6d5d31d5dd2b59e05426bec0f49aa40" + integrity sha512-ebzWopcacB2J19Jsb5RPtMrzmjUZ5VAQnsL0Ztrix3lswozHbiDp+1Lg3AWSKHdwsps/W2vtshA/x3I827F78g== + dependencies: + anymatch "^3.0.1" + async-each "^1.0.3" + braces "^3.0.2" + glob-parent "^5.0.0" + is-binary-path "^2.1.0" + is-glob "^4.0.1" + normalize-path "^3.0.0" + readdirp "^3.0.1" + optionalDependencies: + fsevents "^2.0.6" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== -ci-info@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1: version "1.0.3" @@ -1706,9 +2399,15 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" -classnames@^2.2.4: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" clean-css@4.1.x: version "4.1.9" @@ -1725,33 +2424,47 @@ clean-webpack-plugin@^0.1.16: cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== dependencies: - restore-cursor "^1.0.1" + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.0.3, cliui@^3.2.0: +cliui@^3.0.3: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c" @@ -1766,6 +2479,7 @@ clone@^1.0.2: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= coa@~1.0.1: version "1.0.1" @@ -1773,28 +2487,64 @@ coa@~1.0.1: dependencies: q "^1.1.2" +coa@~2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -color-convert@^1.3.0, color-convert@^1.9.0: +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.3.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: color-name "^1.1.1" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@~0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" + integrity sha1-vbbGnOZg+t/+CwAHzER+G59ygr0= color-diff@^0.1.3: version "0.1.7" resolved "https://registry.yarnpkg.com/color-diff/-/color-diff-0.1.7.tgz#6db78cd9482a8e459d40821eaf4b503283dcb8e2" -color-name@^1.0.0, color-name@^1.1.1: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" +color-name@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-string@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" @@ -1836,13 +2586,19 @@ colornames@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/colornames/-/colornames-0.0.2.tgz#d811fd6c84f59029499a8ac4436202935b92be31" +colors@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" @@ -1854,13 +2610,30 @@ commander@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= compare-version@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= + +compare-versions@^3.2.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= compressible@~2.0.8: version "2.0.9" @@ -1882,8 +2655,9 @@ compression@^1.5.2: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.0, concat-stream@^1.5.2: +concat-stream@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -1891,6 +2665,16 @@ concat-stream@1.6.0, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concurrently@^3.4.0: version "3.5.0" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.5.0.tgz#8cf1b7707a6916a78a4ff5b77bb04dec54b379b2" @@ -1905,8 +2689,9 @@ concurrently@^3.4.0: tree-kill "^1.1.0" configstore@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" @@ -1928,6 +2713,7 @@ console-browserify@^1.1.0: console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" @@ -1941,13 +2727,17 @@ content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@^1.1.0, convert-source-map@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" @@ -1957,6 +2747,23 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + copy-webpack-plugin@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.2.0.tgz#252bb94597f96399d23d7fad355f8d3a661ac096" @@ -1978,13 +2785,15 @@ core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" -core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" +core-js@^2.5.7: + version "2.6.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.3.tgz#4b70938bdffdaf64931e66e2db158f0892289c49" + integrity sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ== -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cosmiconfig@^2.1.1: version "2.2.2" @@ -2008,6 +2817,7 @@ create-ecdh@^4.0.0: create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= dependencies: capture-stack-trace "^1.0.0" @@ -2035,20 +2845,48 @@ create-react-class@^15.5.2: loose-envify "^1.3.1" object-assign "^4.1.1" +create-react-context@<=0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca" + integrity sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A== + dependencies: + fbjs "^0.8.0" + gud "^1.0.0" + crocket@^0.9.11: version "0.9.11" resolved "https://registry.yarnpkg.com/crocket/-/crocket-0.9.11.tgz#288fca11ef0d3dd239b62c488265f30c8edfb0c5" dependencies: xpipe "*" +cross-env@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" + integrity sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg== + dependencies: + cross-spawn "^6.0.5" + is-windows "^1.0.0" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-unzip@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f" @@ -2060,8 +2898,9 @@ cryptiles@2.x.x: boom "2.x.x" cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + version "3.1.4" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.4.tgz#769a68c95612b56faadfcebf57ac86479cbe8322" + integrity sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw== dependencies: boom "5.x.x" @@ -2083,6 +2922,7 @@ crypto-browserify@^3.11.0: crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= css-color-keywords@^1.0.0: version "1.0.0" @@ -2096,11 +2936,13 @@ css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" -css-hot-loader@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/css-hot-loader/-/css-hot-loader-1.3.2.tgz#c4fb0fb49a5aedba03383db1e32e776cd5ea6998" +css-hot-loader@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/css-hot-loader/-/css-hot-loader-1.4.3.tgz#69e8256ef85f2b3b3d89e37f7504c6e3431a70c9" + integrity sha512-akm6gN57sCirABQuT+BZIHWf/UZGX0y4zMnrbZIKOPyTdpg2+teP9kQ3StBi4d+bZbdJWGW78VmsgtXBYw4ukA== dependencies: loader-utils "^1.1.0" + lodash "^4.17.5" normalize-url "^1.9.1" css-loader@^0.28.7: @@ -2122,6 +2964,24 @@ css-loader@^0.28.7: postcss-value-parser "^3.3.0" source-list-map "^2.0.0" +css-loader@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe" + integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw== + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash "^4.17.11" + postcss "^6.0.23" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + css-rule-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/css-rule-stream/-/css-rule-stream-1.1.0.tgz#3786e7198983d965a26e31957e09078cbb7705a2" @@ -2131,6 +2991,11 @@ css-rule-stream@^1.1.0: ldjson-stream "^1.2.1" through2 "^0.6.3" +css-select-base-adapter@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -2140,6 +3005,16 @@ css-select@^1.1.0: domutils "1.5.1" nth-check "~1.0.1" +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + css-selector-tokenizer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.6.0.tgz#6445f582c7930d241dcc5007a43d6fcb8f073152" @@ -2156,9 +3031,10 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" -css-to-react-native@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.0.4.tgz#cf4cc407558b3474d4ba8be1a2cd3b6ce713101b" +css-to-react-native@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.2.2.tgz#c077d0f7bf3e6c915a539e7325821c9dd01f9965" + integrity sha512-w99Fzop1FO8XKm0VpbQp3y5mnTnaS+rtCvS+ylSEOK76YXO5zoHQx/QMB1N54Cp+Ya9jB9922EHrh14ld4xmmw== dependencies: css-color-keywords "^1.0.0" fbjs "^0.8.5" @@ -2171,15 +3047,41 @@ css-tokenize@^1.0.1: inherits "^2.0.1" readable-stream "^1.0.33" +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" +css-what@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" + integrity sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ== + cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" -"cssnano@>=2.6.1 <4": +"cssnano@>=2.6.1 <4", cssnano@^3.4.0: version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" dependencies: @@ -2216,6 +3118,13 @@ cssesc@^0.1.0: postcss-value-parser "^3.2.3" postcss-zindex "^2.0.1" +csso@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" @@ -2233,25 +3142,22 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" -d@^0.1.1, d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" - dependencies: - es5-ext "~0.10.2" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" @@ -2273,35 +3179,63 @@ debug@2.2.0, debug@~2.2.0: dependencies: ms "0.7.1" -debug@2.6.0, debug@^2.2.0: +debug@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" dependencies: ms "0.7.2" -debug@^2.1.1, debug@^2.1.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8: +debug@2.6.9, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.0.0, debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" +debug@^3.0.0, debug@^3.1.0, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: - ms "2.0.0" + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== + dependencies: + xregexp "4.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.1, deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + integrity sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8= deep-freeze@^0.0.1: version "0.0.1" @@ -2311,12 +3245,49 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + dependencies: + strip-bom "^3.0.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + is-descriptor "^1.0.2" + isobject "^3.0.1" defined@^1.0.0, defined@~1.0.0: version "1.0.0" @@ -2348,14 +3319,17 @@ del@^3.0.0: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: version "1.0.0" @@ -2368,11 +3342,30 @@ destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +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== + +diff-sequences@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.0.0.tgz#cdf8e27ed20d8b8d3caccb4e0c0d8fe31a173013" + integrity sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw== diff@^2.2.1: version "2.2.3" @@ -2390,17 +3383,19 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -dmg-builder@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-2.1.5.tgz#f1f7d68d75cfb834e793c0681c7f50ced0a3038d" - dependencies: - bluebird-lst "^1.0.5" - builder-util "^3.2.0" - debug "^3.1.0" - fs-extra-p "^4.4.4" - iconv-lite "^0.4.19" - js-yaml "^3.10.0" +dmg-builder@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-6.5.4.tgz#18c573a5e777cbb39d84d7eaa84d965e1bb5b01f" + integrity sha512-EaEkF8weXez3iAwgYffjcYfumauUh5x+BggMgn/IuihNIA5/WfzRAUR4wMq9aII2zwArlw+rIrX6ZHKbmtkQmA== + dependencies: + app-builder-lib "~20.38.5" + bluebird-lst "^1.0.6" + builder-util "~9.6.2" + fs-extra-p "^7.0.0" + iconv-lite "^0.4.24" + js-yaml "^3.12.1" parse-color "^1.0.0" + sanitize-filename "^1.6.1" dns-equal@^1.0.0: version "1.0.0" @@ -2426,12 +3421,12 @@ doctrine@^1.2.2: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" - isarray "^1.0.0" doiuse@^2.4.1: version "2.6.0" @@ -2475,6 +3470,11 @@ domelementtype@1: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" +domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" @@ -2489,6 +3489,13 @@ domhandler@2.1: dependencies: domelementtype "1" +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + domutils@1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" @@ -2502,19 +3509,30 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== dependencies: is-obj "^1.0.0" -dotenv-expand@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.0.1.tgz#68fddc1561814e0a10964111057ff138ced7d7a8" +dotenv-expand@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" + integrity sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU= -dotenv@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" +dotenv@^6.1.0, dotenv@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== duplexer2@0.0.2: version "0.0.2" @@ -2525,60 +3543,57 @@ duplexer2@0.0.2: duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -ejs@^2.5.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" - -electron-builder@^19.43.0: - version "19.43.0" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.43.0.tgz#0938989ec75c66ff577e49434b1433dc6165579f" - dependencies: - "7zip-bin" "^2.2.7" - app-package-builder "1.3.3" - asar-integrity "0.2.3" - async-exit-hook "^2.0.1" - bluebird-lst "^1.0.5" - builder-util "3.2.0" - builder-util-runtime "2.5.0" - chalk "^2.3.0" - chromium-pickle-js "^0.2.0" - cuint "^0.2.2" - debug "^3.1.0" - dmg-builder "2.1.5" - ejs "^2.5.7" - electron-download-tf "4.3.4" - electron-osx-sign "0.4.7" - electron-publish "19.43.0" - fs-extra-p "^4.4.4" - hosted-git-info "^2.5.0" - is-ci "^1.0.10" - isbinaryfile "^3.0.2" - js-yaml "^3.10.0" - lazy-val "^1.0.2" - minimatch "^3.0.4" - normalize-package-data "^2.4.0" - plist "^2.1.0" - read-config-file "1.2.0" +ejs@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + +electron-builder@^20.38.5: + version "20.38.5" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-20.38.5.tgz#31b3913a68b4911afd4cfc7bcd2522c5808040cd" + integrity sha512-p88IDHhH2J4hA6KwRBJY+OfVZuFtFIShY3Uh/TwYAfbX0v1RhKZytuGdO8sty2zcWxDYX74xDBv+X9oN6qEIRQ== + dependencies: + app-builder-lib "20.38.5" + bluebird-lst "^1.0.6" + builder-util "9.6.2" + builder-util-runtime "8.1.1" + chalk "^2.4.2" + dmg-builder "6.5.4" + fs-extra-p "^7.0.0" + is-ci "^2.0.0" + lazy-val "^1.0.3" + read-config-file "3.2.1" sanitize-filename "^1.6.1" - semver "^5.4.1" - temp-file "^2.0.3" - update-notifier "^2.3.0" - yargs "^10.0.3" + update-notifier "^2.5.0" + yargs "^12.0.5" electron-debug@^1.4.0: version "1.4.0" @@ -2596,9 +3611,20 @@ electron-devtools-installer@^2.2.1: rimraf "^2.5.2" semver "^5.3.0" -electron-download-tf@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/electron-download-tf/-/electron-download-tf-4.3.4.tgz#b03740b2885aa2ad3f8784fae74df427f66d5165" +electron-devtools-installer@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz#261a50337e37121d338b966f07922eb4939a8763" + integrity sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA== + dependencies: + "7zip" "0.0.6" + cross-unzip "0.0.2" + rimraf "^2.5.2" + semver "^5.3.0" + +electron-download@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8" + integrity sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg== dependencies: debug "^3.0.0" env-paths "^1.0.0" @@ -2610,20 +3636,6 @@ electron-download-tf@4.3.4: semver "^5.4.1" sumchecker "^2.0.2" -electron-download@^3.0.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" - dependencies: - debug "^2.2.0" - fs-extra "^0.30.0" - home-path "^1.0.1" - minimist "^1.2.0" - nugget "^2.0.0" - path-exists "^2.1.0" - rc "^1.1.2" - semver "^5.3.0" - sumchecker "^1.2.0" - electron-is-accelerator@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" @@ -2645,84 +3657,92 @@ electron-log@^2.2.14: version "2.2.14" resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-2.2.14.tgz#2123319ccb8d70b0db07f0eda57d5823cb42b4b0" -electron-osx-sign@0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.7.tgz#1d75647a82748eacd48bea70616ec83ffade3ee5" +electron-osx-sign@0.4.11: + version "0.4.11" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.11.tgz#8377732fe7b207969f264b67582ee47029ce092f" + integrity sha512-VVd40nrnVqymvFrY9ZkOYgHJOvexHHYTR3di/SN+mjJ0OWhR1I8BRVj3U+Yamw6hnkZZNKZp52rqL5EFAAPFkQ== dependencies: bluebird "^3.5.0" compare-version "^0.1.2" debug "^2.6.8" isbinaryfile "^3.0.2" minimist "^1.2.0" - plist "^2.1.0" + plist "^3.0.1" -electron-publish@19.43.0: - version "19.43.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.43.0.tgz#3a5b8f6317a2a83faa008c26594220ffb4006664" +electron-publish@20.38.5: + version "20.38.5" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-20.38.5.tgz#c6ed7ea12bc80796b1f36489995f4651f730b1df" + integrity sha512-EhdPm6t0nKDfa0r3KjV1kSFcz03VrzgJRv7v5nHkkpQZB6OSmDNlHq7k66NBwQhPK3i4CK+uvehljZAP28vbCA== dependencies: - bluebird-lst "^1.0.5" - builder-util "^3.2.0" - builder-util-runtime "^2.5.0" - chalk "^2.3.0" - fs-extra-p "^4.4.4" - mime "^2.0.3" + bluebird-lst "^1.0.6" + builder-util "~9.6.2" + builder-util-runtime "^8.1.1" + chalk "^2.4.2" + fs-extra-p "^7.0.0" + lazy-val "^1.0.3" + mime "^2.4.0" electron-to-chromium@^1.2.7: version "1.3.2" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.2.tgz#b8ce5c93b308db0e92f6d0435c46ddec8f6363ab" -electron-to-chromium@^1.3.24: - version "1.3.27" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" +electron-to-chromium@^1.3.103: + version "1.3.113" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" + integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== -electron-webpack-js@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/electron-webpack-js/-/electron-webpack-js-1.1.0.tgz#c7c1cf375f6d32638ba62f46e1bd31445b7f1018" +electron-webpack-js@~2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/electron-webpack-js/-/electron-webpack-js-2.3.1.tgz#bdb234494ebf4d3ca0e8063c4b9a816a5bac5628" + integrity sha512-RI+Vw/LwqOQMGGpdkm2sWtrdfqgFhXXul+RkMXJ+T9LJht38kg9qq9OtCievrGQyxfcpgB99EDr4GcKMVFShGA== dependencies: - babel-core "^6.26.0" - babel-loader "^7.1.2" - babel-plugin-component "^0.10.1" - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-preset-env "^1.6.1" + "@babel/core" "^7.2.2" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/preset-env" "^7.2.3" + babel-loader "^8.0.5" + babel-plugin-component "^1.1.1" -electron-webpack@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/electron-webpack/-/electron-webpack-1.11.0.tgz#51cbdc1a6ba1e73af8504fba135996eb1f28ca52" +electron-webpack@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/electron-webpack/-/electron-webpack-2.6.1.tgz#69425faa780215586f8290b55279bad1d2f6c974" + integrity sha512-PHr5/5syGsHzuFxQCzLuvBmPfE+MCDgllcR6s6nDrQC69pZ2ICACiKVVFO+Q2wVb2XBfH31jozaFZ6hscreuwg== dependencies: - "@types/webpack-env" "^1.13.2" + "@types/webpack-env" "^1.13.6" async-exit-hook "^2.0.1" - babel-minify-webpack-plugin "^0.2.0" - bluebird-lst "^1.0.5" - chalk "^2.3.0" + bluebird-lst "^1.0.6" + chalk "^2.4.1" crocket "^0.9.11" - css-hot-loader "^1.3.2" - css-loader "^0.28.7" - debug "^3.1.0" - electron-devtools-installer "^2.2.1" - electron-webpack-js "~1.1.0" - extract-text-webpack-plugin "^3.0.2" - file-loader "^1.1.5" - fs-extra-p "^4.4.4" - html-loader "^0.5.1" - html-webpack-plugin "^2.30.1" - lazy-val "^1.0.2" + css-hot-loader "^1.4.2" + css-loader "^1.0.1" + debug "^4.1.0" + dotenv "^6.1.0" + electron-devtools-installer "^2.2.4" + electron-webpack-js "~2.3.0" + file-loader "^2.0.0" + fs-extra-p "^7.0.0" + html-loader "^1.0.0-alpha.0" + html-webpack-plugin "^3.2.0" + lazy-val "^1.0.3" + mini-css-extract-plugin "^0.4.5" node-loader "^0.6.0" - read-config-file "^1.2.0" - semver "^5.4.1" - source-map-support "^0.5.0" - style-loader "^0.19.0" - url-loader "^0.6.2" - virtual-module-webpack-plugin "^0.3.0" - webpack-dev-server "^2.9.3" - webpack-merge "^4.1.0" - yargs "^10.0.3" - -electron@^1.8.2-beta.2: - version "1.8.2-beta.2" - resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.2-beta.2.tgz#b532c71050ddd2d4b00e2e0d355de4e75bc1e5fd" + read-config-file "^3.2.0" + semver "^5.6.0" + source-map-support "^0.5.9" + style-loader "^0.23.1" + terser-webpack-plugin "^1.1.0" + url-loader "^1.1.2" + webpack-cli "^3.1.2" + webpack-dev-server "^3.1.10" + webpack-merge "^4.1.4" + yargs "^12.0.5" + +electron@3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/electron/-/electron-3.1.5.tgz#9c14041b2f3889997b57133a6b7972b2c557f78d" + integrity sha512-+t3xCGl+ljpb4hHrqHiYw7gv3hUIDtj437spAAgiLFl8JpIrG6Ku2tOIjdkH3W7OHO+aiJJR0xcw8osQ4Y15Iw== dependencies: "@types/node" "^8.0.24" - electron-download "^3.0.1" + electron-download "^4.1.0" extract-zip "^1.0.3" elliptic@^6.0.0: @@ -2734,13 +3754,20 @@ elliptic@^6.0.0: hash.js "^1.0.0" inherits "^2.0.1" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" @@ -2749,19 +3776,25 @@ encoding@^0.1.11: iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@~1.1.1: version "1.1.1" @@ -2770,6 +3803,7 @@ entities@~1.1.1: env-paths@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" + integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= err-code@^1.1.2: version "1.1.2" @@ -2781,9 +3815,17 @@ errno@^0.1.3: dependencies: prr "~0.0.0" -error-ex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" +errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" @@ -2793,6 +3835,18 @@ error-stack-parser@^1.3.6: dependencies: stackframe "^0.3.1" +es-abstract@^1.12.0, es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + es-abstract@^1.5.0: version "1.9.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227" @@ -2820,73 +3874,19 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" -es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: - version "0.10.12" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - es6-iterator "2" - es6-symbol "~3.1" + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" -es6-iterator@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" - dependencies: - d "^0.1.1" - es5-ext "^0.10.7" - es6-symbol "3" - -es6-map@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-set "~0.1.3" - es6-symbol "~3.1.0" - event-emitter "~0.3.4" - -es6-promise@^4.0.5: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" - -es6-set@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - es6-iterator "2" - es6-symbol "3" - event-emitter "~0.3.4" - -es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" - dependencies: - d "~0.1.1" - es5-ext "~0.10.11" - -es6-templates@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/es6-templates/-/es6-templates-0.2.3.tgz#5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4" - dependencies: - recast "~0.11.12" - through "~2.3.6" - -es6-weak-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" - dependencies: - d "^0.1.1" - es5-ext "^0.10.8" - es6-iterator "2" - es6-symbol "3" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -2906,15 +3906,6 @@ escodegen@^1.9.0: optionalDependencies: source-map "~0.5.6" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-config-standard-jsx@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.3.0.tgz#cab0801a15a360bf63facb97ab22fbdd88d8a5e0" @@ -2933,6 +3924,11 @@ eslint-plugin-babel@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-4.1.2.tgz#79202a0e35757dd92780919b2336f1fa2fe53c1e" +eslint-plugin-jest@^22.3.0: + version "22.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.3.0.tgz#a10f10dedfc92def774ec9bb5bfbd2fb8e1c96d2" + integrity sha512-P1mYVRNlOEoO5T9yTqOfucjOYf1ktmJ26NjwjH8sxpCFQa6IhBGr5TpKl3hcAAT29hOsRJVuMWmTsHoUVo9FoA== + eslint-plugin-promise@^3.4.1: version "3.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz#54b7658c8f454813dc2a870aff8152ec4969ba75" @@ -2951,68 +3947,111 @@ eslint-plugin-standard@^2.0.1: version "2.3.1" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.3.1.tgz#6765bd2a6d9ecdc7bdf1b145ae4bb30e2b7b86f8" -eslint@^3.15.0: - version "3.19.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" - esquery "^1.0.0" - estraverse "^4.2.0" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.0.tgz#e2c3c8dba768425f897cf0f9e51fe2e241485d4c" + integrity sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ== + dependencies: + eslint-visitor-keys "^1.0.0" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.1.0.tgz#06438a4a278b1d84fb107d24eaaa35471986e646" + integrity sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^6.0.0" + esquery "^1.0.1" esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" + inquirer "^6.4.1" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" - strip-json-comments "~2.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" -espree@^3.4.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.1.tgz#0c988b8ab46db53100a1954ae4ba995ddd27d87e" +espree@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.0.0.tgz#716fc1f5a245ef5b9a7fdb1d7b0d3f02322e75f6" + integrity sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q== dependencies: - acorn "^5.1.1" - acorn-jsx "^3.0.0" + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^3.1.3, esprima@~3.1.0: +esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== dependencies: estraverse "^4.0.0" @@ -3031,20 +4070,14 @@ estraverse@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" - -event-emitter@~0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" - dependencies: - d "~0.1.1" - es5-ext "~0.10.7" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" @@ -3062,11 +4095,12 @@ events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== dependencies: - original ">=0.0.5" + original "^1.0.0" evp_bytestokey@^1.0.0: version "1.0.0" @@ -3074,9 +4108,30 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" +exec-sh@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== + dependencies: + merge "^1.2.0" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.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" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -3086,15 +4141,29 @@ 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" dependencies: clone-regexp "^1.0.0" -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^0.1.4: version "0.1.5" @@ -3102,54 +4171,111 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" dependencies: fill-range "^2.1.0" -expand-template@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" -express@^4.13.3: - version "4.14.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.14.1.tgz#646c237f766f148c2120aff073817b9e4d7e0d33" +expect@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.1.0.tgz#88e73301c4c785cde5f16da130ab407bdaf8c0f2" + integrity sha512-lVcAPhaYkQcIyMS+F8RVwzbm1jro20IG8OkvxQ6f1JfqhVZyyudCwYogQ7wnktlf14iF3ii7ArIUO/mqvrW9Gw== dependencies: - accepts "~1.3.3" + ansi-styles "^3.2.0" + jest-get-type "^24.0.0" + jest-matcher-utils "^24.0.0" + jest-message-util "^24.0.0" + jest-regex-util "^24.0.0" + +express@^4.16.2: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" array-flatten "1.1.1" + body-parser "1.18.3" content-disposition "0.5.2" - content-type "~1.0.2" + content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" - debug "~2.2.0" - depd "~1.1.0" - encodeurl "~1.0.1" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" - etag "~1.7.0" - finalhandler "0.5.1" - fresh "0.3.0" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~1.1.3" - qs "6.2.0" + proxy-addr "~2.0.4" + qs "6.5.2" range-parser "~1.2.0" - send "0.14.2" - serve-static "~1.11.2" - type-is "~1.6.14" - utils-merge "1.0.0" - vary "~1.1.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" -extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend@~3.0.1, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" extglob@^0.3.1: version "0.3.2" @@ -3157,14 +4283,19 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extract-text-webpack-plugin@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7" - dependencies: - async "^2.4.1" - loader-utils "^1.1.0" - schema-utils "^0.3.0" - webpack-sources "^1.0.1" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" extract-zip@^1.0.3: version "1.6.5" @@ -3175,17 +4306,30 @@ extract-zip@^1.0.3: mkdirp "0.5.0" yauzl "2.4.1" -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 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" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" @@ -3201,12 +4345,32 @@ faye-websocket@^0.10.0: dependencies: websocket-driver ">=0.5.1" -faye-websocket@~0.11.0: +faye-websocket@~0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + 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.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.5, fbjs@^0.8.9: version "0.8.16" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" @@ -3225,13 +4389,25 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" -figures@^1.3.5, figures@^1.4.0: +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^1.4.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" dependencies: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -3239,17 +4415,33 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -file-loader@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.5.tgz#91c25b6b6fbe56dae99f10a425fd64933b5c9daa" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" + integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== dependencies: loader-utils "^1.0.2" - schema-utils "^0.3.0" + schema-utils "^1.0.0" filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" +fileset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + fill-keys@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" @@ -3267,45 +4459,86 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" -finalhandler@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.1.tgz#2c400d8d4530935bc232549c5fa385ec07de6fcd" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: - debug "~2.2.0" + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" - statuses "~1.3.1" + parseurl "~1.3.2" + statuses "~1.4.0" unpipe "~1.0.0" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= dependencies: commondir "^1.0.1" make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -3315,10 +4548,32 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +flush-write-stream@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.0.tgz#2e89a8bd5eee42f8ec97e43aae81e3d5099c2ddc" + integrity sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg== + dependencies: + inherits "^2.0.3" + readable-stream "^3.1.1" + flux-standard-action@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/flux-standard-action/-/flux-standard-action-0.6.1.tgz#6f34211b94834ea1c3cc30f4e7afad3d0fbf71a2" @@ -3335,19 +4590,21 @@ for-in@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + for-own@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" dependencies: for-in "^0.1.5" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.1.1: version "2.1.2" @@ -3357,12 +4614,13 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" +form-data@~2.3.1, form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "^1.0.6" mime-types "^2.1.12" formatio@1.2.0: @@ -3371,39 +4629,74 @@ formatio@1.2.0: dependencies: samsam "1.x" -forwarded@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= -fresh@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra-p@^4.4.0, fs-extra-p@^4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.4.4.tgz#396ad6f914eb2954e1700fd0e18288301ed45f04" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: - bluebird-lst "^1.0.4" - fs-extra "^4.0.2" + inherits "^2.0.1" + readable-stream "^2.0.0" -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" +fs-extra-p@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-7.0.0.tgz#da9a72df71dc77fb938162025a5fc658713c98ab" + integrity sha512-5tg5jBOd0xIXjwj4PDnafOXL5TyPVzjxLby4DPKev53wurEXp7IsojBaD4Lj5M5w7jxw0pbkEU0fFEPmcKoMnA== dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" + bluebird-lst "^1.0.6" + fs-extra "^7.0.0" fs-extra@^4.0.1, fs-extra@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3415,6 +4708,19 @@ fsevents@^1.0.0: nan "^2.3.0" node-pre-gyp "^0.6.29" +fsevents@^1.2.3, fsevents@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fsevents@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.6.tgz#87b19df0bfb4a1a51d7ddb51b01b5f3bedb40c33" + integrity sha512-vfmKZp3XPM36DNF0qhW+Cdxk7xm7gTEHY1clv1Xq1arwRQuKZgAhw+NZNWbJBtuaNxzNXwhfdPYRrvIbjfS33A== + fstream-ignore@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" @@ -3432,21 +4738,28 @@ fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.0: +function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function-bind@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" -function-bind@^1.1.1, function-bind@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= gather-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gather-stream/-/gather-stream-1.0.0.tgz#b33994af457a8115700d410f317733cbe7a0904b" -gauge@~2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -3457,23 +4770,15 @@ gauge@~2.7.1: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stdin@^5.0.0: version "5.0.1" @@ -3482,17 +4787,27 @@ get-stdin@^5.0.0: get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +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" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -3506,6 +4821,21 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" + integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== + dependencies: + is-glob "^4.0.1" + glob@7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.4.tgz#3b44afa0943bdc31b2037b934791e2e084bcb7f6" @@ -3517,33 +4847,66 @@ glob@7.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.2, glob@~7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.0.2" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" +glob@^7.1.1, glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.2, glob@~7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.2" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" global-dirs@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" global@^4.3.0: version "4.3.2" @@ -3552,7 +4915,17 @@ global@^4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^9.14.0, globals@^9.18.0: +globals@^11.1.0: + version "11.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" + integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== + +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3609,6 +4982,7 @@ glslify-import@^3.1.0: got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" @@ -3622,13 +4996,36 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -handle-thing@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +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@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" + integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" har-schema@^1.0.5: version "1.0.5" @@ -3637,6 +5034,7 @@ har-schema@^1.0.5: har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~4.2.1: version "4.2.1" @@ -3648,10 +5046,19 @@ har-validator@~4.2.1: har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= dependencies: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + has-ansi@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" @@ -3671,12 +5078,62 @@ has-flag@^1.0.0: has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" -has@^1.0.1, has@~1.0.1: +has@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" dependencies: @@ -3700,6 +5157,7 @@ hawk@~3.1.3: hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== dependencies: boom "4.x.x" cryptiles "3.x.x" @@ -3725,12 +5183,9 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - -hoist-non-react-statics@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb" + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== hoist-non-react-statics@^2.2.1, hoist-non-react-statics@^2.3.0: version "2.3.1" @@ -3740,24 +5195,22 @@ hoist-non-react-statics@^2.3.1: version "2.5.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" -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" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -home-path@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" +home-or-tmp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" + integrity sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs= -hosted-git-info@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" +homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= + dependencies: + parse-passwd "^1.0.0" -hosted-git-info@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== hpack.js@^2.1.6: version "2.1.6" @@ -3782,17 +5235,18 @@ html-entities@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.0.tgz#41948caf85ce82fed36e4e6a0ed371a6664379e2" -html-loader@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.1.tgz#4f1e8396a1ea6ab42bedc987dfac058070861ebe" +html-loader@^1.0.0-alpha.0: + version "1.0.0-alpha.0" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.0.0-alpha.0.tgz#3f4ae7b490a587619be6d1eaa8ce16683580c642" + integrity sha512-KcuaIRWTU0kFjOJCs32a3JsGNCWkeOak0/F/uvJNp3x/N4McXdqHpcK64cYTozK7QLPKKtUqb9h7wR9K9rYRkg== dependencies: - es6-templates "^0.2.2" - fastparse "^1.1.1" - html-minifier "^3.0.1" - loader-utils "^1.0.2" - object-assign "^4.1.0" + "@posthtml/esm" "^1.0.0" + htmlnano "^0.1.6" + loader-utils "^1.1.0" + posthtml "^0.11.2" + schema-utils "^0.4.3" -html-minifier@^3.0.1, html-minifier@^3.2.3: +html-minifier@^3.2.3: version "3.5.6" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.6.tgz#7e4e661a09999599c7d8e8a2b8d7fb7430bb5c3e" dependencies: @@ -3809,16 +5263,42 @@ html-tags@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" -html-webpack-plugin@^2.30.1: - version "2.30.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz#7f9c421b7ea91ec460f56527d78df484ee7537d5" +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= dependencies: - bluebird "^3.4.7" html-minifier "^3.2.3" loader-utils "^0.2.16" lodash "^4.17.3" pretty-error "^2.0.2" + tapable "^1.0.0" toposort "^1.0.0" + util.promisify "1.0.0" + +htmlnano@^0.1.6: + version "0.1.10" + resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.1.10.tgz#a0a548eb4c76ae2cf2423ec7a25c881734d3dea6" + integrity sha512-eTEUzz8VdWYp+w/KUdb99kwao4reR64epUySyZkQeepcyzPQ2n2EPWzibf6QDxmkGy10Kr+CKxYqI3izSbmhJQ== + dependencies: + cssnano "^3.4.0" + object-assign "^4.0.1" + posthtml "^0.11.3" + posthtml-render "^1.1.4" + svgo "^1.0.5" + terser "^3.8.1" + +htmlparser2@^3.9.2: + version "3.10.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" + integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.0.6" htmlparser2@~3.3.0: version "3.3.0" @@ -3829,11 +5309,21 @@ htmlparser2@~3.3.0: domutils "1.1" readable-stream "1.0" -http-deceiver@^1.2.4: +http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" -http-errors@~1.5.0, http-errors@~1.5.1: +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" dependencies: @@ -3841,14 +5331,15 @@ http-errors@~1.5.0, http-errors@~1.5.1: setprototypeof "1.0.2" statuses ">= 1.3.1 < 2" -http-proxy-middleware@~0.17.4: - version "0.17.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" +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" + integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== dependencies: http-proxy "^1.16.2" - is-glob "^3.1.0" - lodash "^4.17.2" - micromatch "^2.3.11" + is-glob "^4.0.0" + lodash "^4.17.5" + micromatch "^3.1.9" http-proxy@^1.16.2: version "1.16.2" @@ -3868,6 +5359,7 @@ http-signature@~1.1.0: http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" @@ -3877,14 +5369,33 @@ https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" -iconv-lite@0.4.19, iconv-lite@^0.4.19, iconv-lite@~0.4.13: +iconv-lite@0.4.19, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.0.2.tgz#cb0b6054eb3af6edc9ab1d62d01933e2d4c8bfa5" +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + icss-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" @@ -3895,28 +5406,57 @@ ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + ignore@^3.2.0: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -import-local@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8" +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: - pkg-dir "^2.0.0" + pkg-dir "^3.0.0" resolve-cwd "^2.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" @@ -3938,46 +5478,48 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inquirer@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" + integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" through "^2.3.6" -int64-buffer@^0.1.9: - version "0.1.9" - resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.9.tgz#9e039da043b24f78b196b283e04653ef5e990f61" - -internal-ip@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== dependencies: - meow "^3.3.0" + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" -interpret@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" +interpret@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2: version "2.2.2" @@ -3985,17 +5527,41 @@ invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +invariant@^2.2.0, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" -ipaddr.js@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.2.0.tgz#8aba49c9192799585bdd643e0ccb50e8ae777ba4" +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + integrity sha1-+kt5+kf9Pe9eOxWYJRYcClGclCc= irregular-plurals@^1.0.0: version "1.4.0" @@ -4005,9 +5571,24 @@ 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" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" @@ -4015,29 +5596,88 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-binary-path@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.0.2: version "1.1.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.0.0.tgz#137d3d2425023a19a660fb9dd6ddfabe52c03466" + integrity sha512-/93sDihsAD652hrMEbJGbMAVBf1qc96kyThHQ0CAOONHaE3aROLpTjDe4WQ5aoC5ITHFxEq1z8XqSU7km+8amw== dependencies: - builtin-modules "^1.0.0" + builtin-modules "^3.0.0" is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + is-ci@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.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" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: - ci-info "^1.0.0" + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" is-directory@^0.3.1: version "0.3.1" @@ -4053,10 +5693,17 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" @@ -4068,23 +5715,31 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: is-finite@^1.0.0, is-finite@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-function@^1.0.1, is-function@~1.0.0: +is-function@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" +is-generator-fn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e" + integrity sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g== + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -4103,25 +5758,25 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= dependencies: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-my-json-valid@^2.10.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= is-number@^2.0.2, is-number@^2.1.0: version "2.1.0" @@ -4129,9 +5784,22 @@ is-number@^2.0.2, is-number@^2.1.0: dependencies: kind-of "^3.0.2" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= is-object@~1.0.1: version "1.0.1" @@ -4148,8 +5816,9 @@ is-path-in-cwd@^1.0.0: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" @@ -4157,9 +5826,10 @@ is-plain-obj@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" -is-plain-object@^2.0.1: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" @@ -4175,13 +5845,10 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= is-regex@^1.0.3: version "1.0.3" @@ -4190,6 +5857,7 @@ is-regex@^1.0.3: is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" @@ -4197,15 +5865,10 @@ is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" @@ -4225,70 +5888,517 @@ is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +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" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.0.tgz#07d1061c21598b41292b0f5c68add5eab601ad8e" + integrity sha512-RBtmso6l2mCaEsUvXngMTIjg3oheXo0MgYzzfT6sk44RYggPnm9fT+cQJAmzRnJIxPHXg9FZglqDJGW28dvcqA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0, isobject@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-api@^2.0.8: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0" + integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw== + dependencies: + async "^2.6.1" + compare-versions "^3.2.1" + fileset "^2.0.3" + istanbul-lib-coverage "^2.0.3" + istanbul-lib-hook "^2.0.3" + istanbul-lib-instrument "^3.1.0" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.2" + istanbul-reports "^2.1.1" + js-yaml "^3.12.0" + make-dir "^1.3.0" + minimatch "^3.0.4" + once "^1.4.0" + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" + integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== + +istanbul-lib-hook@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" + integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== + dependencies: + append-transform "^1.0.0" + +istanbul-lib-instrument@^3.0.0, istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" + integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== + dependencies: + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.3" + semver "^5.5.0" + +istanbul-lib-report@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" + integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== + dependencies: + istanbul-lib-coverage "^2.0.3" + make-dir "^1.3.0" + supports-color "^6.0.0" + +istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" + integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.3" + make-dir "^1.3.0" + rimraf "^2.6.2" + source-map "^0.6.1" + +istanbul-reports@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" + integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== + dependencies: + handlebars "^4.1.0" + +jest-changed-files@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0.tgz#c02c09a8cc9ca93f513166bc773741bd39898ff7" + integrity sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ== + dependencies: + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.1.0.tgz#f7cc98995f36e7210cce3cbb12974cbf60940843" + integrity sha512-U/iyWPwOI0T1CIxVLtk/2uviOTJ/OiSWJSe8qt6X1VkbbgP+nrtLJlmT9lPBe4lK78VNFJtrJ7pttcNv/s7yCw== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.15" + import-local "^2.0.0" + is-ci "^2.0.0" + istanbul-api "^2.0.8" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-changed-files "^24.0.0" + jest-config "^24.1.0" + jest-environment-jsdom "^24.0.0" + jest-get-type "^24.0.0" + jest-haste-map "^24.0.0" + jest-message-util "^24.0.0" + jest-regex-util "^24.0.0" + jest-resolve-dependencies "^24.1.0" + jest-runner "^24.1.0" + jest-runtime "^24.1.0" + jest-snapshot "^24.1.0" + jest-util "^24.0.0" + jest-validate "^24.0.0" + jest-watcher "^24.0.0" + jest-worker "^24.0.0" + micromatch "^3.1.10" + node-notifier "^5.2.1" + p-each-series "^1.0.0" + pirates "^4.0.0" + prompts "^2.0.1" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^2.0.0" + string-length "^2.0.0" + strip-ansi "^5.0.0" + which "^1.2.12" + yargs "^12.0.2" + +jest-config@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.1.0.tgz#6ea6881cfdd299bc86cc144ee36d937c97c3850c" + integrity sha512-FbbRzRqtFC6eGjG5VwsbW4E5dW3zqJKLWYiZWhB0/4E5fgsMw8GODLbGSrY5t17kKOtCWb/Z7nsIThRoDpuVyg== + dependencies: + "@babel/core" "^7.1.0" + babel-jest "^24.1.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.0.0" + jest-environment-node "^24.0.0" + jest-get-type "^24.0.0" + jest-jasmine2 "^24.1.0" + jest-regex-util "^24.0.0" + jest-resolve "^24.1.0" + jest-util "^24.0.0" + jest-validate "^24.0.0" + micromatch "^3.1.10" + pretty-format "^24.0.0" + realpath-native "^1.0.2" + +jest-diff@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0.tgz#a3e5f573dbac482f7d9513ac9cfa21644d3d6b34" + integrity sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.0.0" + jest-get-type "^24.0.0" + pretty-format "^24.0.0" -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" +jest-docblock@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0.tgz#54d77a188743e37f62181a91a01eb9222289f94e" + integrity sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA== + dependencies: + detect-newline "^2.1.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" +jest-each@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0.tgz#10987a06b21c7ffbfb7706c89d24c52ed864be55" + integrity sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA== + dependencies: + chalk "^2.0.1" + jest-get-type "^24.0.0" + jest-util "^24.0.0" + pretty-format "^24.0.0" + +jest-environment-jsdom@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz#5affa0654d6e44cd798003daa1a8701dbd6e4d11" + integrity sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw== + dependencies: + jest-mock "^24.0.0" + jest-util "^24.0.0" + jsdom "^11.5.1" + +jest-environment-node@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0.tgz#330948980656ed8773ce2e04eb597ed91e3c7190" + integrity sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg== + dependencies: + jest-mock "^24.0.0" + jest-util "^24.0.0" + +jest-get-type@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0.tgz#36e72930b78e33da59a4f63d44d332188278940b" + integrity sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w== + +jest-haste-map@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0.tgz#e9ef51b2c9257384b4d6beb83bd48c65b37b5e6e" + integrity sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ== + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.0.0" + jest-util "^24.0.0" + jest-worker "^24.0.0" + micromatch "^3.1.10" + sane "^3.0.0" + +jest-jasmine2@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.1.0.tgz#8377324b967037c440f0a549ee0bbd9912055db6" + integrity sha512-H+o76SdSNyCh9fM5K8upK45YTo/DiFx5w2YAzblQebSQmukDcoVBVeXynyr7DDnxh+0NTHYRCLwJVf3tC518wg== + dependencies: + "@babel/traverse" "^7.1.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.1.0" + is-generator-fn "^2.0.0" + jest-each "^24.0.0" + jest-matcher-utils "^24.0.0" + jest-message-util "^24.0.0" + jest-snapshot "^24.1.0" + jest-util "^24.0.0" + pretty-format "^24.0.0" + throat "^4.0.0" + +jest-leak-detector@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz#78280119fd05ee98317daee62cddb3aa537a31c6" + integrity sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg== + dependencies: + pretty-format "^24.0.0" + +jest-matcher-utils@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz#fc9c41cfc49b2c3ec14e576f53d519c37729d579" + integrity sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.0.0" + jest-get-type "^24.0.0" + pretty-format "^24.0.0" -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" +jest-message-util@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0.tgz#a07a141433b2c992dbaec68d4cbfe470ba289619" + integrity sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q== + dependencies: + "@babel/code-frame" "^7.0.0" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0.tgz#9a4b53e01d66a0e780f7d857462d063e024c617d" + integrity sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A== + +jest-regex-util@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0.tgz#4feee8ec4a358f5bee0a654e94eb26163cb9089a" + integrity sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q== + +jest-resolve-dependencies@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.1.0.tgz#78f738a2ec59ff4d00751d9da56f176e3f589f6c" + integrity sha512-2VwPsjd3kRPu7qe2cpytAgowCObk5AKeizfXuuiwgm1a9sijJDZe8Kh1sFj6FKvSaNEfCPlBVkZEJa2482m/Uw== + dependencies: + jest-regex-util "^24.0.0" + jest-snapshot "^24.1.0" + +jest-resolve@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.1.0.tgz#42ff0169b0ea47bfdbd0c52a0067ca7d022c7688" + integrity sha512-TPiAIVp3TG6zAxH28u/6eogbwrvZjBMWroSLBDkwkHKrqxB/RIdwkWDye4uqPlZIXWIaHtifY3L0/eO5Z0f2wg== + dependencies: + browser-resolve "^1.11.3" + chalk "^2.0.1" + realpath-native "^1.0.0" + +jest-runner@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.1.0.tgz#3686a2bb89ce62800da23d7fdc3da2c32792943b" + integrity sha512-CDGOkT3AIFl16BLL/OdbtYgYvbAprwJ+ExKuLZmGSCSldwsuU2dEGauqkpvd9nphVdAnJUcP12e/EIlnTX0QXg== + dependencies: + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.1.0" + jest-docblock "^24.0.0" + jest-haste-map "^24.0.0" + jest-jasmine2 "^24.1.0" + jest-leak-detector "^24.0.0" + jest-message-util "^24.0.0" + jest-runtime "^24.1.0" + jest-util "^24.0.0" + jest-worker "^24.0.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.1.0.tgz#7c157a2e776609e8cf552f956a5a19ec9c985214" + integrity sha512-59/BY6OCuTXxGeDhEMU7+N33dpMQyXq7MLK07cNSIY/QYt2QZgJ7Tjx+rykBI0skAoigFl0A5tmT8UdwX92YuQ== + dependencies: + "@babel/core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.1.0" + jest-haste-map "^24.0.0" + jest-message-util "^24.0.0" + jest-regex-util "^24.0.0" + jest-resolve "^24.1.0" + jest-snapshot "^24.1.0" + jest-util "^24.0.0" + jest-validate "^24.0.0" + micromatch "^3.1.10" + realpath-native "^1.0.0" + slash "^2.0.0" + strip-bom "^3.0.0" + write-file-atomic "2.4.1" + yargs "^12.0.2" -isbinaryfile@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" +jest-serializer@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0.tgz#522c44a332cdd194d8c0531eb06a1ee5afb4256b" + integrity sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw== -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" +jest-snapshot@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.1.0.tgz#85e22f810357aa5994ab61f236617dc2205f2f5b" + integrity sha512-th6TDfFqEmXvuViacU1ikD7xFb7lQsPn2rJl7OEmnfIVpnrx3QNY2t3PE88meeg0u/mQ0nkyvmC05PBqO4USFA== + dependencies: + "@babel/types" "^7.0.0" + chalk "^2.0.1" + jest-diff "^24.0.0" + jest-matcher-utils "^24.0.0" + jest-message-util "^24.0.0" + jest-resolve "^24.1.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.0.0" + semver "^5.5.0" -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" +jest-util@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0.tgz#fd38fcafd6dedbd0af2944d7a227c0d91b68f7d6" + integrity sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ== dependencies: - isarray "1.0.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + jest-message-util "^24.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" +jest-validate@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0.tgz#aa8571a46983a6538328fef20406b4a496b6c020" + integrity sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g== + dependencies: + camelcase "^5.0.0" + chalk "^2.0.1" + jest-get-type "^24.0.0" + leven "^2.1.0" + pretty-format "^24.0.0" -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" +jest-watcher@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0.tgz#20d44244d10b0b7312410aefd256c1c1eef68890" + integrity sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g== dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.0.0" + string-length "^2.0.0" -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +jest-worker@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0.tgz#3d3483b077bf04f412f47654a27bba7e947f8b6d" + integrity sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg== + dependencies: + merge-stream "^1.0.1" + supports-color "^6.1.0" -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" +jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.1.0.tgz#b1e1135caefcf2397950ecf7f90e395fde866fd2" + integrity sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A== dependencies: - jsbn "~0.1.0" + import-local "^2.0.0" + jest-cli "^24.1.0" js-base64@^2.1.9: version "2.1.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.10.0, js-yaml@^3.2.7, js-yaml@^3.4.3, js-yaml@^3.5.1: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.12.0, js-yaml@^3.12.1: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.2.7, js-yaml@^3.4.3: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: @@ -4305,6 +6415,7 @@ js-yaml@~3.7.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom-global@^3.0.2: version "3.0.2" @@ -4339,27 +6450,41 @@ jsdom@^11.5.1: whatwg-url "^6.3.0" xml-name-validator "^2.0.1" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" -json-loader@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -4368,16 +6493,31 @@ json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0, json5@^0.5.1: +json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" -jsonfile@^2.1.0, jsonfile@^2.4.0: +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" optionalDependencies: @@ -4386,6 +6526,7 @@ jsonfile@^2.1.0, jsonfile@^2.4.0: jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" @@ -4406,17 +6547,15 @@ jsonparse@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - jsprim@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: - extsprintf "1.0.2" + assert-plus "1.0.0" + extsprintf "1.3.0" json-schema "0.2.3" - verror "1.3.6" + verror "1.10.0" jsx-ast-utils@^1.3.4: version "1.4.1" @@ -4430,17 +6569,45 @@ keyboardevents-areequal@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" +killable@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + kind-of@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" dependencies: is-buffer "^1.0.2" -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" +kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +kleur@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.2.tgz#83c7ec858a41098b613d5998a7b653962b504f68" + integrity sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q== known-css-properties@^0.2.0: version "0.2.0" @@ -4449,23 +6616,29 @@ known-css-properties@^0.2.0: latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= dependencies: package-json "^4.0.0" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazy-val@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.2.tgz#d9b07fb1fce54cbc99b3c611de431b83249369b6" +lazy-val@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.3.tgz#bb97b200ef00801d94c317e29dc6ed39e31c5edc" + integrity sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg== lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + ldjson-stream@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ldjson-stream/-/ldjson-stream-1.2.1.tgz#91beceda5ac4ed2b17e649fb777e7abfa0189c2b" @@ -4477,6 +6650,11 @@ left-pad@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4487,6 +6665,7 @@ levn@^0.3.0, levn@~0.3.0: load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4494,13 +6673,14 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" + parse-json "^4.0.0" + pify "^3.0.0" strip-bom "^3.0.0" loader-runner@^2.3.0: @@ -4516,7 +6696,16 @@ loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.16: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.0.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: @@ -4527,10 +6716,19 @@ loader-utils@^1.0.2, loader-utils@^1.1.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash-es@^4.17.3: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.5.tgz#9fc6e737b1c4d151d8f9cae2247305d552ce748f" @@ -4567,10 +6765,6 @@ lodash.isplainobject@^3.2.0: lodash.isarguments "^3.0.0" lodash.keysin "^3.0.0" -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - lodash.keysin@^3.0.0: version "3.0.8" resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz#22c4493ebbedb1427962a54b445b2c8a767fb47f" @@ -4586,18 +6780,10 @@ lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" -lodash.some@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - lodash.unescape@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" @@ -4606,10 +6792,20 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.1, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" @@ -4624,19 +6820,23 @@ lolex@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: js-tokens "^3.0.0" +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -4646,29 +6846,66 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" -make-dir@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" +make-dir@^1.0.0, make-dir@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" math-expression-evaluator@^1.2.14: version "1.2.17" @@ -4678,15 +6915,28 @@ mathml-tag-names@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz#8d41268168bf86d1102b98109e28e531e7a34578" +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" +mem@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a" + integrity sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg== dependencies: + map-age-cleaner "^0.1.1" mimic-fn "^1.0.0" + p-is-promise "^2.0.0" + +memoize-one@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906" + integrity sha512-2GApq0yI/b22J2j9rhbrAlsHb0Qcz+7yWxeLG8h+95sl1XPUgeLimQSOdur4Vw7cUhrBHwaUZxWFZueojqNRzA== memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" @@ -4698,6 +6948,7 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: meow@3.7.0, meow@^3.1.0, meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -4714,6 +6965,18 @@ merge-descriptors@1.0.1, merge-descriptors@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4736,6 +6999,25 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + miller-rabin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" @@ -4747,37 +7029,38 @@ miller-rabin@^4.0.0: version "1.26.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" + integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" + integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + dependencies: + mime-db "~1.37.0" -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: +mime-types@~2.1.11, mime-types@~2.1.7: version "2.1.14" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" dependencies: mime-db "~1.26.0" -mime-types@~2.1.17: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -mime@1.3.4, mime@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -mime@^1.4.1: +mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.0.3.tgz#4353337854747c48ea498330dc034f9f4bbbcc0b" +mime@^2.0.3, mime@^2.3.1, mime@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" + integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== min-document@^2.19.0: version "2.19.0" @@ -4785,13 +7068,23 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +mini-css-extract-plugin@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz#c99e9e78d54f3fa775633aee5933aeaa4e80719a" + integrity sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" -"minimatch@2 || 3", minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" @@ -4804,15 +7097,60 @@ minimatch@^3.0.0, minimatch@^3.0.2: minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minimist@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" @@ -4822,6 +7160,7 @@ mkdirp@0.5.0: mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" @@ -4829,6 +7168,18 @@ module-not-found-error@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" @@ -4836,10 +7187,17 @@ ms@0.7.1: ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + integrity sha1-riXPJRKziFodldfwN4aNhDESR2U= ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== multicast-dns-service-types@^1.1.0: version "1.1.0" @@ -4861,17 +7219,36 @@ multimatch@^2.0.0: arrify "^1.0.0" minimatch "^3.0.0" -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= nan@^2.3.0: version "2.5.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" -nan@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" +nan@^2.9.2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" native-promise-only@^0.8.1: version "0.8.1" @@ -4887,32 +7264,41 @@ ncname@1.0.x: dependencies: xml-char-classes "^1.0.0" +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +neo-async@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" dependencies: lower-case "^1.1.1" -node-abi@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.1.1.tgz#c9cda256ec8aa99bcab2f6446db38af143338b2a" - node-dir@^0.1.10: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" dependencies: minimatch "^3.0.2" -node-emoji@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" - dependencies: - lodash.toarray "^4.4.0" - node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -4924,6 +7310,11 @@ node-forge@0.6.33: version "0.6.33" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-libs-browser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -4956,6 +7347,38 @@ node-loader@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/node-loader/-/node-loader-0.6.0.tgz#c797ef51095ed5859902b157f6384f6361e05ae8" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.6.29: version "0.6.33" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9" @@ -4970,9 +7393,20 @@ node-pre-gyp@^0.6.29: tar "~2.2.1" tar-pack "~3.3.0" -noop-logger@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" +node-releases@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.7.tgz#b09a10394d0ed8f7778f72bb861dde68b146303b" + integrity sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA== + dependencies: + semver "^5.3.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" nopt@~3.0.6: version "3.0.6" @@ -4980,21 +7414,13 @@ nopt@~3.0.6: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.1.tgz#ca948bac9af17c3c91e49fadd011fd7cb2be5c09" + integrity sha512-ZVuHxWJv1bopjv/SD5uPhgwUhLqxdJ+SsdUQbGR9HWlXrvnd/C08Cn9Bq48PbvX3y5V97GIpAHpL5Bk9BwChGg== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + is-builtin-module "^3.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" @@ -5002,6 +7428,18 @@ normalize-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" @@ -5019,28 +7457,50 @@ normalize-url@^1.4.0, normalize-url@^1.9.1: query-string "^4.1.0" sort-keys "^1.0.0" +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.3.0.tgz#7f01e8e44408341379ca98cfd756e7b29bd2626c" + integrity sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" -npmlog@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" +npmlog@^4.0.1, npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" - gauge "~2.7.1" + gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" dependencies: boolbase "~1.0.0" -nugget@^2.0.0, nugget@^2.0.1: +nugget@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" dependencies: @@ -5059,6 +7519,7 @@ num2fraction@^1.2.2: number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= nwmatcher@^1.4.3: version "1.4.3" @@ -5068,21 +7529,49 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" object-inspect@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.3.0.tgz#5b1eb8e6742e2ee83342a637034d844928ba2f6d" -object-keys@^1.0.10, object-keys@^1.0.8: +object-keys@^1.0.10: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== + object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" object.assign@^4.0.4: version "4.0.4" @@ -5092,6 +7581,14 @@ object.assign@^4.0.4: function-bind "^1.1.0" object-keys "^1.0.10" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -5099,10 +7596,32 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -obuf@^1.0.0, obuf@^1.1.0: +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +obuf@^1.0.0: 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" @@ -5122,6 +7641,7 @@ once@1.3.3, once@^1.3.0, once@~1.3.3: once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" @@ -5129,9 +7649,12 @@ onecolor@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/onecolor/-/onecolor-3.0.4.tgz#75a46f80da6c7aaa5b4daae17a47198bd9652494" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" opn@^5.1.0: version "5.1.0" @@ -5139,6 +7662,14 @@ opn@^5.1.0: dependencies: is-wsl "^1.1.0" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -5150,11 +7681,12 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -original@>=0.0.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== dependencies: - url-parse "1.0.x" + url-parse "^1.4.3" os-browserify@^0.2.0: version "0.2.1" @@ -5170,45 +7702,106 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" -os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + outpipe@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" dependencies: shell-quote "^1.4.2" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" + integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" + integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g== + dependencies: + p-try "^2.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= dependencies: got "^6.7.1" registry-auth-token "^3.0.1" @@ -5219,12 +7812,28 @@ pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + param-case@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" dependencies: no-case "^2.2.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.0.0.tgz#35060f6d5015d37628c770f4e091a0b5a278bc23" @@ -5238,6 +7847,7 @@ parse-asn1@^5.0.0: parse-color@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" + integrity sha1-e3SLlag/A/FqlPU15S1/PZRlhhk= dependencies: color-convert "~0.5.0" @@ -5253,13 +7863,27 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-ms@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + parse5@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -5270,36 +7894,60 @@ parseurl@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" -path-exists@^2.0.0, path-exists@^2.1.0: +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -5313,16 +7961,18 @@ path-to-regexp@^1.7.0: path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: - pify "^2.0.0" + pify "^3.0.0" pbkdf2@^3.0.3: version "3.0.9" @@ -5342,23 +7992,32 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" +picomatch@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.6.tgz#f39cfedd26213982733ae6b819d3da0e736598d5" + integrity sha512-Btng9qVvFsW6FkXYQQK5nEI5i8xdXFDmlKxC7Q8S2Bu5HGWnbQf7ts2kOoxJIrZn5hmw61RZIayAg2zBuJDtyQ== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pipetteur@^2.0.0: version "2.0.3" @@ -5367,11 +8026,12 @@ pipetteur@^2.0.0: onecolor "^3.0.4" synesthesia "^1.0.1" -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" +pirates@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" + integrity sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA== dependencies: - find-up "^1.0.0" + node-modules-regexp "^1.0.0" pkg-dir@^2.0.0: version "2.0.0" @@ -5379,12 +8039,20 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -plist@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== dependencies: - base64-js "1.2.0" - xmlbuilder "8.2.2" + base64-js "^1.2.3" + xmlbuilder "^9.0.7" xmldom "0.1.x" plur@^1.0.0: @@ -5397,14 +8065,15 @@ plur@^2.0.0, plur@^2.1.2: dependencies: irregular-plurals "^1.0.0" -pluralize@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - pn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" +popper.js@^1.14.4: + version "1.14.7" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.7.tgz#e31ec06cfac6a97a53280c3e55e4e0c860e7738e" + integrity sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ== + portfinder@^1.0.9: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" @@ -5413,6 +8082,11 @@ portfinder@^1.0.9: debug "^2.2.0" mkdirp "0.5.x" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" @@ -5551,6 +8225,13 @@ postcss-modules-extract-imports@^1.0.0: dependencies: postcss "^5.0.4" +postcss-modules-extract-imports@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" + integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== + dependencies: + postcss "^6.0.1" + postcss-modules-local-by-default@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.1.1.tgz#29a10673fa37d19251265ca2ba3150d9040eb4ce" @@ -5558,6 +8239,14 @@ postcss-modules-local-by-default@^1.0.1: css-selector-tokenizer "^0.6.0" postcss "^5.0.4" +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-scope@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.0.2.tgz#ff977395e5e06202d7362290b88b1e8cd049de29" @@ -5565,6 +8254,14 @@ postcss-modules-scope@^1.0.0: css-selector-tokenizer "^0.6.0" postcss "^5.0.4" +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-values@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.2.2.tgz#f0e7d476fe1ed88c5e4c7f97533a3e772ad94ca1" @@ -5572,6 +8269,14 @@ postcss-modules-values@^1.1.0: icss-replace-symbols "^1.0.2" postcss "^5.0.14" +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + postcss-normalize-charset@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" @@ -5706,24 +8411,37 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^4.4.0" -prebuild-install@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.3.0.tgz#19481247df728b854ab57b187ce234211311b485" +postcss@^6.0.23: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== dependencies: - expand-template "^1.0.2" - github-from-package "0.0.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - node-abi "^2.1.1" - noop-logger "^0.1.1" - npmlog "^4.0.1" - os-homedir "^1.0.1" - pump "^1.0.1" - rc "^1.1.6" - simple-get "^1.4.2" - tar-fs "^1.13.0" - tunnel-agent "^0.6.0" - xtend "4.0.1" + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +posthtml-parser@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.3.3.tgz#3fe986fca9f00c0f109d731ba590b192f26e776d" + integrity sha512-H/Z/yXGwl49A7hYQLV1iQ3h87NE0aZ/PMZhFwhw3lKeCAN+Ti4idrHvVvh4/GX10I7u77aQw+QB4vV5/Lzvv5A== + dependencies: + htmlparser2 "^3.9.2" + isobject "^2.1.0" + object-assign "^4.1.1" + +posthtml-render@^1.1.0, posthtml-render@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.1.4.tgz#95dac09892f4f183fad5ac823f08f42c0256551e" + integrity sha512-jL6eFIzoN3xUEvbo33OAkSDE2VIKU4JQ1wENOows1DpfnrdapR/K3Q1/fB43Mq7wQlcSgRm23nFrvoioufM7eA== + +posthtml@^0.11.2, posthtml@^0.11.3: + version "0.11.3" + resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.3.tgz#17ea2921b0555b7455f33c977bd16d8b8cb74f27" + integrity sha512-quMHnDckt2DQ9lRi6bYLnuyBDnVzK+McHa8+ar4kTdYbWEo/92hREOu3h70ZirudOOp/my2b3r0m5YtxY52yrA== + dependencies: + object-assign "^4.1.1" + posthtml-parser "^0.3.3" + posthtml-render "^1.1.0" prelude-ls@~1.1.2: version "1.1.2" @@ -5740,6 +8458,7 @@ preserve@^0.2.0: pretty-bytes@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" + integrity sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ= dependencies: get-stdin "^4.0.1" meow "^3.1.0" @@ -5751,6 +8470,14 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" +pretty-format@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0.tgz#cb6599fd73ac088e37ed682f61291e4678f48591" + integrity sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g== + dependencies: + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + pretty-ms@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" @@ -5763,13 +8490,15 @@ private@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" -private@^0.1.7, private@~0.1.5: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== process@^0.11.0: version "0.11.9" @@ -5782,13 +8511,20 @@ process@~0.5.1: progress-stream@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" + integrity sha1-LNPP6jO6OonJwSHsM0er6asSX3c= dependencies: speedometer "~0.1.2" through2 "~0.2.3" -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise@^7.1.1: version "7.3.1" @@ -5796,6 +8532,14 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +prompts@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.3.tgz#c5ccb324010b2e8f74752aadceeb57134c1d2522" + integrity sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ== + dependencies: + kleur "^3.0.2" + sisteransi "^1.0.0" + prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0: version "15.6.0" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" @@ -5804,12 +8548,30 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.5.9, loose-envify "^1.3.1" object-assign "^4.1.1" -proxy-addr@~1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.3.tgz#dc97502f5722e888467b3fa2297a7b1ff47df074" +prop-types@^15.6.1: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +prop-types@^15.6.2: + version "15.6.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" + integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== dependencies: - forwarded "~0.1.0" - ipaddr.js "1.2.0" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" proxyquire@^1.7.11: version "1.8.0" @@ -5823,9 +8585,20 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== public-encrypt@^4.0.0: version "4.0.0" @@ -5837,13 +8610,31 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" -pump@^1.0.0, pump@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -5851,6 +8642,7 @@ punycode@1.3.2: punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: version "2.1.0" @@ -5860,18 +8652,15 @@ q@^1.1.2: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" -qs@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" +qs@6.5.2, qs@~6.5.1, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" -qs@~6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -5887,22 +8676,15 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" +querystringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" + integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== quotemeta@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/quotemeta/-/quotemeta-0.0.0.tgz#51d3a06ee0fcd6e3b501dbd28904351ad7a5a38c" -rabin-bindings@~1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/rabin-bindings/-/rabin-bindings-1.7.3.tgz#fb6ae9dbf897988bc2504ccf4832ee4f0546d32a" - dependencies: - bindings "^1.3.0" - nan "^2.7.0" - prebuild-install "^2.3.0" - randomatic@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" @@ -5918,11 +8700,22 @@ range-parser@^1.0.3, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== dependencies: - deep-extend "~0.4.0" + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.1, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" @@ -5951,14 +8744,15 @@ react-deep-force-update@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-2.1.1.tgz#8ea4263cd6455a050b37445b3f08fd839d86e909" -react-dom@16: - version "16.1.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.1.1.tgz#b2e331b6d752faf1a2d31399969399a41d8d45f8" +react-dom@^16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.7.0.tgz#a17b2a7ca89ee7390bc1ed5eb81783c7461748b8" + integrity sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.12.0" react-hot-loader@next: version "3.0.0" @@ -5978,12 +8772,27 @@ react-input-autosize@^1.1.3: create-react-class "^15.5.2" prop-types "^15.5.8" -react-input-autosize@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.0.1.tgz#e92190497b4026c2780ad0f2fd703c835ba03e33" +react-is@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa" + integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g== + +react-is@^16.8.1: + version "16.8.5" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.5.tgz#c54ac229dd66b5afe0de5acbe47647c3da692ff8" + integrity sha512-sudt2uq5P/2TznPV4Wtdi+Lnq3yaYW8LfvPKLM9BKD8jJNBkxMVyB0C9/GmVhLw7Jbdmndk/73n7XQGeN9A3QQ== + +react-popper@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.3.tgz#2c6cef7515a991256b4f0536cd4bdcb58a7b6af6" + integrity sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w== dependencies: - create-react-class "^15.5.2" - prop-types "^15.5.8" + "@babel/runtime" "^7.1.2" + create-react-context "<=0.2.2" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" react-proxy@^3.0.0-alpha.0: version "3.0.0-alpha.1" @@ -6033,36 +8842,30 @@ react-router@^4.2.0: prop-types "^15.5.4" warning "^3.0.0" -react-select@^1.0.0-rc.3: - version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-1.0.0-rc.10.tgz#f137346250f9255c979fbfa21860899928772350" - dependencies: - classnames "^2.2.4" - prop-types "^15.5.8" - react-input-autosize "^2.0.1" - -react@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" +react@^16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381" + integrity sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.12.0" -read-config-file@1.2.0, read-config-file@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-1.2.0.tgz#1fd7dc8ccdad838cac9f686182625290fc94f456" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - bluebird-lst "^1.0.4" - dotenv "^4.0.0" - dotenv-expand "^4.0.1" - fs-extra-p "^4.4.4" - js-yaml "^3.10.0" - json5 "^0.5.1" - lazy-val "^1.0.2" +read-config-file@3.2.1, read-config-file@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-3.2.1.tgz#112dc8636121fa71fd524e1a8a5b4470ef7a2732" + integrity sha512-yW4hZZXdNN+Paij5JVAiTv1lUsAN5QRBU5NqotQqwYdVkUczSmDzm66VLu0eojiZt2zFeYptTFDAYlalDGuHdA== + dependencies: + ajv "^6.7.0" + ajv-keywords "^3.2.0" + bluebird-lst "^1.0.6" + dotenv "^6.2.0" + dotenv-expand "^4.2.0" + fs-extra-p "^7.0.0" + js-yaml "^3.12.1" + json5 "^2.1.0" + lazy-val "^1.0.3" read-file-stdin@^0.2.1: version "0.2.1" @@ -6073,32 +8876,49 @@ read-file-stdin@^0.2.1: read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" + find-up "^3.0.0" + read-pkg "^3.0.0" read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: - load-json-file "^2.0.0" + load-json-file "^4.0.0" normalize-package-data "^2.3.2" - path-type "^2.0.0" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": version "1.0.34" @@ -6112,13 +8932,14 @@ readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": readable-stream@^1.0.33, readable-stream@~1.1.10, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@^2, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -6130,11 +8951,10 @@ readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.1.5, readable-str string_decoder "~1.0.3" util-deprecate "~1.0.1" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" +readable-stream@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" dependencies: - buffer-shims "^1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" @@ -6142,10 +8962,11 @@ readable-stream@^2, readable-stream@^2.0.0, readable-stream@^2.1.5, readable-str string_decoder "~0.10.x" util-deprecate "~1.0.1" -readable-stream@^2.0.1, readable-stream@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" +readable-stream@^2.0.2, readable-stream@^2.1.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" dependencies: + buffer-shims "^1.0.0" core-util-is "~1.0.0" inherits "~2.0.1" isarray "~1.0.0" @@ -6153,6 +8974,15 @@ readable-stream@^2.0.1, readable-stream@^2.0.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" + integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~2.1.4: version "2.1.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" @@ -6174,28 +9004,28 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" -recast@~0.11.12: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" +readdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.0.1.tgz#14a8875883c5575c235579624a1e177cb0b1ec58" + integrity sha512-emMp13NEwWQQX1yeDgrzDNCSY7NHV6k9HTW0OhyQqOAzYacbqQhnmWiCYjxNPcqMTQ9k77oXQJp28jkytm3+jg== dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" + picomatch "^2.0.4" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" +realpath-native@^1.0.0, realpath-native@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== dependencies: - resolve "^1.1.6" + util.promisify "^1.0.0" recompose@^0.26.0: version "0.26.0" @@ -6218,6 +9048,7 @@ redbox-react@^1.3.6: redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" @@ -6256,9 +9087,10 @@ redux-debounced@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/redux-debounced/-/redux-debounced-0.4.0.tgz#905557c5a4d75f259e1600a60ce934d890967f07" -redux-devtools-extension@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz#e0f9a8e8dfca7c17be92c7124958a3b94eb2911d" +redux-devtools-extension@^2.13.7: + version "2.13.7" + resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.7.tgz#14bd7a1a7c8bee7f397beb1116fd16fc9633b752" + integrity sha512-F2GlWMWxCTJGRjJ+GSZcGDcVAj6Pbf77FKb4C9S8eni5Eah6UBGNwxNj8K1MTtmItdZH1Wx+EvIifHN2KKcQrw== redux-form@^7.2.3: version "7.2.3" @@ -6292,36 +9124,75 @@ redux@^3.3.1, redux@^3.6.0: loose-envify "^1.1.0" symbol-observable "^1.0.3" +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" +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.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - regenerator-runtime@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" regex-cache@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp-tree@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.1.tgz#27b455f9b138ca2e84c090e9aff1ffe2a04d97fa" + integrity sha512-HwRjOquc9QOwKTgbxvZTcddS5mlNlwePMQ3NFL8broajMLD5CXDAqas8Y5yxJH5QtZp5iRor3YCILd5pz71Cgw== + dependencies: + cli-table3 "^0.5.0" + colors "^1.1.2" + yargs "^12.0.5" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpu-core@^1.0.0: version "1.0.0" @@ -6331,17 +9202,22 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" registry-auth-token@^3.0.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== dependencies: rc "^1.1.6" safe-buffer "^5.0.1" @@ -6349,6 +9225,7 @@ registry-auth-token@^3.0.1: registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= dependencies: rc "^1.0.1" @@ -6356,16 +9233,33 @@ 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" +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + renderkid@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" @@ -6380,13 +9274,14 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" @@ -6404,32 +9299,31 @@ request-promise-native@^1.0.3: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@^2.45.0, request@^2.83.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" +request@^2.45.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" - aws4 "^1.6.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" + form-data "~2.3.2" + har-validator "~5.1.0" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" + mime-types "~2.1.19" + oauth-sign "~0.9.0" performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.1.0" + uuid "^3.3.2" request@^2.79.0: version "2.81.0" @@ -6458,9 +9352,37 @@ request@^2.79.0: tunnel-agent "^0.6.0" uuid "^3.0.0" +request@^2.83.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^1.1.0: version "1.2.1" @@ -6469,15 +9391,9 @@ require-from-string@^1.1.0: require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -require-uncached@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requires-port@1.0.x, requires-port@1.x.x: +requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -6487,31 +9403,46 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" -resolve-from@^1.0.0: +resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-pathname@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7, resolve@~1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolve@^0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" -resolve@^1.1.6: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" +resolve@^1.3.2, resolve@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: - path-parse "^1.0.5" - -resolve@~1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + path-parse "^1.0.6" resolve@~1.4.0: version "1.4.0" @@ -6519,12 +9450,13 @@ resolve@~1.4.0: dependencies: path-parse "^1.0.5" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + onetime "^2.0.0" + signal-exit "^3.0.2" resumer@~0.0.0: version "0.0.0" @@ -6532,11 +9464,10 @@ resumer@~0.0.0: dependencies: through "~2.3.4" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4: version "2.5.4" @@ -6544,6 +9475,13 @@ rimraf@2, rimraf@^2.2.8, rimraf@~2.5.1, rimraf@~2.5.4: dependencies: glob "^7.0.5" +rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rimraf@^2.5.2, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -6554,39 +9492,82 @@ ripemd160@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: - once "^1.3.0" + is-promise "^2.1.0" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" rx@2.3.24: version "2.3.24" resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +rxjs@^6.4.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" + integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== + dependencies: + tslib "^1.9.0" -safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== samsam@1.x, samsam@^1.1.3: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" +sane@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" + integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + sanitize-filename@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" + integrity sha1-YS2hyWRz+gLczaktzVtKsWSmdyo= dependencies: truncate-utf8-bytes "^1.0.0" -sax@^1.2.1, sax@^1.2.4: +sax@^1.2.1, sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -6594,11 +9575,30 @@ sax@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" +scheduler@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.12.0.tgz#8ab17699939c0aedc5a196a657743c496538647b" + integrity sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^0.4.3, schema-utils@^0.4.4: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: - ajv "^5.0.0" + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" select-hose@^2.0.0: version "2.0.0" @@ -6613,34 +9613,47 @@ selfsigned@^1.9.1: semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@5.3.0, semver@^5.3.0, semver@~5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, 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, semver@^5.3.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -semver@^5.0.3, semver@^5.1.0, semver@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.14.2.tgz#39b0438b3f510be5dc6f667a11f71689368cdeef" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: - debug "~2.2.0" - depd "~1.1.0" + debug "2.6.9" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.5.1" - mime "1.3.4" - ms "0.7.2" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" - statuses "~1.3.1" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" + integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== serve-index@^1.7.2: version "1.8.0" @@ -6654,23 +9667,45 @@ serve-index@^1.7.2: mime-types "~2.1.11" parseurl "~1.3.1" -serve-static@~1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.2.tgz#2cf9889bd4435a320cc36895c9aa57bd662e6ac7" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.14.2" + parseurl "~1.3.2" + send "0.16.2" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -6679,6 +9714,11 @@ setprototypeof@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + sha.js@^2.3.6: version "2.4.8" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" @@ -6688,12 +9728,14 @@ sha.js@^2.3.6: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shell-quote@^1.4.2: version "1.6.1" @@ -6704,25 +9746,15 @@ shell-quote@^1.4.2: array-reduce "~0.0.0" jsonify "~0.0.0" -shelljs@^0.7.5: - version "0.7.8" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -simple-get@^1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb" - dependencies: - once "^1.3.1" - unzip-response "^1.0.0" - xtend "^4.0.0" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= simple-html-tokenizer@^0.1.1: version "0.1.1" @@ -6735,6 +9767,7 @@ simpler-debounce@1.0.0: single-line-log@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + integrity sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q= dependencies: string-width "^1.0.1" @@ -6751,13 +9784,15 @@ sinon@^2.1.0: text-encoding "0.6.4" type-detect "^4.0.0" -slash@^1.0.0: +sisteransi@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slice-ansi@1.0.0: version "1.0.0" @@ -6765,6 +9800,45 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -6774,26 +9848,29 @@ sntp@1.x.x: sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== dependencies: hoek "4.x.x" -sockjs-client@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" +sockjs-client@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" + integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" json3 "^3.3.2" - url-parse "^1.1.8" + url-parse "^1.4.3" -sockjs@0.3.18: - version "0.3.18" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== dependencies: faye-websocket "^0.10.0" - uuid "^2.0.2" + uuid "^3.0.1" sort-keys@^1.0.0: version "1.1.2" @@ -6805,23 +9882,35 @@ source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: - source-map "^0.5.6" + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" -source-map-support@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab" +source-map-support@^0.5.10, source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@~0.5.9: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== dependencies: + buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.5.6, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@0.5.6, source-map@^0.5.3, source-map@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" -source-map@0.5.x, source-map@~0.5.0, source-map@~0.5.6: +source-map@0.5.x, source-map@^0.5.0, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -6845,39 +9934,54 @@ spawn-command@^0.0.2-1: version "0.0.2" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" + integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== -spdy-transport@^2.0.15: - version "2.0.18" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.18.tgz#43fc9c56be2cccc12bb3e2754aa971154e836ea6" +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 "^2.2.0" + debug "^4.1.0" + detect-node "^2.0.4" hpack.js "^2.1.6" - obuf "^1.1.0" - readable-stream "^2.0.1" - wbuf "^1.4.0" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" -spdy@^3.4.1: - version "3.4.4" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.4.tgz#e0406407ca90ff01b553eb013505442649f5a819" +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 "^2.2.0" - handle-thing "^1.2.4" - http-deceiver "^1.2.4" + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" select-hose "^2.0.0" - spdy-transport "^2.0.15" + spdy-transport "^3.0.0" specificity@^0.3.0: version "0.3.2" @@ -6886,6 +9990,14 @@ specificity@^0.3.0: speedometer@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" + integrity sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0= + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" split2@^0.2.1: version "0.2.1" @@ -6902,22 +10014,40 @@ split@~0.3.0: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@~0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + stackframe@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-0.3.1.tgz#33aa84f1177a5548c8935533cbfeb3420975f5a4" @@ -6925,15 +10055,34 @@ stackframe@^0.3.1: stat-mode@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + integrity sha1-5sgLYjEj19gM8TLOU480YokHJQI= + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" stats.js@^0.17.0: version "0.17.0" resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d" -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: +"statuses@>= 1.3.1 < 2": version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -6952,6 +10101,14 @@ stream-combiner@^0.2.1, stream-combiner@~0.2.1: duplexer "~0.1.1" through "~2.3.4" +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + stream-http@^2.3.1: version "2.6.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.3.tgz#4c3ddbf9635968ea2cfd4e48d43de5def2625ac3" @@ -6962,32 +10119,49 @@ stream-http@^2.3.1: to-arraybuffer "^1.0.0" xtend "^4.0.0" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" -string-width@^1.0.1, string-width@^1.0.2: +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - -string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string.prototype.trim@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" @@ -6999,17 +10173,38 @@ string.prototype.trim@~1.1.2: string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +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@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4, stringstream@~0.0.5: +stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +stringstream@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + integrity sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA== + strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" @@ -7019,6 +10214,7 @@ strip-ansi@^0.3.0: strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" @@ -7028,9 +10224,24 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" + integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== + dependencies: + ansi-regex "^4.0.0" + +strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" @@ -7041,13 +10252,20 @@ strip-bom@^3.0.0: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" @@ -7055,6 +10273,7 @@ strip-json-comments@~1.0.4: strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= style-loader@^0.16.1: version "0.16.1" @@ -7062,30 +10281,34 @@ style-loader@^0.16.1: dependencies: loader-utils "^1.0.2" -style-loader@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.0.tgz#7258e788f0fee6a42d710eaf7d6c2412a4c50759" +style-loader@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== dependencies: - loader-utils "^1.0.2" - schema-utils "^0.3.0" + loader-utils "^1.1.0" + schema-utils "^1.0.0" style-search@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" -styled-components@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-2.2.3.tgz#154575c269880c840f903f580287dab155cf684c" - dependencies: - buffer "^5.0.3" - css-to-react-native "^2.0.3" - fbjs "^0.8.9" - hoist-non-react-statics "^1.2.0" - is-function "^1.0.1" - is-plain-object "^2.0.1" +styled-components@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-4.1.3.tgz#4472447208e618b57e84deaaeb6acd34a5e0fe9b" + integrity sha512-0quV4KnSfvq5iMtT0RzpMGl/Dg3XIxIxOl9eJpiqiq4SrAmR1l1DLzNpMzoy3DyzdXVDMJS2HzROnXscWA3SEw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@emotion/is-prop-valid" "^0.7.3" + "@emotion/unitless" "^0.7.0" + babel-plugin-styled-components ">= 1" + css-to-react-native "^2.2.2" + memoize-one "^4.0.0" prop-types "^15.5.4" - stylis "3.x" - supports-color "^3.2.3" + react-is "^16.6.0" + stylis "^3.5.0" + stylis-rule-sheet "^0.0.10" + supports-color "^5.5.0" stylehacks@^2.3.2: version "2.3.2" @@ -7160,9 +10383,15 @@ stylelint@^7.9.0: svg-tags "^1.0.0" table "^4.0.1" -stylis@3.x: - version "3.4.5" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.4.5.tgz#d7b9595fc18e7b9c8775eca8270a9a1d3e59806e" +stylis-rule-sheet@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@^3.5.0: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== sugarss@^0.2.0: version "0.2.0" @@ -7170,16 +10399,10 @@ sugarss@^0.2.0: dependencies: postcss "^5.2.4" -sumchecker@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" - dependencies: - debug "^2.2.0" - es6-promise "^4.0.5" - sumchecker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" + integrity sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4= dependencies: debug "^2.2.0" @@ -7197,12 +10420,26 @@ supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: +supports-color@^4.0.0, supports-color@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.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" + +supports-color@^6.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-inline-loader@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/svg-inline-loader/-/svg-inline-loader-0.7.1.tgz#6d0e2728b7ec3414c2180b3f780bc3f7154ef226" @@ -7227,6 +10464,26 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" +svgo@^1.0.5: + version "1.1.1" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz#12384b03335bcecd85cfa5f4e3375fed671cb985" + integrity sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g== + dependencies: + coa "~2.0.1" + colors "~1.1.2" + css-select "^2.0.0" + css-select-base-adapter "~0.1.0" + css-tree "1.0.0-alpha.28" + css-url-regex "^1.1.0" + csso "^3.5.0" + js-yaml "^3.12.0" + mkdirp "~0.5.1" + object.values "^1.0.4" + sax "~1.2.4" + stable "~0.1.6" + unquote "~1.1.1" + util.promisify "~1.0.0" + symbol-observable@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" @@ -7245,17 +10502,6 @@ synesthesia@^1.0.1: dependencies: css-color-names "0.0.3" -table@^3.7.8: - version "3.8.3" - resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" @@ -7267,6 +10513,16 @@ table@^4.0.1: slice-ansi "1.0.0" string-width "^2.1.1" +table@^5.2.3: + version "5.4.5" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.5.tgz#c8f4ea2d8fee08c0027fac27b0ec0a4fe01dfa42" + integrity sha512-oGa2Hl7CQjfoaogtrOHEJroOcYILTx7BZWLGsJIlzoWmB2zmguhNfPJZsWPKYek/MgCxfco54gEi31d1uN2hFA== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tap-colorize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tap-colorize/-/tap-colorize-1.2.0.tgz#cdffa443c73d88d5a4b394c129f8734e2c32baab" @@ -7305,9 +10561,10 @@ tap-tempo@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/tap-tempo/-/tap-tempo-0.1.1.tgz#d2cc093ea9348695cba5b9b22adb72e50d8b7fd7" -tapable@^0.2.7: - version "0.2.8" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== tape-watch@^2.3.0: version "2.3.0" @@ -7340,15 +10597,6 @@ tape@^4.6.3: string.prototype.trim "~1.1.2" through "~2.3.8" -tar-fs@^1.13.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896" - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - tar-pack@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" @@ -7362,14 +10610,18 @@ tar-pack@~3.3.0: tar "~2.2.1" uid-number "~0.0.6" -tar-stream@^1.1.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" tar@~2.2.1: version "2.2.1" @@ -7379,36 +10631,77 @@ tar@~2.2.1: fstream "^1.0.2" inherits "2" -temp-file@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-2.0.3.tgz#0de2540629fc77a6406ca56f50214d1f224947ac" +temp-file@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.2.tgz#69b6daf1bbe23231d0a5d03844e3d96f3f531aaa" + integrity sha512-FGKccAW0Mux9hC/2bdUIe4bJRv4OyVo4RpVcuplFird1V/YoplIFbnPZjfzbJSf/qNvRZIRB9/4n/RkI0GziuQ== dependencies: async-exit-hook "^2.0.1" - bluebird-lst "^1.0.3" - fs-extra-p "^4.4.0" - lazy-val "^1.0.2" + bluebird-lst "^1.0.6" + fs-extra-p "^7.0.0" term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= dependencies: execa "^0.7.0" +terser-webpack-plugin@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz#9bff3a891ad614855a7dde0d707f7db5a927e3d9" + integrity sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.16.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.16.1, terser@^3.8.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493" + integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.9" + +test-exclude@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1" + integrity sha512-gwf0S2fFsANC55fSeSqpb8BYk6w3FDvwZxfNjeF6FRgvFa43r+7wRiA/Q0IxoRU37wB/LE8IQ4221BsNucTaCA== + dependencies: + arrify "^1.0.1" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^1.0.1" + text-encoding@0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" -text-table@^0.2.0, text-table@~0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -three@^0.92.0: - version "0.92.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.92.0.tgz#8d3d1f5af890e62da7f4cb45d20c09fa51057dcd" +three@^0.107.0: + version "0.107.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.107.0.tgz#0c862c348d61bd3f22058e01f5e771c1294315a1" + integrity sha512-vqbKJRLBEviPVa7poEzXocobicwxzsctr5mnymA7n8fEzcVS49rYP0RrwqZ98JqujRoruK+/YzcchNpRP+kXsQ== + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= throttleit@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" + integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8= through2@^0.6.1, through2@^0.6.3, through2@~0.6.1: version "0.6.5" @@ -7427,6 +10720,7 @@ through2@^2.0.0: through2@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" + integrity sha1-6zKE2k6jEbbMis42U3SKUqvyWj8= dependencies: readable-stream "~1.1.9" xtend "~2.1.1" @@ -7438,7 +10732,7 @@ through2@~1.0.0: readable-stream "~1.1.10" xtend "~2.1.1" -through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.6, through@~2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7446,13 +10740,10 @@ thunky@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" -time-stamp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" - timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= timers-browserify@^2.0.2: version "2.0.2" @@ -7464,23 +10755,68 @@ tinycolor2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" - to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + toposort@^1.0.0: version "1.0.6" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.6.tgz#c31748e55d210effc00fdcdc7d6e68d7d7bb9cec" -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: +tough-cookie@>=2.3.3, tough-cookie@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: @@ -7492,6 +10828,21 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== + dependencies: + punycode "^1.4.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + tr46@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -7505,6 +10856,7 @@ tree-kill@^1.1.0: trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" @@ -7513,6 +10865,7 @@ trim-right@^1.0.1: truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= dependencies: utf8-byte-length "^1.0.1" @@ -7520,9 +10873,10 @@ try-require@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/try-require/-/try-require-1.2.1.tgz#34489a2cac0c09c1cc10ed91ba011594d4333be2" -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tty-browserify@0.0.0: version "0.0.0" @@ -7531,12 +10885,14 @@ tty-browserify@0.0.0: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" @@ -7548,12 +10904,18 @@ type-detect@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" -type-is@~1.6.14: - version "1.6.14" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" - mime-types "~2.1.13" + mime-types "~2.1.18" + +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== typedarray@^0.0.6: version "0.0.6" @@ -7570,6 +10932,11 @@ typescript@~2.3.2: version "2.3.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.4.tgz#3d38321828231e434f287514959c37a82b629f42" +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" @@ -7581,26 +10948,13 @@ uglify-js@3.1.x: commander "~2.11.0" source-map "~0.6.1" -uglify-js@^2.8.29: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" + commander "~2.17.1" + source-map "~0.6.1" uid-number@~0.0.6: version "0.0.6" @@ -7610,6 +10964,39 @@ uid@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/uid/-/uid-0.0.2.tgz#5e4a5d4b78138b4f70f89fd3c76fc59aa9d2f103" +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.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" @@ -7624,36 +11011,69 @@ uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@~1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -unzip-response@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -update-notifier@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" +upath@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== 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" @@ -7664,33 +11084,41 @@ upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" -url-loader@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: - loader-utils "^1.0.2" - mime "^1.4.1" - schema-utils "^0.3.0" + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-loader@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" + integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^1.0.0" url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= dependencies: prepend-http "^1.0.1" -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - -url-parse@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.8.tgz#7a65b3a8d57a1e86af6b4e2276e34774167c0156" +url-parse@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" + integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== dependencies: - querystringify "0.0.x" - requires-port "1.0.x" + querystringify "^2.0.0" + requires-port "^1.0.0" url@^0.11.0: version "0.11.0" @@ -7699,19 +11127,28 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 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" + integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= -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" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" util@0.10.3, util@^0.10.3: version "0.10.3" @@ -7727,28 +11164,37 @@ utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - -uuid@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" -uuid@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8-compile-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== + +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" value-equal@^0.4.0: version "0.4.0" @@ -7758,19 +11204,23 @@ vary@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + vendors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: - extsprintf "1.0.2" - -virtual-module-webpack-plugin@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/virtual-module-webpack-plugin/-/virtual-module-webpack-plugin-0.3.0.tgz#b2095b2b8c51480362ab3ec2bd613bdd507cbd46" + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" vm-browserify@0.0.4: version "0.0.4" @@ -7778,110 +11228,175 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" dependencies: loose-envify "^1.0.0" -watchpack@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" +warning@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: - async "^2.1.2" - chokidar "^1.7.0" + chokidar "^2.0.2" graceful-fs "^4.1.2" + neo-async "^2.5.0" -wbuf@^1.1.0, wbuf@^1.4.0: +wbuf@^1.1.0: version "1.7.2" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" 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" + webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" -webpack-dev-middleware@^1.11.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" +webpack-cli@^3.1.2, webpack-cli@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.3.tgz#13653549adfd8ccd920ad7be1ef868bacc22e346" + integrity sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q== + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" + import-local "^2.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.4" + +webpack-dev-middleware@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" + integrity sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA== dependencies: memory-fs "~0.4.1" - mime "^1.3.4" - path-is-absolute "^1.0.0" + mime "^2.3.1" range-parser "^1.0.3" - time-stamp "^2.0.0" + webpack-log "^2.0.0" -webpack-dev-server@^2.4.1, webpack-dev-server@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.3.tgz#f0554e88d129e87796a6f74a016b991743ca6f81" +webpack-dev-server@^3.1.10, webpack-dev-server@^3.1.14: + version "3.1.14" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz#60fb229b997fc5a0a1fc6237421030180959d469" + integrity sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ== dependencies: ansi-html "0.0.7" - array-includes "^3.0.3" bonjour "^3.5.0" - chokidar "^1.6.0" + chokidar "^2.0.0" compression "^1.5.2" connect-history-api-fallback "^1.3.0" debug "^3.1.0" del "^3.0.0" - express "^4.13.3" + express "^4.16.2" html-entities "^1.2.0" - http-proxy-middleware "~0.17.4" - import-local "^0.1.1" - internal-ip "1.2.0" + http-proxy-middleware "~0.18.0" + import-local "^2.0.0" + internal-ip "^3.0.1" 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.18" - sockjs-client "1.1.4" - spdy "^3.4.1" - strip-ansi "^3.0.1" - supports-color "^4.2.1" - webpack-dev-middleware "^1.11.0" - yargs "^6.6.0" + sockjs "0.3.19" + sockjs-client "1.3.0" + spdy "^4.0.0" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + url "^0.11.0" + webpack-dev-middleware "3.4.0" + webpack-log "^2.0.0" + yargs "12.0.2" -webpack-merge@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.0.tgz#6ad72223b3e0b837e531e4597c199f909361511e" +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== dependencies: - lodash "^4.17.4" + ansi-colors "^3.0.0" + uuid "^3.3.2" -webpack-sources@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" +webpack-merge@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4" + integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw== dependencies: - source-list-map "^2.0.0" - source-map "~0.5.3" + lodash "^4.17.5" -webpack@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.8.1.tgz#b16968a81100abe61608b0153c9159ef8bb2bd83" +webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^5.1.5" - ajv-keywords "^2.0.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.29.1: + version "4.29.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.1.tgz#a6533d7bc6a6b1ed188cb029d53d231be777e175" + integrity sha512-dY3KyQIVeg6cDPj9G5Bnjy9Pt9SoCpbNWl0RDKHstbd3MWe0dG9ri4RQRpCm43iToy3zoA1IMOpFkJ8Clnc7FQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" + micromatch "^3.1.8" mkdirp "~0.5.0" + neo-async "^2.5.0" node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" + schema-utils "^0.4.4" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" websocket-driver@>=0.5.1: version "0.6.5" @@ -7915,51 +11430,56 @@ whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" +which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.1" + string-width "^1.0.2 || 2" -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: - string-width "^1.0.1" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + string-width "^2.1.1" window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -7967,10 +11487,21 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + version "2.4.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" @@ -7980,6 +11511,13 @@ write-file-stdout@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/write-file-stdout/-/write-file-stdout-0.0.2.tgz#c252d7c7c5b1b402897630e3453c7bfe690d9ca1" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -7993,6 +11531,7 @@ x256@~0.0.2: xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= xml-char-classes@^1.0.0: version "1.0.0" @@ -8002,19 +11541,26 @@ xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" -xmlbuilder@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= xmldom@0.1.x: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= xpipe@*: version "1.0.5" resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" -xtend@4.0.1, "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -8025,55 +11571,84 @@ xtend@^2.1.2: xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= dependencies: object-keys "~0.4.0" -y18n@^3.2.0, y18n@^3.2.1: +y18n@^3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - dependencies: - camelcase "^3.0.0" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" -yargs-parser@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.0.0.tgz#21d476330e5a82279a4b881345bf066102e219c6" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" yargs@^1.2.6: version "1.3.3" resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.3.3.tgz#054de8b61f22eefdb7207059eaef9d6b83fb931a" -yargs@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" +yargs@^12.0.2, yargs@^12.0.4, yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - find-up "^2.1.0" + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" get-caller-file "^1.0.1" - os-locale "^2.0.0" + os-locale "^3.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" yargs@^3.5.4: version "3.32.0" @@ -8087,51 +11662,6 @@ yargs@^3.5.4: window-size "^0.1.4" y18n "^3.2.0" -yargs@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"