├── .arcconfig ├── .arclint ├── .circleci └── config.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── assets ├── general-solution.gif ├── ode.gif └── wobble-logo.png ├── demos ├── 1-chat-heads │ ├── 0.jpg │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── index.html │ └── index.tsx ├── dist │ └── now.json ├── index.html ├── package.json ├── tsconfig.json └── yarn.lock ├── jest └── rAF.js ├── package.json ├── rollup.config.js ├── src ├── __tests__ │ ├── Springs-test.ts │ └── __snapshots__ │ │ └── Springs-test.ts.snap ├── index.ts └── utils.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.arcconfig: -------------------------------------------------------------------------------- 1 | { 2 | "load": [ 3 | "material-arc-tools/third_party/arc-hook-conphig", 4 | "material-arc-tools/third_party/arc-hook-github-issues", 5 | "material-arc-tools/third_party/arc-proselint" 6 | ], 7 | "arcanist_configuration": "HookConphig", 8 | "phabricator.uri": "http://codereview.cc/", 9 | "arc.land.onto.default": "develop", 10 | "arc.feature.start.default": "origin/develop" 11 | } 12 | -------------------------------------------------------------------------------- /.arclint: -------------------------------------------------------------------------------- 1 | { 2 | "linters": { 3 | "chmod": { 4 | "type": "chmod" 5 | }, 6 | "prose": { 7 | "type": "prose", 8 | "include": "(\\.(md)$)", 9 | "exclude": [ 10 | "(^CHANGELOG.md)" 11 | ], 12 | "severity": { 13 | "consistency.spacing": "disabled", 14 | "typography.symbols.curly_quotes": "disabled", 15 | "typography.symbols.ellipsis": "disabled", 16 | "leonard.exclamation.30ppm": "disabled", 17 | "misc.annotations": "warning" 18 | } 19 | }, 20 | "spelling": { 21 | "type": "spelling", 22 | "include": "(\\.(md)$)" 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # This configuration was automatically generated from a CircleCI 1.0 config. 2 | # It should include any build commands you had along with commands that CircleCI 3 | # inferred from your project structure. We strongly recommend you read all the 4 | # comments in this file to understand the structure of CircleCI 2.0, as the idiom 5 | # for configuration has changed substantially in 2.0 to allow arbitrary jobs rather 6 | # than the prescribed lifecycle of 1.0. In general, we recommend using this generated 7 | # configuration as a reference rather than using it in production, though in most 8 | # cases it should duplicate the execution of your original 1.0 config. 9 | version: 2 10 | jobs: 11 | build: 12 | working_directory: ~/skevy/wobble 13 | parallelism: 1 14 | shell: /bin/bash --login 15 | # CircleCI 2.0 does not support environment variables that refer to each other the same way as 1.0 did. 16 | # If any of these refer to each other, rewrite them so that they don't or see https://circleci.com/docs/2.0/env-vars/#interpolating-environment-variables-to-set-other-environment-variables . 17 | environment: 18 | CIRCLE_ARTIFACTS: /tmp/circleci-artifacts 19 | CIRCLE_TEST_REPORTS: /tmp/circleci-test-results 20 | # In CircleCI 1.0 we used a pre-configured image with a large number of languages and other packages. 21 | # In CircleCI 2.0 you can now specify your own image, or use one of our pre-configured images. 22 | # The following configuration line tells CircleCI to use the specified docker image as the runtime environment for you job. 23 | # We have selected a pre-built image that mirrors the build environment we use on 24 | # the 1.0 platform, but we recommend you choose an image more tailored to the needs 25 | # of each job. For more information on choosing an image (or alternatively using a 26 | # VM instead of a container) see https://circleci.com/docs/2.0/executor-types/ 27 | # To see the list of pre-built images that CircleCI provides for most common languages see 28 | # https://circleci.com/docs/2.0/circleci-images/ 29 | docker: 30 | - image: circleci/node:10-stretch-browsers 31 | steps: 32 | # Machine Setup 33 | # If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each 34 | # The following `checkout` command checks out your code to your working directory. In 1.0 we did this implicitly. In 2.0 you can choose where in the course of a job your code should be checked out. 35 | - checkout 36 | # Prepare for artifact and test results collection equivalent to how it was done on 1.0. 37 | # In many cases you can simplify this from what is generated here. 38 | # 'See docs on artifact collection here https://circleci.com/docs/2.0/artifacts/' 39 | - run: mkdir -p $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS/jest/ $CIRCLE_TEST_REPORTS/tslint/ 40 | # Dependencies 41 | # This would typically go in either a build or a build-and-test job when using workflows 42 | # Restore the dependency cache 43 | - restore_cache: 44 | keys: 45 | # This branch if available 46 | - node10-{{ .Branch }}- 47 | # Default branch if not 48 | - node10-develop- 49 | # Any branch if there are none on the default branch - this should be unnecessary if you have your default branch configured correctly 50 | - node10- 51 | 52 | - run: 53 | name: Configure yarn 54 | command: | 55 | yarn config set prefix "$HOME/.yarn 56 | PATH=$( yarn global bin ):$PATH" 57 | 58 | - run: 59 | name: Install yarn dependencies for Wobble 60 | command: yarn 61 | 62 | 63 | - run: 64 | name: Check dependencies in demos 65 | working_directory: ./demos 66 | command: yarn 67 | when: always 68 | 69 | # Save dependency cache 70 | - save_cache: 71 | key: node10-{{ .Branch }}-{{ epoch }} 72 | paths: 73 | - ~/.cache/yarn 74 | - ./node_modules 75 | - ./demos/node_modules 76 | 77 | # jest-junit seems to be ignoring the JEST_JUNIT_OUTPUT environment 78 | # variables, so set them in package.json instead. 79 | - run: 80 | name: Add $CIRCLE_TEST_REPORTS to package.json 81 | command: | 82 | awk "{gsub(/CIRCLE_TEST_REPORTS/,\"$CIRCLE_TEST_REPORTS\"); print}" package.json > package.ci.json 83 | rm package.json 84 | mv package.ci.json package.json 85 | 86 | # Test 87 | # This would typically be a build job when using workflows, possibly combined with build 88 | # This is based on your 1.0 configuration file or project settings 89 | - run: 90 | name: Run tests 91 | command: yarn run test --ci --reporters=default --reporters=jest-junit 92 | when: always 93 | 94 | # yarn will lint separately as part of pretest, but we're running it manually to get the output piped into Circle 95 | - run: 96 | name: Run linter 97 | command: yarn run lint --out $CIRCLE_TEST_REPORTS/tslint/core.xml --formatters-dir ./node_modules/tslint-junit-formatter/formatters --format junit 98 | when: always 99 | 100 | # Teardown 101 | # If you break your build into multiple jobs with workflows, you will probably want to do the parts of this that are relevant in each 102 | # Save test results 103 | - store_test_results: 104 | path: /tmp/circleci-test-results 105 | # Save artifacts 106 | - store_artifacts: 107 | path: /tmp/circleci-artifacts 108 | - store_artifacts: 109 | path: /tmp/circleci-test-results 110 | 111 | # From http://codereview.cc/harbormaster/step/edit/6/ 112 | # 113 | # This was from CircleCI v1, but Internet comments lead me to believe it's 114 | # unofficially still supported in Circle v2. 115 | notify: 116 | webhooks: 117 | - url: http://codereview.cc/harbormaster/hook/circleci/ 118 | 119 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | build 4 | *.log 5 | coverage 6 | demos/.cache 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ### v1.5.1 4 | 5 | - Distribute unminified bundles by default - minified versions are available at `/dist/wobble.${MODULE_FORMAT}.min.js` ([af82dda](https://github.com/skevy/wobble/commit/af82dda29eae11741efd380fcde5a1e7542f759d)) 6 | - Add `typescript:main` field to `package.json`, which points to the raw TypeScript source ([0198d63](https://github.com/skevy/wobble/commit/0198d630a4d426c9fc9bbdb1e7e9e74c28873c31)) 7 | 8 | ### v1.5.0 9 | 10 | - Fixup `yarn watch` to support es module compilation ([f7dd689](https://github.com/skevy/wobble/commit/f7dd68951e0f2cd8a083706c9727b1906d3b6e03)) 11 | - Add module entry point for .es.js dist ([0b929acf](https://github.com/skevy/wobble/commit/0b929acf6ba3a443b974a1c350213a3d64ff45cc)) 12 | 13 | ### v1.4.1 14 | 15 | - Remove Babel ([cfdc3d85](https://github.com/skevy/wobble/commit/cfdc3d85ce01687b77c44cc68d11cabc85ffe0a3)) 16 | - Fixup typescript interface names and member access ([2112b118](https://github.com/skevy/wobble/commit/2112b118fbb491113ec0432d9080b7f7acfc2bd5)) 17 | 18 | ### v1.4.0 19 | 20 | - Remove Flow, rewrite in TypeScript ([a85aa77](https://github.com/skevy/wobble/commit/a85aa771843ec9a9ddf7d3d187dc4c2e5ff5a1b6)) 21 | 22 | ### v1.3.1 23 | 24 | - Fix types for chainable methods ([bd7b496](https://github.com/skevy/wobble/commit/bd7b49622805b9bc218c87017ea92d3cb35d623f)) 25 | - Use lolex in tests to properly fake timers ([3cb1e92](https://github.com/skevy/wobble/commit/3cb1e92729eb7948776f4548f9e86a4bad4c3077)) 26 | 27 | ### v1.3.0 28 | 29 | - Update TypeScript definition with chainable API ([0c9bb96](https://github.com/skevy/wobble/commit/0c9bb96eb66c716d4d3b057bb366d593ea9bc79e)) 30 | - Add README ([4656acf](https://github.com/skevy/wobble/commit/4656acf67f1a892ac81a1684d6516384eb900cd3 31 | )) 32 | - Deploy demos to wobble-demos.now.sh ([4172c9c](https://github.com/skevy/wobble/commit/4172c9c13aa6877a7f3951c201ca33a4e3e37856 33 | )) 34 | - Set _currentValue + _currentVelocity in constructor ([6112980](https://github.com/skevy/wobble/commit/61129802df8b2536264ceff46823e5e3911e9eef)) 35 | - Add "chat heads" demo ([5189aea](https://github.com/skevy/wobble/commit/5189aea291131816fd80dc834fac2885a72e58b1)) 36 | - Use `Date.now()` instead of `performance.now()` for React Native compatibility ([34d9a0f](https://github.com/skevy/wobble/commit/34d9a0fe6ef3ac24630c8524a0ac1229ed09fc08)) 37 | - Make `this._currentTime` always equal to "now", remove "first step" calculation ([4589723](https://github.com/skevy/wobble/commit/45897231dd8683f4e820d2030956fe34cb4866ee)) 38 | - Make all APIs chainable ([b89559f](https://github.com/skevy/wobble/commit/b89559fb6e83314098a673461d2225369f170d81)) 39 | - Set default `toValue` to 1. ([c0fb41a](https://github.com/skevy/wobble/commit/c0fb41a3d17f30fb1c5298cc3c2aa20af7fe55a8)) 40 | - Move @flow annotations + fix comments ([058c75d](https://github.com/skevy/wobble/commit/058c75d934a36c0e2a8f5dd5f34d5854ce664124)) 41 | - Remove "browser" field from package.json ([261cca3](https://github.com/skevy/wobble/commit/261cca3237837cf2650a9441fe1406bc41a37b73)) 42 | 43 | ### v1.2.0 44 | 45 | - Consistently use the term "listener" in tests ([1328f38](https://github.com/skevy/wobble/commit/1328f3878b7eea60611f4d722fa13d32e854826f)) 46 | - Ensure listeners are only notified once per frame ([cf92f76](https://github.com/skevy/wobble/commit/cf92f7670aae10dc776af1a624a5d2509d0f1b70)) 47 | - Made _evaluateSpring take an absolute timestamp ([0696712](https://github.com/skevy/wobble/commit/0696712d1352263d6dc09bc61e03be06be4f98ed)) 48 | 49 | ### v1.1.0 50 | 51 | - Made onStart synchronous ([aaf21a9](https://github.com/skevy/wobble/commit/aaf21a97435864b93122ed6480765a654713f888)) 52 | - Update _currentValue and _currentVelocity before updating fromValue ([9abf13f](https://github.com/skevy/wobble/commit/9abf13f8e1a107619a31c304750cd0363ad976ed)) 53 | 54 | ### v1.0.0 55 | 56 | 🎉🎉🎉🎉🎉🎉 Initial Release! 🎉🎉🎉🎉🎉🎉 57 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2017 Adam Miskiewicz 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![repo-banner](./assets/wobble-logo.png) 2 | 3 | [![Current version:](https://img.shields.io/badge/v1.5.1:-222222.svg?logo=npm)](https://www.npmjs.com/package/wobble/v/1.5.1) 4 | [![Test status](https://img.shields.io/circleci/project/github/skevy/wobble/stable.svg?logo=circleci&label=Tests)](https://circleci.com/gh/skevy/wobble/133) 5 | [![Code coverage](https://img.shields.io/codecov/c/github/skevy/wobble/stable.svg?logo=codecov&logoColor=white&label=Coverage)](https://codecov.io/gh/skevy/wobble/tree/81d48aa583e633fef9da5d0050002b7438a1eb4d/src)
6 | [![HEAD:](https://img.shields.io/badge/HEAD:-222222.svg?logo=github&logoColor=white)](https://github.com/skevy/wobble) 7 | [![Test status](https://img.shields.io/circleci/project/github/skevy/wobble/develop.svg?logo=circleci&label=Tests)](https://circleci.com/gh/skevy/wobble/tree/develop) 8 | [![Code coverage](https://img.shields.io/codecov/c/github/skevy/wobble/develop.svg?logo=codecov&logoColor=white&label=Coverage)](https://codecov.io/gh/skevy/wobble/branch/develop) 9 | 10 | A tiny (~1.7 KB gzipped) spring physics micro-library that models a [damped harmonic oscillator](https://en.wikipedia.org/wiki/Harmonic_oscillator#Damped_harmonic_oscillator). 11 | 12 | # Why Would I Use This? 13 | 14 | Perhaps, you just really like to dance. 15 | 16 | Use _wobble_ if you need a very small and accurate damped harmonic spring simulation in your animation library or application. _wobble_ intentionally **only** provides a way to animate a scalar value according to equations governing damped harmonic motion. That's all this library will ever do -- any other functionality (integration with [insert ui library here], multi-dimensional springs, a nice API around chaining springs together, etc.) is left to the reader to implement. 17 | 18 | # Background 19 | 20 | Using spring physics in UI design is a common way to express natural motion, and there are several ways to model the physics behind springs. 21 | 22 | There are two main ways that spring physics is typically implemented: numerical integration (using something like the [Runge-Kutta 4th order](https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods) numerical integration method) or by using a closed-form (exact) solution. Numerical integration is an approximation of the exact solution, and is generally easier to derive. The numerical integration technique can be applied to basically any ordinary differential equation. Though there are several different numerical integration methods, it's common to leverage RK4 when accuracy of the approximation is required, even though it's slightly slower. RK4 is commonly used in other animation libraries, such as [Rebound](https://github.com/facebook/rebound) and [Pop](https://github.com/facebook/pop/). 23 | 24 | The original goal of the algorithm used in _wobble_ was to replicate `CASpringAnimation` from Apple's Core Animation library (used to power animations on macOS and iOS) in order to mimic iOS animations in React Native. After doing a [little spelunking](https://github.com/facebook/react-native/pull/15322) inside `QuartzCore.framework`, it became clear that Apple was using the closed-form solution for damped harmonic oscillation to power `CASpringAnimation`. _wobble_ leverages the same equations as `CASpringAnimation` in order to be able to match Apple animations precisely. 25 | 26 | The closed-form solution lets us calculate position (_x_) and velocity (_v_) from time _t_, and thus it turns out that using the closed-form solution provides a couple advantages over RK4: 27 | 28 | - Easier to generate keyframes and build continuous/interruptible gestures and animations, due to the fact that _x_ and _v_ are pure functions of _t_. 29 | - Less code. 30 | - It's faster. 31 | 32 | ### Math! 33 | 34 | The ODE for damped harmonic motion is: 35 | 36 | ![DHO ODE](./assets/ode.gif) 37 | 38 | Solving this ODE yields: 39 | 40 | ![solution](./assets/general-solution.gif) 41 | 42 | And from this general solution, we're able to easily derive the solutions for under-damped, critically-damped, and over-damped damped harmonic oscillation. 43 | 44 | The full proof can be found [in this PDF](http://planetmath.org/sites/default/files/texpdf/39745.pdf) from [planetmath.org](http://planetmath.org). 45 | 46 | # Demos 47 | 48 | Wobble demos are located here: [https://wobble-demos.now.sh/](https://wobble-demos.now.sh/). Send PRs to add more! 49 | 50 | ... and of course, [Our FAVORITE Demo](https://m.youtube.com/watch?v=rFdeskwbhAM) 51 | 52 | # Getting Started 53 | 54 | ```bash 55 | yarn add wobble 56 | # or 57 | npm install --save wobble 58 | ``` 59 | 60 | # Usage 61 | 62 | ```jsx 63 | import { Spring } from 'wobble'; 64 | 65 | // Create a new spring 66 | const spring = new Spring({ 67 | toValue: 100, 68 | stiffness: 1000, 69 | damping: 500, 70 | mass: 3, 71 | }); 72 | 73 | // Set listeners for spring events, start the spring. 74 | spring 75 | .onStart(() => { 76 | console.log('Spring started!'); 77 | }) 78 | .onUpdate((s) => { 79 | console.log(`Spring's current value: ` + s.currentValue); 80 | console.log(`Spring's current velocity: ` + s.currentVelocity); 81 | }) 82 | .onStop(() => { 83 | console.log('Spring is at rest!'); 84 | }) 85 | .start(); 86 | ``` 87 | 88 | # API 89 | 90 | #### `new Spring(config: SpringConfig)` 91 | 92 | Initialize a new spring with a given spring configuration. 93 | 94 | ## Configuration 95 | 96 | #### `fromValue: number` 97 | 98 | Starting value of the animation. Defaults to `0`. 99 | 100 | #### `toValue: number` 101 | 102 | Ending value of the animation. Defaults to `1`. 103 | 104 | #### `stiffness: number` 105 | 106 | The spring stiffness coefficient. Defaults to `100`. 107 | 108 | #### `damping: number` 109 | 110 | Defines how the spring’s motion should be damped due to the forces of friction. Defaults to `10`. 111 | 112 | #### `mass: number` 113 | 114 | The mass of the object attached to the end of the spring. Defaults to `1`. 115 | 116 | #### `initialVelocity: number` 117 | 118 | The initial velocity (in units/ms) of the object attached to the spring. Defaults to `0`. 119 | 120 | #### `allowsOverdamping: boolean` 121 | 122 | Whether or not the spring allows "overdamping" (a damping ratio > 1). Defaults to `false`. 123 | 124 | #### `overshootClamping: boolean` 125 | 126 | False when overshooting is allowed, true when it is not. Defaults to `false`. 127 | 128 | #### `restVelocityThreshold: number` 129 | 130 | When spring's velocity is below `restVelocityThreshold`, it is at rest. Defaults to `.001`. 131 | 132 | #### `restDisplacementThreshold: number` 133 | 134 | When the spring's displacement (current value) is below `restDisplacementThreshold`, it is at rest. Defaults to `.001`. 135 | 136 | ## Methods 137 | 138 | #### `start(): Spring` 139 | 140 | If `fromValue` differs from `toValue`, or `initialVelocity` is non-zero, start the simulation and call the `onStart` listeners. 141 | 142 | #### `stop(): Spring` 143 | 144 | If a simulation is in progress, stop it and call the `onStop` listeners. 145 | 146 | #### `updateConfig(updatedConfig: PartialSpringConfig): Spring` 147 | 148 | Updates the spring config with the given values. Values not explicitly supplied will be reused from the existing config. 149 | 150 | #### `onStart(listener: SpringListenerFn): Spring` 151 | 152 | The provided callback will be invoked when the simulation begins. 153 | 154 | #### `onUpdate(listener: SpringListenerFn): Spring` 155 | 156 | The provided callback will be invoked on each frame while the simulation is running. 157 | 158 | #### `onStop(listener: SpringListenerFn): Spring` 159 | 160 | The provided callback will be invoked when the simulation ends. 161 | 162 | #### `removeListener(listenerFn: SpringListenerFn): Spring` 163 | 164 | Remove a single listener from this spring. 165 | 166 | #### `removeAllListeners(): Spring` 167 | 168 | Removes all listeners from this spring. 169 | 170 | ## Properties 171 | 172 | #### `currentValue: number` 173 | 174 | The spring's current displacement. 175 | 176 | #### `currentVelocity: number` 177 | 178 | The spring's current velocity in units / ms. 179 | 180 | #### `isAtRest: boolean` 181 | 182 | If the spring has reached its `toValue`, or if its velocity is below the `restVelocityThreshold`, it is considered at rest. If `stop()` is called during a simulation, both `isAnimating` and `isAtRest` will be false. 183 | 184 | #### `isAnimating: boolean` 185 | 186 | Whether or not the spring is currently emitting values. Note: this is distinct from whether or not it is at rest. See also `isAtRest`. 187 | 188 | # Credits 189 | 190 | Brenton Simpson ([@appsforartists](https://twitter.com/appsforartists)) - For his assistance in creating and testing this library. 191 | 192 | Devine Lu Linvega ([@neauoire](https://twitter.com/neauoire)) - The awesome logo! 193 | -------------------------------------------------------------------------------- /assets/general-solution.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/assets/general-solution.gif -------------------------------------------------------------------------------- /assets/ode.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/assets/ode.gif -------------------------------------------------------------------------------- /assets/wobble-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/assets/wobble-logo.png -------------------------------------------------------------------------------- /demos/1-chat-heads/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/demos/1-chat-heads/0.jpg -------------------------------------------------------------------------------- /demos/1-chat-heads/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/demos/1-chat-heads/1.jpg -------------------------------------------------------------------------------- /demos/1-chat-heads/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/demos/1-chat-heads/2.jpg -------------------------------------------------------------------------------- /demos/1-chat-heads/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/demos/1-chat-heads/3.jpg -------------------------------------------------------------------------------- /demos/1-chat-heads/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/demos/1-chat-heads/4.jpg -------------------------------------------------------------------------------- /demos/1-chat-heads/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skevy/wobble/142d649f6351cae53c0eaa113bab7bac3e7e83fc/demos/1-chat-heads/5.jpg -------------------------------------------------------------------------------- /demos/1-chat-heads/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Chat Heads 4 | 5 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /demos/1-chat-heads/index.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import * as ReactDOM from "react-dom"; 3 | 4 | import { Spring } from "wobble"; 5 | 6 | // @ts-ignore 7 | import * as images from "./*.jpg"; 8 | 9 | const INITIAL_X = 250; 10 | const INITIAL_Y = 300; 11 | 12 | interface Ball { 13 | x: number; 14 | y: number; 15 | } 16 | 17 | interface BallSpring { 18 | x: Spring; 19 | y: Spring; 20 | } 21 | 22 | class ChatHeads extends React.Component { 23 | balls: Ball[] = Array(6) 24 | .fill([]) 25 | .map(() => ({ x: INITIAL_X, y: INITIAL_Y })); 26 | 27 | springs: BallSpring[] = []; 28 | 29 | componentDidMount() { 30 | window.addEventListener("mousemove", this.handleMouseMove); 31 | window.addEventListener("touchmove", this.handleTouchMove); 32 | this.createFollowerSprings(); 33 | this.springs[0].x.start(); 34 | this.springs[0].y.start(); 35 | } 36 | 37 | render() { 38 | return ( 39 |
47 | {this.balls.map(({ x, y }, i) => ( 48 |
63 | ))} 64 |
65 | ); 66 | } 67 | 68 | createFollowerSprings() { 69 | const springConfig = { 70 | stiffness: 120, 71 | damping: 14, 72 | mass: 1 73 | }; 74 | // Follower springs 75 | for (let i = 0; i < this.balls.length - 1; i++) { 76 | const x = new Spring({ 77 | ...springConfig, 78 | fromValue: 0, 79 | toValue: INITIAL_X 80 | }).onUpdate(s => this.onSpringUpdate(i, "x", s)); 81 | const y = new Spring({ 82 | ...springConfig, 83 | fromValue: 0, 84 | toValue: INITIAL_Y 85 | }).onUpdate(s => this.onSpringUpdate(i, "y", s)); 86 | this.springs.push({ x, y }); 87 | } 88 | } 89 | 90 | onSpringUpdate = (i: number, dim: "x" | "y", s: Spring) => { 91 | const val = s.currentValue; 92 | this.balls[i + 1][dim] = val; 93 | if (i < this.balls.length - 2) { 94 | this.springs[i + 1][dim] 95 | .updateConfig({ 96 | toValue: val 97 | }) 98 | .start(); 99 | } 100 | this.forceUpdate(); 101 | }; 102 | 103 | handleMouseMove = ({ 104 | pageX: x, 105 | pageY: y 106 | }: { 107 | pageX: number; 108 | pageY: number; 109 | }) => { 110 | this.balls[0].x = x; 111 | this.balls[0].y = y; 112 | this.springs[0].x 113 | .updateConfig({ 114 | toValue: x 115 | }) 116 | .start(); 117 | this.springs[0].y 118 | .updateConfig({ 119 | toValue: y 120 | }) 121 | .start(); 122 | }; 123 | 124 | handleTouchMove = ({ touches }: TouchEvent) => { 125 | this.handleMouseMove(touches[0]); 126 | }; 127 | } 128 | 129 | ReactDOM.render(, document.getElementById("app")); 130 | -------------------------------------------------------------------------------- /demos/dist/now.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "static", 3 | "alias": "wobble-demos" 4 | } 5 | -------------------------------------------------------------------------------- /demos/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Demos 4 | 5 | 6 |

Demos

7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /demos/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wobble-demos", 3 | "scripts": { 4 | "start": "parcel serve", 5 | "build": "parcel build index.html --public-url ./", 6 | "deploy": "yarn build && cd dist && now --public && now alias" 7 | }, 8 | "dependencies": { 9 | "react": "^16.2.0", 10 | "react-dom": "^16.2.0", 11 | "wobble": "link:../" 12 | }, 13 | "devDependencies": { 14 | "@types/react": "^16.0.34", 15 | "@types/react-dom": "^16.0.3", 16 | "now": "^9.1.0", 17 | "parcel-bundler": "^1.4.1", 18 | "tslint": "^5.9.1", 19 | "typescript": "^2.6.2" 20 | } 21 | } -------------------------------------------------------------------------------- /demos/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "jsx": "react", 5 | "sourceMap": true, 6 | "noImplicitReturns": true, 7 | "noImplicitThis": true, 8 | "noImplicitAny": true, 9 | "strictNullChecks": true, 10 | "lib": [ 11 | "dom", 12 | "esnext" 13 | ], 14 | "target": "es5", 15 | "pretty": true 16 | }, 17 | "exclude": [ 18 | "node_modules" 19 | ] 20 | } -------------------------------------------------------------------------------- /demos/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@*": 6 | version "9.3.0" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-9.3.0.tgz#3a129cda7c4e5df2409702626892cb4b96546dd5" 8 | 9 | "@types/react-dom@^16.0.3": 10 | version "16.0.3" 11 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64" 12 | dependencies: 13 | "@types/node" "*" 14 | "@types/react" "*" 15 | 16 | "@types/react@*", "@types/react@^16.0.34": 17 | version "16.0.34" 18 | resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.34.tgz#7a8f795afd8a404a9c4af9539b24c75d3996914e" 19 | 20 | abbrev@1: 21 | version "1.1.1" 22 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 23 | 24 | ajv@^4.9.1: 25 | version "4.11.8" 26 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 27 | dependencies: 28 | co "^4.6.0" 29 | json-stable-stringify "^1.0.1" 30 | 31 | align-text@^0.1.1, align-text@^0.1.3: 32 | version "0.1.4" 33 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 34 | dependencies: 35 | kind-of "^3.0.2" 36 | longest "^1.0.1" 37 | repeat-string "^1.5.2" 38 | 39 | alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: 40 | version "1.0.2" 41 | resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" 42 | 43 | ansi-regex@^2.0.0: 44 | version "2.1.1" 45 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 46 | 47 | ansi-styles@^2.2.1: 48 | version "2.2.1" 49 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 50 | 51 | ansi-styles@^3.1.0: 52 | version "3.2.0" 53 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 54 | dependencies: 55 | color-convert "^1.9.0" 56 | 57 | anymatch@^1.3.0: 58 | version "1.3.2" 59 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 60 | dependencies: 61 | micromatch "^2.1.5" 62 | normalize-path "^2.0.0" 63 | 64 | aproba@^1.0.3: 65 | version "1.2.0" 66 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 67 | 68 | are-we-there-yet@~1.1.2: 69 | version "1.1.4" 70 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 71 | dependencies: 72 | delegates "^1.0.0" 73 | readable-stream "^2.0.6" 74 | 75 | argparse@^1.0.7: 76 | version "1.0.9" 77 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 78 | dependencies: 79 | sprintf-js "~1.0.2" 80 | 81 | arr-diff@^2.0.0: 82 | version "2.0.0" 83 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 84 | dependencies: 85 | arr-flatten "^1.0.1" 86 | 87 | arr-diff@^4.0.0: 88 | version "4.0.0" 89 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 90 | 91 | arr-flatten@^1.0.1, arr-flatten@^1.1.0: 92 | version "1.1.0" 93 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 94 | 95 | arr-union@^3.1.0: 96 | version "3.1.0" 97 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 98 | 99 | array-unique@^0.2.1: 100 | version "0.2.1" 101 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 102 | 103 | array-unique@^0.3.2: 104 | version "0.3.2" 105 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 106 | 107 | asap@~2.0.3: 108 | version "2.0.6" 109 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 110 | 111 | asn1.js@^4.0.0: 112 | version "4.9.2" 113 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" 114 | dependencies: 115 | bn.js "^4.0.0" 116 | inherits "^2.0.1" 117 | minimalistic-assert "^1.0.0" 118 | 119 | asn1@~0.2.3: 120 | version "0.2.3" 121 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 122 | 123 | assert-plus@1.0.0, assert-plus@^1.0.0: 124 | version "1.0.0" 125 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 126 | 127 | assert-plus@^0.2.0: 128 | version "0.2.0" 129 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 130 | 131 | assert@^1.1.1: 132 | version "1.4.1" 133 | resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" 134 | dependencies: 135 | util "0.10.3" 136 | 137 | assign-symbols@^1.0.0: 138 | version "1.0.0" 139 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 140 | 141 | async-each@^1.0.0: 142 | version "1.0.1" 143 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 144 | 145 | async-limiter@~1.0.0: 146 | version "1.0.0" 147 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 148 | 149 | asynckit@^0.4.0: 150 | version "0.4.0" 151 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 152 | 153 | atob@^2.0.0: 154 | version "2.0.3" 155 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" 156 | 157 | autoprefixer@^6.3.1: 158 | version "6.7.7" 159 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" 160 | dependencies: 161 | browserslist "^1.7.6" 162 | caniuse-db "^1.0.30000634" 163 | normalize-range "^0.1.2" 164 | num2fraction "^1.2.2" 165 | postcss "^5.2.16" 166 | postcss-value-parser "^3.2.3" 167 | 168 | aws-sign2@~0.6.0: 169 | version "0.6.0" 170 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 171 | 172 | aws4@^1.2.1: 173 | version "1.6.0" 174 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 175 | 176 | babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: 177 | version "6.26.0" 178 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 179 | dependencies: 180 | chalk "^1.1.3" 181 | esutils "^2.0.2" 182 | js-tokens "^3.0.2" 183 | 184 | babel-core@^6.25.0, babel-core@^6.26.0: 185 | version "6.26.0" 186 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" 187 | dependencies: 188 | babel-code-frame "^6.26.0" 189 | babel-generator "^6.26.0" 190 | babel-helpers "^6.24.1" 191 | babel-messages "^6.23.0" 192 | babel-register "^6.26.0" 193 | babel-runtime "^6.26.0" 194 | babel-template "^6.26.0" 195 | babel-traverse "^6.26.0" 196 | babel-types "^6.26.0" 197 | babylon "^6.18.0" 198 | convert-source-map "^1.5.0" 199 | debug "^2.6.8" 200 | json5 "^0.5.1" 201 | lodash "^4.17.4" 202 | minimatch "^3.0.4" 203 | path-is-absolute "^1.0.1" 204 | private "^0.1.7" 205 | slash "^1.0.0" 206 | source-map "^0.5.6" 207 | 208 | babel-generator@^6.25.0, babel-generator@^6.26.0: 209 | version "6.26.0" 210 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" 211 | dependencies: 212 | babel-messages "^6.23.0" 213 | babel-runtime "^6.26.0" 214 | babel-types "^6.26.0" 215 | detect-indent "^4.0.0" 216 | jsesc "^1.3.0" 217 | lodash "^4.17.4" 218 | source-map "^0.5.6" 219 | trim-right "^1.0.1" 220 | 221 | babel-helpers@^6.24.1: 222 | version "6.24.1" 223 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 224 | dependencies: 225 | babel-runtime "^6.22.0" 226 | babel-template "^6.24.1" 227 | 228 | babel-messages@^6.23.0: 229 | version "6.23.0" 230 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 231 | dependencies: 232 | babel-runtime "^6.22.0" 233 | 234 | babel-plugin-transform-es2015-modules-commonjs@^6.26.0: 235 | version "6.26.0" 236 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" 237 | dependencies: 238 | babel-plugin-transform-strict-mode "^6.24.1" 239 | babel-runtime "^6.26.0" 240 | babel-template "^6.26.0" 241 | babel-types "^6.26.0" 242 | 243 | babel-plugin-transform-strict-mode@^6.24.1: 244 | version "6.24.1" 245 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 246 | dependencies: 247 | babel-runtime "^6.22.0" 248 | babel-types "^6.24.1" 249 | 250 | babel-register@^6.26.0: 251 | version "6.26.0" 252 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 253 | dependencies: 254 | babel-core "^6.26.0" 255 | babel-runtime "^6.26.0" 256 | core-js "^2.5.0" 257 | home-or-tmp "^2.0.0" 258 | lodash "^4.17.4" 259 | mkdirp "^0.5.1" 260 | source-map-support "^0.4.15" 261 | 262 | babel-runtime@^6.11.6, babel-runtime@^6.22.0, babel-runtime@^6.26.0: 263 | version "6.26.0" 264 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 265 | dependencies: 266 | core-js "^2.4.0" 267 | regenerator-runtime "^0.11.0" 268 | 269 | babel-template@^6.24.1, babel-template@^6.26.0: 270 | version "6.26.0" 271 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 272 | dependencies: 273 | babel-runtime "^6.26.0" 274 | babel-traverse "^6.26.0" 275 | babel-types "^6.26.0" 276 | babylon "^6.18.0" 277 | lodash "^4.17.4" 278 | 279 | babel-traverse@^6.26.0: 280 | version "6.26.0" 281 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 282 | dependencies: 283 | babel-code-frame "^6.26.0" 284 | babel-messages "^6.23.0" 285 | babel-runtime "^6.26.0" 286 | babel-types "^6.26.0" 287 | babylon "^6.18.0" 288 | debug "^2.6.8" 289 | globals "^9.18.0" 290 | invariant "^2.2.2" 291 | lodash "^4.17.4" 292 | 293 | babel-types@^6.15.0, babel-types@^6.24.1, babel-types@^6.26.0: 294 | version "6.26.0" 295 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 296 | dependencies: 297 | babel-runtime "^6.26.0" 298 | esutils "^2.0.2" 299 | lodash "^4.17.4" 300 | to-fast-properties "^1.0.3" 301 | 302 | babylon-walk@^1.0.2: 303 | version "1.0.2" 304 | resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce" 305 | dependencies: 306 | babel-runtime "^6.11.6" 307 | babel-types "^6.15.0" 308 | lodash.clone "^4.5.0" 309 | 310 | babylon@^6.17.4, babylon@^6.18.0: 311 | version "6.18.0" 312 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 313 | 314 | balanced-match@^0.4.2: 315 | version "0.4.2" 316 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 317 | 318 | balanced-match@^1.0.0: 319 | version "1.0.0" 320 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 321 | 322 | base64-js@^1.0.2: 323 | version "1.2.1" 324 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" 325 | 326 | base@^0.11.1: 327 | version "0.11.2" 328 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 329 | dependencies: 330 | cache-base "^1.0.1" 331 | class-utils "^0.3.5" 332 | component-emitter "^1.2.1" 333 | define-property "^1.0.0" 334 | isobject "^3.0.1" 335 | mixin-deep "^1.2.0" 336 | pascalcase "^0.1.1" 337 | 338 | bcrypt-pbkdf@^1.0.0: 339 | version "1.0.1" 340 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 341 | dependencies: 342 | tweetnacl "^0.14.3" 343 | 344 | binary-extensions@^1.0.0: 345 | version "1.11.0" 346 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" 347 | 348 | block-stream@*: 349 | version "0.0.9" 350 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 351 | dependencies: 352 | inherits "~2.0.0" 353 | 354 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: 355 | version "4.11.8" 356 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" 357 | 358 | boom@2.x.x: 359 | version "2.10.1" 360 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 361 | dependencies: 362 | hoek "2.x.x" 363 | 364 | brace-expansion@^1.1.7: 365 | version "1.1.8" 366 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 367 | dependencies: 368 | balanced-match "^1.0.0" 369 | concat-map "0.0.1" 370 | 371 | braces@^1.8.2: 372 | version "1.8.5" 373 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 374 | dependencies: 375 | expand-range "^1.8.1" 376 | preserve "^0.2.0" 377 | repeat-element "^1.1.2" 378 | 379 | braces@^2.3.0: 380 | version "2.3.0" 381 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" 382 | dependencies: 383 | arr-flatten "^1.1.0" 384 | array-unique "^0.3.2" 385 | define-property "^1.0.0" 386 | extend-shallow "^2.0.1" 387 | fill-range "^4.0.0" 388 | isobject "^3.0.1" 389 | repeat-element "^1.1.2" 390 | snapdragon "^0.8.1" 391 | snapdragon-node "^2.0.1" 392 | split-string "^3.0.2" 393 | to-regex "^3.0.1" 394 | 395 | brorand@^1.0.1: 396 | version "1.1.0" 397 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 398 | 399 | browser-resolve@^1.11.2: 400 | version "1.11.2" 401 | resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" 402 | dependencies: 403 | resolve "1.1.7" 404 | 405 | browserify-aes@^1.0.0, browserify-aes@^1.0.4: 406 | version "1.1.1" 407 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" 408 | dependencies: 409 | buffer-xor "^1.0.3" 410 | cipher-base "^1.0.0" 411 | create-hash "^1.1.0" 412 | evp_bytestokey "^1.0.3" 413 | inherits "^2.0.1" 414 | safe-buffer "^5.0.1" 415 | 416 | browserify-cipher@^1.0.0: 417 | version "1.0.0" 418 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" 419 | dependencies: 420 | browserify-aes "^1.0.4" 421 | browserify-des "^1.0.0" 422 | evp_bytestokey "^1.0.0" 423 | 424 | browserify-des@^1.0.0: 425 | version "1.0.0" 426 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" 427 | dependencies: 428 | cipher-base "^1.0.1" 429 | des.js "^1.0.0" 430 | inherits "^2.0.1" 431 | 432 | browserify-rsa@^4.0.0: 433 | version "4.0.1" 434 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" 435 | dependencies: 436 | bn.js "^4.1.0" 437 | randombytes "^2.0.1" 438 | 439 | browserify-sign@^4.0.0: 440 | version "4.0.4" 441 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" 442 | dependencies: 443 | bn.js "^4.1.1" 444 | browserify-rsa "^4.0.0" 445 | create-hash "^1.1.0" 446 | create-hmac "^1.1.2" 447 | elliptic "^6.0.0" 448 | inherits "^2.0.1" 449 | parse-asn1 "^5.0.0" 450 | 451 | browserify-zlib@^0.2.0: 452 | version "0.2.0" 453 | resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" 454 | dependencies: 455 | pako "~1.0.5" 456 | 457 | browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: 458 | version "1.7.7" 459 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" 460 | dependencies: 461 | caniuse-db "^1.0.30000639" 462 | electron-to-chromium "^1.2.7" 463 | 464 | buffer-xor@^1.0.3: 465 | version "1.0.3" 466 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 467 | 468 | buffer@^4.3.0: 469 | version "4.9.1" 470 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" 471 | dependencies: 472 | base64-js "^1.0.2" 473 | ieee754 "^1.1.4" 474 | isarray "^1.0.0" 475 | 476 | builtin-modules@^1.1.1: 477 | version "1.1.1" 478 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 479 | 480 | builtin-status-codes@^3.0.0: 481 | version "3.0.0" 482 | resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" 483 | 484 | cache-base@^1.0.1: 485 | version "1.0.1" 486 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 487 | dependencies: 488 | collection-visit "^1.0.0" 489 | component-emitter "^1.2.1" 490 | get-value "^2.0.6" 491 | has-value "^1.0.0" 492 | isobject "^3.0.1" 493 | set-value "^2.0.0" 494 | to-object-path "^0.3.0" 495 | union-value "^1.0.0" 496 | unset-value "^1.0.0" 497 | 498 | camelcase@^1.0.2: 499 | version "1.2.1" 500 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 501 | 502 | caniuse-api@^1.5.2: 503 | version "1.6.1" 504 | resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" 505 | dependencies: 506 | browserslist "^1.3.6" 507 | caniuse-db "^1.0.30000529" 508 | lodash.memoize "^4.1.2" 509 | lodash.uniq "^4.5.0" 510 | 511 | caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: 512 | version "1.0.30000792" 513 | resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000792.tgz#a7dac6dc9f5181b675fd69e5cb06fefb523157f8" 514 | 515 | caseless@~0.12.0: 516 | version "0.12.0" 517 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 518 | 519 | center-align@^0.1.1: 520 | version "0.1.3" 521 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 522 | dependencies: 523 | align-text "^0.1.3" 524 | lazy-cache "^1.0.3" 525 | 526 | chalk@^1.1.3: 527 | version "1.1.3" 528 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 529 | dependencies: 530 | ansi-styles "^2.2.1" 531 | escape-string-regexp "^1.0.2" 532 | has-ansi "^2.0.0" 533 | strip-ansi "^3.0.0" 534 | supports-color "^2.0.0" 535 | 536 | chalk@^2.1.0, chalk@^2.3.0: 537 | version "2.3.0" 538 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 539 | dependencies: 540 | ansi-styles "^3.1.0" 541 | escape-string-regexp "^1.0.5" 542 | supports-color "^4.0.0" 543 | 544 | chokidar@^1.7.0: 545 | version "1.7.0" 546 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" 547 | dependencies: 548 | anymatch "^1.3.0" 549 | async-each "^1.0.0" 550 | glob-parent "^2.0.0" 551 | inherits "^2.0.1" 552 | is-binary-path "^1.0.0" 553 | is-glob "^2.0.0" 554 | path-is-absolute "^1.0.0" 555 | readdirp "^2.0.0" 556 | optionalDependencies: 557 | fsevents "^1.0.0" 558 | 559 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 560 | version "1.0.4" 561 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 562 | dependencies: 563 | inherits "^2.0.1" 564 | safe-buffer "^5.0.1" 565 | 566 | clap@^1.0.9: 567 | version "1.2.3" 568 | resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" 569 | dependencies: 570 | chalk "^1.1.3" 571 | 572 | class-utils@^0.3.5: 573 | version "0.3.6" 574 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 575 | dependencies: 576 | arr-union "^3.1.0" 577 | define-property "^0.2.5" 578 | isobject "^3.0.0" 579 | static-extend "^0.1.1" 580 | 581 | cliui@^2.1.0: 582 | version "2.1.0" 583 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 584 | dependencies: 585 | center-align "^0.1.1" 586 | right-align "^0.1.1" 587 | wordwrap "0.0.2" 588 | 589 | clone@^1.0.2: 590 | version "1.0.3" 591 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" 592 | 593 | co@^4.6.0: 594 | version "4.6.0" 595 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 596 | 597 | coa@~1.0.1: 598 | version "1.0.4" 599 | resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" 600 | dependencies: 601 | q "^1.1.2" 602 | 603 | code-point-at@^1.0.0: 604 | version "1.1.0" 605 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 606 | 607 | collection-visit@^1.0.0: 608 | version "1.0.0" 609 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 610 | dependencies: 611 | map-visit "^1.0.0" 612 | object-visit "^1.0.0" 613 | 614 | color-convert@^1.3.0, color-convert@^1.9.0: 615 | version "1.9.1" 616 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 617 | dependencies: 618 | color-name "^1.1.1" 619 | 620 | color-name@^1.0.0, color-name@^1.1.1: 621 | version "1.1.3" 622 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 623 | 624 | color-string@^0.3.0: 625 | version "0.3.0" 626 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" 627 | dependencies: 628 | color-name "^1.0.0" 629 | 630 | color@^0.11.0: 631 | version "0.11.4" 632 | resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" 633 | dependencies: 634 | clone "^1.0.2" 635 | color-convert "^1.3.0" 636 | color-string "^0.3.0" 637 | 638 | colormin@^1.0.5: 639 | version "1.1.2" 640 | resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" 641 | dependencies: 642 | color "^0.11.0" 643 | css-color-names "0.0.4" 644 | has "^1.0.1" 645 | 646 | colors@~1.1.2: 647 | version "1.1.2" 648 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 649 | 650 | combined-stream@^1.0.5, combined-stream@~1.0.5: 651 | version "1.0.5" 652 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 653 | dependencies: 654 | delayed-stream "~1.0.0" 655 | 656 | commander@^2.11.0, commander@^2.12.1, commander@~2.13.0: 657 | version "2.13.0" 658 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" 659 | 660 | component-emitter@^1.2.1: 661 | version "1.2.1" 662 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 663 | 664 | concat-map@0.0.1: 665 | version "0.0.1" 666 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 667 | 668 | console-browserify@^1.1.0: 669 | version "1.1.0" 670 | resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" 671 | dependencies: 672 | date-now "^0.1.4" 673 | 674 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 675 | version "1.1.0" 676 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 677 | 678 | constants-browserify@^1.0.0: 679 | version "1.0.0" 680 | resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" 681 | 682 | convert-source-map@^1.5.0: 683 | version "1.5.1" 684 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" 685 | 686 | copy-descriptor@^0.1.0: 687 | version "0.1.1" 688 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 689 | 690 | core-js@^1.0.0: 691 | version "1.2.7" 692 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 693 | 694 | core-js@^2.4.0, core-js@^2.5.0: 695 | version "2.5.3" 696 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" 697 | 698 | core-util-is@1.0.2, core-util-is@~1.0.0: 699 | version "1.0.2" 700 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 701 | 702 | create-ecdh@^4.0.0: 703 | version "4.0.0" 704 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" 705 | dependencies: 706 | bn.js "^4.1.0" 707 | elliptic "^6.0.0" 708 | 709 | create-hash@^1.1.0, create-hash@^1.1.2: 710 | version "1.1.3" 711 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" 712 | dependencies: 713 | cipher-base "^1.0.1" 714 | inherits "^2.0.1" 715 | ripemd160 "^2.0.0" 716 | sha.js "^2.4.0" 717 | 718 | create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: 719 | version "1.1.6" 720 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" 721 | dependencies: 722 | cipher-base "^1.0.3" 723 | create-hash "^1.1.0" 724 | inherits "^2.0.1" 725 | ripemd160 "^2.0.0" 726 | safe-buffer "^5.0.1" 727 | sha.js "^2.4.8" 728 | 729 | cross-spawn@^5.1.0: 730 | version "5.1.0" 731 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 732 | dependencies: 733 | lru-cache "^4.0.1" 734 | shebang-command "^1.2.0" 735 | which "^1.2.9" 736 | 737 | cryptiles@2.x.x: 738 | version "2.0.5" 739 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 740 | dependencies: 741 | boom "2.x.x" 742 | 743 | crypto-browserify@^3.11.0: 744 | version "3.12.0" 745 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 746 | dependencies: 747 | browserify-cipher "^1.0.0" 748 | browserify-sign "^4.0.0" 749 | create-ecdh "^4.0.0" 750 | create-hash "^1.1.0" 751 | create-hmac "^1.1.0" 752 | diffie-hellman "^5.0.0" 753 | inherits "^2.0.1" 754 | pbkdf2 "^3.0.3" 755 | public-encrypt "^4.0.0" 756 | randombytes "^2.0.0" 757 | randomfill "^1.0.3" 758 | 759 | css-color-names@0.0.4: 760 | version "0.0.4" 761 | resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" 762 | 763 | cssnano@^3.10.0, cssnano@^3.4.0: 764 | version "3.10.0" 765 | resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" 766 | dependencies: 767 | autoprefixer "^6.3.1" 768 | decamelize "^1.1.2" 769 | defined "^1.0.0" 770 | has "^1.0.1" 771 | object-assign "^4.0.1" 772 | postcss "^5.0.14" 773 | postcss-calc "^5.2.0" 774 | postcss-colormin "^2.1.8" 775 | postcss-convert-values "^2.3.4" 776 | postcss-discard-comments "^2.0.4" 777 | postcss-discard-duplicates "^2.0.1" 778 | postcss-discard-empty "^2.0.1" 779 | postcss-discard-overridden "^0.1.1" 780 | postcss-discard-unused "^2.2.1" 781 | postcss-filter-plugins "^2.0.0" 782 | postcss-merge-idents "^2.1.5" 783 | postcss-merge-longhand "^2.0.1" 784 | postcss-merge-rules "^2.0.3" 785 | postcss-minify-font-values "^1.0.2" 786 | postcss-minify-gradients "^1.0.1" 787 | postcss-minify-params "^1.0.4" 788 | postcss-minify-selectors "^2.0.4" 789 | postcss-normalize-charset "^1.1.0" 790 | postcss-normalize-url "^3.0.7" 791 | postcss-ordered-values "^2.1.0" 792 | postcss-reduce-idents "^2.2.2" 793 | postcss-reduce-initial "^1.0.0" 794 | postcss-reduce-transforms "^1.0.3" 795 | postcss-svgo "^2.1.1" 796 | postcss-unique-selectors "^2.0.2" 797 | postcss-value-parser "^3.2.3" 798 | postcss-zindex "^2.0.1" 799 | 800 | csso@~2.3.1: 801 | version "2.3.2" 802 | resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" 803 | dependencies: 804 | clap "^1.0.9" 805 | source-map "^0.5.3" 806 | 807 | dashdash@^1.12.0: 808 | version "1.14.1" 809 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 810 | dependencies: 811 | assert-plus "^1.0.0" 812 | 813 | date-now@^0.1.4: 814 | version "0.1.4" 815 | resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" 816 | 817 | debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: 818 | version "2.6.9" 819 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 820 | dependencies: 821 | ms "2.0.0" 822 | 823 | decamelize@^1.0.0, decamelize@^1.1.2: 824 | version "1.2.0" 825 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 826 | 827 | decode-uri-component@^0.2.0: 828 | version "0.2.0" 829 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 830 | 831 | deep-extend@~0.4.0: 832 | version "0.4.2" 833 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 834 | 835 | define-property@^0.2.5: 836 | version "0.2.5" 837 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 838 | dependencies: 839 | is-descriptor "^0.1.0" 840 | 841 | define-property@^1.0.0: 842 | version "1.0.0" 843 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 844 | dependencies: 845 | is-descriptor "^1.0.0" 846 | 847 | defined@^1.0.0: 848 | version "1.0.0" 849 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 850 | 851 | delayed-stream@~1.0.0: 852 | version "1.0.0" 853 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 854 | 855 | delegates@^1.0.0: 856 | version "1.0.0" 857 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 858 | 859 | depd@1.1.1: 860 | version "1.1.1" 861 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" 862 | 863 | depd@~1.1.1: 864 | version "1.1.2" 865 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 866 | 867 | des.js@^1.0.0: 868 | version "1.0.0" 869 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" 870 | dependencies: 871 | inherits "^2.0.1" 872 | minimalistic-assert "^1.0.0" 873 | 874 | destroy@~1.0.4: 875 | version "1.0.4" 876 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 877 | 878 | detect-indent@^4.0.0: 879 | version "4.0.0" 880 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 881 | dependencies: 882 | repeating "^2.0.0" 883 | 884 | detect-libc@^1.0.2: 885 | version "1.0.3" 886 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 887 | 888 | diff@^3.2.0: 889 | version "3.4.0" 890 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" 891 | 892 | diffie-hellman@^5.0.0: 893 | version "5.0.2" 894 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" 895 | dependencies: 896 | bn.js "^4.1.0" 897 | miller-rabin "^4.0.0" 898 | randombytes "^2.0.0" 899 | 900 | dom-serializer@0: 901 | version "0.1.0" 902 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" 903 | dependencies: 904 | domelementtype "~1.1.1" 905 | entities "~1.1.1" 906 | 907 | domain-browser@^1.1.1: 908 | version "1.1.7" 909 | resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" 910 | 911 | domelementtype@1, domelementtype@^1.3.0: 912 | version "1.3.0" 913 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" 914 | 915 | domelementtype@~1.1.1: 916 | version "1.1.3" 917 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" 918 | 919 | domhandler@^2.3.0: 920 | version "2.4.1" 921 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" 922 | dependencies: 923 | domelementtype "1" 924 | 925 | domutils@^1.5.1: 926 | version "1.6.2" 927 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff" 928 | dependencies: 929 | dom-serializer "0" 930 | domelementtype "1" 931 | 932 | ecc-jsbn@~0.1.1: 933 | version "0.1.1" 934 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 935 | dependencies: 936 | jsbn "~0.1.0" 937 | 938 | ee-first@1.1.1: 939 | version "1.1.1" 940 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 941 | 942 | electron-releases@^2.1.0: 943 | version "2.1.0" 944 | resolved "https://registry.yarnpkg.com/electron-releases/-/electron-releases-2.1.0.tgz#c5614bf811f176ce3c836e368a0625782341fd4e" 945 | 946 | electron-to-chromium@^1.2.7: 947 | version "1.3.30" 948 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz#9666f532a64586651fc56a72513692e820d06a80" 949 | dependencies: 950 | electron-releases "^2.1.0" 951 | 952 | elliptic@^6.0.0: 953 | version "6.4.0" 954 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" 955 | dependencies: 956 | bn.js "^4.4.0" 957 | brorand "^1.0.1" 958 | hash.js "^1.0.0" 959 | hmac-drbg "^1.0.0" 960 | inherits "^2.0.1" 961 | minimalistic-assert "^1.0.0" 962 | minimalistic-crypto-utils "^1.0.0" 963 | 964 | encodeurl@~1.0.1: 965 | version "1.0.1" 966 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 967 | 968 | encoding@^0.1.11: 969 | version "0.1.12" 970 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 971 | dependencies: 972 | iconv-lite "~0.4.13" 973 | 974 | entities@^1.1.1, entities@~1.1.1: 975 | version "1.1.1" 976 | resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" 977 | 978 | errno@^0.1.4: 979 | version "0.1.6" 980 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" 981 | dependencies: 982 | prr "~1.0.1" 983 | 984 | escape-html@~1.0.3: 985 | version "1.0.3" 986 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 987 | 988 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 989 | version "1.0.5" 990 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 991 | 992 | esprima@^2.6.0: 993 | version "2.7.3" 994 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 995 | 996 | esprima@^4.0.0: 997 | version "4.0.0" 998 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 999 | 1000 | esutils@^2.0.2: 1001 | version "2.0.2" 1002 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1003 | 1004 | etag@~1.8.1: 1005 | version "1.8.1" 1006 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 1007 | 1008 | events@^1.0.0: 1009 | version "1.1.1" 1010 | resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 1011 | 1012 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 1013 | version "1.0.3" 1014 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 1015 | dependencies: 1016 | md5.js "^1.3.4" 1017 | safe-buffer "^5.1.1" 1018 | 1019 | expand-brackets@^0.1.4: 1020 | version "0.1.5" 1021 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1022 | dependencies: 1023 | is-posix-bracket "^0.1.0" 1024 | 1025 | expand-brackets@^2.1.4: 1026 | version "2.1.4" 1027 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 1028 | dependencies: 1029 | debug "^2.3.3" 1030 | define-property "^0.2.5" 1031 | extend-shallow "^2.0.1" 1032 | posix-character-classes "^0.1.0" 1033 | regex-not "^1.0.0" 1034 | snapdragon "^0.8.1" 1035 | to-regex "^3.0.1" 1036 | 1037 | expand-range@^1.8.1: 1038 | version "1.8.2" 1039 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 1040 | dependencies: 1041 | fill-range "^2.1.0" 1042 | 1043 | extend-shallow@^2.0.1: 1044 | version "2.0.1" 1045 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 1046 | dependencies: 1047 | is-extendable "^0.1.0" 1048 | 1049 | extend-shallow@^3.0.0: 1050 | version "3.0.2" 1051 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 1052 | dependencies: 1053 | assign-symbols "^1.0.0" 1054 | is-extendable "^1.0.1" 1055 | 1056 | extend@~3.0.0: 1057 | version "3.0.1" 1058 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 1059 | 1060 | extglob@^0.3.1: 1061 | version "0.3.2" 1062 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 1063 | dependencies: 1064 | is-extglob "^1.0.0" 1065 | 1066 | extglob@^2.0.2: 1067 | version "2.0.4" 1068 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 1069 | dependencies: 1070 | array-unique "^0.3.2" 1071 | define-property "^1.0.0" 1072 | expand-brackets "^2.1.4" 1073 | extend-shallow "^2.0.1" 1074 | fragment-cache "^0.2.1" 1075 | regex-not "^1.0.0" 1076 | snapdragon "^0.8.1" 1077 | to-regex "^3.0.1" 1078 | 1079 | extsprintf@1.3.0: 1080 | version "1.3.0" 1081 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 1082 | 1083 | extsprintf@^1.2.0: 1084 | version "1.4.0" 1085 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 1086 | 1087 | fbjs@^0.8.16: 1088 | version "0.8.16" 1089 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" 1090 | dependencies: 1091 | core-js "^1.0.0" 1092 | isomorphic-fetch "^2.1.1" 1093 | loose-envify "^1.0.0" 1094 | object-assign "^4.1.0" 1095 | promise "^7.1.1" 1096 | setimmediate "^1.0.5" 1097 | ua-parser-js "^0.7.9" 1098 | 1099 | filename-regex@^2.0.0: 1100 | version "2.0.1" 1101 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 1102 | 1103 | fill-range@^2.1.0: 1104 | version "2.2.3" 1105 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 1106 | dependencies: 1107 | is-number "^2.1.0" 1108 | isobject "^2.0.0" 1109 | randomatic "^1.1.3" 1110 | repeat-element "^1.1.2" 1111 | repeat-string "^1.5.2" 1112 | 1113 | fill-range@^4.0.0: 1114 | version "4.0.0" 1115 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 1116 | dependencies: 1117 | extend-shallow "^2.0.1" 1118 | is-number "^3.0.0" 1119 | repeat-string "^1.6.1" 1120 | to-regex-range "^2.1.0" 1121 | 1122 | flatten@^1.0.2: 1123 | version "1.0.2" 1124 | resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" 1125 | 1126 | for-in@^1.0.1, for-in@^1.0.2: 1127 | version "1.0.2" 1128 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 1129 | 1130 | for-own@^0.1.4: 1131 | version "0.1.5" 1132 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 1133 | dependencies: 1134 | for-in "^1.0.1" 1135 | 1136 | forever-agent@~0.6.1: 1137 | version "0.6.1" 1138 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1139 | 1140 | form-data@~2.1.1: 1141 | version "2.1.4" 1142 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 1143 | dependencies: 1144 | asynckit "^0.4.0" 1145 | combined-stream "^1.0.5" 1146 | mime-types "^2.1.12" 1147 | 1148 | fragment-cache@^0.2.1: 1149 | version "0.2.1" 1150 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 1151 | dependencies: 1152 | map-cache "^0.2.2" 1153 | 1154 | fresh@0.5.2: 1155 | version "0.5.2" 1156 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1157 | 1158 | fs.realpath@^1.0.0: 1159 | version "1.0.0" 1160 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1161 | 1162 | fsevents@^1.0.0: 1163 | version "1.1.3" 1164 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" 1165 | dependencies: 1166 | nan "^2.3.0" 1167 | node-pre-gyp "^0.6.39" 1168 | 1169 | fstream-ignore@^1.0.5: 1170 | version "1.0.5" 1171 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 1172 | dependencies: 1173 | fstream "^1.0.0" 1174 | inherits "2" 1175 | minimatch "^3.0.0" 1176 | 1177 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 1178 | version "1.0.11" 1179 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 1180 | dependencies: 1181 | graceful-fs "^4.1.2" 1182 | inherits "~2.0.0" 1183 | mkdirp ">=0.5 0" 1184 | rimraf "2" 1185 | 1186 | function-bind@^1.0.2: 1187 | version "1.1.1" 1188 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1189 | 1190 | gauge@~2.7.3: 1191 | version "2.7.4" 1192 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 1193 | dependencies: 1194 | aproba "^1.0.3" 1195 | console-control-strings "^1.0.0" 1196 | has-unicode "^2.0.0" 1197 | object-assign "^4.1.0" 1198 | signal-exit "^3.0.0" 1199 | string-width "^1.0.1" 1200 | strip-ansi "^3.0.1" 1201 | wide-align "^1.1.0" 1202 | 1203 | get-port@^3.2.0: 1204 | version "3.2.0" 1205 | resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" 1206 | 1207 | get-value@^2.0.3, get-value@^2.0.6: 1208 | version "2.0.6" 1209 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 1210 | 1211 | getpass@^0.1.1: 1212 | version "0.1.7" 1213 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1214 | dependencies: 1215 | assert-plus "^1.0.0" 1216 | 1217 | glob-base@^0.3.0: 1218 | version "0.3.0" 1219 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1220 | dependencies: 1221 | glob-parent "^2.0.0" 1222 | is-glob "^2.0.0" 1223 | 1224 | glob-parent@^2.0.0: 1225 | version "2.0.0" 1226 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1227 | dependencies: 1228 | is-glob "^2.0.0" 1229 | 1230 | glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: 1231 | version "7.1.2" 1232 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 1233 | dependencies: 1234 | fs.realpath "^1.0.0" 1235 | inflight "^1.0.4" 1236 | inherits "2" 1237 | minimatch "^3.0.4" 1238 | once "^1.3.0" 1239 | path-is-absolute "^1.0.0" 1240 | 1241 | globals@^9.18.0: 1242 | version "9.18.0" 1243 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 1244 | 1245 | graceful-fs@^4.1.2: 1246 | version "4.1.11" 1247 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1248 | 1249 | har-schema@^1.0.5: 1250 | version "1.0.5" 1251 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 1252 | 1253 | har-validator@~4.2.1: 1254 | version "4.2.1" 1255 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 1256 | dependencies: 1257 | ajv "^4.9.1" 1258 | har-schema "^1.0.5" 1259 | 1260 | has-ansi@^2.0.0: 1261 | version "2.0.0" 1262 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1263 | dependencies: 1264 | ansi-regex "^2.0.0" 1265 | 1266 | has-flag@^1.0.0: 1267 | version "1.0.0" 1268 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1269 | 1270 | has-flag@^2.0.0: 1271 | version "2.0.0" 1272 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 1273 | 1274 | has-unicode@^2.0.0: 1275 | version "2.0.1" 1276 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1277 | 1278 | has-value@^0.3.1: 1279 | version "0.3.1" 1280 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 1281 | dependencies: 1282 | get-value "^2.0.3" 1283 | has-values "^0.1.4" 1284 | isobject "^2.0.0" 1285 | 1286 | has-value@^1.0.0: 1287 | version "1.0.0" 1288 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 1289 | dependencies: 1290 | get-value "^2.0.6" 1291 | has-values "^1.0.0" 1292 | isobject "^3.0.0" 1293 | 1294 | has-values@^0.1.4: 1295 | version "0.1.4" 1296 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 1297 | 1298 | has-values@^1.0.0: 1299 | version "1.0.0" 1300 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 1301 | dependencies: 1302 | is-number "^3.0.0" 1303 | kind-of "^4.0.0" 1304 | 1305 | has@^1.0.1: 1306 | version "1.0.1" 1307 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1308 | dependencies: 1309 | function-bind "^1.0.2" 1310 | 1311 | hash-base@^2.0.0: 1312 | version "2.0.2" 1313 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" 1314 | dependencies: 1315 | inherits "^2.0.1" 1316 | 1317 | hash-base@^3.0.0: 1318 | version "3.0.4" 1319 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" 1320 | dependencies: 1321 | inherits "^2.0.1" 1322 | safe-buffer "^5.0.1" 1323 | 1324 | hash.js@^1.0.0, hash.js@^1.0.3: 1325 | version "1.1.3" 1326 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" 1327 | dependencies: 1328 | inherits "^2.0.3" 1329 | minimalistic-assert "^1.0.0" 1330 | 1331 | hawk@3.1.3, hawk@~3.1.3: 1332 | version "3.1.3" 1333 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 1334 | dependencies: 1335 | boom "2.x.x" 1336 | cryptiles "2.x.x" 1337 | hoek "2.x.x" 1338 | sntp "1.x.x" 1339 | 1340 | hmac-drbg@^1.0.0: 1341 | version "1.0.1" 1342 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 1343 | dependencies: 1344 | hash.js "^1.0.3" 1345 | minimalistic-assert "^1.0.0" 1346 | minimalistic-crypto-utils "^1.0.1" 1347 | 1348 | hoek@2.x.x: 1349 | version "2.16.3" 1350 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 1351 | 1352 | home-or-tmp@^2.0.0: 1353 | version "2.0.0" 1354 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1355 | dependencies: 1356 | os-homedir "^1.0.0" 1357 | os-tmpdir "^1.0.1" 1358 | 1359 | html-comment-regex@^1.1.0: 1360 | version "1.1.1" 1361 | resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" 1362 | 1363 | htmlnano@^0.1.6: 1364 | version "0.1.6" 1365 | resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.1.6.tgz#709aa2d96d8df37bfd8dbfa6ce5f4f80c863738e" 1366 | dependencies: 1367 | cssnano "^3.4.0" 1368 | object-assign "^4.0.1" 1369 | posthtml "^0.8.7" 1370 | posthtml-render "^1.0.6" 1371 | svgo "^0.7.2" 1372 | uglify-js "^2.8.29" 1373 | 1374 | htmlparser2@^3.8.3, htmlparser2@^3.9.2: 1375 | version "3.9.2" 1376 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" 1377 | dependencies: 1378 | domelementtype "^1.3.0" 1379 | domhandler "^2.3.0" 1380 | domutils "^1.5.1" 1381 | entities "^1.1.1" 1382 | inherits "^2.0.1" 1383 | readable-stream "^2.0.2" 1384 | 1385 | http-errors@~1.6.2: 1386 | version "1.6.2" 1387 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" 1388 | dependencies: 1389 | depd "1.1.1" 1390 | inherits "2.0.3" 1391 | setprototypeof "1.0.3" 1392 | statuses ">= 1.3.1 < 2" 1393 | 1394 | http-signature@~1.1.0: 1395 | version "1.1.1" 1396 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 1397 | dependencies: 1398 | assert-plus "^0.2.0" 1399 | jsprim "^1.2.2" 1400 | sshpk "^1.7.0" 1401 | 1402 | https-browserify@^1.0.0: 1403 | version "1.0.0" 1404 | resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" 1405 | 1406 | iconv-lite@~0.4.13: 1407 | version "0.4.19" 1408 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 1409 | 1410 | ieee754@^1.1.4: 1411 | version "1.1.8" 1412 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" 1413 | 1414 | indexes-of@^1.0.1: 1415 | version "1.0.1" 1416 | resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" 1417 | 1418 | indexof@0.0.1: 1419 | version "0.0.1" 1420 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 1421 | 1422 | inflight@^1.0.4: 1423 | version "1.0.6" 1424 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1425 | dependencies: 1426 | once "^1.3.0" 1427 | wrappy "1" 1428 | 1429 | 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: 1430 | version "2.0.3" 1431 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1432 | 1433 | inherits@2.0.1: 1434 | version "2.0.1" 1435 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1436 | 1437 | ini@~1.3.0: 1438 | version "1.3.5" 1439 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 1440 | 1441 | invariant@^2.2.2: 1442 | version "2.2.2" 1443 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1444 | dependencies: 1445 | loose-envify "^1.0.0" 1446 | 1447 | is-absolute-url@^2.0.0: 1448 | version "2.1.0" 1449 | resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" 1450 | 1451 | is-accessor-descriptor@^0.1.6: 1452 | version "0.1.6" 1453 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 1454 | dependencies: 1455 | kind-of "^3.0.2" 1456 | 1457 | is-accessor-descriptor@^1.0.0: 1458 | version "1.0.0" 1459 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 1460 | dependencies: 1461 | kind-of "^6.0.0" 1462 | 1463 | is-binary-path@^1.0.0: 1464 | version "1.0.1" 1465 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1466 | dependencies: 1467 | binary-extensions "^1.0.0" 1468 | 1469 | is-buffer@^1.1.5: 1470 | version "1.1.6" 1471 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1472 | 1473 | is-data-descriptor@^0.1.4: 1474 | version "0.1.4" 1475 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 1476 | dependencies: 1477 | kind-of "^3.0.2" 1478 | 1479 | is-data-descriptor@^1.0.0: 1480 | version "1.0.0" 1481 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 1482 | dependencies: 1483 | kind-of "^6.0.0" 1484 | 1485 | is-descriptor@^0.1.0: 1486 | version "0.1.6" 1487 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 1488 | dependencies: 1489 | is-accessor-descriptor "^0.1.6" 1490 | is-data-descriptor "^0.1.4" 1491 | kind-of "^5.0.0" 1492 | 1493 | is-descriptor@^1.0.0: 1494 | version "1.0.2" 1495 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 1496 | dependencies: 1497 | is-accessor-descriptor "^1.0.0" 1498 | is-data-descriptor "^1.0.0" 1499 | kind-of "^6.0.2" 1500 | 1501 | is-dotfile@^1.0.0: 1502 | version "1.0.3" 1503 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1504 | 1505 | is-equal-shallow@^0.1.3: 1506 | version "0.1.3" 1507 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1508 | dependencies: 1509 | is-primitive "^2.0.0" 1510 | 1511 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1512 | version "0.1.1" 1513 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1514 | 1515 | is-extendable@^1.0.1: 1516 | version "1.0.1" 1517 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 1518 | dependencies: 1519 | is-plain-object "^2.0.4" 1520 | 1521 | is-extglob@^1.0.0: 1522 | version "1.0.0" 1523 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1524 | 1525 | is-finite@^1.0.0: 1526 | version "1.0.2" 1527 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1528 | dependencies: 1529 | number-is-nan "^1.0.0" 1530 | 1531 | is-fullwidth-code-point@^1.0.0: 1532 | version "1.0.0" 1533 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1534 | dependencies: 1535 | number-is-nan "^1.0.0" 1536 | 1537 | is-glob@^2.0.0, is-glob@^2.0.1: 1538 | version "2.0.1" 1539 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1540 | dependencies: 1541 | is-extglob "^1.0.0" 1542 | 1543 | is-number@^2.1.0: 1544 | version "2.1.0" 1545 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1546 | dependencies: 1547 | kind-of "^3.0.2" 1548 | 1549 | is-number@^3.0.0: 1550 | version "3.0.0" 1551 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1552 | dependencies: 1553 | kind-of "^3.0.2" 1554 | 1555 | is-odd@^1.0.0: 1556 | version "1.0.0" 1557 | resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" 1558 | dependencies: 1559 | is-number "^3.0.0" 1560 | 1561 | is-plain-obj@^1.0.0: 1562 | version "1.1.0" 1563 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 1564 | 1565 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 1566 | version "2.0.4" 1567 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 1568 | dependencies: 1569 | isobject "^3.0.1" 1570 | 1571 | is-posix-bracket@^0.1.0: 1572 | version "0.1.1" 1573 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1574 | 1575 | is-primitive@^2.0.0: 1576 | version "2.0.0" 1577 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1578 | 1579 | is-stream@^1.0.1: 1580 | version "1.1.0" 1581 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1582 | 1583 | is-svg@^2.0.0: 1584 | version "2.1.0" 1585 | resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" 1586 | dependencies: 1587 | html-comment-regex "^1.1.0" 1588 | 1589 | is-typedarray@~1.0.0: 1590 | version "1.0.0" 1591 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1592 | 1593 | is-url@^1.2.2: 1594 | version "1.2.2" 1595 | resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.2.tgz#498905a593bf47cc2d9e7f738372bbf7696c7f26" 1596 | 1597 | is-wsl@^1.1.0: 1598 | version "1.1.0" 1599 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" 1600 | 1601 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 1602 | version "1.0.0" 1603 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1604 | 1605 | isexe@^2.0.0: 1606 | version "2.0.0" 1607 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1608 | 1609 | isobject@^2.0.0, isobject@^2.1.0: 1610 | version "2.1.0" 1611 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1612 | dependencies: 1613 | isarray "1.0.0" 1614 | 1615 | isobject@^3.0.0, isobject@^3.0.1: 1616 | version "3.0.1" 1617 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 1618 | 1619 | isomorphic-fetch@^2.1.1: 1620 | version "2.2.1" 1621 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1622 | dependencies: 1623 | node-fetch "^1.0.1" 1624 | whatwg-fetch ">=0.10.0" 1625 | 1626 | isstream@~0.1.2: 1627 | version "0.1.2" 1628 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1629 | 1630 | js-base64@^2.1.9: 1631 | version "2.4.0" 1632 | resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" 1633 | 1634 | js-tokens@^3.0.0, js-tokens@^3.0.2: 1635 | version "3.0.2" 1636 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1637 | 1638 | js-yaml@^3.10.0, js-yaml@^3.7.0: 1639 | version "3.10.0" 1640 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" 1641 | dependencies: 1642 | argparse "^1.0.7" 1643 | esprima "^4.0.0" 1644 | 1645 | js-yaml@~3.7.0: 1646 | version "3.7.0" 1647 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 1648 | dependencies: 1649 | argparse "^1.0.7" 1650 | esprima "^2.6.0" 1651 | 1652 | jsbn@~0.1.0: 1653 | version "0.1.1" 1654 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1655 | 1656 | jsesc@^1.3.0: 1657 | version "1.3.0" 1658 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1659 | 1660 | json-schema@0.2.3: 1661 | version "0.2.3" 1662 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1663 | 1664 | json-stable-stringify@^1.0.1: 1665 | version "1.0.1" 1666 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1667 | dependencies: 1668 | jsonify "~0.0.0" 1669 | 1670 | json-stringify-safe@~5.0.1: 1671 | version "5.0.1" 1672 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1673 | 1674 | json5@^0.5.1: 1675 | version "0.5.1" 1676 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1677 | 1678 | jsonify@~0.0.0: 1679 | version "0.0.0" 1680 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1681 | 1682 | jsprim@^1.2.2: 1683 | version "1.4.1" 1684 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1685 | dependencies: 1686 | assert-plus "1.0.0" 1687 | extsprintf "1.3.0" 1688 | json-schema "0.2.3" 1689 | verror "1.10.0" 1690 | 1691 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 1692 | version "3.2.2" 1693 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1694 | dependencies: 1695 | is-buffer "^1.1.5" 1696 | 1697 | kind-of@^4.0.0: 1698 | version "4.0.0" 1699 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1700 | dependencies: 1701 | is-buffer "^1.1.5" 1702 | 1703 | kind-of@^5.0.0, kind-of@^5.0.2: 1704 | version "5.1.0" 1705 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 1706 | 1707 | kind-of@^6.0.0, kind-of@^6.0.2: 1708 | version "6.0.2" 1709 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 1710 | 1711 | lazy-cache@^1.0.3: 1712 | version "1.0.4" 1713 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 1714 | 1715 | lazy-cache@^2.0.2: 1716 | version "2.0.2" 1717 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" 1718 | dependencies: 1719 | set-getter "^0.1.0" 1720 | 1721 | lodash.clone@^4.5.0: 1722 | version "4.5.0" 1723 | resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" 1724 | 1725 | lodash.memoize@^4.1.2: 1726 | version "4.1.2" 1727 | resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" 1728 | 1729 | lodash.uniq@^4.5.0: 1730 | version "4.5.0" 1731 | resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" 1732 | 1733 | lodash@^4.17.4: 1734 | version "4.17.4" 1735 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1736 | 1737 | longest@^1.0.1: 1738 | version "1.0.1" 1739 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1740 | 1741 | loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: 1742 | version "1.3.1" 1743 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1744 | dependencies: 1745 | js-tokens "^3.0.0" 1746 | 1747 | lru-cache@^4.0.1: 1748 | version "4.1.1" 1749 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 1750 | dependencies: 1751 | pseudomap "^1.0.2" 1752 | yallist "^2.1.2" 1753 | 1754 | macaddress@^0.2.8: 1755 | version "0.2.8" 1756 | resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" 1757 | 1758 | map-cache@^0.2.2: 1759 | version "0.2.2" 1760 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 1761 | 1762 | map-visit@^1.0.0: 1763 | version "1.0.0" 1764 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 1765 | dependencies: 1766 | object-visit "^1.0.0" 1767 | 1768 | math-expression-evaluator@^1.2.14: 1769 | version "1.2.17" 1770 | resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" 1771 | 1772 | md5.js@^1.3.4: 1773 | version "1.3.4" 1774 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" 1775 | dependencies: 1776 | hash-base "^3.0.0" 1777 | inherits "^2.0.1" 1778 | 1779 | micromatch@^2.1.5: 1780 | version "2.3.11" 1781 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1782 | dependencies: 1783 | arr-diff "^2.0.0" 1784 | array-unique "^0.2.1" 1785 | braces "^1.8.2" 1786 | expand-brackets "^0.1.4" 1787 | extglob "^0.3.1" 1788 | filename-regex "^2.0.0" 1789 | is-extglob "^1.0.0" 1790 | is-glob "^2.0.1" 1791 | kind-of "^3.0.2" 1792 | normalize-path "^2.0.1" 1793 | object.omit "^2.0.0" 1794 | parse-glob "^3.0.4" 1795 | regex-cache "^0.4.2" 1796 | 1797 | micromatch@^3.0.4: 1798 | version "3.1.5" 1799 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" 1800 | dependencies: 1801 | arr-diff "^4.0.0" 1802 | array-unique "^0.3.2" 1803 | braces "^2.3.0" 1804 | define-property "^1.0.0" 1805 | extend-shallow "^2.0.1" 1806 | extglob "^2.0.2" 1807 | fragment-cache "^0.2.1" 1808 | kind-of "^6.0.0" 1809 | nanomatch "^1.2.5" 1810 | object.pick "^1.3.0" 1811 | regex-not "^1.0.0" 1812 | snapdragon "^0.8.1" 1813 | to-regex "^3.0.1" 1814 | 1815 | miller-rabin@^4.0.0: 1816 | version "4.0.1" 1817 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 1818 | dependencies: 1819 | bn.js "^4.0.0" 1820 | brorand "^1.0.1" 1821 | 1822 | mime-db@~1.30.0: 1823 | version "1.30.0" 1824 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 1825 | 1826 | mime-types@^2.1.12, mime-types@~2.1.7: 1827 | version "2.1.17" 1828 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 1829 | dependencies: 1830 | mime-db "~1.30.0" 1831 | 1832 | mime@1.4.1: 1833 | version "1.4.1" 1834 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 1835 | 1836 | minimalistic-assert@^1.0.0: 1837 | version "1.0.0" 1838 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" 1839 | 1840 | minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: 1841 | version "1.0.1" 1842 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1843 | 1844 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: 1845 | version "3.0.4" 1846 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1847 | dependencies: 1848 | brace-expansion "^1.1.7" 1849 | 1850 | minimist@0.0.8: 1851 | version "0.0.8" 1852 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1853 | 1854 | minimist@^1.2.0: 1855 | version "1.2.0" 1856 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1857 | 1858 | mixin-deep@^1.2.0: 1859 | version "1.3.0" 1860 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" 1861 | dependencies: 1862 | for-in "^1.0.2" 1863 | is-extendable "^1.0.1" 1864 | 1865 | "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: 1866 | version "0.5.1" 1867 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1868 | dependencies: 1869 | minimist "0.0.8" 1870 | 1871 | ms@2.0.0: 1872 | version "2.0.0" 1873 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1874 | 1875 | nan@^2.3.0: 1876 | version "2.8.0" 1877 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" 1878 | 1879 | nanomatch@^1.2.5: 1880 | version "1.2.7" 1881 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" 1882 | dependencies: 1883 | arr-diff "^4.0.0" 1884 | array-unique "^0.3.2" 1885 | define-property "^1.0.0" 1886 | extend-shallow "^2.0.1" 1887 | fragment-cache "^0.2.1" 1888 | is-odd "^1.0.0" 1889 | kind-of "^5.0.2" 1890 | object.pick "^1.3.0" 1891 | regex-not "^1.0.0" 1892 | snapdragon "^0.8.1" 1893 | to-regex "^3.0.1" 1894 | 1895 | node-fetch@^1.0.1: 1896 | version "1.7.3" 1897 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" 1898 | dependencies: 1899 | encoding "^0.1.11" 1900 | is-stream "^1.0.1" 1901 | 1902 | node-forge@^0.7.1: 1903 | version "0.7.1" 1904 | resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" 1905 | 1906 | node-libs-browser@^2.0.0: 1907 | version "2.1.0" 1908 | resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" 1909 | dependencies: 1910 | assert "^1.1.1" 1911 | browserify-zlib "^0.2.0" 1912 | buffer "^4.3.0" 1913 | console-browserify "^1.1.0" 1914 | constants-browserify "^1.0.0" 1915 | crypto-browserify "^3.11.0" 1916 | domain-browser "^1.1.1" 1917 | events "^1.0.0" 1918 | https-browserify "^1.0.0" 1919 | os-browserify "^0.3.0" 1920 | path-browserify "0.0.0" 1921 | process "^0.11.10" 1922 | punycode "^1.2.4" 1923 | querystring-es3 "^0.2.0" 1924 | readable-stream "^2.3.3" 1925 | stream-browserify "^2.0.1" 1926 | stream-http "^2.7.2" 1927 | string_decoder "^1.0.0" 1928 | timers-browserify "^2.0.4" 1929 | tty-browserify "0.0.0" 1930 | url "^0.11.0" 1931 | util "^0.10.3" 1932 | vm-browserify "0.0.4" 1933 | 1934 | node-pre-gyp@^0.6.39: 1935 | version "0.6.39" 1936 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" 1937 | dependencies: 1938 | detect-libc "^1.0.2" 1939 | hawk "3.1.3" 1940 | mkdirp "^0.5.1" 1941 | nopt "^4.0.1" 1942 | npmlog "^4.0.2" 1943 | rc "^1.1.7" 1944 | request "2.81.0" 1945 | rimraf "^2.6.1" 1946 | semver "^5.3.0" 1947 | tar "^2.2.1" 1948 | tar-pack "^3.4.0" 1949 | 1950 | nopt@^4.0.1: 1951 | version "4.0.1" 1952 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1953 | dependencies: 1954 | abbrev "1" 1955 | osenv "^0.1.4" 1956 | 1957 | normalize-path@^2.0.0, normalize-path@^2.0.1: 1958 | version "2.1.1" 1959 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1960 | dependencies: 1961 | remove-trailing-separator "^1.0.1" 1962 | 1963 | normalize-range@^0.1.2: 1964 | version "0.1.2" 1965 | resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 1966 | 1967 | normalize-url@^1.4.0: 1968 | version "1.9.1" 1969 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" 1970 | dependencies: 1971 | object-assign "^4.0.1" 1972 | prepend-http "^1.0.0" 1973 | query-string "^4.1.0" 1974 | sort-keys "^1.0.0" 1975 | 1976 | now@^9.1.0: 1977 | version "9.1.0" 1978 | resolved "https://registry.yarnpkg.com/now/-/now-9.1.0.tgz#b13feae859311fd3d4d0f084e02a1a67680c7116" 1979 | 1980 | npmlog@^4.0.2: 1981 | version "4.1.2" 1982 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1983 | dependencies: 1984 | are-we-there-yet "~1.1.2" 1985 | console-control-strings "~1.1.0" 1986 | gauge "~2.7.3" 1987 | set-blocking "~2.0.0" 1988 | 1989 | num2fraction@^1.2.2: 1990 | version "1.2.2" 1991 | resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" 1992 | 1993 | number-is-nan@^1.0.0: 1994 | version "1.0.1" 1995 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1996 | 1997 | oauth-sign@~0.8.1: 1998 | version "0.8.2" 1999 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 2000 | 2001 | object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: 2002 | version "4.1.1" 2003 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 2004 | 2005 | object-copy@^0.1.0: 2006 | version "0.1.0" 2007 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 2008 | dependencies: 2009 | copy-descriptor "^0.1.0" 2010 | define-property "^0.2.5" 2011 | kind-of "^3.0.3" 2012 | 2013 | object-visit@^1.0.0: 2014 | version "1.0.1" 2015 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 2016 | dependencies: 2017 | isobject "^3.0.0" 2018 | 2019 | object.omit@^2.0.0: 2020 | version "2.0.1" 2021 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 2022 | dependencies: 2023 | for-own "^0.1.4" 2024 | is-extendable "^0.1.1" 2025 | 2026 | object.pick@^1.3.0: 2027 | version "1.3.0" 2028 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 2029 | dependencies: 2030 | isobject "^3.0.1" 2031 | 2032 | on-finished@~2.3.0: 2033 | version "2.3.0" 2034 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 2035 | dependencies: 2036 | ee-first "1.1.1" 2037 | 2038 | once@^1.3.0, once@^1.3.3: 2039 | version "1.4.0" 2040 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2041 | dependencies: 2042 | wrappy "1" 2043 | 2044 | opn@^5.1.0: 2045 | version "5.2.0" 2046 | resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" 2047 | dependencies: 2048 | is-wsl "^1.1.0" 2049 | 2050 | os-browserify@^0.3.0: 2051 | version "0.3.0" 2052 | resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" 2053 | 2054 | os-homedir@^1.0.0: 2055 | version "1.0.2" 2056 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 2057 | 2058 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 2059 | version "1.0.2" 2060 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 2061 | 2062 | osenv@^0.1.4: 2063 | version "0.1.4" 2064 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 2065 | dependencies: 2066 | os-homedir "^1.0.0" 2067 | os-tmpdir "^1.0.0" 2068 | 2069 | pako@~1.0.5: 2070 | version "1.0.6" 2071 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" 2072 | 2073 | parcel-bundler@^1.4.1: 2074 | version "1.4.1" 2075 | resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.4.1.tgz#9f86d9d113d5fdf130dd414508c7a75293be0c61" 2076 | dependencies: 2077 | babel-core "^6.25.0" 2078 | babel-generator "^6.25.0" 2079 | babel-plugin-transform-es2015-modules-commonjs "^6.26.0" 2080 | babylon "^6.17.4" 2081 | babylon-walk "^1.0.2" 2082 | browser-resolve "^1.11.2" 2083 | chalk "^2.1.0" 2084 | chokidar "^1.7.0" 2085 | commander "^2.11.0" 2086 | cross-spawn "^5.1.0" 2087 | cssnano "^3.10.0" 2088 | get-port "^3.2.0" 2089 | glob "^7.1.2" 2090 | htmlnano "^0.1.6" 2091 | is-url "^1.2.2" 2092 | js-yaml "^3.10.0" 2093 | json5 "^0.5.1" 2094 | micromatch "^3.0.4" 2095 | mkdirp "^0.5.1" 2096 | node-forge "^0.7.1" 2097 | node-libs-browser "^2.0.0" 2098 | opn "^5.1.0" 2099 | physical-cpu-count "^2.0.0" 2100 | postcss "^6.0.10" 2101 | postcss-value-parser "^3.3.0" 2102 | posthtml "^0.10.1" 2103 | resolve "^1.4.0" 2104 | sanitize-filename "^1.6.1" 2105 | serve-static "^1.12.4" 2106 | uglify-es "^3.2.1" 2107 | v8-compile-cache "^1.1.0" 2108 | worker-farm "^1.4.1" 2109 | ws "^3.3.3" 2110 | 2111 | parse-asn1@^5.0.0: 2112 | version "5.1.0" 2113 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" 2114 | dependencies: 2115 | asn1.js "^4.0.0" 2116 | browserify-aes "^1.0.0" 2117 | create-hash "^1.1.0" 2118 | evp_bytestokey "^1.0.0" 2119 | pbkdf2 "^3.0.3" 2120 | 2121 | parse-glob@^3.0.4: 2122 | version "3.0.4" 2123 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 2124 | dependencies: 2125 | glob-base "^0.3.0" 2126 | is-dotfile "^1.0.0" 2127 | is-extglob "^1.0.0" 2128 | is-glob "^2.0.0" 2129 | 2130 | parseurl@~1.3.2: 2131 | version "1.3.2" 2132 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 2133 | 2134 | pascalcase@^0.1.1: 2135 | version "0.1.1" 2136 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 2137 | 2138 | path-browserify@0.0.0: 2139 | version "0.0.0" 2140 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" 2141 | 2142 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 2143 | version "1.0.1" 2144 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2145 | 2146 | path-parse@^1.0.5: 2147 | version "1.0.5" 2148 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 2149 | 2150 | pbkdf2@^3.0.3: 2151 | version "3.0.14" 2152 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" 2153 | dependencies: 2154 | create-hash "^1.1.2" 2155 | create-hmac "^1.1.4" 2156 | ripemd160 "^2.0.1" 2157 | safe-buffer "^5.0.1" 2158 | sha.js "^2.4.8" 2159 | 2160 | performance-now@^0.2.0: 2161 | version "0.2.0" 2162 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 2163 | 2164 | physical-cpu-count@^2.0.0: 2165 | version "2.0.0" 2166 | resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" 2167 | 2168 | posix-character-classes@^0.1.0: 2169 | version "0.1.1" 2170 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 2171 | 2172 | postcss-calc@^5.2.0: 2173 | version "5.3.1" 2174 | resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" 2175 | dependencies: 2176 | postcss "^5.0.2" 2177 | postcss-message-helpers "^2.0.0" 2178 | reduce-css-calc "^1.2.6" 2179 | 2180 | postcss-colormin@^2.1.8: 2181 | version "2.2.2" 2182 | resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" 2183 | dependencies: 2184 | colormin "^1.0.5" 2185 | postcss "^5.0.13" 2186 | postcss-value-parser "^3.2.3" 2187 | 2188 | postcss-convert-values@^2.3.4: 2189 | version "2.6.1" 2190 | resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" 2191 | dependencies: 2192 | postcss "^5.0.11" 2193 | postcss-value-parser "^3.1.2" 2194 | 2195 | postcss-discard-comments@^2.0.4: 2196 | version "2.0.4" 2197 | resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" 2198 | dependencies: 2199 | postcss "^5.0.14" 2200 | 2201 | postcss-discard-duplicates@^2.0.1: 2202 | version "2.1.0" 2203 | resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" 2204 | dependencies: 2205 | postcss "^5.0.4" 2206 | 2207 | postcss-discard-empty@^2.0.1: 2208 | version "2.1.0" 2209 | resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" 2210 | dependencies: 2211 | postcss "^5.0.14" 2212 | 2213 | postcss-discard-overridden@^0.1.1: 2214 | version "0.1.1" 2215 | resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" 2216 | dependencies: 2217 | postcss "^5.0.16" 2218 | 2219 | postcss-discard-unused@^2.2.1: 2220 | version "2.2.3" 2221 | resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" 2222 | dependencies: 2223 | postcss "^5.0.14" 2224 | uniqs "^2.0.0" 2225 | 2226 | postcss-filter-plugins@^2.0.0: 2227 | version "2.0.2" 2228 | resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" 2229 | dependencies: 2230 | postcss "^5.0.4" 2231 | uniqid "^4.0.0" 2232 | 2233 | postcss-merge-idents@^2.1.5: 2234 | version "2.1.7" 2235 | resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" 2236 | dependencies: 2237 | has "^1.0.1" 2238 | postcss "^5.0.10" 2239 | postcss-value-parser "^3.1.1" 2240 | 2241 | postcss-merge-longhand@^2.0.1: 2242 | version "2.0.2" 2243 | resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" 2244 | dependencies: 2245 | postcss "^5.0.4" 2246 | 2247 | postcss-merge-rules@^2.0.3: 2248 | version "2.1.2" 2249 | resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" 2250 | dependencies: 2251 | browserslist "^1.5.2" 2252 | caniuse-api "^1.5.2" 2253 | postcss "^5.0.4" 2254 | postcss-selector-parser "^2.2.2" 2255 | vendors "^1.0.0" 2256 | 2257 | postcss-message-helpers@^2.0.0: 2258 | version "2.0.0" 2259 | resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" 2260 | 2261 | postcss-minify-font-values@^1.0.2: 2262 | version "1.0.5" 2263 | resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" 2264 | dependencies: 2265 | object-assign "^4.0.1" 2266 | postcss "^5.0.4" 2267 | postcss-value-parser "^3.0.2" 2268 | 2269 | postcss-minify-gradients@^1.0.1: 2270 | version "1.0.5" 2271 | resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" 2272 | dependencies: 2273 | postcss "^5.0.12" 2274 | postcss-value-parser "^3.3.0" 2275 | 2276 | postcss-minify-params@^1.0.4: 2277 | version "1.2.2" 2278 | resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" 2279 | dependencies: 2280 | alphanum-sort "^1.0.1" 2281 | postcss "^5.0.2" 2282 | postcss-value-parser "^3.0.2" 2283 | uniqs "^2.0.0" 2284 | 2285 | postcss-minify-selectors@^2.0.4: 2286 | version "2.1.1" 2287 | resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" 2288 | dependencies: 2289 | alphanum-sort "^1.0.2" 2290 | has "^1.0.1" 2291 | postcss "^5.0.14" 2292 | postcss-selector-parser "^2.0.0" 2293 | 2294 | postcss-normalize-charset@^1.1.0: 2295 | version "1.1.1" 2296 | resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" 2297 | dependencies: 2298 | postcss "^5.0.5" 2299 | 2300 | postcss-normalize-url@^3.0.7: 2301 | version "3.0.8" 2302 | resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" 2303 | dependencies: 2304 | is-absolute-url "^2.0.0" 2305 | normalize-url "^1.4.0" 2306 | postcss "^5.0.14" 2307 | postcss-value-parser "^3.2.3" 2308 | 2309 | postcss-ordered-values@^2.1.0: 2310 | version "2.2.3" 2311 | resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" 2312 | dependencies: 2313 | postcss "^5.0.4" 2314 | postcss-value-parser "^3.0.1" 2315 | 2316 | postcss-reduce-idents@^2.2.2: 2317 | version "2.4.0" 2318 | resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" 2319 | dependencies: 2320 | postcss "^5.0.4" 2321 | postcss-value-parser "^3.0.2" 2322 | 2323 | postcss-reduce-initial@^1.0.0: 2324 | version "1.0.1" 2325 | resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" 2326 | dependencies: 2327 | postcss "^5.0.4" 2328 | 2329 | postcss-reduce-transforms@^1.0.3: 2330 | version "1.0.4" 2331 | resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" 2332 | dependencies: 2333 | has "^1.0.1" 2334 | postcss "^5.0.8" 2335 | postcss-value-parser "^3.0.1" 2336 | 2337 | postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: 2338 | version "2.2.3" 2339 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" 2340 | dependencies: 2341 | flatten "^1.0.2" 2342 | indexes-of "^1.0.1" 2343 | uniq "^1.0.1" 2344 | 2345 | postcss-svgo@^2.1.1: 2346 | version "2.1.6" 2347 | resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" 2348 | dependencies: 2349 | is-svg "^2.0.0" 2350 | postcss "^5.0.14" 2351 | postcss-value-parser "^3.2.3" 2352 | svgo "^0.7.0" 2353 | 2354 | postcss-unique-selectors@^2.0.2: 2355 | version "2.0.2" 2356 | resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" 2357 | dependencies: 2358 | alphanum-sort "^1.0.1" 2359 | postcss "^5.0.4" 2360 | uniqs "^2.0.0" 2361 | 2362 | postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: 2363 | version "3.3.0" 2364 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" 2365 | 2366 | postcss-zindex@^2.0.1: 2367 | version "2.2.0" 2368 | resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" 2369 | dependencies: 2370 | has "^1.0.1" 2371 | postcss "^5.0.4" 2372 | uniqs "^2.0.0" 2373 | 2374 | postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16: 2375 | version "5.2.18" 2376 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" 2377 | dependencies: 2378 | chalk "^1.1.3" 2379 | js-base64 "^2.1.9" 2380 | source-map "^0.5.6" 2381 | supports-color "^3.2.3" 2382 | 2383 | postcss@^6.0.10: 2384 | version "6.0.16" 2385 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.16.tgz#112e2fe2a6d2109be0957687243170ea5589e146" 2386 | dependencies: 2387 | chalk "^2.3.0" 2388 | source-map "^0.6.1" 2389 | supports-color "^5.1.0" 2390 | 2391 | posthtml-parser@^0.1.3: 2392 | version "0.1.3" 2393 | resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.1.3.tgz#43251f575ba34e361032f79a11e0fc93ab232b24" 2394 | dependencies: 2395 | htmlparser2 "^3.8.3" 2396 | 2397 | posthtml-parser@^0.3.0: 2398 | version "0.3.1" 2399 | resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.3.1.tgz#c8a3cfb126313fe733fe239430e9318d538c22f8" 2400 | dependencies: 2401 | htmlparser2 "^3.9.2" 2402 | isobject "^2.1.0" 2403 | object-assign "^4.1.1" 2404 | 2405 | posthtml-render@^1.0.5, posthtml-render@^1.0.6: 2406 | version "1.0.6" 2407 | resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.0.6.tgz#1b88b8e7860a8ebdfe2f2a1310a4642a55cf5bda" 2408 | 2409 | posthtml@^0.10.1: 2410 | version "0.10.1" 2411 | resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.10.1.tgz#029caa80591d2788ac1903dcf92352f46cec3cb5" 2412 | dependencies: 2413 | posthtml-parser "^0.3.0" 2414 | posthtml-render "^1.0.5" 2415 | 2416 | posthtml@^0.8.7: 2417 | version "0.8.7" 2418 | resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.8.7.tgz#aba6124c6cf87b4ceea6bab5f7e50268f2c2006d" 2419 | dependencies: 2420 | posthtml-parser "^0.1.3" 2421 | posthtml-render "^1.0.5" 2422 | 2423 | prepend-http@^1.0.0: 2424 | version "1.0.4" 2425 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 2426 | 2427 | preserve@^0.2.0: 2428 | version "0.2.0" 2429 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 2430 | 2431 | private@^0.1.7: 2432 | version "0.1.8" 2433 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 2434 | 2435 | process-nextick-args@~1.0.6: 2436 | version "1.0.7" 2437 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 2438 | 2439 | process@^0.11.10: 2440 | version "0.11.10" 2441 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 2442 | 2443 | promise@^7.1.1: 2444 | version "7.3.1" 2445 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 2446 | dependencies: 2447 | asap "~2.0.3" 2448 | 2449 | prop-types@^15.6.0: 2450 | version "15.6.0" 2451 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" 2452 | dependencies: 2453 | fbjs "^0.8.16" 2454 | loose-envify "^1.3.1" 2455 | object-assign "^4.1.1" 2456 | 2457 | prr@~1.0.1: 2458 | version "1.0.1" 2459 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 2460 | 2461 | pseudomap@^1.0.2: 2462 | version "1.0.2" 2463 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 2464 | 2465 | public-encrypt@^4.0.0: 2466 | version "4.0.0" 2467 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" 2468 | dependencies: 2469 | bn.js "^4.1.0" 2470 | browserify-rsa "^4.0.0" 2471 | create-hash "^1.1.0" 2472 | parse-asn1 "^5.0.0" 2473 | randombytes "^2.0.1" 2474 | 2475 | punycode@1.3.2: 2476 | version "1.3.2" 2477 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 2478 | 2479 | punycode@^1.2.4, punycode@^1.4.1: 2480 | version "1.4.1" 2481 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 2482 | 2483 | q@^1.1.2: 2484 | version "1.5.1" 2485 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" 2486 | 2487 | qs@~6.4.0: 2488 | version "6.4.0" 2489 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 2490 | 2491 | query-string@^4.1.0: 2492 | version "4.3.4" 2493 | resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" 2494 | dependencies: 2495 | object-assign "^4.1.0" 2496 | strict-uri-encode "^1.0.0" 2497 | 2498 | querystring-es3@^0.2.0: 2499 | version "0.2.1" 2500 | resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" 2501 | 2502 | querystring@0.2.0: 2503 | version "0.2.0" 2504 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 2505 | 2506 | randomatic@^1.1.3: 2507 | version "1.1.7" 2508 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 2509 | dependencies: 2510 | is-number "^3.0.0" 2511 | kind-of "^4.0.0" 2512 | 2513 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: 2514 | version "2.0.6" 2515 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" 2516 | dependencies: 2517 | safe-buffer "^5.1.0" 2518 | 2519 | randomfill@^1.0.3: 2520 | version "1.0.3" 2521 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" 2522 | dependencies: 2523 | randombytes "^2.0.5" 2524 | safe-buffer "^5.1.0" 2525 | 2526 | range-parser@~1.2.0: 2527 | version "1.2.0" 2528 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 2529 | 2530 | rc@^1.1.7: 2531 | version "1.2.3" 2532 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.3.tgz#51575a900f8dd68381c710b4712c2154c3e2035b" 2533 | dependencies: 2534 | deep-extend "~0.4.0" 2535 | ini "~1.3.0" 2536 | minimist "^1.2.0" 2537 | strip-json-comments "~2.0.1" 2538 | 2539 | react-dom@^16.2.0: 2540 | version "16.2.0" 2541 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044" 2542 | dependencies: 2543 | fbjs "^0.8.16" 2544 | loose-envify "^1.1.0" 2545 | object-assign "^4.1.1" 2546 | prop-types "^15.6.0" 2547 | 2548 | react@^16.2.0: 2549 | version "16.2.0" 2550 | resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" 2551 | dependencies: 2552 | fbjs "^0.8.16" 2553 | loose-envify "^1.1.0" 2554 | object-assign "^4.1.1" 2555 | prop-types "^15.6.0" 2556 | 2557 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.3.3: 2558 | version "2.3.3" 2559 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 2560 | dependencies: 2561 | core-util-is "~1.0.0" 2562 | inherits "~2.0.3" 2563 | isarray "~1.0.0" 2564 | process-nextick-args "~1.0.6" 2565 | safe-buffer "~5.1.1" 2566 | string_decoder "~1.0.3" 2567 | util-deprecate "~1.0.1" 2568 | 2569 | readdirp@^2.0.0: 2570 | version "2.1.0" 2571 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 2572 | dependencies: 2573 | graceful-fs "^4.1.2" 2574 | minimatch "^3.0.2" 2575 | readable-stream "^2.0.2" 2576 | set-immediate-shim "^1.0.1" 2577 | 2578 | reduce-css-calc@^1.2.6: 2579 | version "1.3.0" 2580 | resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" 2581 | dependencies: 2582 | balanced-match "^0.4.2" 2583 | math-expression-evaluator "^1.2.14" 2584 | reduce-function-call "^1.0.1" 2585 | 2586 | reduce-function-call@^1.0.1: 2587 | version "1.0.2" 2588 | resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" 2589 | dependencies: 2590 | balanced-match "^0.4.2" 2591 | 2592 | regenerator-runtime@^0.11.0: 2593 | version "0.11.1" 2594 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 2595 | 2596 | regex-cache@^0.4.2: 2597 | version "0.4.4" 2598 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 2599 | dependencies: 2600 | is-equal-shallow "^0.1.3" 2601 | 2602 | regex-not@^1.0.0: 2603 | version "1.0.0" 2604 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" 2605 | dependencies: 2606 | extend-shallow "^2.0.1" 2607 | 2608 | remove-trailing-separator@^1.0.1: 2609 | version "1.1.0" 2610 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 2611 | 2612 | repeat-element@^1.1.2: 2613 | version "1.1.2" 2614 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2615 | 2616 | repeat-string@^1.5.2, repeat-string@^1.6.1: 2617 | version "1.6.1" 2618 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2619 | 2620 | repeating@^2.0.0: 2621 | version "2.0.1" 2622 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2623 | dependencies: 2624 | is-finite "^1.0.0" 2625 | 2626 | request@2.81.0: 2627 | version "2.81.0" 2628 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 2629 | dependencies: 2630 | aws-sign2 "~0.6.0" 2631 | aws4 "^1.2.1" 2632 | caseless "~0.12.0" 2633 | combined-stream "~1.0.5" 2634 | extend "~3.0.0" 2635 | forever-agent "~0.6.1" 2636 | form-data "~2.1.1" 2637 | har-validator "~4.2.1" 2638 | hawk "~3.1.3" 2639 | http-signature "~1.1.0" 2640 | is-typedarray "~1.0.0" 2641 | isstream "~0.1.2" 2642 | json-stringify-safe "~5.0.1" 2643 | mime-types "~2.1.7" 2644 | oauth-sign "~0.8.1" 2645 | performance-now "^0.2.0" 2646 | qs "~6.4.0" 2647 | safe-buffer "^5.0.1" 2648 | stringstream "~0.0.4" 2649 | tough-cookie "~2.3.0" 2650 | tunnel-agent "^0.6.0" 2651 | uuid "^3.0.0" 2652 | 2653 | resolve-url@^0.2.1: 2654 | version "0.2.1" 2655 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 2656 | 2657 | resolve@1.1.7: 2658 | version "1.1.7" 2659 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 2660 | 2661 | resolve@^1.3.2, resolve@^1.4.0: 2662 | version "1.5.0" 2663 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 2664 | dependencies: 2665 | path-parse "^1.0.5" 2666 | 2667 | right-align@^0.1.1: 2668 | version "0.1.3" 2669 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 2670 | dependencies: 2671 | align-text "^0.1.1" 2672 | 2673 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 2674 | version "2.6.2" 2675 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 2676 | dependencies: 2677 | glob "^7.0.5" 2678 | 2679 | ripemd160@^2.0.0, ripemd160@^2.0.1: 2680 | version "2.0.1" 2681 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" 2682 | dependencies: 2683 | hash-base "^2.0.0" 2684 | inherits "^2.0.1" 2685 | 2686 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2687 | version "5.1.1" 2688 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 2689 | 2690 | sanitize-filename@^1.6.1: 2691 | version "1.6.1" 2692 | resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" 2693 | dependencies: 2694 | truncate-utf8-bytes "^1.0.0" 2695 | 2696 | sax@~1.2.1: 2697 | version "1.2.4" 2698 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2699 | 2700 | semver@^5.3.0: 2701 | version "5.4.1" 2702 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 2703 | 2704 | send@0.16.1: 2705 | version "0.16.1" 2706 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" 2707 | dependencies: 2708 | debug "2.6.9" 2709 | depd "~1.1.1" 2710 | destroy "~1.0.4" 2711 | encodeurl "~1.0.1" 2712 | escape-html "~1.0.3" 2713 | etag "~1.8.1" 2714 | fresh "0.5.2" 2715 | http-errors "~1.6.2" 2716 | mime "1.4.1" 2717 | ms "2.0.0" 2718 | on-finished "~2.3.0" 2719 | range-parser "~1.2.0" 2720 | statuses "~1.3.1" 2721 | 2722 | serve-static@^1.12.4: 2723 | version "1.13.1" 2724 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" 2725 | dependencies: 2726 | encodeurl "~1.0.1" 2727 | escape-html "~1.0.3" 2728 | parseurl "~1.3.2" 2729 | send "0.16.1" 2730 | 2731 | set-blocking@~2.0.0: 2732 | version "2.0.0" 2733 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2734 | 2735 | set-getter@^0.1.0: 2736 | version "0.1.0" 2737 | resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" 2738 | dependencies: 2739 | to-object-path "^0.3.0" 2740 | 2741 | set-immediate-shim@^1.0.1: 2742 | version "1.0.1" 2743 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 2744 | 2745 | set-value@^0.4.3: 2746 | version "0.4.3" 2747 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 2748 | dependencies: 2749 | extend-shallow "^2.0.1" 2750 | is-extendable "^0.1.1" 2751 | is-plain-object "^2.0.1" 2752 | to-object-path "^0.3.0" 2753 | 2754 | set-value@^2.0.0: 2755 | version "2.0.0" 2756 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 2757 | dependencies: 2758 | extend-shallow "^2.0.1" 2759 | is-extendable "^0.1.1" 2760 | is-plain-object "^2.0.3" 2761 | split-string "^3.0.1" 2762 | 2763 | setimmediate@^1.0.4, setimmediate@^1.0.5: 2764 | version "1.0.5" 2765 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 2766 | 2767 | setprototypeof@1.0.3: 2768 | version "1.0.3" 2769 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 2770 | 2771 | sha.js@^2.4.0, sha.js@^2.4.8: 2772 | version "2.4.9" 2773 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" 2774 | dependencies: 2775 | inherits "^2.0.1" 2776 | safe-buffer "^5.0.1" 2777 | 2778 | shebang-command@^1.2.0: 2779 | version "1.2.0" 2780 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2781 | dependencies: 2782 | shebang-regex "^1.0.0" 2783 | 2784 | shebang-regex@^1.0.0: 2785 | version "1.0.0" 2786 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2787 | 2788 | signal-exit@^3.0.0: 2789 | version "3.0.2" 2790 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2791 | 2792 | slash@^1.0.0: 2793 | version "1.0.0" 2794 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2795 | 2796 | snapdragon-node@^2.0.1: 2797 | version "2.1.1" 2798 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 2799 | dependencies: 2800 | define-property "^1.0.0" 2801 | isobject "^3.0.0" 2802 | snapdragon-util "^3.0.1" 2803 | 2804 | snapdragon-util@^3.0.1: 2805 | version "3.0.1" 2806 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 2807 | dependencies: 2808 | kind-of "^3.2.0" 2809 | 2810 | snapdragon@^0.8.1: 2811 | version "0.8.1" 2812 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" 2813 | dependencies: 2814 | base "^0.11.1" 2815 | debug "^2.2.0" 2816 | define-property "^0.2.5" 2817 | extend-shallow "^2.0.1" 2818 | map-cache "^0.2.2" 2819 | source-map "^0.5.6" 2820 | source-map-resolve "^0.5.0" 2821 | use "^2.0.0" 2822 | 2823 | sntp@1.x.x: 2824 | version "1.0.9" 2825 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2826 | dependencies: 2827 | hoek "2.x.x" 2828 | 2829 | sort-keys@^1.0.0: 2830 | version "1.1.2" 2831 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 2832 | dependencies: 2833 | is-plain-obj "^1.0.0" 2834 | 2835 | source-map-resolve@^0.5.0: 2836 | version "0.5.1" 2837 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" 2838 | dependencies: 2839 | atob "^2.0.0" 2840 | decode-uri-component "^0.2.0" 2841 | resolve-url "^0.2.1" 2842 | source-map-url "^0.4.0" 2843 | urix "^0.1.0" 2844 | 2845 | source-map-support@^0.4.15: 2846 | version "0.4.18" 2847 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 2848 | dependencies: 2849 | source-map "^0.5.6" 2850 | 2851 | source-map-url@^0.4.0: 2852 | version "0.4.0" 2853 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 2854 | 2855 | source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: 2856 | version "0.5.7" 2857 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2858 | 2859 | source-map@^0.6.1, source-map@~0.6.1: 2860 | version "0.6.1" 2861 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2862 | 2863 | split-string@^3.0.1, split-string@^3.0.2: 2864 | version "3.1.0" 2865 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 2866 | dependencies: 2867 | extend-shallow "^3.0.0" 2868 | 2869 | sprintf-js@~1.0.2: 2870 | version "1.0.3" 2871 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2872 | 2873 | sshpk@^1.7.0: 2874 | version "1.13.1" 2875 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 2876 | dependencies: 2877 | asn1 "~0.2.3" 2878 | assert-plus "^1.0.0" 2879 | dashdash "^1.12.0" 2880 | getpass "^0.1.1" 2881 | optionalDependencies: 2882 | bcrypt-pbkdf "^1.0.0" 2883 | ecc-jsbn "~0.1.1" 2884 | jsbn "~0.1.0" 2885 | tweetnacl "~0.14.0" 2886 | 2887 | static-extend@^0.1.1: 2888 | version "0.1.2" 2889 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 2890 | dependencies: 2891 | define-property "^0.2.5" 2892 | object-copy "^0.1.0" 2893 | 2894 | "statuses@>= 1.3.1 < 2": 2895 | version "1.4.0" 2896 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 2897 | 2898 | statuses@~1.3.1: 2899 | version "1.3.1" 2900 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 2901 | 2902 | stream-browserify@^2.0.1: 2903 | version "2.0.1" 2904 | resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" 2905 | dependencies: 2906 | inherits "~2.0.1" 2907 | readable-stream "^2.0.2" 2908 | 2909 | stream-http@^2.7.2: 2910 | version "2.8.0" 2911 | resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" 2912 | dependencies: 2913 | builtin-status-codes "^3.0.0" 2914 | inherits "^2.0.1" 2915 | readable-stream "^2.3.3" 2916 | to-arraybuffer "^1.0.0" 2917 | xtend "^4.0.0" 2918 | 2919 | strict-uri-encode@^1.0.0: 2920 | version "1.1.0" 2921 | resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" 2922 | 2923 | string-width@^1.0.1, string-width@^1.0.2: 2924 | version "1.0.2" 2925 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2926 | dependencies: 2927 | code-point-at "^1.0.0" 2928 | is-fullwidth-code-point "^1.0.0" 2929 | strip-ansi "^3.0.0" 2930 | 2931 | string_decoder@^1.0.0, string_decoder@~1.0.3: 2932 | version "1.0.3" 2933 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2934 | dependencies: 2935 | safe-buffer "~5.1.0" 2936 | 2937 | stringstream@~0.0.4: 2938 | version "0.0.5" 2939 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2940 | 2941 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2942 | version "3.0.1" 2943 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2944 | dependencies: 2945 | ansi-regex "^2.0.0" 2946 | 2947 | strip-json-comments@~2.0.1: 2948 | version "2.0.1" 2949 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2950 | 2951 | supports-color@^2.0.0: 2952 | version "2.0.0" 2953 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2954 | 2955 | supports-color@^3.2.3: 2956 | version "3.2.3" 2957 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 2958 | dependencies: 2959 | has-flag "^1.0.0" 2960 | 2961 | supports-color@^4.0.0: 2962 | version "4.5.0" 2963 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 2964 | dependencies: 2965 | has-flag "^2.0.0" 2966 | 2967 | supports-color@^5.1.0: 2968 | version "5.1.0" 2969 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" 2970 | dependencies: 2971 | has-flag "^2.0.0" 2972 | 2973 | svgo@^0.7.0, svgo@^0.7.2: 2974 | version "0.7.2" 2975 | resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" 2976 | dependencies: 2977 | coa "~1.0.1" 2978 | colors "~1.1.2" 2979 | csso "~2.3.1" 2980 | js-yaml "~3.7.0" 2981 | mkdirp "~0.5.1" 2982 | sax "~1.2.1" 2983 | whet.extend "~0.9.9" 2984 | 2985 | tar-pack@^3.4.0: 2986 | version "3.4.1" 2987 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" 2988 | dependencies: 2989 | debug "^2.2.0" 2990 | fstream "^1.0.10" 2991 | fstream-ignore "^1.0.5" 2992 | once "^1.3.3" 2993 | readable-stream "^2.1.4" 2994 | rimraf "^2.5.1" 2995 | tar "^2.2.1" 2996 | uid-number "^0.0.6" 2997 | 2998 | tar@^2.2.1: 2999 | version "2.2.1" 3000 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 3001 | dependencies: 3002 | block-stream "*" 3003 | fstream "^1.0.2" 3004 | inherits "2" 3005 | 3006 | timers-browserify@^2.0.4: 3007 | version "2.0.4" 3008 | resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" 3009 | dependencies: 3010 | setimmediate "^1.0.4" 3011 | 3012 | to-arraybuffer@^1.0.0: 3013 | version "1.0.1" 3014 | resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 3015 | 3016 | to-fast-properties@^1.0.3: 3017 | version "1.0.3" 3018 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 3019 | 3020 | to-object-path@^0.3.0: 3021 | version "0.3.0" 3022 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 3023 | dependencies: 3024 | kind-of "^3.0.2" 3025 | 3026 | to-regex-range@^2.1.0: 3027 | version "2.1.1" 3028 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 3029 | dependencies: 3030 | is-number "^3.0.0" 3031 | repeat-string "^1.6.1" 3032 | 3033 | to-regex@^3.0.1: 3034 | version "3.0.1" 3035 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" 3036 | dependencies: 3037 | define-property "^0.2.5" 3038 | extend-shallow "^2.0.1" 3039 | regex-not "^1.0.0" 3040 | 3041 | tough-cookie@~2.3.0: 3042 | version "2.3.3" 3043 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 3044 | dependencies: 3045 | punycode "^1.4.1" 3046 | 3047 | trim-right@^1.0.1: 3048 | version "1.0.1" 3049 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 3050 | 3051 | truncate-utf8-bytes@^1.0.0: 3052 | version "1.0.2" 3053 | resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" 3054 | dependencies: 3055 | utf8-byte-length "^1.0.1" 3056 | 3057 | tslib@^1.8.0, tslib@^1.8.1: 3058 | version "1.8.1" 3059 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac" 3060 | 3061 | tslint@^5.9.1: 3062 | version "5.9.1" 3063 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.9.1.tgz#1255f87a3ff57eb0b0e1f0e610a8b4748046c9ae" 3064 | dependencies: 3065 | babel-code-frame "^6.22.0" 3066 | builtin-modules "^1.1.1" 3067 | chalk "^2.3.0" 3068 | commander "^2.12.1" 3069 | diff "^3.2.0" 3070 | glob "^7.1.1" 3071 | js-yaml "^3.7.0" 3072 | minimatch "^3.0.4" 3073 | resolve "^1.3.2" 3074 | semver "^5.3.0" 3075 | tslib "^1.8.0" 3076 | tsutils "^2.12.1" 3077 | 3078 | tsutils@^2.12.1: 3079 | version "2.18.0" 3080 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.18.0.tgz#f97385709d348169002c12f6f5fd42c1df13b250" 3081 | dependencies: 3082 | tslib "^1.8.1" 3083 | 3084 | tty-browserify@0.0.0: 3085 | version "0.0.0" 3086 | resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" 3087 | 3088 | tunnel-agent@^0.6.0: 3089 | version "0.6.0" 3090 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 3091 | dependencies: 3092 | safe-buffer "^5.0.1" 3093 | 3094 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 3095 | version "0.14.5" 3096 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 3097 | 3098 | typescript@^2.6.2: 3099 | version "2.6.2" 3100 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" 3101 | 3102 | ua-parser-js@^0.7.9: 3103 | version "0.7.17" 3104 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" 3105 | 3106 | uglify-es@^3.2.1: 3107 | version "3.3.7" 3108 | resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.7.tgz#d1249af668666aba7cb1163e277455be9eb393cf" 3109 | dependencies: 3110 | commander "~2.13.0" 3111 | source-map "~0.6.1" 3112 | 3113 | uglify-js@^2.8.29: 3114 | version "2.8.29" 3115 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" 3116 | dependencies: 3117 | source-map "~0.5.1" 3118 | yargs "~3.10.0" 3119 | optionalDependencies: 3120 | uglify-to-browserify "~1.0.0" 3121 | 3122 | uglify-to-browserify@~1.0.0: 3123 | version "1.0.2" 3124 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 3125 | 3126 | uid-number@^0.0.6: 3127 | version "0.0.6" 3128 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 3129 | 3130 | ultron@~1.1.0: 3131 | version "1.1.1" 3132 | resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" 3133 | 3134 | union-value@^1.0.0: 3135 | version "1.0.0" 3136 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 3137 | dependencies: 3138 | arr-union "^3.1.0" 3139 | get-value "^2.0.6" 3140 | is-extendable "^0.1.1" 3141 | set-value "^0.4.3" 3142 | 3143 | uniq@^1.0.1: 3144 | version "1.0.1" 3145 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 3146 | 3147 | uniqid@^4.0.0: 3148 | version "4.1.1" 3149 | resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" 3150 | dependencies: 3151 | macaddress "^0.2.8" 3152 | 3153 | uniqs@^2.0.0: 3154 | version "2.0.0" 3155 | resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" 3156 | 3157 | unset-value@^1.0.0: 3158 | version "1.0.0" 3159 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 3160 | dependencies: 3161 | has-value "^0.3.1" 3162 | isobject "^3.0.0" 3163 | 3164 | urix@^0.1.0: 3165 | version "0.1.0" 3166 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 3167 | 3168 | url@^0.11.0: 3169 | version "0.11.0" 3170 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 3171 | dependencies: 3172 | punycode "1.3.2" 3173 | querystring "0.2.0" 3174 | 3175 | use@^2.0.0: 3176 | version "2.0.2" 3177 | resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" 3178 | dependencies: 3179 | define-property "^0.2.5" 3180 | isobject "^3.0.0" 3181 | lazy-cache "^2.0.2" 3182 | 3183 | utf8-byte-length@^1.0.1: 3184 | version "1.0.4" 3185 | resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" 3186 | 3187 | util-deprecate@~1.0.1: 3188 | version "1.0.2" 3189 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 3190 | 3191 | util@0.10.3, util@^0.10.3: 3192 | version "0.10.3" 3193 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" 3194 | dependencies: 3195 | inherits "2.0.1" 3196 | 3197 | uuid@^3.0.0: 3198 | version "3.1.0" 3199 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 3200 | 3201 | v8-compile-cache@^1.1.0: 3202 | version "1.1.0" 3203 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-1.1.0.tgz#1dc2a340fb8e5f800a32bcdbfb8c23cd747021b9" 3204 | 3205 | vendors@^1.0.0: 3206 | version "1.0.1" 3207 | resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" 3208 | 3209 | verror@1.10.0: 3210 | version "1.10.0" 3211 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 3212 | dependencies: 3213 | assert-plus "^1.0.0" 3214 | core-util-is "1.0.2" 3215 | extsprintf "^1.2.0" 3216 | 3217 | vm-browserify@0.0.4: 3218 | version "0.0.4" 3219 | resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" 3220 | dependencies: 3221 | indexof "0.0.1" 3222 | 3223 | whatwg-fetch@>=0.10.0: 3224 | version "2.0.3" 3225 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 3226 | 3227 | whet.extend@~0.9.9: 3228 | version "0.9.9" 3229 | resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" 3230 | 3231 | which@^1.2.9: 3232 | version "1.3.0" 3233 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 3234 | dependencies: 3235 | isexe "^2.0.0" 3236 | 3237 | wide-align@^1.1.0: 3238 | version "1.1.2" 3239 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 3240 | dependencies: 3241 | string-width "^1.0.2" 3242 | 3243 | window-size@0.1.0: 3244 | version "0.1.0" 3245 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 3246 | 3247 | "wobble@link:..": 3248 | version "1.4.0" 3249 | 3250 | wordwrap@0.0.2: 3251 | version "0.0.2" 3252 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 3253 | 3254 | worker-farm@^1.4.1: 3255 | version "1.5.2" 3256 | resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" 3257 | dependencies: 3258 | errno "^0.1.4" 3259 | xtend "^4.0.1" 3260 | 3261 | wrappy@1: 3262 | version "1.0.2" 3263 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 3264 | 3265 | ws@^3.3.3: 3266 | version "3.3.3" 3267 | resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" 3268 | dependencies: 3269 | async-limiter "~1.0.0" 3270 | safe-buffer "~5.1.0" 3271 | ultron "~1.1.0" 3272 | 3273 | xtend@^4.0.0, xtend@^4.0.1: 3274 | version "4.0.1" 3275 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 3276 | 3277 | yallist@^2.1.2: 3278 | version "2.1.2" 3279 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 3280 | 3281 | yargs@~3.10.0: 3282 | version "3.10.0" 3283 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 3284 | dependencies: 3285 | camelcase "^1.0.2" 3286 | cliui "^2.1.0" 3287 | decamelize "^1.0.0" 3288 | window-size "0.1.0" 3289 | -------------------------------------------------------------------------------- /jest/rAF.js: -------------------------------------------------------------------------------- 1 | // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 2 | // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating 3 | 4 | // requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel 5 | 6 | // MIT license 7 | 8 | (function() { 9 | var lastTime = 0; 10 | var vendors = ["ms", "moz", "webkit", "o"]; 11 | for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 12 | window.requestAnimationFrame = window[vendors[x] + "RequestAnimationFrame"]; 13 | window.cancelAnimationFrame = 14 | window[vendors[x] + "CancelAnimationFrame"] || 15 | window[vendors[x] + "CancelRequestAnimationFrame"]; 16 | } 17 | 18 | if (!window.requestAnimationFrame) 19 | window.requestAnimationFrame = function(callback, element) { 20 | var currTime = new Date().getTime(); 21 | var timeToCall = Math.max(0, 16 - (currTime - lastTime)); 22 | var id = window.setTimeout(function() { 23 | callback(currTime + timeToCall); 24 | }, 1000 / 60); 25 | lastTime = currTime + timeToCall; 26 | return id; 27 | }; 28 | 29 | if (!window.cancelAnimationFrame) 30 | window.cancelAnimationFrame = function(id) { 31 | clearTimeout(id); 32 | }; 33 | 34 | if (!window.performance) 35 | window.performance = { 36 | now() { 37 | // Using rAF polyfill's `lastTime` to ensure that timestamp passed into 38 | // rAF's callback and `performance.now()` are on the same timescale. 39 | return lastTime; 40 | } 41 | }; 42 | })(); 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wobble", 3 | "version": "1.5.1", 4 | "description": "Wobble is a tiny spring simulation library based on the equations of motion governing damped harmonic oscillators.", 5 | "repository": "https://github.com/skevy/wobble", 6 | "author": "Adam Miskiewicz ", 7 | "license": "MIT", 8 | "typescript:main": "src/index.ts", 9 | "main": "./dist/module/index.js", 10 | "module": "./dist/wobble.es.js", 11 | "types": "./dist/module/index.d.ts", 12 | "scripts": { 13 | "dev": "concurrently \"yarn watch\" \"cd demos && yarn start\"", 14 | "lint": "tslint -p . --format codeFrame", 15 | "test": "tsc --noEmit && jest --coverage", 16 | "posttest": "codecov -f coverage/*.json", 17 | "clean": "rm -rf ./dist/", 18 | "watch": "concurrently \"tsc -w\" \"yarn dist-es -w\"", 19 | "build": "tsc", 20 | "dist-es": "rollup -c --environment ROLLUP_CONFIG:es", 21 | "dist-cjs": "rollup -c --environment ROLLUP_CONFIG:cjs", 22 | "dist-browser": "rollup -c --environment ROLLUP_CONFIG:browser", 23 | "dist": "yarn run clean && concurrently \"yarn build\" \"yarn dist-es\" \"yarn dist-cjs\" \"yarn dist-browser\"", 24 | "prepublish": "yarn dist", 25 | "precommit": "lint-staged" 26 | }, 27 | "files": [ 28 | "src", 29 | "dist" 30 | ], 31 | "jest": { 32 | "globals": { 33 | "ts-jest": { 34 | "useBabelrc": true 35 | } 36 | }, 37 | "setupFiles": [ 38 | "./jest/rAF.js" 39 | ], 40 | "modulePathIgnorePatterns": [ 41 | "/build/", 42 | "/dist/" 43 | ], 44 | "transform": { 45 | "^.+\\.tsx?$": "ts-jest" 46 | }, 47 | "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", 48 | "moduleFileExtensions": [ 49 | "ts", 50 | "tsx", 51 | "js", 52 | "jsx", 53 | "json", 54 | "node" 55 | ], 56 | "mapCoverage": true, 57 | "timers": "fake" 58 | }, 59 | "lint-staged": { 60 | "**/*.+(ts|tsx)": [ 61 | "tslint --format codeFrame" 62 | ] 63 | }, 64 | "jest-junit": { 65 | "outputDirectory": "CIRCLE_TEST_REPORTS/jest/", 66 | "outputName": "./test-results.xml" 67 | }, 68 | "devDependencies": { 69 | "@types/jest": "^22.0.1", 70 | "@types/lolex": "^2.1.1", 71 | "codecov": "^3.0.0", 72 | "concurrently": "^3.5.1", 73 | "husky": "^0.14.3", 74 | "jest": "^22.1.1", 75 | "jest-junit": "^5.2.0", 76 | "lint-staged": "^6.0.0", 77 | "lolex": "^2.3.1", 78 | "prettier": "^1.10.2", 79 | "rimraf": "^2.6.2", 80 | "rollup": "^0.54.0", 81 | "rollup-plugin-node-resolve": "^3.0.2", 82 | "rollup-plugin-typescript": "^0.8.1", 83 | "rollup-plugin-typescript2": "^0.10.0", 84 | "rollup-plugin-uglify": "^2.0.1", 85 | "rollup-watch": "^4.3.1", 86 | "temp-dir": "^1.0.0", 87 | "ts-jest": "^22.0.1", 88 | "tslint": "^5.9.1", 89 | "tslint-config-prettier": "^1.6.0", 90 | "tslint-eslint-rules": "^4.1.1", 91 | "tslint-junit-formatter": "^5.1.0", 92 | "tslint-plugin-prettier": "^1.3.0", 93 | "tslint-react": "^3.4.0", 94 | "typescript": "^2.6.2", 95 | "uglify-es": "^3.3.7" 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | // rollup.config.js 2 | import resolve from "rollup-plugin-node-resolve"; 3 | import typescript from "rollup-plugin-typescript2"; 4 | import uglify from "rollup-plugin-uglify"; 5 | import { minify } from "uglify-es"; 6 | 7 | const base = { 8 | input: "src/index.ts", 9 | plugins: [resolve()], 10 | }; 11 | 12 | const CACHE_ROOT = `${require("temp-dir")}/.rpt2_cache_${process.env 13 | .ROLLUP_CONFIG}`; 14 | 15 | const browser = { 16 | ...base, 17 | output: { 18 | name: "Wobble", 19 | format: "iife", 20 | file: "./dist/wobble.browser.js", 21 | sourcemap: true, 22 | }, 23 | plugins: [ 24 | ...base.plugins, 25 | typescript({ 26 | cacheRoot: CACHE_ROOT, 27 | tsconfigOverride: { 28 | compilerOptions: { 29 | declaration: false, 30 | }, 31 | }, 32 | typescript: require("typescript"), 33 | }), 34 | ] 35 | }; 36 | 37 | const cjs = { 38 | ...browser, 39 | output: { 40 | ...browser.output, 41 | format: "cjs", 42 | file: browser.output.file.replace("browser", "cjs"), 43 | }, 44 | }; 45 | 46 | const es = { 47 | ...base, 48 | output: { 49 | format: "es", 50 | file: "./dist/wobble.es.js", 51 | sourcemap: true 52 | }, 53 | plugins: [ 54 | ...base.plugins, 55 | typescript({ 56 | cacheRoot: CACHE_ROOT, 57 | tsconfigOverride: { 58 | compilerOptions: { 59 | module: "esnext", 60 | target: "ES2017", 61 | declaration: false, 62 | }, 63 | }, 64 | typescript: require("typescript"), 65 | }), 66 | ] 67 | }; 68 | 69 | let config; 70 | switch (process.env.ROLLUP_CONFIG) { 71 | case "cjs": 72 | config = cjs; 73 | break; 74 | case "browser": 75 | config = browser; 76 | break; 77 | case "es": 78 | config = es; 79 | break; 80 | default: 81 | throw new Error("Must set ROLLUP_CONFIG"); 82 | } 83 | 84 | export default [ 85 | config, 86 | addMinifier(config), 87 | ]; 88 | 89 | function addMinifier(config) { 90 | return { 91 | ...config, 92 | output: { 93 | ...config.output, 94 | file: config.output.file.replace(".js", ".min.js"), 95 | }, 96 | plugins: [ 97 | ...config.plugins, 98 | uglify({}, minify), 99 | ], 100 | }; 101 | } 102 | -------------------------------------------------------------------------------- /src/__tests__/Springs-test.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright 2017 Adam Miskiewicz 4 | * 5 | * Use of this source code is governed by a MIT-style license that can be found 6 | * in the LICENSE file or at https://opensource.org/licenses/MIT. 7 | */ 8 | 9 | import * as lolex from "lolex"; 10 | import { Spring } from "../"; 11 | 12 | describe("Spring", () => { 13 | it("animates correctly with base values", () => { 14 | const clock = lolex.install(); 15 | 16 | const spring = new Spring({ 17 | fromValue: 0, 18 | toValue: 1 19 | }); 20 | 21 | const { values, velocities } = _measureSpringDynamics(clock, spring, 80); 22 | expect(values).toMatchSnapshot(); 23 | expect(velocities).toMatchSnapshot(); 24 | 25 | clock.uninstall(); 26 | }); 27 | 28 | it("animates correctly with non-zero initialVelocity", () => { 29 | const clock = lolex.install(); 30 | 31 | const spring = new Spring({ 32 | fromValue: 10, 33 | toValue: 100, 34 | stiffness: 230, 35 | damping: 22, 36 | mass: 1, 37 | initialVelocity: 2 38 | }); 39 | 40 | const { values, velocities } = _measureSpringDynamics(clock, spring, 80); 41 | 42 | expect(velocities[0]).toBe(2); 43 | expect(velocities[values.length - 1]).toBe(0); 44 | 45 | expect(values).toMatchSnapshot(); 46 | expect(velocities).toMatchSnapshot(); 47 | 48 | clock.uninstall(); 49 | }); 50 | 51 | it("animates correctly with non-zero fromValue", () => { 52 | const clock = lolex.install(); 53 | 54 | const spring = new Spring({ 55 | fromValue: 25, 56 | toValue: 50, 57 | stiffness: 230, 58 | damping: 22, 59 | mass: 1 60 | }); 61 | 62 | const { values, velocities } = _measureSpringDynamics(clock, spring, 60); 63 | 64 | expect(values[0]).toBe(25); 65 | expect(values[values.length - 1]).toBe(50); 66 | 67 | expect(values).toMatchSnapshot(); 68 | expect(velocities).toMatchSnapshot(); 69 | 70 | clock.uninstall(); 71 | }); 72 | 73 | it("animates correctly with fromValue that's larger than toValue", () => { 74 | const clock = lolex.install(); 75 | 76 | const spring = new Spring({ 77 | fromValue: 200, 78 | toValue: 11, 79 | stiffness: 230, 80 | damping: 22, 81 | mass: 1 82 | }); 83 | 84 | const { values, velocities } = _measureSpringDynamics(clock, spring, 60); 85 | 86 | expect(values[0]).toBe(200); 87 | expect(values[values.length - 1]).toBe(11); 88 | 89 | expect(values).toMatchSnapshot(); 90 | expect(velocities).toMatchSnapshot(); 91 | 92 | clock.uninstall(); 93 | }); 94 | 95 | it("keeps proper dynamics when the config is updated during the animation", () => { 96 | const clock = lolex.install(); 97 | 98 | const spring = new Spring({ 99 | fromValue: 25, 100 | toValue: 131, 101 | stiffness: 230, 102 | damping: 22, 103 | mass: 1 104 | }); 105 | 106 | const { 107 | values: expectedValues, 108 | velocities: expectedVelocities 109 | } = _measureSpringDynamics(clock, spring, 60); 110 | 111 | // Just run spring for 10 frames...we don't care about its 112 | // values/velocities -- other tests cover this 113 | _measureSpringDynamics(clock, spring, 10); 114 | 115 | spring.updateConfig({}); // don't change anything 116 | 117 | const { 118 | values: valuesAfterUpdate, 119 | velocities: velocitiesAfterUpdate 120 | } = _measureSpringDynamics(clock, spring, 60); 121 | 122 | // Get the expected values/velocities after 10 frames 123 | const expectedValuesAfterUpdate = expectedValues.slice(10); 124 | const expectedVelocitiesAfterUpdate = expectedVelocities.slice(10); 125 | 126 | valuesAfterUpdate.forEach((val, i) => { 127 | expect(val).toBeCloseTo(expectedValuesAfterUpdate[i], 0.00000001); 128 | }); 129 | velocitiesAfterUpdate.forEach((vel, i) => { 130 | expect(vel).toBeCloseTo(expectedVelocitiesAfterUpdate[i], 0.00000001); 131 | }); 132 | 133 | clock.uninstall(); 134 | }); 135 | 136 | it("respects toValue being updated mid-animation", () => { 137 | const clock = lolex.install(); 138 | 139 | const spring = new Spring({ 140 | fromValue: 25, 141 | toValue: 131, 142 | stiffness: 230, 143 | damping: 22, 144 | mass: 1 145 | }); 146 | 147 | const { 148 | values: expectedValues, 149 | velocities: expectedVelocities 150 | } = _measureSpringDynamics(clock, spring, 60); 151 | 152 | // Just run spring for 5 frames 153 | _measureSpringDynamics(clock, spring, 5); 154 | 155 | spring.updateConfig({ 156 | toValue: 200, 157 | restDisplacementThreshold: 0.01 158 | }); // Extend the spring 159 | 160 | // Run the simulation till spring rests 161 | const { 162 | values: valuesAfterUpdate, 163 | velocities: velocitiesAfterUpdate 164 | } = _measureSpringDynamics(clock, spring, 60); 165 | 166 | // Expect spring to be at rest with new values 167 | expect(valuesAfterUpdate[valuesAfterUpdate.length - 1]).toBe(200); 168 | expect(velocitiesAfterUpdate[velocitiesAfterUpdate.length - 1]).toBe(0); 169 | 170 | clock.uninstall(); 171 | }); 172 | 173 | it("respects initialVelocity being updated mid-animation", () => { 174 | const clock = lolex.install(); 175 | 176 | const spring = new Spring({ 177 | fromValue: 25, 178 | toValue: 131, 179 | stiffness: 230, 180 | damping: 22, 181 | mass: 1 182 | }); 183 | 184 | const { 185 | values: expectedValues, 186 | velocities: expectedVelocities 187 | } = _measureSpringDynamics(clock, spring, 60); 188 | 189 | // Just run spring for 10 frames 190 | _measureSpringDynamics(clock, spring, 10); 191 | 192 | spring.updateConfig({ 193 | initialVelocity: 200 194 | }); 195 | 196 | // Run the simulation till spring rests 197 | const { 198 | values: valuesAfterUpdate, 199 | velocities: velocitiesAfterUpdate 200 | } = _measureSpringDynamics(clock, spring, 60); 201 | 202 | // Expect spring to be at rest with new values 203 | expect(valuesAfterUpdate[0]).toBe(expectedValues[10]); // first frame should be the same position as ending frame 204 | expect(valuesAfterUpdate[1]).toBeGreaterThan(2000); // should go to a really high number 205 | expect(velocitiesAfterUpdate[0]).toBe(200); 206 | expect(velocitiesAfterUpdate[8]).toBeLessThan(0); // given the spring dynamics, v should go negative pretty quickly 207 | 208 | clock.uninstall(); 209 | }); 210 | 211 | it("removes existing listener", () => { 212 | const spring = new Spring(); 213 | const onUpdateListener = () => {}; 214 | spring.onUpdate(onUpdateListener); 215 | expect(spring._listeners[0].onUpdate).toBe(onUpdateListener); 216 | spring.removeListener(onUpdateListener); 217 | expect(spring._listeners).toEqual([]); 218 | }); 219 | 220 | it("clears all listeners", () => { 221 | const spring = new Spring(); 222 | const onUpdateListener = () => {}; 223 | spring.onUpdate(onUpdateListener); 224 | expect(spring._listeners[0].onUpdate).toBe(onUpdateListener); 225 | spring.removeAllListeners(); 226 | expect(spring._listeners).toEqual([]); 227 | }); 228 | 229 | it("synchronously notifies listeners that the spring has started when .start() is called", () => { 230 | const onStartListener = jest.fn(); 231 | 232 | const spring = new Spring({ 233 | toValue: 1 234 | }); 235 | 236 | spring.onStart(onStartListener); 237 | 238 | spring.start(); 239 | expect(onStartListener).toHaveBeenCalledWith(spring); 240 | }); 241 | 242 | it("synchronously notifies listeners that the spring has stopped when .stop() is called mid-animation", () => { 243 | const clock = lolex.install(); 244 | const onStopListener = jest.fn(); 245 | 246 | const spring = new Spring({ 247 | toValue: 1 248 | }); 249 | 250 | spring 251 | .onStop(s => { 252 | onStopListener(s); 253 | expect(s.currentVelocity).toBeCloseTo(0.00165009062976268, 0.001); 254 | }) 255 | .start(); 256 | 257 | clock.tick(1000 / 60 * 10); 258 | 259 | spring.stop(); 260 | expect(onStopListener).toHaveBeenCalledWith(spring); 261 | expect(spring.isAtRest).toBeFalsy(); 262 | 263 | clock.tick(1000 / 60 * 1); 264 | 265 | expect(onStopListener).toHaveBeenCalledTimes(1); 266 | 267 | clock.uninstall(); 268 | }); 269 | 270 | it("should only call onUpdate once per frame", () => { 271 | const clock = lolex.install(); 272 | const onUpdateListener = jest.fn(); 273 | const onStopListener = jest.fn(); 274 | 275 | const spring = new Spring({ fromValue: 0, toValue: 1 }); 276 | spring.onUpdate(onUpdateListener); 277 | spring.onStop(onStopListener); 278 | 279 | spring.start(); 280 | spring.updateConfig({ toValue: 0 }); 281 | spring.updateConfig({ fromValue: 1 }); 282 | 283 | expect(onUpdateListener).not.toHaveBeenCalled(); 284 | 285 | clock.tick(1000 / 60); 286 | 287 | expect(onUpdateListener).toHaveBeenCalledTimes(1); 288 | expect(onStopListener).not.toHaveBeenCalled(); 289 | 290 | clock.uninstall(); 291 | }); 292 | 293 | it("should call onStop on the next frame if fromValue and toValue are updated to match during the animation", () => { 294 | const clock = lolex.install(); 295 | const onStopListener = jest.fn(); 296 | 297 | const spring = new Spring({ fromValue: 0, toValue: 1 }); 298 | spring.onStop(onStopListener); 299 | 300 | spring.start(); 301 | 302 | clock.tick(1000 / 60); 303 | spring.updateConfig({ fromValue: 1, initialVelocity: 0 }); 304 | expect(onStopListener).not.toHaveBeenCalled(); 305 | 306 | clock.tick(1000 / 60); 307 | expect(onStopListener).toHaveBeenCalled(); 308 | 309 | clock.uninstall(); 310 | }); 311 | 312 | function _measureSpringDynamics( 313 | clock: any, 314 | spring: Spring, 315 | numFrames: number 316 | ) { 317 | const values = [spring.currentValue]; 318 | const velocities = [spring.currentVelocity]; 319 | 320 | spring 321 | .onUpdate(s => { 322 | values.push(s.currentValue); 323 | velocities.push(s.currentVelocity); 324 | }) 325 | .start(); 326 | 327 | clock.tick(Math.round(1000 / 60.0 * numFrames / 16) * 16); // round to the nearest frame 328 | 329 | spring.removeAllListeners(); 330 | 331 | return { values, velocities }; 332 | } 333 | }); 334 | -------------------------------------------------------------------------------- /src/__tests__/__snapshots__/Springs-test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Spring animates correctly with base values 1`] = ` 4 | Array [ 5 | 0, 6 | 0.012118183855440723, 7 | 0.045765140015336936, 8 | 0.09696341587796564, 9 | 0.16190932310375994, 10 | 0.2370370376012132, 11 | 0.31906760676794765, 12 | 0.4050439386491632, 13 | 0.49235301969933065, 14 | 0.5787367249918682, 15 | 0.6622926523620347, 16 | 0.7414664358152023, 17 | 0.8150369794982677, 18 | 0.8820960075484949, 19 | 0.9420232530109494, 20 | 0.994458516320375, 21 | 1.0392717158058167, 22 | 1.0765319341153579, 23 | 1.1064763397287811, 24 | 1.1294797356842887, 25 | 1.1460253616325144, 26 | 1.1566774531695427, 27 | 1.1620559464048958, 28 | 1.1628136077170668, 29 | 1.159615770006046, 30 | 1.1531227684140493, 31 | 1.1439750910140445, 32 | 1.13278119358284, 33 | 1.1201078722089377, 34 | 1.1064730428132934, 35 | 1.0923407421568574, 36 | 1.078118139883442, 37 | 1.0641543347893314, 38 | 1.0507406999265947, 39 | 1.0381125393887147, 40 | 1.0264518237270874, 41 | 1.0158907799422672, 42 | 1.0065161249483228, 43 | 0.9983737474311465, 44 | 0.9914736612801814, 45 | 0.9857950735061112, 46 | 0.9812914300808033, 47 | 0.9778953238487577, 48 | 0.9755231690445936, 49 | 0.9740795665759048, 50 | 0.973461302744298, 51 | 0.9735609412068916, 52 | 0.9742699835262327, 53 | 0.9754815874857109, 54 | 0.9770928443874273, 55 | 0.979006626780466, 56 | 0.9811330265155371, 57 | 0.9833904097512144, 58 | 0.9857061206427543, 59 | 0.9880168690462664, 60 | 0.9902688398061515, 61 | 0.9924175622115515, 62 | 0.9944275781639953, 63 | 0.9962719466514748, 64 | 0.9979316204297375, 65 | 0.9993947285201821, 66 | 1, 67 | ] 68 | `; 69 | 70 | exports[`Spring animates correctly with base values 2`] = ` 71 | Array [ 72 | 0, 73 | 0.0014722643337529411, 74 | 0.002692090100901331, 75 | 0.0036680059846017103, 76 | 0.004413037529862265, 77 | 0.004943734765886689, 78 | 0.005279260399440419, 79 | 0.005440551148082793, 80 | 0.00544956119714427, 81 | 0.005328593497343909, 82 | 0.00509972170104589, 83 | 0.0047843029817831425, 84 | 0.00440257980006235, 85 | 0.003973366865141564, 86 | 0.0035138180857917237, 87 | 0.003039267184671805, 88 | 0.00256313484724593, 89 | 0.0020968947595945853, 90 | 0.00165009062976268, 91 | 0.0012303962525958773, 92 | 0.0008437108358921209, 93 | 0.0004942821239385422, 94 | 0.00018485030189079542, 95 | -0.00008319378867348585, 96 | -0.00030964197395281427, 97 | -0.000495298797419148, 98 | -0.0006418127907510669, 99 | -0.0007515127687238599, 100 | -0.0008272522697527069, 101 | -0.0008722646099318806, 102 | -0.0008900304029785307, 103 | -0.0008841588303220178, 104 | -0.0008582834311026966, 105 | -0.0008159727252641336, 106 | -0.0007606555864577867, 107 | -0.0006955609456000093, 108 | -0.0006236711295988386, 109 | -0.0005476879207195682, 110 | -0.00047001025698630467, 111 | -0.00039272237883750555, 112 | -0.00031759115730901406, 113 | -0.0002460713092712086, 114 | -0.0001793172104563659, 115 | -0.00011820005188667955, 116 | -0.00006332914464319894, 117 | -0.0000150762566847655, 118 | 0.000026398041099778095, 119 | 0.00006111693862418324, 120 | 0.00008925966899400152, 121 | 0.00011113420546903981, 122 | 0.00012715095623345315, 123 | 0.00013779793041819583, 124 | 0.0001436177440875581, 125 | 0.00014518673694992226, 126 | 0.00014309638069229773, 127 | 0.00013793707899365293, 128 | 0.00013028438801892302, 129 | 0.00012068762479774043, 130 | 0.00010966077934163385, 131 | 0.00009767560441157903, 132 | 0.00008515672408379602, 133 | 0, 134 | ] 135 | `; 136 | 137 | exports[`Spring animates correctly with fromValue that's larger than toValue 1`] = ` 138 | Array [ 139 | 200, 140 | 195.05879648140845, 141 | 182.49297418542363, 142 | 165.18554241058436, 143 | 145.39825516562362, 144 | 124.8442406041327, 145 | 104.76617681550424, 146 | 86.01450710975685, 147 | 69.12181997875679, 148 | 54.370858080609224, 149 | 41.854687638996964, 150 | 31.528382616207214, 151 | 23.25218868349522, 152 | 16.82656320842733, 153 | 12.019771160895, 154 | 8.588882766695027, 155 | 6.295093654887642, 156 | 4.914295456808681, 157 | 4.2437840540466825, 158 | 4.105920187404668, 159 | 4.349465922296467, 160 | 4.849220581361768, 161 | 5.504478707681407, 162 | 6.2367357476320775, 163 | 6.986977987589001, 164 | 7.712813956242222, 165 | 8.385636014555168, 166 | 8.987943366831226, 167 | 9.510910814092904, 168 | 9.952250413843375, 169 | 10.314384748944883, 170 | 10.602929568318068, 171 | 10.825468945960472, 172 | 10.990596657899847, 173 | 11.107192131884522, 174 | 11.183897128687047, 175 | 11.228759440979136, 176 | 11.249011650266404, 177 | 11.250955794796825, 178 | 11.239928218871462, 179 | 11.220322548254767, 180 | 11.195652409746248, 181 | 11.168639004274318, 182 | 11.141311833691699, 183 | 11.115113703352058, 184 | 11.091003545619664, 185 | 11.069552632370982, 186 | 11.051031386113765, 187 | 11.035485291648522, 188 | 11.022799393036555, 189 | 11.012751577297877, 190 | 11.005055340325985, 191 | 10.999393043621197, 192 | 11, 193 | ] 194 | `; 195 | 196 | exports[`Spring animates correctly with fromValue that's larger than toValue 2`] = ` 197 | Array [ 198 | 0, 199 | -0.5805667416086457, 200 | -0.9601932580432371, 201 | -1.179752531750891, 202 | -1.2758955339616094, 203 | -1.2804937663421414, 204 | -1.2204832724317183, 205 | -1.1179986991617832, 206 | -0.9907047234569577, 207 | -0.8522499124198902, 208 | -0.7127842722007753, 209 | -0.5794960258100922, 210 | -0.4571354024933738, 211 | -0.34850342233082965, 212 | -0.2548919213159135, 213 | -0.17646755173486192, 214 | -0.11259741548473648, 215 | -0.06211756577647179, 216 | -0.02354806785191467, 217 | 0.004740146257445649, 218 | 0.024400566318536772, 219 | 0.03702219063273279, 220 | 0.04407018037609186, 221 | 0.04685023936488721, 222 | 0.046491438745436736, 223 | 0.04394286193120299, 224 | 0.039980134753606046, 225 | 0.03521858515915774, 226 | 0.030130415369569202, 227 | 0.025063847784232544, 228 | 0.020262713349108917, 229 | 0.01588538362239904, 230 | 0.012022306209361193, 231 | 0.008711691888986423, 232 | 0.005953127065895795, 233 | 0.0037190548177109635, 234 | 0.0019641899123149908, 235 | 0.0006330158139724396, 236 | -0.00033443749119602085, 237 | -0.0009983101055073508, 238 | -0.0014158913961132345, 239 | -0.001639636309292585, 240 | -0.0017160090586120886, 241 | -0.0016849657996026062, 242 | -0.0015799122419520046, 243 | -0.001427997369371168, 244 | -0.0012506290303086946, 245 | -0.0010641201006948123, 246 | -0.0008803945610404532, 247 | -0.0007077008365485966, 248 | -0.000551295012870641, 249 | -0.00041406912157516864, 250 | -0.0002971097628489569, 251 | 0, 252 | ] 253 | `; 254 | 255 | exports[`Spring animates correctly with non-zero fromValue 1`] = ` 256 | Array [ 257 | 25, 258 | 25.653598349020047, 259 | 27.31574415536725, 260 | 29.605086982726935, 261 | 32.22245302042016, 262 | 34.94123801532636, 263 | 37.59706655879574, 264 | 40.07744614950306, 265 | 42.31192857423852, 266 | 44.263114010501425, 267 | 45.918692111243786, 268 | 47.284605474046664, 269 | 48.37934012123079, 270 | 49.22929058089586, 271 | 49.86510963480225, 272 | 50.31893085096627, 273 | 50.62234210914185, 274 | 50.804987373438, 275 | 50.89367935793033, 276 | 50.911915319126365, 277 | 50.87970027482851, 278 | 50.813595161195536, 279 | 50.72692080586225, 280 | 50.63006140904338, 281 | 50.530823017514685, 282 | 50.43481296875103, 283 | 50.345815341990054, 284 | 50.26614505729746, 285 | 50.19696946903533, 286 | 50.138591215100085, 287 | 50.09068984802316, 288 | 50.05252254387327, 289 | 50.023086118259194, 290 | 50.00124382832013, 291 | 49.98582114657612, 292 | 49.97567498297791, 293 | 49.9697408146853, 294 | 49.96706195102296, 295 | 49.96680478904804, 296 | 49.96826346311224, 297 | 49.970856805786404, 298 | 49.974120051620865, 299 | 49.97769325340287, 300 | 49.98130795850639, 301 | 49.98477331966242, 302 | 49.987962493965654, 303 | 49.99079991635305, 304 | 49.99324981665162, 305 | 49.99530617835337, 306 | 49.996984207270295, 307 | 49.99831328342621, 308 | 49.99933130418968, 309 | 50, 310 | ] 311 | `; 312 | 313 | exports[`Spring animates correctly with non-zero fromValue 2`] = ` 314 | Array [ 315 | 0, 316 | 0.07679454254082613, 317 | 0.12700969021735947, 318 | 0.15605192218927133, 319 | 0.16876925052402242, 320 | 0.16937748232038907, 321 | 0.16143958630049182, 322 | 0.14788342581505068, 323 | 0.1310455983408674, 324 | 0.11273146989681088, 325 | 0.09428363388899147, 326 | 0.07665291346694342, 327 | 0.060467645832456854, 328 | 0.04609833628714678, 329 | 0.03371586260792507, 330 | 0.023342268747997608, 331 | 0.014893838027081543, 332 | 0.00821660922969204, 333 | 0.0031148237899358, 334 | -0.0006270034732070995, 335 | -0.003227588137372588, 336 | -0.0048971151630598925, 337 | -0.005829388938636489, 338 | -0.006197121609112065, 339 | -0.006149661209713854, 340 | -0.00581254787449775, 341 | -0.005288377612910853, 342 | -0.0046585430104705994, 343 | -0.003985504678514445, 344 | -0.0033153237809831404, 345 | -0.0026802530885064704, 346 | -0.002101241219894053, 347 | -0.0015902521440953959, 348 | -0.0011523401969558758, 349 | -0.0007874506700920363, 350 | -0.0004919384679511855, 351 | -0.00025981348046494584, 352 | -0.00008373225052545497, 353 | 0.000044237763385717084, 354 | 0.000132051601257586, 355 | 0.00018728722170809983, 356 | 0.00021688310969478637, 357 | 0.00022698532521323923, 358 | 0.00022287907402150878, 359 | 0.00020898310078730213, 360 | 0.0001888885409221122, 361 | 0.000165427120411203, 362 | 0.00014075662707603337, 363 | 0.00011645430701593295, 364 | 0.00009361122176568737, 365 | 0.0000729226207500848, 366 | 0.00005477104782740325, 367 | 0, 368 | ] 369 | `; 370 | 371 | exports[`Spring animates correctly with non-zero initialVelocity 1`] = ` 372 | Array [ 373 | 10, 374 | 39.06409928806386, 375 | 62.51396251318623, 376 | 80.8572425949548, 377 | 94.70317888186817, 378 | 104.70236374922327, 379 | 111.5023391944444, 380 | 115.71651946518517, 381 | 117.90402055103863, 382 | 118.55815648886977, 383 | 118.10159904012683, 384 | 116.88646265159178, 385 | 115.19784907380713, 386 | 113.25965001718917, 387 | 111.24165124456638, 388 | 109.26720106278208, 389 | 107.42089699363466, 390 | 105.75590558079143, 391 | 104.30066265896166, 392 | 103.06480698426115, 393 | 102.04428163725304, 394 | 101.22559817576135, 395 | 100.58930135723053, 396 | 100.112700512865, 397 | 99.77195026836978, 398 | 99.5435709050697, 399 | 99.40549953971696, 400 | 99.3377594200202, 401 | 99.3228275916526, 402 | 99.34577227662703, 403 | 99.39422150905506, 404 | 99.45821464667628, 405 | 99.52997884517819, 406 | 99.60366380040259, 407 | 99.67506024242464, 408 | 99.7413209063896, 409 | 99.80069702661841, 410 | 99.85229876263033, 411 | 99.89588428870711, 412 | 99.93167945894584, 413 | 99.96022788229475, 414 | 99.98226978920722, 415 | 99.99864712971579, 416 | 100.0102318068044, 417 | 100.01787372497162, 418 | 100.02236534033622, 419 | 100.02441956684008, 420 | 100.02465816675488, 421 | 100.02360808799072, 422 | 100.02170357113505, 423 | 100.01929221016046, 424 | 100.01664349432718, 425 | 100.0139586731709, 426 | 100.01138106475277, 427 | 100.00900616651616, 428 | 100.00689112793977, 429 | 100.00506330649466, 430 | 100.00352775632362, 431 | 100.00227359645484, 432 | 100.00127927648482, 433 | 100.00051680679795, 434 | 100, 435 | ] 436 | `; 437 | 438 | exports[`Spring animates correctly with non-zero initialVelocity 2`] = ` 439 | Array [ 440 | 2, 441 | 1.6365272901303531, 442 | 1.300075114168103, 443 | 0.9992435132061892, 444 | 0.7383214040690447, 445 | 0.5183539434582274, 446 | 0.338053395156957, 447 | 0.19455494778050617, 448 | 0.08402615904488181, 449 | 0.002143357664982831, 450 | -0.055549050571416236, 451 | -0.09337937423326034, 452 | -0.11537262672389709, 453 | -0.12514172220915018, 454 | -0.12583130969977188, 455 | -0.12010140056918722, 456 | -0.11013979064978245, 457 | -0.09769411944927074, 458 | -0.0841161563397317, 459 | -0.07041249841259188, 460 | -0.057297273533970974, 461 | -0.04524365058272171, 462 | -0.03453196668285285, 463 | -0.025293098203068156, 464 | -0.017546344673116717, 465 | -0.011231582634726203, 466 | -0.006235801553844076, 467 | -0.0024143781239765547, 468 | 0.0003924005657625629, 469 | 0.002346971330585942, 470 | 0.0036056638037470427, 471 | 0.004312791346404617, 472 | 0.004597088792729067, 473 | 0.004569976619445893, 474 | 0.004325195337065842, 475 | 0.003939421588422054, 476 | 0.0034735442329731202, 477 | 0.002974341559422668, 478 | 0.002476357765393879, 479 | 0.002003826897229159, 480 | 0.00157253514303554, 481 | 0.0011915477910457162, 482 | 0.0008647557142977911, 483 | 0.0005922185499756275, 484 | 0.0003712985577286597, 485 | 0.00019759126475033136, 486 | 0.00006566722991624419, 487 | -0.000030355664454962653, 488 | -0.00009638737322113902, 489 | -0.00013806553243080494, 490 | -0.00016055781557080187, 491 | -0.00016844614637102464, 492 | -0.00016567419849620714, 493 | -0.00015554199666841127, 494 | -0.00014073390994317854, 495 | -0.00012336874641923147, 496 | -0.00010506291723991592, 497 | -0.00008699967226059632, 498 | -0.00006999918620773934, 499 | -0.000054585781375324923, 500 | -0.00004104981633641747, 501 | 0, 502 | ] 503 | `; 504 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright 2017 Adam Miskiewicz 4 | * 5 | * Use of this source code is governed by a MIT-style license that can be found 6 | * in the LICENSE file or at https://opensource.org/licenses/MIT. 7 | */ 8 | 9 | import { invariant, withDefault } from "./utils"; 10 | 11 | export interface SpringConfig { 12 | fromValue: number; // Starting value of the animation. 13 | toValue: number; // Ending value of the animation. 14 | stiffness: number; // The spring stiffness coefficient. 15 | damping: number; // Defines how the spring’s motion should be damped due to the forces of friction. 16 | mass: number; // The mass of the object attached to the end of the spring. 17 | initialVelocity: number; // The initial velocity (in units/ms) of the object attached to the spring. 18 | allowsOverdamping: boolean; // Whether or not the spring allows "overdamping" (a damping ratio > 1). Defaults to false. 19 | overshootClamping: boolean; // False when overshooting is allowed, true when it is not. Defaults to false. 20 | restVelocityThreshold: number; // When spring's velocity is below `restVelocityThreshold`, it is at rest. Defaults to .001. 21 | restDisplacementThreshold: number; // When the spring's displacement (current value) is below `restDisplacementThreshold`, it is at rest. Defaults to .001. 22 | } 23 | 24 | export type PartialSpringConfig = Partial; 25 | 26 | export type SpringListenerFn = (spring: Spring) => void; 27 | export interface SpringListener { 28 | onUpdate?: SpringListenerFn; 29 | onStart?: SpringListenerFn; 30 | onStop?: SpringListenerFn; 31 | } 32 | 33 | /** 34 | * Implements a spring physics simulation based on the equations behind 35 | * damped harmonic oscillators (https://en.wikipedia.org/wiki/Harmonic_oscillator#Damped_harmonic_oscillator). 36 | */ 37 | export class Spring { 38 | static MAX_DELTA_TIME_MS = 1 / 60 * 1000 * 4; // advance 4 frames at max 39 | 40 | _listeners: SpringListener[] = []; 41 | 42 | private _config: SpringConfig; 43 | private _currentAnimationStep: number = 0; // current requestAnimationFrame 44 | 45 | private _currentTime: number = 0; // Current timestamp of animation in ms (real time) 46 | private _springTime: number = 0; // Current time along the spring curve in ms (zero-based) 47 | 48 | private _currentValue: number = 0; // the current value of the spring 49 | private _currentVelocity: number = 0; // the current velocity of the spring 50 | private _isAnimating: boolean = false; 51 | 52 | private _oscillationVelocityPairs = []; 53 | 54 | constructor(config: PartialSpringConfig = {}) { 55 | this._config = { 56 | fromValue: withDefault(config.fromValue, 0), 57 | toValue: withDefault(config.toValue, 1), 58 | stiffness: withDefault(config.stiffness, 100), 59 | damping: withDefault(config.damping, 10), 60 | mass: withDefault(config.mass, 1), 61 | initialVelocity: withDefault(config.initialVelocity, 0), 62 | overshootClamping: withDefault(config.overshootClamping, false), 63 | allowsOverdamping: withDefault(config.allowsOverdamping, false), 64 | restVelocityThreshold: withDefault(config.restVelocityThreshold, 0.001), 65 | restDisplacementThreshold: withDefault( 66 | config.restDisplacementThreshold, 67 | 0.001 68 | ) 69 | }; 70 | this._currentValue = this._config.fromValue; 71 | this._currentVelocity = this._config.initialVelocity; 72 | } 73 | 74 | /** 75 | * If `fromValue` differs from `toValue`, or `initialVelocity` is non-zero, 76 | * start the simulation and call the `onStart` listeners. 77 | */ 78 | start(): this { 79 | const { fromValue, toValue, initialVelocity } = this._config; 80 | 81 | if (fromValue !== toValue || initialVelocity !== 0) { 82 | this._reset(); 83 | this._isAnimating = true; 84 | 85 | if (!this._currentAnimationStep) { 86 | this._notifyListeners("onStart"); 87 | this._currentAnimationStep = requestAnimationFrame((t: number) => { 88 | this._step(Date.now()); 89 | }); 90 | } 91 | } 92 | 93 | return this; 94 | } 95 | 96 | /** 97 | * If a simulation is in progress, stop it and call the `onStop` listeners. 98 | */ 99 | stop(): this { 100 | if (!this._isAnimating) { 101 | return this; 102 | } 103 | 104 | this._isAnimating = false; 105 | this._notifyListeners("onStop"); 106 | 107 | if (this._currentAnimationStep) { 108 | cancelAnimationFrame(this._currentAnimationStep); 109 | this._currentAnimationStep = 0; 110 | } 111 | 112 | return this; 113 | } 114 | 115 | /** 116 | * The spring's current position. 117 | */ 118 | get currentValue(): number { 119 | return this._currentValue; 120 | } 121 | 122 | /** 123 | * The spring's current velocity in units / ms. 124 | */ 125 | get currentVelocity(): number { 126 | return this._currentVelocity; // give velocity in units/ms; 127 | } 128 | 129 | /** 130 | * If the spring has reached its `toValue`, or if its velocity is below the 131 | * `restVelocityThreshold`, it is considered at rest. If `stop()` is called 132 | * during a simulation, both `isAnimating` and `isAtRest` will be false. 133 | */ 134 | get isAtRest(): boolean { 135 | return this._isSpringAtRest(); 136 | } 137 | 138 | /** 139 | * Whether or not the spring is currently emitting values. 140 | * 141 | * Note: this is distinct from whether or not it is at rest. 142 | * See also `isAtRest`. 143 | */ 144 | get isAnimating(): boolean { 145 | return this._isAnimating; 146 | } 147 | 148 | /** 149 | * Updates the spring config with the given values. Values not explicitly 150 | * supplied will be reused from the existing config. 151 | */ 152 | updateConfig(updatedConfig: PartialSpringConfig): this { 153 | // When we update the spring config, we reset the simulation to ensure the 154 | // spring always moves the full distance between `fromValue` and `toValue`. 155 | // To ensure that the simulation behaves correctly if those values aren't 156 | // being changed in `updatedConfig`, we run the simulation with `_step()` 157 | // and default `fromValue` and `initialVelocity` to their current values. 158 | 159 | this._advanceSpringToTime(Date.now()); 160 | 161 | const baseConfig = { 162 | fromValue: this._currentValue, 163 | initialVelocity: this._currentVelocity 164 | }; 165 | 166 | this._config = { 167 | ...this._config, 168 | ...baseConfig, 169 | ...updatedConfig 170 | }; 171 | 172 | this._reset(); 173 | 174 | return this; 175 | } 176 | 177 | /** 178 | * The provided callback will be invoked when the simulation begins. 179 | */ 180 | onStart(listener: SpringListenerFn): this { 181 | this._listeners.push({ onStart: listener }); 182 | return this; 183 | } 184 | 185 | /** 186 | * The provided callback will be invoked on each frame while the simulation is 187 | * running. 188 | */ 189 | onUpdate(listener: SpringListenerFn): this { 190 | this._listeners.push({ onUpdate: listener }); 191 | return this; 192 | } 193 | 194 | /** 195 | * The provided callback will be invoked when the simulation ends. 196 | */ 197 | onStop(listener: SpringListenerFn): this { 198 | this._listeners.push({ onStop: listener }); 199 | return this; 200 | } 201 | 202 | /** 203 | * Remove a single listener from this spring. 204 | */ 205 | removeListener(listenerFn: SpringListenerFn): this { 206 | this._listeners = this._listeners.reduce( 207 | (result, listener) => { 208 | const foundListenerFn = 209 | Object.values(listener).indexOf(listenerFn) !== -1; 210 | if (!foundListenerFn) { 211 | result.push(listener); 212 | } 213 | return result; 214 | }, 215 | [] as SpringListener[] 216 | ); 217 | return this; 218 | } 219 | 220 | /** 221 | * Removes all listeners from this spring. 222 | */ 223 | removeAllListeners(): this { 224 | this._listeners = []; 225 | return this; 226 | } 227 | 228 | private _reset() { 229 | this._currentTime = Date.now(); 230 | this._springTime = 0.0; 231 | this._currentValue = this._config.fromValue; 232 | this._currentVelocity = this._config.initialVelocity; 233 | } 234 | 235 | private _notifyListeners(eventName: keyof SpringListener) { 236 | this._listeners.forEach((listener: Partial) => { 237 | const maybeListenerFn = listener[eventName]; 238 | if (typeof maybeListenerFn === "function") { 239 | maybeListenerFn(this); 240 | } 241 | }); 242 | } 243 | 244 | /** 245 | * `_step` is the main loop. While the animation is running, it updates the 246 | * current state once per frame, and schedules the next frame if the spring is 247 | * not yet at rest. 248 | */ 249 | private _step(timestamp: number) { 250 | this._advanceSpringToTime(timestamp, true); 251 | 252 | // check `_isAnimating`, in case `stop()` got called during 253 | // `_advanceSpringToTime()` 254 | if (this._isAnimating) { 255 | this._currentAnimationStep = requestAnimationFrame((t: number) => 256 | this._step(Date.now()) 257 | ); 258 | } 259 | } 260 | 261 | private _advanceSpringToTime( 262 | timestamp: number, 263 | shouldNotifyListeners: boolean = false 264 | ) { 265 | // `_advanceSpringToTime` updates `_currentTime` and triggers the listeners. 266 | // Because of these side effects, it's only safe to call when an animation 267 | // is already in-progress. 268 | if (!this._isAnimating) { 269 | return; 270 | } 271 | 272 | let deltaTime = timestamp - this._currentTime; 273 | 274 | // If for some reason we lost a lot of frames (e.g. process large payload or 275 | // stopped in the debugger), we only advance by 4 frames worth of 276 | // computation and will continue on the next frame. It's better to have it 277 | // running at slower speed than jumping to the end. 278 | if (deltaTime > Spring.MAX_DELTA_TIME_MS) { 279 | deltaTime = Spring.MAX_DELTA_TIME_MS; 280 | } 281 | this._springTime += deltaTime; 282 | 283 | const c = this._config.damping; 284 | const m = this._config.mass; 285 | const k = this._config.stiffness; 286 | const fromValue = this._config.fromValue; 287 | const toValue = this._config.toValue; 288 | const v0 = -this._config.initialVelocity; 289 | 290 | invariant(m > 0, "Mass value must be greater than 0"); 291 | invariant(k > 0, "Stiffness value must be greater than 0"); 292 | 293 | let zeta = c / (2 * Math.sqrt(k * m)); // damping ratio (dimensionless) 294 | const omega0 = Math.sqrt(k / m) / 1000; // undamped angular frequency of the oscillator (rad/ms) 295 | const omega1 = omega0 * Math.sqrt(1.0 - zeta * zeta); // exponential decay 296 | const omega2 = omega0 * Math.sqrt(zeta * zeta - 1.0); // frequency of damped oscillation 297 | const x0 = toValue - fromValue; // initial displacement of the spring at t = 0 298 | 299 | if (zeta > 1 && !this._config.allowsOverdamping) { 300 | zeta = 1; 301 | } 302 | 303 | let oscillation = 0.0; 304 | let velocity = 0.0; 305 | const t = this._springTime; 306 | if (zeta < 1) { 307 | // Under damped 308 | const envelope = Math.exp(-zeta * omega0 * t); 309 | oscillation = 310 | toValue - 311 | envelope * 312 | ((v0 + zeta * omega0 * x0) / omega1 * Math.sin(omega1 * t) + 313 | x0 * Math.cos(omega1 * t)); 314 | // This looks crazy -- it's actually just the derivative of the 315 | // oscillation function 316 | velocity = 317 | zeta * 318 | omega0 * 319 | envelope * 320 | (Math.sin(omega1 * t) * (v0 + zeta * omega0 * x0) / omega1 + 321 | x0 * Math.cos(omega1 * t)) - 322 | envelope * 323 | (Math.cos(omega1 * t) * (v0 + zeta * omega0 * x0) - 324 | omega1 * x0 * Math.sin(omega1 * t)); 325 | } else if (zeta === 1) { 326 | // Critically damped 327 | const envelope = Math.exp(-omega0 * t); 328 | oscillation = toValue - envelope * (x0 + (v0 + omega0 * x0) * t); 329 | velocity = 330 | envelope * (v0 * (t * omega0 - 1) + t * x0 * (omega0 * omega0)); 331 | } else { 332 | // Overdamped 333 | const envelope = Math.exp(-zeta * omega0 * t); 334 | oscillation = 335 | toValue - 336 | envelope * 337 | ((v0 + zeta * omega0 * x0) * Math.sinh(omega2 * t) + 338 | omega2 * x0 * Math.cosh(omega2 * t)) / 339 | omega2; 340 | velocity = 341 | envelope * 342 | zeta * 343 | omega0 * 344 | (Math.sinh(omega2 * t) * (v0 + zeta * omega0 * x0) + 345 | x0 * omega2 * Math.cosh(omega2 * t)) / 346 | omega2 - 347 | envelope * 348 | (omega2 * Math.cosh(omega2 * t) * (v0 + zeta * omega0 * x0) + 349 | omega2 * omega2 * x0 * Math.sinh(omega2 * t)) / 350 | omega2; 351 | } 352 | 353 | this._currentTime = timestamp; 354 | this._currentValue = oscillation; 355 | this._currentVelocity = velocity; 356 | 357 | if (!shouldNotifyListeners) { 358 | return; 359 | } 360 | 361 | this._notifyListeners("onUpdate"); 362 | if (!this._isAnimating) { 363 | // a listener might have stopped us in _onUpdate 364 | return; 365 | } 366 | 367 | // If the Spring is overshooting (when overshoot clamping is on), or if the 368 | // spring is at rest (based on the thresholds set in the config), stop the 369 | // animation. 370 | if (this._isSpringOvershooting() || this._isSpringAtRest()) { 371 | if (k !== 0) { 372 | // Ensure that we end up with a round value 373 | this._currentValue = toValue; 374 | this._currentVelocity = 0; 375 | this._notifyListeners("onUpdate"); 376 | } 377 | 378 | this.stop(); 379 | return; 380 | } 381 | } 382 | 383 | private _isSpringOvershooting() { 384 | const { stiffness, fromValue, toValue, overshootClamping } = this._config; 385 | let isOvershooting = false; 386 | if (overshootClamping && stiffness !== 0) { 387 | if (fromValue < toValue) { 388 | isOvershooting = this._currentValue > toValue; 389 | } else { 390 | isOvershooting = this._currentValue < toValue; 391 | } 392 | } 393 | return isOvershooting; 394 | } 395 | 396 | private _isSpringAtRest() { 397 | const { 398 | stiffness, 399 | toValue, 400 | restDisplacementThreshold, 401 | restVelocityThreshold 402 | } = this._config; 403 | 404 | const isNoVelocity = 405 | Math.abs(this._currentVelocity) <= restVelocityThreshold; 406 | const isNoDisplacement = 407 | stiffness !== 0 && 408 | Math.abs(toValue - this._currentValue) <= restDisplacementThreshold; 409 | return isNoDisplacement && isNoVelocity; 410 | } 411 | } 412 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright 2017 Adam Miskiewicz 4 | * 5 | * Use of this source code is governed by a MIT-style license that can be found 6 | * in the LICENSE file or at https://opensource.org/licenses/MIT. 7 | */ 8 | 9 | export function invariant(condition: boolean, message: string): void { 10 | if (!condition) { 11 | throw new Error(message); 12 | } 13 | } 14 | 15 | export function withDefault(maybeValue: X | undefined, defaultValue: X): X { 16 | return typeof maybeValue !== "undefined" && maybeValue !== null 17 | ? (maybeValue as X) 18 | : defaultValue; 19 | } 20 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "jsx": "react", 5 | "sourceMap": true, 6 | "noImplicitReturns": true, 7 | "noImplicitThis": true, 8 | "noImplicitAny": true, 9 | "strictNullChecks": true, 10 | "lib": [ 11 | "dom", 12 | "esnext" 13 | ], 14 | "target": "es5", 15 | "pretty": true, 16 | "declaration": true, 17 | "outDir": "./dist/module" 18 | }, 19 | "exclude": [ 20 | "dist", 21 | "demos", 22 | "node_modules" 23 | ] 24 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:latest", 4 | "tslint-react", 5 | "tslint-eslint-rules", 6 | "tslint-config-prettier" 7 | ], 8 | "rulesDirectory": [ 9 | "tslint-plugin-prettier" 10 | ], 11 | "rules": { 12 | "interface-name": [ 13 | true, 14 | "never-prefix" 15 | ], 16 | "member-access": [ 17 | true, 18 | "no-public" 19 | ], 20 | "no-empty": false, 21 | "no-implicit-dependencies": [ 22 | true, 23 | "dev" 24 | ], 25 | "no-submodule-imports": false, 26 | "object-literal-sort-keys": false, 27 | "prettier": true, 28 | "prefer-conditional-expression": false, 29 | "variable-name": [ 30 | true, 31 | "ban-keywords", 32 | "check-format", 33 | "allow-leading-underscore" 34 | ] 35 | } 36 | } --------------------------------------------------------------------------------