├── .gitignore ├── .travis.yml ├── src ├── shared.ts ├── index.ts ├── interfaces.ts ├── observe.ts ├── observe-many.ts ├── array-methods.ts ├── get-set-deep.ts ├── observe-deep.ts ├── tween.ts └── spring.ts ├── rollup.config.js ├── tsconfig.json ├── appveyor.yml ├── test ├── getDeep │ └── index.js ├── tests.js ├── setDeep │ └── index.js ├── setup.js ├── observe │ └── index.js ├── observeMany │ └── index.js ├── htmlEqual.js ├── observeDeep │ └── index.js ├── array-methods │ └── index.js ├── spring │ └── index.js └── tween │ └── index.js ├── LICENSE ├── .eslintrc.json ├── CHANGELOG.md ├── package.json ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | dist 4 | package-lock.json -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "8" 4 | 5 | env: 6 | global: 7 | - BUILD_TIMEOUT=10000 -------------------------------------------------------------------------------- /src/shared.ts: -------------------------------------------------------------------------------- 1 | export function isDate(obj: any) { 2 | return Object.prototype.toString.call(obj) === '[object Date]'; 3 | } 4 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './array-methods'; 2 | export * from './tween'; 3 | export * from './observe'; 4 | export * from './observe-deep'; 5 | export * from './observe-many'; 6 | export * from './get-set-deep'; 7 | export * from './spring'; -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from 'rollup-plugin-typescript'; 2 | 3 | const pkg = require('./package.json'); 4 | 5 | export default { 6 | input: 'src/index.ts', 7 | output: [ 8 | { file: pkg.main, format: 'cjs' }, 9 | { file: pkg.module, format: 'es' }, 10 | { file: 'dist/svelte-extras.umd.js', format: 'umd', name: 'svelte.extras' } 11 | ], 12 | plugins: [typescript({ typescript: require('typescript') })] 13 | }; 14 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "types" : ["node"], 4 | "noImplicitAny": true, 5 | "diagnostics": true, 6 | "noImplicitThis": true, 7 | "noEmitOnError": true, 8 | "allowJs": true, 9 | "lib": ["es5", "es6", "dom"] 10 | }, 11 | "target": "ES5", 12 | "include": [ 13 | "src" 14 | ], 15 | "exclude": [ 16 | "node_modules" 17 | ] 18 | } -------------------------------------------------------------------------------- /src/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface Component { 2 | set(data: {}): void; 3 | get(key?: string): any; 4 | on(key: string, handler: (event: any) => void): { 5 | cancel: () => void 6 | }; 7 | 8 | _currentTweens?: Record; // TODO 9 | _tweening?: boolean; 10 | 11 | _springs?: Record; // TODO 12 | _springCallbacks?: Record void>; 13 | _springing?: boolean; 14 | } 15 | 16 | export interface Observer { 17 | cancel: () => void; 18 | } 19 | 20 | export interface ObserverOptions { 21 | init?: boolean; 22 | defer?: boolean; 23 | } 24 | -------------------------------------------------------------------------------- /src/observe.ts: -------------------------------------------------------------------------------- 1 | import { Component, Observer, ObserverOptions } from './interfaces'; 2 | 3 | export function observe( 4 | this: Component, 5 | key: string, 6 | callback: (newValue: any, oldValue: any) => void, 7 | opts?: ObserverOptions 8 | ) { 9 | const fn = callback.bind(this); 10 | 11 | if (!opts || opts.init !== false) { 12 | fn(this.get()[key]); 13 | } 14 | 15 | return this.on( 16 | opts && opts.defer ? 'update' : 'state', 17 | ({ changed, current, previous }) => { 18 | if (changed[key]) fn(current[key], previous && previous[key]); 19 | } 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | # http://www.appveyor.com/docs/appveyor-yml 2 | 3 | version: "{build}" 4 | 5 | clone_depth: 10 6 | 7 | init: 8 | - git config --global core.autocrlf false 9 | 10 | environment: 11 | matrix: 12 | # node.js 13 | - nodejs_version: 8 14 | 15 | install: 16 | - ps: Install-Product node $env:nodejs_version 17 | - npm install 18 | 19 | build: off 20 | 21 | test_script: 22 | - node --version && npm --version 23 | - npm test 24 | 25 | matrix: 26 | fast_finish: false 27 | 28 | # cache: 29 | # - C:\Users\appveyor\AppData\Roaming\npm-cache -> package.json # npm cache 30 | # - node_modules -> package.json # local npm modules 31 | -------------------------------------------------------------------------------- /test/getDeep/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = () => { 5 | describe('getDeep', () => { 6 | it('get a value from a keypath', () => { 7 | const foo = { bar: { nested: { value: 1 } } }; 8 | const { component } = setup(`{foo.bar.nested.value}`, { foo }); 9 | 10 | const value = component.getDeep( 'foo.bar.nested.value' ); 11 | 12 | assert.equal( value, 1 ); 13 | }); 14 | 15 | it('get a value from an array keypath', () => { 16 | const foo = { bar: { nested: { array: [1] } } }; 17 | const { component } = setup(`{foo.bar.nested.array}`, { foo }); 18 | 19 | const value = component.getDeep( 'foo.bar.nested.array[0]' ); 20 | 21 | assert.equal( value, 1 ); 22 | }); 23 | }); 24 | }; -------------------------------------------------------------------------------- /src/observe-many.ts: -------------------------------------------------------------------------------- 1 | import { Component, Observer, ObserverOptions } from './interfaces'; 2 | 3 | export function observeMany( 4 | this: Component, 5 | keys: string[], 6 | callback: (newValue: any, oldValue: any) => void, 7 | opts?: ObserverOptions 8 | ) { 9 | const fn = callback.bind(this); 10 | 11 | if (!opts || opts.init !== false) { 12 | const state = this.get(); 13 | fn(keys.map(key => state[key]), keys.map(key => undefined)); 14 | } 15 | 16 | return this.on( 17 | opts && opts.defer ? 'update' : 'state', 18 | ({ changed, current, previous }) => { 19 | if (!previous) return; // prevent double-firing if observing in oncreate 20 | 21 | let i = keys.length; 22 | while (i--) { 23 | if (changed[keys[i]]) { 24 | fn(keys.map(key => current[key]), keys.map(key => previous[key])); 25 | return; 26 | } 27 | } 28 | } 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /src/array-methods.ts: -------------------------------------------------------------------------------- 1 | import Component from './interfaces.ts'; 2 | 3 | const arrayNotationPattern = /\[\s*(\d+)\s*\]/g; 4 | 5 | function makeArrayMethod(name: string) { 6 | return function(this: Component, keypath: string, ...args: any[]) { 7 | const parts = keypath.replace(arrayNotationPattern, '.$1').split('.'); 8 | 9 | const key = parts.shift(); 10 | const value = this.get()[key]; 11 | 12 | let array = value; 13 | while (parts.length) array = array[parts.shift()]; 14 | 15 | const result = array[name](...args); 16 | this.set({ [key]: value }); 17 | 18 | return result; 19 | }; 20 | } 21 | 22 | export const push = makeArrayMethod('push'); 23 | export const pop = makeArrayMethod('pop'); 24 | export const shift = makeArrayMethod('shift'); 25 | export const unshift = makeArrayMethod('unshift'); 26 | export const splice = makeArrayMethod('splice'); 27 | export const sort = makeArrayMethod('sort'); 28 | export const reverse = makeArrayMethod('reverse'); 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 [these people](https://github.com/sveltejs/svelte-extras/graphs/contributors) 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. 8 | -------------------------------------------------------------------------------- /src/get-set-deep.ts: -------------------------------------------------------------------------------- 1 | import { Component } from './interfaces'; 2 | 3 | function getDeep(this: Component, keypath: string) { 4 | if (keypath === undefined) { 5 | return this.get(); 6 | } 7 | 8 | const keys = keypath.replace(/\[(\d+)\]/g, '.$1').split('.'); 9 | let value = this.get()[keys[0]]; 10 | for (let i = 1; i < keys.length; i++) { 11 | value = value[keys[i]]; 12 | } 13 | return value; 14 | } 15 | 16 | function setDeep(this: Component, keypath: string, value: any) { 17 | if (keypath === undefined) { 18 | return; 19 | } 20 | 21 | const keys = keypath.replace(/\[(\d+)\]/g, '.$1').split('.'); 22 | const lastKey = keys.pop(); 23 | 24 | // If not a nested keypath 25 | if (keys[0] === undefined) { 26 | const data: any = {}; 27 | data[lastKey] = value; 28 | this.set(data); 29 | return; 30 | } 31 | 32 | let object = this.get()[keys[0]]; 33 | for (let i = 1; i < keys.length; i++) { 34 | object = object[keys[i]]; 35 | } 36 | object[lastKey] = value; 37 | 38 | const data: any = {}; 39 | data[keys[0]] = this.get()[keys[0]]; 40 | this.set(data); 41 | } 42 | 43 | export { getDeep, setDeep }; 44 | -------------------------------------------------------------------------------- /src/observe-deep.ts: -------------------------------------------------------------------------------- 1 | import { Component, Observer, ObserverOptions } from './interfaces'; 2 | 3 | function getNestedValue(obj: any, parts: string[]): any { 4 | for (let i = 0; i < parts.length; i += 1) { 5 | if (!obj) return undefined; 6 | obj = obj[parts[i]]; 7 | } 8 | 9 | return obj; 10 | } 11 | 12 | export function observeDeep( 13 | this: Component, 14 | keypath: string, 15 | callback: (newValue: any, oldValue: any) => void, 16 | opts?: ObserverOptions 17 | ) { 18 | const parts = keypath.replace(/\[(\d+)\]/g, '.$1').split('.'); 19 | const [key] = parts; 20 | const fn = callback.bind(this); 21 | 22 | let last: any = getNestedValue(this.get(), parts); 23 | 24 | if (!opts || opts.init !== false) fn(last); 25 | 26 | return this.on( 27 | opts && opts.defer ? 'update' : 'state', 28 | ({ changed, current, previous }) => { 29 | if (changed[key]) { 30 | const value = getNestedValue(current, parts); 31 | if ( 32 | value !== last || 33 | typeof value === 'object' || 34 | typeof value === 'function' 35 | ) { 36 | fn(value, last); 37 | last = value; 38 | } 39 | } 40 | } 41 | ); 42 | } 43 | -------------------------------------------------------------------------------- /test/tests.js: -------------------------------------------------------------------------------- 1 | const { rollup } = require('rollup'); 2 | const virtual = require('rollup-plugin-virtual'); 3 | const assert = require('assert'); 4 | 5 | require('console-group').install(); 6 | require('./htmlEqual.js'); 7 | 8 | describe('svelte-extras', () => { 9 | require('./array-methods/index.js')(); 10 | require('./tween/index.js')(); 11 | require('./observe/index.js')(); 12 | require('./observeDeep/index.js')(); 13 | require('./observeMany/index.js')(); 14 | require('./getDeep/index.js')(); 15 | require('./setDeep/index.js')(); 16 | require('./spring/index.js')(); 17 | 18 | describe('tree-shaking', () => { 19 | it('does not include any unwanted code', async () => { 20 | const warnings = []; 21 | const bundle = await rollup({ 22 | input: 'entry', 23 | plugins: [ 24 | virtual({ 25 | entry: `import './dist/svelte-extras.es.js';` 26 | }) 27 | ], 28 | onwarn: warning => { 29 | warnings.push(warning); 30 | } 31 | }); 32 | 33 | await bundle.generate({ format: 'es' }); 34 | 35 | assert.equal(warnings.length, 1); 36 | assert.equal(warnings[0].code, 'EMPTY_BUNDLE'); 37 | }); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "rules": { 4 | "indent": [ 2, "tab", { "SwitchCase": 1 } ], 5 | "semi": [ 2, "always" ], 6 | "keyword-spacing": [ 2, { "before": true, "after": true } ], 7 | "space-before-blocks": [ 2, "always" ], 8 | "no-mixed-spaces-and-tabs": [ 2, "smart-tabs" ], 9 | "no-cond-assign": 0, 10 | "no-unused-vars": 2, 11 | "object-shorthand": [ 2, "always" ], 12 | "no-const-assign": 2, 13 | "no-class-assign": 2, 14 | "no-this-before-super": 2, 15 | "no-var": 2, 16 | "no-unreachable": 2, 17 | "valid-typeof": 2, 18 | "quote-props": [ 2, "as-needed" ], 19 | "one-var": [ 2, "never" ], 20 | "prefer-arrow-callback": 2, 21 | "prefer-const": [ 2, { "destructuring": "all" } ], 22 | "arrow-spacing": 2, 23 | "no-inner-declarations": 0 24 | }, 25 | "env": { 26 | "es6": true, 27 | "browser": true, 28 | "node": true, 29 | "mocha": true 30 | }, 31 | "extends": [ 32 | "eslint:recommended", 33 | "plugin:import/errors", 34 | "plugin:import/warnings" 35 | ], 36 | "parserOptions": { 37 | "ecmaVersion": 6, 38 | "sourceType": "module" 39 | }, 40 | "settings": { 41 | "import/core-modules": [ "svelte" ] 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # svelte-extras changelog 2 | 3 | ## 2.0.2 4 | 5 | * Prevent double-firing of deferred `observeMany` if observer is added in `oncreate` 6 | 7 | ## 2.0.1 8 | 9 | * Update for v2 10 | 11 | ## 2.0.0 12 | 13 | * Add `observe` method, and reimplement `observeMany` and `observeDeep` ([#15](https://github.com/sveltejs/svelte-extras/issues/15)) 14 | 15 | ## 1.6.0 16 | 17 | * Add `observeMany` method ([#11](https://github.com/sveltejs/svelte-extras/pull/11)) 18 | 19 | ## 1.5.3 20 | 21 | * Preserve existing spring velocity when updating target ([#9](https://github.com/sveltejs/svelte-extras/issues/9)) 22 | 23 | ## 1.5.2 24 | 25 | * Only end springs on specific keys when data is set ([#8](https://github.com/sveltejs/svelte-extras/issues/8)) 26 | 27 | ## 1.5.1 28 | 29 | * Fix spring end threshold 30 | 31 | ## 1.5.0 32 | 33 | * Add a `spring` method ([#7](https://github.com/sveltejs/svelte-extras/pull/7)) 34 | 35 | ## 1.4.1 36 | 37 | * Fix `setDeep` method when keypath is a non-nested data root key ([#5](https://github.com/sveltejs/svelte-extras/issues/5)) 38 | 39 | ## 1.4.0 40 | 41 | * Add `getDeep` and `setDeep` methods 42 | 43 | ## 1.3.0 44 | 45 | * Add `observeDeep` method 46 | 47 | ## 1.2.0 48 | 49 | * Interpolate dates 50 | 51 | ## 1.1.1 52 | 53 | * Support custom interpolators with `tween` 54 | 55 | ## 1.1.0 56 | 57 | * Add `tween` method 58 | 59 | ## 1.0.0 60 | 61 | * Initial release 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-extras", 3 | "version": "2.0.2", 4 | "description": "Extra methods for Svelte components", 5 | "main": "dist/svelte-extras.cjs.js", 6 | "module": "dist/svelte-extras.es.js", 7 | "scripts": { 8 | "build": "rollup -c && agadoo", 9 | "dev": "rollup -cw", 10 | "lint": "eslint src", 11 | "prepublish": "npm run lint && npm test", 12 | "test": "mocha", 13 | "pretest": "npm run build" 14 | }, 15 | "files": [ 16 | "dist" 17 | ], 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/sveltejs/svelte-extras.git" 21 | }, 22 | "keywords": [ 23 | "svelte" 24 | ], 25 | "author": "Rich Harris", 26 | "license": "MIT", 27 | "bugs": { 28 | "url": "https://github.com/sveltejs/svelte-extras/issues" 29 | }, 30 | "homepage": "https://github.com/sveltejs/svelte-extras#readme", 31 | "devDependencies": { 32 | "@types/node": "^9.6.5", 33 | "agadoo": "^1.0.0", 34 | "console-group": "^0.3.3", 35 | "eslint": "^4.2.0", 36 | "eslint-plugin-import": "^2.7.0", 37 | "jsdom": "^11.8.0", 38 | "mocha": "^5.1.1", 39 | "rollup": "^0.58.1", 40 | "rollup-plugin-buble": "^0.19.2", 41 | "rollup-plugin-typescript": "^0.8.1", 42 | "rollup-plugin-virtual": "^1.0.1", 43 | "svelte": "^2.0.0", 44 | "typescript": "^2.4.2" 45 | }, 46 | "peerDependencies": { 47 | "svelte": "^2" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /test/setDeep/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = () => { 5 | describe('setDeep', () => { 6 | it('set a value with a keypath', () => { 7 | const foo = { bar: { nested: { value: 1 } } }; 8 | const { component } = setup(`{foo.bar.nested.value}`, { foo }); 9 | 10 | component.setDeep('foo.bar.nested.value', 2); 11 | const { foo: value } = component.get(); 12 | 13 | assert.deepEqual(value, { bar: { nested: { value: 2 } } }); 14 | }); 15 | 16 | it('set a value with an array keypath', () => { 17 | const foo = { bar: { nested: { array: [1] } } }; 18 | const { component } = setup(`{foo.bar.nested.array}`, { foo }); 19 | 20 | component.setDeep('foo.bar.nested.array[0]', 2); 21 | const { foo: value } = component.get(); 22 | 23 | assert.deepEqual(value, { bar: { nested: { array: [2] } } }); 24 | }); 25 | 26 | it('set a string value with a non-nested keypath', () => { 27 | const { component } = setup(`{foo}`, 'bar'); 28 | 29 | component.setDeep('foo', 'baz'); 30 | const { foo: value } = component.get(); 31 | 32 | assert.equal(value, 'baz'); 33 | }); 34 | 35 | it('set an array value with a non-nested keypath', () => { 36 | const { component } = setup(`{foo}`, [1, 2, 3]); 37 | 38 | component.setDeep('foo', [4, 5, 6]); 39 | const { foo: value } = component.get(); 40 | 41 | assert.deepEqual(value, [4, 5, 6]); 42 | }); 43 | }); 44 | }; 45 | -------------------------------------------------------------------------------- /test/setup.js: -------------------------------------------------------------------------------- 1 | const { JSDOM } = require('jsdom'); 2 | 3 | const svelte = require('svelte'); 4 | const extras = require('../dist/svelte-extras.cjs.js'); 5 | 6 | module.exports = function setup( 7 | template = ` 8 | {#each array as item} 9 | ({item}) 10 | {/each} 11 | `, 12 | data = { array: ['foo', 'bar', 'baz'] } 13 | ) { 14 | const { window } = new JSDOM('
'); 15 | global.document = window.document; 16 | const target = window.document.querySelector('main'); 17 | 18 | // set of hacks to support tween tests 19 | const raf = { 20 | time: 0, 21 | callback: null, 22 | tick: now => { 23 | raf.time = now; 24 | if ( raf.callback ) raf.callback(); 25 | } 26 | }; 27 | 28 | window.performance.now = () => raf.time; 29 | global.requestAnimationFrame = cb => { 30 | let called = false; 31 | raf.callback = () => { 32 | if ( !called ) { 33 | called = true; 34 | cb(); 35 | } 36 | }; 37 | }; 38 | 39 | global.window = window; 40 | 41 | Object.assign(global, extras); 42 | 43 | const Component = svelte.create(` 44 | ${template} 45 | 46 | 66 | `); 67 | const component = new Component({ 68 | target, 69 | data 70 | }); 71 | 72 | return { component, target, raf }; 73 | }; 74 | -------------------------------------------------------------------------------- /test/observe/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = () => { 5 | describe('observe', () => { 6 | it('observes a property', () => { 7 | const { component, target } = setup(`{foo}`, { foo: 1 }); 8 | 9 | const observed = []; 10 | 11 | component.observe(['foo'], (n, o) => { 12 | observed.push([o, n, target.innerHTML]); 13 | }); 14 | 15 | component.set({ foo: 2 }); 16 | component.set({ foo: 3 }); 17 | component.set({ bar: 4 }); 18 | 19 | assert.deepEqual(observed, [ 20 | [undefined, 1, '1'], 21 | [1, 2, '1'], 22 | [2, 3, '2'] 23 | ]); 24 | }); 25 | 26 | it('respects init: false', () => { 27 | const { component, target } = setup(`{foo}`, { foo: 1 }); 28 | 29 | const observed = []; 30 | 31 | component.observe(['foo'], (n, o) => { 32 | observed.push([o, n, target.innerHTML]); 33 | }, { init: false }); 34 | 35 | component.set({ foo: 2 }); 36 | component.set({ foo: 3 }); 37 | component.set({ bar: 4 }); 38 | 39 | assert.deepEqual(observed, [ 40 | [1, 2, '1'], 41 | [2, 3, '2'] 42 | ]); 43 | }); 44 | 45 | it('respects defer: true', () => { 46 | const { component, target } = setup(`{foo}`, { foo: 1 }); 47 | 48 | const observed = []; 49 | 50 | component.observe(['foo'], (n, o) => { 51 | observed.push([o, n, target.innerHTML]); 52 | }, { defer: true }); 53 | 54 | component.set({ foo: 2 }); 55 | component.set({ foo: 3 }); 56 | component.set({ bar: 4 }); 57 | 58 | assert.deepEqual(observed, [ 59 | [undefined, 1, '1'], 60 | [1, 2, '2'], 61 | [2, 3, '3'] 62 | ]); 63 | }); 64 | }); 65 | }; -------------------------------------------------------------------------------- /test/observeMany/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = () => { 5 | describe('observeMany', () => { 6 | it('fires once per set, however many properties change', () => { 7 | const { component, target } = setup(`{foo} {bar}`, { foo: 1, bar: 2 }); 8 | 9 | const observed = []; 10 | 11 | component.observeMany(['foo', 'bar'], (n, o) => { 12 | observed.push([o, n, target.innerHTML]); 13 | }); 14 | 15 | component.set({ foo: 3, bar: 4 }); 16 | component.set({ foo: 5 }); 17 | component.set({ bar: 6 }); 18 | 19 | assert.deepEqual(observed, [ 20 | [[undefined, undefined], [1, 2], '1 2'], 21 | [[1, 2], [3, 4], '1 2'], 22 | [[3, 4], [5, 4], '3 4'], 23 | [[5, 4], [5, 6], '5 4'] 24 | ]); 25 | }); 26 | 27 | it('respects init: false', () => { 28 | const { component, target } = setup(`{foo} {bar}`, { foo: 1, bar: 2 }); 29 | 30 | const observed = []; 31 | 32 | component.observeMany(['foo', 'bar'], (n, o) => { 33 | observed.push([o, n, target.innerHTML]); 34 | }, { 35 | init: false 36 | }); 37 | 38 | component.set({ foo: 3, bar: 4 }); 39 | 40 | assert.deepEqual(observed, [ 41 | [[1, 2], [3, 4], '1 2'] 42 | ]); 43 | }); 44 | 45 | it('respects defer: true', () => { 46 | const { component, target } = setup(`{foo} {bar}`, { foo: 1, bar: 2 }); 47 | 48 | const observed = []; 49 | 50 | component.observeMany(['foo', 'bar'], (n, o) => { 51 | observed.push([o, n, target.innerHTML]); 52 | }, { 53 | defer: true 54 | }); 55 | 56 | component.set({ foo: 3, bar: 4 }); 57 | 58 | assert.deepEqual(observed, [ 59 | [[undefined, undefined], [1, 2], '1 2'], 60 | [[1, 2], [3, 4], '3 4'] 61 | ]); 62 | }); 63 | }); 64 | }; -------------------------------------------------------------------------------- /test/htmlEqual.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const { JSDOM } = require('jsdom'); 3 | 4 | function cleanChildren(node) { 5 | let previous = null; 6 | 7 | [...node.childNodes].forEach(child => { 8 | if (child.nodeType === 8) { 9 | // comment 10 | node.removeChild(child); 11 | return; 12 | } 13 | 14 | if (child.nodeType === 3) { 15 | if ( 16 | node.namespaceURI === 'http://www.w3.org/2000/svg' && 17 | node.tagName !== 'text' && 18 | node.tagName !== 'tspan' 19 | ) { 20 | node.removeChild(child); 21 | } 22 | 23 | child.data = child.data.replace(/\s{2,}/, '\n'); 24 | 25 | // text 26 | if (previous && previous.nodeType === 3) { 27 | previous.data += child.data; 28 | previous.data = previous.data.replace(/\s{2,}/, '\n'); 29 | 30 | node.removeChild(child); 31 | child = previous; 32 | } 33 | } else { 34 | cleanChildren(child); 35 | } 36 | 37 | previous = child; 38 | }); 39 | 40 | // collapse whitespace 41 | if (node.firstChild && node.firstChild.nodeType === 3) { 42 | node.firstChild.data = node.firstChild.data.replace(/^\s+/, ''); 43 | if (!node.firstChild.data) node.removeChild(node.firstChild); 44 | } 45 | 46 | if (node.lastChild && node.lastChild.nodeType === 3) { 47 | node.lastChild.data = node.lastChild.data.replace(/\s+$/, ''); 48 | if (!node.lastChild.data) node.removeChild(node.lastChild); 49 | } 50 | } 51 | 52 | const { window } = new JSDOM(''); 53 | 54 | assert.htmlEqual = (actual, expected, message) => { 55 | window.document.body.innerHTML = actual.replace(/>[\s\r\n]+<').trim(); 56 | cleanChildren(window.document.body, ''); 57 | actual = window.document.body.innerHTML; 58 | 59 | window.document.body.innerHTML = expected 60 | .replace(/>[\s\r\n]+<') 61 | .trim(); 62 | cleanChildren(window.document.body, ''); 63 | expected = window.document.body.innerHTML; 64 | 65 | assert.deepEqual(actual, expected, message); 66 | }; 67 | -------------------------------------------------------------------------------- /test/observeDeep/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = () => { 5 | describe('observeDeep', () => { 6 | it('observes a property of an object', () => { 7 | const foo = { bar: 1 }; 8 | const { component } = setup(`{foo.bar}`, { foo }); 9 | 10 | const observed = []; 11 | 12 | component.observeDeep('foo.bar', (n, o) => { 13 | observed.push([o, n]); 14 | }); 15 | 16 | foo.bar = 2; 17 | component.set({ foo }); 18 | 19 | component.set({ foo: { bar: 3 } }); 20 | 21 | assert.deepEqual(observed, [ 22 | [undefined, 1], 23 | [1, 2], 24 | [2, 3] 25 | ]); 26 | }); 27 | 28 | it('respects `init: false`', () => { 29 | const foo = { bar: 1 }; 30 | const { component } = setup(`{foo.bar}`, { foo }); 31 | 32 | const observed = []; 33 | 34 | component.observeDeep('foo.bar', (n, o) => { 35 | observed.push([o, n]); 36 | }, { init: false }); 37 | 38 | foo.bar = 2; 39 | component.set({ foo }); 40 | 41 | component.set({ foo: { bar: 3 } }); 42 | 43 | assert.deepEqual(observed, [ 44 | [1, 2], 45 | [2, 3] 46 | ]); 47 | }); 48 | 49 | it('ignores nested values that are unchanged', () => { 50 | const foo = { bar: 1 }; 51 | const { component } = setup(`{foo.bar}`, { foo }); 52 | 53 | const observed = []; 54 | 55 | component.observeDeep('foo.bar', (n, o) => { 56 | observed.push([o, n]); 57 | }); 58 | 59 | foo.bar = 1; 60 | component.set({ foo }); 61 | 62 | component.set({ foo: { bar: 1 } }); 63 | 64 | assert.deepEqual(observed, [ 65 | [undefined, 1] 66 | ]); 67 | }); 68 | 69 | it('observes a property of an array', () => { 70 | const foo = [1]; 71 | const { component } = setup(`{foo[0]}`, { foo }); 72 | 73 | const observed = []; 74 | 75 | component.observeDeep('foo[0]', (n, o) => { 76 | observed.push([o, n]); 77 | }); 78 | 79 | foo[0] = 2; 80 | component.set({ foo }); 81 | 82 | component.set({ foo: [3] }); 83 | 84 | assert.deepEqual(observed, [ 85 | [undefined, 1], 86 | [1, 2], 87 | [2, 3] 88 | ]); 89 | }); 90 | }); 91 | }; -------------------------------------------------------------------------------- /test/array-methods/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = function () { 5 | describe('array methods', () => { 6 | it('pushes to an array', () => { 7 | const { component, target } = setup(); 8 | const len = component.push('array', 'bop'); 9 | 10 | assert.equal(len, 4); 11 | assert.deepEqual(component.get().array, ['foo', 'bar', 'baz', 'bop']); 12 | assert.htmlEqual(target.innerHTML, `(foo)(bar)(baz)(bop)`); 13 | }); 14 | 15 | it('pops from an array', () => { 16 | const { component, target } = setup(); 17 | const last = component.pop('array'); 18 | 19 | assert.equal(last, 'baz'); 20 | assert.deepEqual(component.get().array, ['foo', 'bar']); 21 | assert.htmlEqual(target.innerHTML, `(foo)(bar)`); 22 | }); 23 | 24 | it('shifts from an array', () => { 25 | const { component, target } = setup(); 26 | const first = component.shift('array'); 27 | 28 | assert.equal(first, 'foo'); 29 | assert.deepEqual(component.get().array, ['bar', 'baz']); 30 | assert.htmlEqual(target.innerHTML, `(bar)(baz)`); 31 | }); 32 | 33 | it('unshifts to an array', () => { 34 | const { component, target } = setup(); 35 | const len = component.unshift('array', 'bop'); 36 | 37 | assert.equal(len, 4); 38 | assert.deepEqual(component.get().array, ['bop', 'foo', 'bar', 'baz']); 39 | assert.htmlEqual(target.innerHTML, `(bop)(foo)(bar)(baz)`); 40 | }); 41 | 42 | it('splices from an array', () => { 43 | const { component, target } = setup(); 44 | const spliced = component.splice('array', 1, 1); 45 | 46 | assert.deepEqual(spliced, ['bar']); 47 | assert.deepEqual(component.get().array, ['foo', 'baz']); 48 | assert.htmlEqual(target.innerHTML, `(foo)(baz)`); 49 | }); 50 | 51 | it('sorts an array', () => { 52 | const { component, target } = setup(); 53 | const sorted = component.sort('array'); 54 | 55 | assert.deepEqual(sorted, ['bar', 'baz', 'foo']); 56 | assert.deepEqual(component.get().array, ['bar', 'baz', 'foo']); 57 | assert.htmlEqual(target.innerHTML, `(bar)(baz)(foo)`); 58 | }); 59 | 60 | it('reverses an array', () => { 61 | const { component, target } = setup(); 62 | const reversed = component.reverse('array'); 63 | 64 | assert.deepEqual(reversed, ['baz', 'bar', 'foo']); 65 | assert.deepEqual(component.get().array, ['baz', 'bar', 'foo']); 66 | assert.htmlEqual(target.innerHTML, `(baz)(bar)(foo)`); 67 | }); 68 | 69 | it('supports dot notation', () => { 70 | const { component, target } = setup( 71 | ` 72 | {#each x.y.z as item} 73 | ({item}) 74 | {/each}`, 75 | { 76 | x: { 77 | y: { 78 | z: ['foo', 'bar', 'baz'] 79 | } 80 | } 81 | } 82 | ); 83 | 84 | component.push('x.y.z', 'bop'); 85 | 86 | assert.deepEqual(component.get(), { 87 | x: { 88 | y: { 89 | z: ['foo', 'bar', 'baz', 'bop'] 90 | } 91 | } 92 | }); 93 | 94 | assert.htmlEqual(target.innerHTML, `(foo)(bar)(baz)(bop)`); 95 | }); 96 | 97 | it('supports array notation', () => { 98 | const { component, target } = setup( 99 | ` 100 | {#each rows as row} 101 | {#each row as cell} 102 | ({cell}) 103 | {/each} 104 | {/each}`, 105 | { 106 | rows: [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']] 107 | } 108 | ); 109 | 110 | component.shift('rows[1]'); 111 | component.push('rows[1]', 'x'); 112 | 113 | assert.deepEqual(component.get(), { 114 | rows: [['a', 'b', 'c'], ['e', 'f', 'x'], ['g', 'h', 'i']] 115 | }); 116 | 117 | assert.htmlEqual(target.innerHTML, `(a)(b)(c)(e)(f)(x)(g)(h)(i)`); 118 | }); 119 | }); 120 | }; -------------------------------------------------------------------------------- /test/spring/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = () => { 5 | describe('spring', () => { 6 | it('springs a number', () => { 7 | const { component, target, raf } = setup(`{x}`, { 8 | x: 20 9 | }); 10 | 11 | const spring = component.spring('x', 40, { 12 | stiffness: 0.1, 13 | damping: 0.01 14 | }); 15 | 16 | raf.tick(null); 17 | assert.equal(component.get().x, 22); 18 | raf.tick(null); 19 | assert.equal(component.get().x, 25.78); 20 | 21 | // this isn't great — it could be exactly 40 while 22 | // the spring is still active. not sure how best to test 23 | while (component.get().x !== 40) { 24 | raf.tick(null); 25 | } 26 | 27 | return spring.then(() => { 28 | assert.equal(component.get().x, 40); 29 | assert.htmlEqual(target.innerHTML, '40'); 30 | }); 31 | }); 32 | 33 | it('springs a date', () => { 34 | const a = 1496986887000; 35 | const c = 1496986889000; 36 | 37 | const { component, target, raf } = setup(`{x.getTime()}`, { 38 | x: new Date(a) 39 | }); 40 | 41 | const spring = component.spring('x', new Date(c), { 42 | stiffness: 0.1, 43 | damping: 0.01 44 | }); 45 | 46 | raf.tick(null); 47 | assert.equal(component.get().x.getTime(), 1496986887200); 48 | raf.tick(null); 49 | assert.equal(component.get().x.getTime(), 1496986887578); 50 | 51 | while (component.get().x.getTime() !== c) { 52 | raf.tick(null); 53 | } 54 | 55 | return spring.then(() => { 56 | assert.equal(component.get().x.getTime(), c); 57 | assert.htmlEqual(target.innerHTML, String(c)); 58 | }); 59 | }); 60 | 61 | it('springs an array', () => { 62 | const { component, target, raf } = setup(`{x[0]}`, { 63 | x: [20] 64 | }); 65 | 66 | const spring = component.spring('x', [40], { 67 | stiffness: 0.1, 68 | damping: 0.01 69 | }); 70 | 71 | raf.tick(null); 72 | assert.equal(component.get().x[0], 22); 73 | raf.tick(null); 74 | assert.equal(component.get().x[0], 25.78); 75 | 76 | // this isn't great — it could be exactly 40 while 77 | // the spring is still active. not sure how best to test 78 | while (component.get().x[0] !== 40) { 79 | raf.tick(null); 80 | } 81 | 82 | return spring.then(() => { 83 | assert.equal(component.get().x[0], 40); 84 | assert.htmlEqual(target.innerHTML, '40'); 85 | }); 86 | }); 87 | 88 | it('springs an object', () => { 89 | const { component, target, raf } = setup(`{x.y}`, { 90 | x: { y: 20 } 91 | }); 92 | 93 | const spring = component.spring('x', { y: 40 }, { 94 | stiffness: 0.1, 95 | damping: 0.01 96 | }); 97 | 98 | raf.tick(null); 99 | assert.equal(component.get().x.y, 22); 100 | raf.tick(null); 101 | assert.equal(component.get().x.y, 25.78); 102 | 103 | // this isn't great — it could be exactly 40 while 104 | // the spring is still active. not sure how best to test 105 | while (component.get().x.y !== 40) { 106 | raf.tick(null); 107 | } 108 | 109 | return spring.then(() => { 110 | assert.equal(component.get().x.y, 40); 111 | assert.htmlEqual(target.innerHTML, '40'); 112 | }); 113 | }); 114 | 115 | it('aborts a tween if data is set', () => { 116 | const { component, raf } = setup(`{x}`, { 117 | x: 20 118 | }); 119 | 120 | component.spring('x', 40, { 121 | stiffness: 0.1, 122 | damping: 0.01 123 | }); 124 | 125 | raf.tick(null); 126 | assert.equal(component.get().x, 22); 127 | raf.tick(null); 128 | assert.equal(component.get().x, 25.78); 129 | 130 | component.set({ x: 30 }); 131 | raf.tick(null); 132 | assert.equal(component.get().x, 30); 133 | raf.tick(null); 134 | assert.equal(component.get().x, 30); 135 | }); 136 | 137 | it('maintains existing velocity', () => { 138 | const { component, raf } = setup(`{x}`, { 139 | x: 20 140 | }); 141 | 142 | component.spring('x', 40, { 143 | stiffness: 0.1, 144 | damping: 0.01 145 | }); 146 | 147 | raf.tick(null); 148 | assert.equal(component.get().x, 22); 149 | 150 | component.spring('x', 40, { 151 | stiffness: 0.1, 152 | damping: 0.01 153 | }); 154 | 155 | raf.tick(null); 156 | assert.equal(component.get().x, 25.78); 157 | }); 158 | }); 159 | }; -------------------------------------------------------------------------------- /src/tween.ts: -------------------------------------------------------------------------------- 1 | import { isDate } from './shared'; 2 | import { Component } from './interfaces'; 3 | 4 | const scheduler = { 5 | components: [], 6 | 7 | running: false, 8 | 9 | add: (component: Component) => { 10 | if (~scheduler.components.indexOf(component)) return; 11 | scheduler.components.push(component); 12 | 13 | if (!scheduler.running) { 14 | scheduler.running = true; 15 | requestAnimationFrame(scheduler.next); 16 | } 17 | }, 18 | 19 | next: () => { 20 | const now = window.performance.now(); 21 | let hasComponents = false; 22 | 23 | let i = scheduler.components.length; 24 | while (i--) { 25 | const component = scheduler.components[i]; 26 | const data: any = {}; 27 | 28 | let hasTweens = false; 29 | 30 | for (const key in component._currentTweens) { 31 | const t = component._currentTweens[key]; 32 | if (now >= t.end) { 33 | data[key] = t.to; 34 | delete component._currentTweens[key]; 35 | t.fulfil(); 36 | } else { 37 | hasTweens = true; 38 | hasComponents = true; 39 | if (now >= t.start) { 40 | const p = (now - t.start) / t.duration; 41 | data[key] = t.value(t.ease(p)); 42 | } 43 | } 44 | } 45 | 46 | component._tweening = true; 47 | component.set(data); 48 | component._tweening = false; 49 | 50 | if (!hasTweens) scheduler.components.splice(i, 1); 51 | } 52 | 53 | if (hasComponents) { 54 | requestAnimationFrame(scheduler.next); 55 | } else { 56 | scheduler.running = false; 57 | } 58 | } 59 | }; 60 | 61 | function snap(to: any) { 62 | return () => to; 63 | } 64 | 65 | function interpolate(a: any, b: any) { 66 | if (a === b || a !== a) return snap(a); 67 | 68 | const type: string = typeof a; 69 | 70 | if (type !== typeof b || Array.isArray(a) !== Array.isArray(b)) { 71 | throw new Error('Cannot interpolate values of different type'); 72 | } 73 | 74 | if (Array.isArray(a)) { 75 | const arr = b.map((bi: any, i: number) => { 76 | return interpolate(a[i], bi); 77 | }); 78 | 79 | return (t: number) => { 80 | return arr.map((fn) => fn(t)); 81 | } 82 | } 83 | 84 | if (type === 'object') { 85 | if (!a || !b) throw new Error('Object cannot be null'); 86 | 87 | if (isDate(a) && isDate(b)) { 88 | a = a.getTime(); 89 | b = b.getTime(); 90 | const delta = b - a; 91 | return (t: number) => { 92 | return new Date(a + t * delta); 93 | }; 94 | } 95 | 96 | const keys = Object.keys(b); 97 | const interpolators: any = {}; 98 | const result: any = {}; 99 | 100 | keys.forEach(key => { 101 | interpolators[key] = interpolate(a[key], b[key]); 102 | }); 103 | 104 | return (t: number) => { 105 | keys.forEach(key => { 106 | result[key] = interpolators[key](t); 107 | }); 108 | return result; 109 | }; 110 | } 111 | 112 | if (type === 'number') { 113 | const delta = b - a; 114 | return (t: number) => { 115 | return a + t * delta; 116 | }; 117 | } 118 | 119 | throw new Error(`Cannot interpolate ${type} values`); 120 | } 121 | 122 | interface Options { 123 | delay?: number 124 | duration?: number 125 | easing?(t: number): number 126 | interpolate?(a: any, b: any): any // TODO this type declaration is wrong... not sure what it should look like 127 | } 128 | 129 | function linear(x: number) { 130 | return x; 131 | } 132 | 133 | export function tween(this: Component, key: string, to: any, options: Options = {}) { 134 | if (!this._currentTweens) { 135 | this._currentTweens = Object.create(null); 136 | this._tweening = false; 137 | 138 | const set = this.set; 139 | this.set = (data: {}) => { 140 | if (!this._tweening) { 141 | for (const key in data) { 142 | if (this._currentTweens[key]) this._currentTweens[key].abort(); 143 | } 144 | } 145 | set.call(this, data); 146 | }; 147 | } 148 | 149 | if (this._currentTweens[key]) this._currentTweens[key].abort(); 150 | 151 | const start = window.performance.now() + (options.delay || 0); 152 | const duration = options.duration || 400; 153 | const end = start + duration; 154 | 155 | const t = { 156 | key, 157 | value: (options.interpolate || interpolate)(this.get()[key], to), 158 | to, 159 | start, 160 | end, 161 | duration, 162 | ease: options.easing || linear, 163 | running: true, 164 | abort: () => { 165 | t.running = false; 166 | delete this._currentTweens[key]; 167 | } 168 | }; 169 | 170 | this._currentTweens[key] = t; 171 | scheduler.add(this); 172 | 173 | let running; 174 | 175 | const promise = new Promise(fulfil => { 176 | t.fulfil = fulfil; 177 | }); 178 | 179 | promise.abort = t.abort; 180 | 181 | return promise; 182 | } -------------------------------------------------------------------------------- /test/tween/index.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const setup = require('../setup.js'); 3 | 4 | module.exports = () => { 5 | describe('tween', () => { 6 | it('tweens a number', () => { 7 | const { component, target, raf } = setup(`{x}`, { 8 | x: 20 9 | }); 10 | 11 | const tween = component.tween('x', 40, { 12 | duration: 100 13 | }); 14 | 15 | assert.equal(component.get().x, 20); 16 | assert.htmlEqual(target.innerHTML, '20'); 17 | 18 | raf.tick(50); 19 | assert.equal(component.get().x, 30); 20 | assert.htmlEqual(target.innerHTML, '30'); 21 | 22 | raf.tick(100); 23 | 24 | return tween.then(() => { 25 | assert.equal(component.get().x, 40); 26 | assert.htmlEqual(target.innerHTML, '40'); 27 | }); 28 | }); 29 | 30 | it('tweens a date', () => { 31 | const a = 1496986887000; 32 | const b = 1496986888000; 33 | const c = 1496986889000; 34 | 35 | const { component, target, raf } = setup(`{x.getTime()}`, { 36 | x: new Date(a) 37 | }); 38 | 39 | const tween = component.tween('x', new Date(c), { 40 | duration: 100 41 | }); 42 | 43 | assert.equal(component.get().x.getTime(), a); 44 | assert.htmlEqual(target.innerHTML, String(a)); 45 | 46 | raf.tick(50); 47 | assert.equal(component.get().x.getTime(), b); 48 | assert.htmlEqual(target.innerHTML, String(b)); 49 | 50 | raf.tick(100); 51 | 52 | return tween.then(() => { 53 | assert.equal(component.get().x.getTime(), c); 54 | assert.htmlEqual(target.innerHTML, String(c)); 55 | }); 56 | }); 57 | 58 | it('tweens an array', () => { 59 | const { component, target, raf } = setup(`{x[0]}`, { 60 | x: [20] 61 | }); 62 | 63 | const tween = component.tween('x', [40], { 64 | duration: 100 65 | }); 66 | 67 | assert.deepEqual(component.get().x, [20]); 68 | assert.htmlEqual(target.innerHTML, '20'); 69 | 70 | raf.tick(50); 71 | assert.deepEqual(component.get().x, [30]); 72 | assert.htmlEqual(target.innerHTML, '30'); 73 | 74 | raf.tick(100); 75 | 76 | return tween.then(() => { 77 | assert.deepEqual(component.get().x, [40]); 78 | assert.htmlEqual(target.innerHTML, '40'); 79 | }); 80 | }); 81 | 82 | it('tweens an object', () => { 83 | const { component, target, raf } = setup(`{x.y}`, { 84 | x: { y: 20 } 85 | }); 86 | 87 | const tween = component.tween( 88 | 'x', 89 | { y: 40 }, 90 | { 91 | duration: 100 92 | } 93 | ); 94 | 95 | assert.deepEqual(component.get().x, { y: 20 }); 96 | assert.htmlEqual(target.innerHTML, '20'); 97 | 98 | raf.tick(50); 99 | assert.deepEqual(component.get().x, { y: 30 }); 100 | assert.htmlEqual(target.innerHTML, '30'); 101 | 102 | raf.tick(100); 103 | 104 | return tween.then(() => { 105 | assert.deepEqual(component.get().x, { y: 40 }); 106 | assert.htmlEqual(target.innerHTML, '40'); 107 | }); 108 | }); 109 | 110 | it('allows tweens to be aborted programmatically', () => { 111 | const { component, target, raf } = setup(`{x}`, { 112 | x: 20 113 | }); 114 | 115 | const tween = component.tween('x', 40, { 116 | duration: 100 117 | }); 118 | 119 | assert.equal(component.get().x, 20); 120 | assert.htmlEqual(target.innerHTML, '20'); 121 | 122 | tween.abort(); 123 | 124 | raf.tick(50); 125 | assert.equal(component.get().x, 20); 126 | assert.htmlEqual(target.innerHTML, '20'); 127 | 128 | tween.then(() => { 129 | throw new Error('Promise should not be fulfilled'); 130 | }); 131 | }); 132 | 133 | it('aborts a tween if a new tween takes its place', () => { 134 | const { component, target, raf } = setup(`{x}`, { 135 | x: 20 136 | }); 137 | 138 | let tween = component.tween('x', 40, { 139 | duration: 100 140 | }); 141 | 142 | assert.equal(component.get().x, 20); 143 | assert.htmlEqual(target.innerHTML, '20'); 144 | 145 | raf.tick(50); 146 | assert.equal(component.get().x, 30); 147 | assert.htmlEqual(target.innerHTML, '30'); 148 | 149 | tween = component.tween('x', 130, { 150 | duration: 100 151 | }); 152 | 153 | raf.tick(75); 154 | assert.equal(component.get().x, 55); 155 | assert.htmlEqual(target.innerHTML, '55'); 156 | 157 | raf.tick(150); 158 | 159 | return tween.then(() => { 160 | assert.equal(component.get().x, 130); 161 | assert.htmlEqual(target.innerHTML, '130'); 162 | }); 163 | }); 164 | 165 | it('aborts a tween if data is set', () => { 166 | const { component, target, raf } = setup(`{x}`, { 167 | x: 20 168 | }); 169 | 170 | const tween = component.tween('x', 40, { 171 | duration: 100 172 | }); 173 | 174 | assert.equal(component.get().x, 20); 175 | assert.htmlEqual(target.innerHTML, '20'); 176 | 177 | raf.tick(50); 178 | assert.equal(component.get().x, 30); 179 | assert.htmlEqual(target.innerHTML, '30'); 180 | 181 | component.set({ x: -99 }); 182 | 183 | raf.tick(75); 184 | assert.equal(component.get().x, -99); 185 | assert.htmlEqual(target.innerHTML, '-99'); 186 | 187 | tween.then(() => { 188 | throw new Error('Promise should not be fulfilled'); 189 | }); 190 | }); 191 | 192 | it('allows custom interpolators', () => { 193 | const { component, target, raf } = setup(`{x}`, { 194 | x: 'a' 195 | }); 196 | 197 | const tween = component.tween('x', 'z', { 198 | duration: 100, 199 | interpolate: (a, b) => { 200 | const start = a.charCodeAt(0); 201 | const delta = b.charCodeAt(0) - start; 202 | return t => String.fromCharCode(~~(start + t * delta)); 203 | } 204 | }); 205 | 206 | raf.tick(50); 207 | assert.equal(component.get().x, 'm'); 208 | assert.htmlEqual(target.innerHTML, 'm'); 209 | 210 | raf.tick(100); 211 | 212 | return tween.then(() => { 213 | assert.equal(component.get().x, 'z'); 214 | assert.htmlEqual(target.innerHTML, 'z'); 215 | }); 216 | }); 217 | }); 218 | }; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## DEPRECATED — As of Svelte v3, many of these are no longer necessary, and `tween` and `spring` are built into the main package 2 | 3 | # svelte-extras 4 | 5 | Extra methods for [Svelte](https://svelte.technology) components. 6 | 7 | ## Usage 8 | 9 | Install with npm or yarn... 10 | 11 | ```bash 12 | npm install --save svelte-extras 13 | ``` 14 | 15 | ...then add to your component methods: 16 | 17 | ```html 18 | 19 | 20 | 21 |
    22 | {{#each todos as todo, i}} 23 |
  • 24 | 25 | {{todo}} 26 |
  • 27 | {{/each}} 28 |
29 | 30 | 47 | ``` 48 | 49 | ## Available methods 50 | 51 | ### Array methods ([live demo](https://svelte.technology/repl?gist=30b8d79ac7a7ce11076df68366cc0134)) 52 | 53 | * push 54 | * pop 55 | * shift 56 | * unshift 57 | * splice 58 | * sort 59 | * reverse 60 | 61 | These all work exactly as their `Array.prototype` counterparts, except that the first argument must be the *keypath* that points to the array. The following are all examples of keypaths: 62 | 63 | ```js 64 | component.push('todos', 'finish writing this documentation'); 65 | component.push('foo.bar.baz', 42); 66 | component.push('rows[4]', cell); 67 | ``` 68 | 69 | ### tween(key, end, options?) ([live demo](https://svelte.technology/repl?gist=f3d3c58264886987afcf09a0c8e07776)) 70 | 71 | Smoothly tweens `key` from its current value to the `end` value. Numerical values (and non-cyclical objects and arrays, as long as their leaf properties are numerical) are automatically interpolated, or you can supply a custom function. 72 | 73 | The available options (and default values) are: 74 | 75 | * **delay** (0) — the delay in milliseconds before the tween starts 76 | * **duration** (400) — the duration of the tween 77 | * **easing** (x => x) — which easing function to use (see e.g. [eases-jsnext](https://github.com/rollup/eases-jsnext))) 78 | * **interpolate** (see above) — a function that generators a custom interpolator, for e.g. transitioning strings representing colors. Must take arguments `a` and `b` and return a function that takes a value `t` between 0 and 1 79 | 80 | This method returns a promise with an additional `abort` method. The tween will be aborted automatically if `key` is updated separately, either by a second tween or via `component.set(...)`. The promise will not resolve if the tween is aborted. 81 | 82 | ### spring(key, end, options) ([live demo](https://svelte.technology/repl?gist=8def8776479d3d74b3b2829af3b01074)) 83 | 84 | Similar to `tween`, except it uses a spring physics simulation rather than a pre-defined easing curve, which gives more natural results in some situations. The `end` value can be anything you could pass to `tween`. 85 | 86 | The following options must be provided: 87 | 88 | * **stiffness** — the *spring constant*, a value between 0 and 1 89 | * **damping** — the *damping coefficient*, again between 0 and 1 90 | 91 | Figuring out the optimal combination of stiffness and damping typically takes a bit of trial and error. The higher the stiffness, the quicker the motion will be; the lower the damping, the 'springier' it will be. 92 | 93 | This method returns a promise that resolves when the simulation is complete — or not at all, if the simulation is aborted by another call to `spring(...)` or a call to `set(...)`. 94 | 95 | 96 | ### observe(key, callback, options?) 97 | 98 | Runs the `callback` function with two arguments, `newValue` and `oldValue`, every time the value of `key` changes. `options` can contain two booleans — `init`, which determines whether to fire the callback immediately (the default) instead of waiting for a change, and `defer`, which determines whether the callback fires before or after the DOM has updated. 99 | 100 | This method used to be built in to Svelte; it's now recommended that you use the `onstate` and `onupdated` lifecycle hooks instead. 101 | 102 | 103 | ### observeDeep(keypath, callback, options?) ([live demo](https://svelte.technology/repl?gist=589949dc19c7dea17deb6c06243ba66d)) 104 | 105 | Exactly the same as `observe` method, except that it observes nested properties of objects and arrays, rather than the objects themselves. The `keypath` option is a string like `foo.bar` (observe the `bar` property of the `foo` object) or `baz[0]` (observe the first member of the `baz` array). 106 | 107 | 108 | ### observeMany(keys, callback, options?) ([live demo](https://svelte.technology/repl?gist=bdb1eb4553e87e191884d32c84355852)) 109 | 110 | Observes multiple keys, without firing multiple times when they change simultaneously. `keys` is an array of keys, while the callback receives two arguments — an array of the new values corresponding to those keys, and an array of the old values. `options` can include `init` and `defer`, like the built-in `observe` method. 111 | 112 | 113 | ### getDeep(keypath) ([live demo](https://svelte.technology/repl?gist=3b32e284732a6297fc49a213930a3cf0)) 114 | 115 | Similar to the built-in `get` method, except that it gets nested properties of objects and arrays, rather than the objects themselves. The `keypath` option is a string like `foo.bar` (get the `bar` property of the `foo` object) or `baz[0]` (get the first member of the `baz` array). 116 | 117 | 118 | ### setDeep(keypath, value) ([live demo](https://svelte.technology/repl?gist=6dc00bf661849b14ac79439d91becd6d)) 119 | 120 | Similar to the built-in `set` method, except that it sets nested properties of objects and arrays, rather than the objects themselves. The `keypath` option is a string like `foo.bar` (set the `bar` property of the `foo` object) or `baz[0]` (set the first member of the `baz` array). 121 | 122 | 123 | ## Tree-shaking 124 | 125 | If you're using a module bundler that supports tree-shaking, such as [Rollup](https://rollupjs.org), only the methods your components use will be included in your app. 126 | 127 | 128 | ## Universal module definition 129 | 130 | If you *really* need it, a UMD build is available at [svelte-extras/dist/svelte-extras.umd.js](https://unpkg.com/svelte-extras/dist/svelte-extras.umd.js), and will register itself as `svelte.extras`. We recommend using a module bundler instead, however. 131 | 132 | 133 | ## License 134 | 135 | [MIT](LICENSE) 136 | -------------------------------------------------------------------------------- /src/spring.ts: -------------------------------------------------------------------------------- 1 | import { isDate } from './shared'; 2 | import { Component } from './interfaces'; 3 | 4 | const scheduler = { 5 | components: [], 6 | 7 | running: false, 8 | 9 | add: (component: Component) => { 10 | if (~scheduler.components.indexOf(component)) return; 11 | scheduler.components.push(component); 12 | 13 | if (!scheduler.running) { 14 | scheduler.running = true; 15 | requestAnimationFrame(scheduler.next); 16 | } 17 | }, 18 | 19 | next: () => { 20 | let hasComponents = false; 21 | 22 | let i = scheduler.components.length; 23 | while (i--) { 24 | const component = scheduler.components[i]; 25 | const data: any = {}; 26 | 27 | let hasSprings = false; 28 | 29 | for (const key in component._springs) { 30 | const spring = component._springs[key]; 31 | 32 | if (spring.tick(data)) { 33 | hasSprings = true; 34 | hasComponents = true; 35 | } else { 36 | component._springCallbacks[key](); 37 | delete component._springs[key]; 38 | delete component._springCallbacks[key]; 39 | } 40 | } 41 | 42 | component._springing = true; 43 | component.set(data); 44 | component._springing = false; 45 | 46 | if (!hasSprings) scheduler.components.splice(i, 1); 47 | } 48 | 49 | if (hasComponents) { 50 | requestAnimationFrame(scheduler.next); 51 | } else { 52 | scheduler.running = false; 53 | } 54 | } 55 | }; 56 | 57 | interface SpringOptions { 58 | stiffness: number; 59 | damping: number; 60 | } 61 | 62 | interface Spring { 63 | key: string | number; 64 | tick: (target: object) => void; 65 | update: (newValue: any, options: SpringOptions) => void; 66 | } 67 | 68 | function noop() {} 69 | 70 | function snap( 71 | key: string | number, 72 | a: any, 73 | b: any, 74 | options: SpringOptions 75 | ): Spring { 76 | return { 77 | key, 78 | tick: (object: any) => { 79 | object[key] = b; 80 | return false; 81 | }, 82 | update: (object: any, options: SpringOptions) => { 83 | b = object; 84 | } 85 | }; 86 | } 87 | 88 | function number( 89 | key: string | number, 90 | a: number, 91 | b: number, 92 | options: SpringOptions 93 | ): Spring { 94 | let velocity = 0; 95 | let aborted = false; 96 | 97 | let { stiffness, damping } = options; 98 | 99 | const valueThreshold = Math.abs(b - a) * 0.001; 100 | const velocityThreshold = valueThreshold; // TODO is this right? 101 | 102 | return { 103 | key, 104 | tick: (object: any) => { 105 | const d = b - a; 106 | const spring = stiffness * d; 107 | const damper = damping * velocity; 108 | 109 | const acceleration = spring - damper; 110 | 111 | velocity += acceleration; 112 | a += velocity; 113 | 114 | object[key] = a; 115 | 116 | if (velocity < velocityThreshold && Math.abs(b - a) < valueThreshold) { 117 | object[key] = b; 118 | return false; 119 | } 120 | 121 | object[key] = a; 122 | return true; 123 | }, 124 | update: (object: any, options: SpringOptions) => { 125 | checkCompatibility(object, b); 126 | 127 | b = object; 128 | stiffness = options.stiffness; 129 | damping = options.damping; 130 | } 131 | }; 132 | } 133 | 134 | function date( 135 | key: string | number, 136 | a: Date, 137 | b: Date, 138 | options: SpringOptions 139 | ): Spring { 140 | const dummy = {}; 141 | const subspring = number(key, a.getTime(), b.getTime(), options); 142 | 143 | return { 144 | key, 145 | tick: (object: any) => { 146 | if (!subspring.tick(dummy)) { 147 | object[key] = b; 148 | return false; 149 | } 150 | 151 | object[key] = new Date(dummy[key]); 152 | return true; 153 | }, 154 | update: (object: any, options: SpringOptions) => { 155 | checkCompatibility(object, b); 156 | 157 | subspring.update(object.getTime(), options); 158 | b = object; 159 | } 160 | }; 161 | } 162 | 163 | function array( 164 | key: string | number, 165 | a: any[], 166 | b: any[], 167 | options: SpringOptions 168 | ): Spring { 169 | const value: any[] = []; 170 | const subsprings: Spring[] = []; 171 | 172 | for (let i = 0; i < a.length; i += 1) { 173 | subsprings.push(getSpring(i, a[i], b[i], options)); 174 | } 175 | 176 | return { 177 | key, 178 | tick: (object: any) => { 179 | let active = false; 180 | 181 | for (let i = 0; i < subsprings.length; i += 1) { 182 | if (subsprings[i].tick(value)) active = true; 183 | } 184 | 185 | if (!active) { 186 | object[key] = b; 187 | return false; 188 | } 189 | 190 | object[key] = value; 191 | return true; 192 | }, 193 | update: (object: any, options: SpringOptions) => { 194 | checkCompatibility(object, b); 195 | 196 | for (let i = 0; i < object.length; i += 1) { 197 | subsprings[i].update(object[i], options); 198 | } 199 | 200 | b = object; 201 | } 202 | }; 203 | } 204 | 205 | function object( 206 | key: string | number, 207 | a: object, 208 | b: object, 209 | options: SpringOptions 210 | ): Spring { 211 | const value = {}; 212 | const subsprings: Spring[] = []; 213 | 214 | for (const k in a) { 215 | subsprings.push(getSpring(k, a[k], b[k], options)); 216 | } 217 | 218 | return { 219 | key, 220 | tick: (object: any) => { 221 | let active = false; 222 | 223 | for (let i = 0; i < subsprings.length; i += 1) { 224 | if (subsprings[i].tick(value)) active = true; 225 | } 226 | 227 | if (!active) { 228 | object[key] = b; 229 | return false; 230 | } 231 | 232 | object[key] = value; 233 | return true; 234 | }, 235 | update: (object: any, options: SpringOptions) => { 236 | checkCompatibility(object, b); 237 | 238 | for (let i = 0; i < subsprings.length; i += 1) { 239 | subsprings[i].update(object[subsprings[i].key], options); 240 | } 241 | 242 | b = object; 243 | } 244 | }; 245 | } 246 | 247 | function checkCompatibility(a: any, b: any) { 248 | const type: string = typeof a; 249 | 250 | if ( 251 | type !== typeof b || 252 | Array.isArray(a) !== Array.isArray(b) || 253 | isDate(a) !== isDate(b) 254 | ) { 255 | throw new Error('Cannot interpolate values of different type'); 256 | } 257 | 258 | if (type === 'object') { 259 | if (!a || !b) throw new Error('Object cannot be null'); 260 | 261 | if (Array.isArray(a)) { 262 | if (a.length !== b.length) { 263 | throw new Error('Cannot interpolate arrays of different length'); 264 | } 265 | } else { 266 | const aKeys = Object.keys(a); 267 | const bKeys = Object.keys(b); 268 | 269 | if (!keysMatch(a, b)) 270 | throw new Error('Cannot interpolate differently-shaped objects'); 271 | } 272 | } else if (type !== 'number') { 273 | throw new Error(`Cannot interpolate ${type} values`); 274 | } 275 | } 276 | 277 | function getSpring( 278 | key: string | number, 279 | a: any, 280 | b: any, 281 | options: SpringOptions 282 | ): Spring { 283 | if (a === b || a !== a) return snap(key, a, b, options); 284 | 285 | checkCompatibility(a, b); 286 | 287 | if (typeof a === 'object') { 288 | if (Array.isArray(a)) { 289 | return array(key, a, b, options); 290 | } 291 | 292 | if (isDate(a)) { 293 | return date(key, a, b, options); 294 | } 295 | 296 | return object(key, a, b, options); 297 | } 298 | 299 | return number(key, a, b, options); 300 | } 301 | 302 | export function spring( 303 | this: Component, 304 | key: string, 305 | to: any, 306 | options: SpringOptions 307 | ) { 308 | if (!this._springs) { 309 | this._springs = Object.create(null); 310 | this._springCallbacks = Object.create(null); 311 | this._springing = false; 312 | 313 | const set = this.set; 314 | this.set = (data: {}) => { 315 | if (!this._springing) { 316 | for (const key in data) { 317 | delete this._springs[key]; 318 | } 319 | } 320 | set.call(this, data); 321 | }; 322 | } 323 | 324 | if (this._springs[key]) { 325 | this._springs[key].update(to, options); 326 | } else { 327 | const spring = getSpring(key, this.get()[key], to, options); 328 | this._springs[key] = spring; 329 | } 330 | 331 | const promise = new Promise(fulfil => { 332 | this._springCallbacks[key] = fulfil; 333 | }); 334 | 335 | scheduler.add(this); 336 | 337 | return promise; 338 | } 339 | 340 | function keysMatch(a: object, b: object) { 341 | const aKeys = Object.keys(a); 342 | const bKeys = Object.keys(b); 343 | 344 | if (aKeys.length !== bKeys.length) return false; 345 | 346 | for (let i = 0; i < aKeys.length; i += 1) { 347 | if (!(aKeys[i] in b)) return false; 348 | } 349 | 350 | return true; 351 | } 352 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/estree@0.0.38": 6 | version "0.0.38" 7 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.38.tgz#c1be40aa933723c608820a99a373a16d215a1ca2" 8 | 9 | "@types/estree@0.0.39": 10 | version "0.0.39" 11 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" 12 | 13 | "@types/node@*", "@types/node@^9.6.5": 14 | version "9.6.5" 15 | resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.5.tgz#ee700810fdf49ac1c399fc5980b7559b3e5a381d" 16 | 17 | abab@^1.0.4: 18 | version "1.0.4" 19 | resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" 20 | 21 | acorn-dynamic-import@^3.0.0: 22 | version "3.0.0" 23 | resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" 24 | dependencies: 25 | acorn "^5.0.0" 26 | 27 | acorn-globals@^4.1.0: 28 | version "4.1.0" 29 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" 30 | dependencies: 31 | acorn "^5.0.0" 32 | 33 | acorn-jsx@^3.0.0: 34 | version "3.0.1" 35 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 36 | dependencies: 37 | acorn "^3.0.4" 38 | 39 | acorn-jsx@^4.1.1: 40 | version "4.1.1" 41 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" 42 | dependencies: 43 | acorn "^5.0.3" 44 | 45 | acorn@^3.0.4: 46 | version "3.3.0" 47 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 48 | 49 | acorn@^5.0.0, acorn@^5.0.3, acorn@^5.3.0, acorn@^5.4.1, acorn@^5.5.0: 50 | version "5.5.3" 51 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" 52 | 53 | agadoo@^1.0.0: 54 | version "1.0.0" 55 | resolved "https://registry.yarnpkg.com/agadoo/-/agadoo-1.0.0.tgz#b2e0052b30906a209954516cda896d17420b29cf" 56 | dependencies: 57 | rollup "^0.64.1" 58 | rollup-plugin-virtual "^1.0.1" 59 | 60 | ajv-keywords@^2.1.0: 61 | version "2.1.1" 62 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 63 | 64 | ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: 65 | version "5.5.2" 66 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 67 | dependencies: 68 | co "^4.6.0" 69 | fast-deep-equal "^1.0.0" 70 | fast-json-stable-stringify "^2.0.0" 71 | json-schema-traverse "^0.3.0" 72 | 73 | ansi-escapes@^3.0.0: 74 | version "3.1.0" 75 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 76 | 77 | ansi-regex@^2.0.0: 78 | version "2.1.1" 79 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 80 | 81 | ansi-regex@^3.0.0: 82 | version "3.0.0" 83 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 84 | 85 | ansi-styles@^2.2.1: 86 | version "2.2.1" 87 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 88 | 89 | ansi-styles@^3.2.1: 90 | version "3.2.1" 91 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 92 | dependencies: 93 | color-convert "^1.9.0" 94 | 95 | argparse@^1.0.7: 96 | version "1.0.10" 97 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 98 | dependencies: 99 | sprintf-js "~1.0.2" 100 | 101 | arr-diff@^2.0.0: 102 | version "2.0.0" 103 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 104 | dependencies: 105 | arr-flatten "^1.0.1" 106 | 107 | arr-flatten@^1.0.1: 108 | version "1.1.0" 109 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 110 | 111 | array-equal@^1.0.0: 112 | version "1.0.0" 113 | resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" 114 | 115 | array-union@^1.0.1: 116 | version "1.0.2" 117 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 118 | dependencies: 119 | array-uniq "^1.0.1" 120 | 121 | array-uniq@^1.0.1: 122 | version "1.0.3" 123 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 124 | 125 | array-unique@^0.2.1: 126 | version "0.2.1" 127 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 128 | 129 | arrify@^1.0.0: 130 | version "1.0.1" 131 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 132 | 133 | asn1@~0.2.3: 134 | version "0.2.3" 135 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 136 | 137 | assert-plus@1.0.0, assert-plus@^1.0.0: 138 | version "1.0.0" 139 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 140 | 141 | async-limiter@~1.0.0: 142 | version "1.0.0" 143 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 144 | 145 | asynckit@^0.4.0: 146 | version "0.4.0" 147 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 148 | 149 | aws-sign2@~0.7.0: 150 | version "0.7.0" 151 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 152 | 153 | aws4@^1.6.0: 154 | version "1.7.0" 155 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" 156 | 157 | babel-code-frame@^6.22.0: 158 | version "6.26.0" 159 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 160 | dependencies: 161 | chalk "^1.1.3" 162 | esutils "^2.0.2" 163 | js-tokens "^3.0.2" 164 | 165 | balanced-match@^1.0.0: 166 | version "1.0.0" 167 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 168 | 169 | bcrypt-pbkdf@^1.0.0: 170 | version "1.0.1" 171 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 172 | dependencies: 173 | tweetnacl "^0.14.3" 174 | 175 | boom@4.x.x: 176 | version "4.3.1" 177 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 178 | dependencies: 179 | hoek "4.x.x" 180 | 181 | boom@5.x.x: 182 | version "5.2.0" 183 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 184 | dependencies: 185 | hoek "4.x.x" 186 | 187 | brace-expansion@^1.1.7: 188 | version "1.1.11" 189 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 190 | dependencies: 191 | balanced-match "^1.0.0" 192 | concat-map "0.0.1" 193 | 194 | braces@^1.8.2: 195 | version "1.8.5" 196 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 197 | dependencies: 198 | expand-range "^1.8.1" 199 | preserve "^0.2.0" 200 | repeat-element "^1.1.2" 201 | 202 | browser-process-hrtime@^0.1.2: 203 | version "0.1.2" 204 | resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" 205 | 206 | browser-stdout@1.3.1: 207 | version "1.3.1" 208 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 209 | 210 | buble@^0.19.2: 211 | version "0.19.3" 212 | resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.3.tgz#01e9412062cff1da6f20342b6ecd72e7bf699d02" 213 | dependencies: 214 | acorn "^5.4.1" 215 | acorn-dynamic-import "^3.0.0" 216 | acorn-jsx "^4.1.1" 217 | chalk "^2.3.1" 218 | magic-string "^0.22.4" 219 | minimist "^1.2.0" 220 | os-homedir "^1.0.1" 221 | vlq "^1.0.0" 222 | 223 | buffer-from@^1.0.0: 224 | version "1.0.0" 225 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" 226 | 227 | builtin-modules@^1.0.0: 228 | version "1.1.1" 229 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 230 | 231 | caller-path@^0.1.0: 232 | version "0.1.0" 233 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 234 | dependencies: 235 | callsites "^0.2.0" 236 | 237 | callsites@^0.2.0: 238 | version "0.2.0" 239 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 240 | 241 | caseless@~0.12.0: 242 | version "0.12.0" 243 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 244 | 245 | chalk@^1.1.3: 246 | version "1.1.3" 247 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 248 | dependencies: 249 | ansi-styles "^2.2.1" 250 | escape-string-regexp "^1.0.2" 251 | has-ansi "^2.0.0" 252 | strip-ansi "^3.0.0" 253 | supports-color "^2.0.0" 254 | 255 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.1: 256 | version "2.4.0" 257 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52" 258 | dependencies: 259 | ansi-styles "^3.2.1" 260 | escape-string-regexp "^1.0.5" 261 | supports-color "^5.3.0" 262 | 263 | chardet@^0.4.0: 264 | version "0.4.2" 265 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 266 | 267 | circular-json@^0.3.1: 268 | version "0.3.3" 269 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 270 | 271 | cli-cursor@^2.1.0: 272 | version "2.1.0" 273 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 274 | dependencies: 275 | restore-cursor "^2.0.0" 276 | 277 | cli-width@^2.0.0: 278 | version "2.2.0" 279 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 280 | 281 | co@^4.6.0: 282 | version "4.6.0" 283 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 284 | 285 | color-convert@^1.9.0: 286 | version "1.9.1" 287 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 288 | dependencies: 289 | color-name "^1.1.1" 290 | 291 | color-name@^1.1.1: 292 | version "1.1.3" 293 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 294 | 295 | combined-stream@1.0.6, combined-stream@~1.0.5: 296 | version "1.0.6" 297 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" 298 | dependencies: 299 | delayed-stream "~1.0.0" 300 | 301 | commander@2.11.0: 302 | version "2.11.0" 303 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 304 | 305 | compare-versions@2.0.1: 306 | version "2.0.1" 307 | resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-2.0.1.tgz#1edc1f93687fd97a325c59f55e45a07db106aca6" 308 | 309 | concat-map@0.0.1: 310 | version "0.0.1" 311 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 312 | 313 | concat-stream@^1.6.0: 314 | version "1.6.2" 315 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 316 | dependencies: 317 | buffer-from "^1.0.0" 318 | inherits "^2.0.3" 319 | readable-stream "^2.2.2" 320 | typedarray "^0.0.6" 321 | 322 | console-group@^0.3.3: 323 | version "0.3.3" 324 | resolved "https://registry.yarnpkg.com/console-group/-/console-group-0.3.3.tgz#6d8eb6b9d6b757a2895284f62d09c7ad43f2bbce" 325 | 326 | contains-path@^0.1.0: 327 | version "0.1.0" 328 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 329 | 330 | core-util-is@1.0.2, core-util-is@~1.0.0: 331 | version "1.0.2" 332 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 333 | 334 | cross-spawn@^5.1.0: 335 | version "5.1.0" 336 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 337 | dependencies: 338 | lru-cache "^4.0.1" 339 | shebang-command "^1.2.0" 340 | which "^1.2.9" 341 | 342 | cryptiles@3.x.x: 343 | version "3.1.2" 344 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 345 | dependencies: 346 | boom "5.x.x" 347 | 348 | cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": 349 | version "0.3.2" 350 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" 351 | 352 | "cssstyle@>= 0.2.37 < 0.3.0": 353 | version "0.2.37" 354 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" 355 | dependencies: 356 | cssom "0.3.x" 357 | 358 | dashdash@^1.12.0: 359 | version "1.14.1" 360 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 361 | dependencies: 362 | assert-plus "^1.0.0" 363 | 364 | data-urls@^1.0.0: 365 | version "1.0.0" 366 | resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" 367 | dependencies: 368 | abab "^1.0.4" 369 | whatwg-mimetype "^2.0.0" 370 | whatwg-url "^6.4.0" 371 | 372 | debug@3.1.0, debug@^3.1.0: 373 | version "3.1.0" 374 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 375 | dependencies: 376 | ms "2.0.0" 377 | 378 | debug@^2.6.8, debug@^2.6.9: 379 | version "2.6.9" 380 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 381 | dependencies: 382 | ms "2.0.0" 383 | 384 | deep-is@~0.1.3: 385 | version "0.1.3" 386 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 387 | 388 | del@^2.0.2: 389 | version "2.2.2" 390 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 391 | dependencies: 392 | globby "^5.0.0" 393 | is-path-cwd "^1.0.0" 394 | is-path-in-cwd "^1.0.0" 395 | object-assign "^4.0.1" 396 | pify "^2.0.0" 397 | pinkie-promise "^2.0.0" 398 | rimraf "^2.2.8" 399 | 400 | delayed-stream@~1.0.0: 401 | version "1.0.0" 402 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 403 | 404 | diff@3.5.0: 405 | version "3.5.0" 406 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 407 | 408 | doctrine@1.5.0: 409 | version "1.5.0" 410 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 411 | dependencies: 412 | esutils "^2.0.2" 413 | isarray "^1.0.0" 414 | 415 | doctrine@^2.1.0: 416 | version "2.1.0" 417 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 418 | dependencies: 419 | esutils "^2.0.2" 420 | 421 | domexception@^1.0.0: 422 | version "1.0.1" 423 | resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" 424 | dependencies: 425 | webidl-conversions "^4.0.2" 426 | 427 | ecc-jsbn@~0.1.1: 428 | version "0.1.1" 429 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 430 | dependencies: 431 | jsbn "~0.1.0" 432 | 433 | error-ex@^1.2.0: 434 | version "1.3.1" 435 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 436 | dependencies: 437 | is-arrayish "^0.2.1" 438 | 439 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 440 | version "1.0.5" 441 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 442 | 443 | escodegen@^1.9.0: 444 | version "1.9.1" 445 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" 446 | dependencies: 447 | esprima "^3.1.3" 448 | estraverse "^4.2.0" 449 | esutils "^2.0.2" 450 | optionator "^0.8.1" 451 | optionalDependencies: 452 | source-map "~0.6.1" 453 | 454 | eslint-import-resolver-node@^0.3.1: 455 | version "0.3.2" 456 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" 457 | dependencies: 458 | debug "^2.6.9" 459 | resolve "^1.5.0" 460 | 461 | eslint-module-utils@^2.2.0: 462 | version "2.2.0" 463 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" 464 | dependencies: 465 | debug "^2.6.8" 466 | pkg-dir "^1.0.0" 467 | 468 | eslint-plugin-import@^2.7.0: 469 | version "2.11.0" 470 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz#15aeea37a67499d848e8e981806d4627b5503816" 471 | dependencies: 472 | contains-path "^0.1.0" 473 | debug "^2.6.8" 474 | doctrine "1.5.0" 475 | eslint-import-resolver-node "^0.3.1" 476 | eslint-module-utils "^2.2.0" 477 | has "^1.0.1" 478 | lodash "^4.17.4" 479 | minimatch "^3.0.3" 480 | read-pkg-up "^2.0.0" 481 | resolve "^1.6.0" 482 | 483 | eslint-scope@^3.7.1: 484 | version "3.7.1" 485 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 486 | dependencies: 487 | esrecurse "^4.1.0" 488 | estraverse "^4.1.1" 489 | 490 | eslint-visitor-keys@^1.0.0: 491 | version "1.0.0" 492 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 493 | 494 | eslint@^4.2.0: 495 | version "4.19.1" 496 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" 497 | dependencies: 498 | ajv "^5.3.0" 499 | babel-code-frame "^6.22.0" 500 | chalk "^2.1.0" 501 | concat-stream "^1.6.0" 502 | cross-spawn "^5.1.0" 503 | debug "^3.1.0" 504 | doctrine "^2.1.0" 505 | eslint-scope "^3.7.1" 506 | eslint-visitor-keys "^1.0.0" 507 | espree "^3.5.4" 508 | esquery "^1.0.0" 509 | esutils "^2.0.2" 510 | file-entry-cache "^2.0.0" 511 | functional-red-black-tree "^1.0.1" 512 | glob "^7.1.2" 513 | globals "^11.0.1" 514 | ignore "^3.3.3" 515 | imurmurhash "^0.1.4" 516 | inquirer "^3.0.6" 517 | is-resolvable "^1.0.0" 518 | js-yaml "^3.9.1" 519 | json-stable-stringify-without-jsonify "^1.0.1" 520 | levn "^0.3.0" 521 | lodash "^4.17.4" 522 | minimatch "^3.0.2" 523 | mkdirp "^0.5.1" 524 | natural-compare "^1.4.0" 525 | optionator "^0.8.2" 526 | path-is-inside "^1.0.2" 527 | pluralize "^7.0.0" 528 | progress "^2.0.0" 529 | regexpp "^1.0.1" 530 | require-uncached "^1.0.3" 531 | semver "^5.3.0" 532 | strip-ansi "^4.0.0" 533 | strip-json-comments "~2.0.1" 534 | table "4.0.2" 535 | text-table "~0.2.0" 536 | 537 | espree@^3.5.4: 538 | version "3.5.4" 539 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 540 | dependencies: 541 | acorn "^5.5.0" 542 | acorn-jsx "^3.0.0" 543 | 544 | esprima@^3.1.3: 545 | version "3.1.3" 546 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 547 | 548 | esprima@^4.0.0: 549 | version "4.0.0" 550 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 551 | 552 | esquery@^1.0.0: 553 | version "1.0.1" 554 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 555 | dependencies: 556 | estraverse "^4.0.0" 557 | 558 | esrecurse@^4.1.0: 559 | version "4.2.1" 560 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 561 | dependencies: 562 | estraverse "^4.1.0" 563 | 564 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 565 | version "4.2.0" 566 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 567 | 568 | estree-walker@^0.2.1: 569 | version "0.2.1" 570 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" 571 | 572 | estree-walker@^0.3.0: 573 | version "0.3.1" 574 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" 575 | 576 | esutils@^2.0.2: 577 | version "2.0.2" 578 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 579 | 580 | expand-brackets@^0.1.4: 581 | version "0.1.5" 582 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 583 | dependencies: 584 | is-posix-bracket "^0.1.0" 585 | 586 | expand-range@^1.8.1: 587 | version "1.8.2" 588 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 589 | dependencies: 590 | fill-range "^2.1.0" 591 | 592 | extend@~3.0.1: 593 | version "3.0.1" 594 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 595 | 596 | external-editor@^2.0.4: 597 | version "2.2.0" 598 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 599 | dependencies: 600 | chardet "^0.4.0" 601 | iconv-lite "^0.4.17" 602 | tmp "^0.0.33" 603 | 604 | extglob@^0.3.1: 605 | version "0.3.2" 606 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 607 | dependencies: 608 | is-extglob "^1.0.0" 609 | 610 | extsprintf@1.3.0: 611 | version "1.3.0" 612 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 613 | 614 | extsprintf@^1.2.0: 615 | version "1.4.0" 616 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 617 | 618 | fast-deep-equal@^1.0.0: 619 | version "1.1.0" 620 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 621 | 622 | fast-json-stable-stringify@^2.0.0: 623 | version "2.0.0" 624 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 625 | 626 | fast-levenshtein@~2.0.4: 627 | version "2.0.6" 628 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 629 | 630 | figures@^2.0.0: 631 | version "2.0.0" 632 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 633 | dependencies: 634 | escape-string-regexp "^1.0.5" 635 | 636 | file-entry-cache@^2.0.0: 637 | version "2.0.0" 638 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 639 | dependencies: 640 | flat-cache "^1.2.1" 641 | object-assign "^4.0.1" 642 | 643 | filename-regex@^2.0.0: 644 | version "2.0.1" 645 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 646 | 647 | fill-range@^2.1.0: 648 | version "2.2.3" 649 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 650 | dependencies: 651 | is-number "^2.1.0" 652 | isobject "^2.0.0" 653 | randomatic "^1.1.3" 654 | repeat-element "^1.1.2" 655 | repeat-string "^1.5.2" 656 | 657 | find-up@^1.0.0: 658 | version "1.1.2" 659 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 660 | dependencies: 661 | path-exists "^2.0.0" 662 | pinkie-promise "^2.0.0" 663 | 664 | find-up@^2.0.0: 665 | version "2.1.0" 666 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 667 | dependencies: 668 | locate-path "^2.0.0" 669 | 670 | flat-cache@^1.2.1: 671 | version "1.3.0" 672 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 673 | dependencies: 674 | circular-json "^0.3.1" 675 | del "^2.0.2" 676 | graceful-fs "^4.1.2" 677 | write "^0.2.1" 678 | 679 | for-in@^1.0.1: 680 | version "1.0.2" 681 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 682 | 683 | for-own@^0.1.4: 684 | version "0.1.5" 685 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 686 | dependencies: 687 | for-in "^1.0.1" 688 | 689 | forever-agent@~0.6.1: 690 | version "0.6.1" 691 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 692 | 693 | form-data@~2.3.1: 694 | version "2.3.2" 695 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" 696 | dependencies: 697 | asynckit "^0.4.0" 698 | combined-stream "1.0.6" 699 | mime-types "^2.1.12" 700 | 701 | fs.realpath@^1.0.0: 702 | version "1.0.0" 703 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 704 | 705 | function-bind@^1.0.2: 706 | version "1.1.1" 707 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 708 | 709 | functional-red-black-tree@^1.0.1: 710 | version "1.0.1" 711 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 712 | 713 | getpass@^0.1.1: 714 | version "0.1.7" 715 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 716 | dependencies: 717 | assert-plus "^1.0.0" 718 | 719 | glob-base@^0.3.0: 720 | version "0.3.0" 721 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 722 | dependencies: 723 | glob-parent "^2.0.0" 724 | is-glob "^2.0.0" 725 | 726 | glob-parent@^2.0.0: 727 | version "2.0.0" 728 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 729 | dependencies: 730 | is-glob "^2.0.0" 731 | 732 | glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 733 | version "7.1.2" 734 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 735 | dependencies: 736 | fs.realpath "^1.0.0" 737 | inflight "^1.0.4" 738 | inherits "2" 739 | minimatch "^3.0.4" 740 | once "^1.3.0" 741 | path-is-absolute "^1.0.0" 742 | 743 | globals@^11.0.1: 744 | version "11.4.0" 745 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc" 746 | 747 | globby@^5.0.0: 748 | version "5.0.0" 749 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 750 | dependencies: 751 | array-union "^1.0.1" 752 | arrify "^1.0.0" 753 | glob "^7.0.3" 754 | object-assign "^4.0.1" 755 | pify "^2.0.0" 756 | pinkie-promise "^2.0.0" 757 | 758 | graceful-fs@^4.1.2: 759 | version "4.1.11" 760 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 761 | 762 | growl@1.10.3: 763 | version "1.10.3" 764 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" 765 | 766 | har-schema@^2.0.0: 767 | version "2.0.0" 768 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 769 | 770 | har-validator@~5.0.3: 771 | version "5.0.3" 772 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 773 | dependencies: 774 | ajv "^5.1.0" 775 | har-schema "^2.0.0" 776 | 777 | has-ansi@^2.0.0: 778 | version "2.0.0" 779 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 780 | dependencies: 781 | ansi-regex "^2.0.0" 782 | 783 | has-flag@^2.0.0: 784 | version "2.0.0" 785 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 786 | 787 | has-flag@^3.0.0: 788 | version "3.0.0" 789 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 790 | 791 | has@^1.0.1: 792 | version "1.0.1" 793 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 794 | dependencies: 795 | function-bind "^1.0.2" 796 | 797 | hawk@~6.0.2: 798 | version "6.0.2" 799 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 800 | dependencies: 801 | boom "4.x.x" 802 | cryptiles "3.x.x" 803 | hoek "4.x.x" 804 | sntp "2.x.x" 805 | 806 | he@1.1.1: 807 | version "1.1.1" 808 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 809 | 810 | hoek@4.x.x: 811 | version "4.2.1" 812 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" 813 | 814 | hosted-git-info@^2.1.4: 815 | version "2.6.0" 816 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" 817 | 818 | html-encoding-sniffer@^1.0.2: 819 | version "1.0.2" 820 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" 821 | dependencies: 822 | whatwg-encoding "^1.0.1" 823 | 824 | http-signature@~1.2.0: 825 | version "1.2.0" 826 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 827 | dependencies: 828 | assert-plus "^1.0.0" 829 | jsprim "^1.2.2" 830 | sshpk "^1.7.0" 831 | 832 | iconv-lite@0.4.19: 833 | version "0.4.19" 834 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 835 | 836 | iconv-lite@^0.4.17: 837 | version "0.4.21" 838 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" 839 | dependencies: 840 | safer-buffer "^2.1.0" 841 | 842 | ignore@^3.3.3: 843 | version "3.3.7" 844 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" 845 | 846 | imurmurhash@^0.1.4: 847 | version "0.1.4" 848 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 849 | 850 | inflight@^1.0.4: 851 | version "1.0.6" 852 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 853 | dependencies: 854 | once "^1.3.0" 855 | wrappy "1" 856 | 857 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 858 | version "2.0.3" 859 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 860 | 861 | inquirer@^3.0.6: 862 | version "3.3.0" 863 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 864 | dependencies: 865 | ansi-escapes "^3.0.0" 866 | chalk "^2.0.0" 867 | cli-cursor "^2.1.0" 868 | cli-width "^2.0.0" 869 | external-editor "^2.0.4" 870 | figures "^2.0.0" 871 | lodash "^4.3.0" 872 | mute-stream "0.0.7" 873 | run-async "^2.2.0" 874 | rx-lite "^4.0.8" 875 | rx-lite-aggregates "^4.0.8" 876 | string-width "^2.1.0" 877 | strip-ansi "^4.0.0" 878 | through "^2.3.6" 879 | 880 | is-arrayish@^0.2.1: 881 | version "0.2.1" 882 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 883 | 884 | is-buffer@^1.1.5: 885 | version "1.1.6" 886 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 887 | 888 | is-builtin-module@^1.0.0: 889 | version "1.0.0" 890 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 891 | dependencies: 892 | builtin-modules "^1.0.0" 893 | 894 | is-dotfile@^1.0.0: 895 | version "1.0.3" 896 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 897 | 898 | is-equal-shallow@^0.1.3: 899 | version "0.1.3" 900 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 901 | dependencies: 902 | is-primitive "^2.0.0" 903 | 904 | is-extendable@^0.1.1: 905 | version "0.1.1" 906 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 907 | 908 | is-extglob@^1.0.0: 909 | version "1.0.0" 910 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 911 | 912 | is-fullwidth-code-point@^2.0.0: 913 | version "2.0.0" 914 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 915 | 916 | is-glob@^2.0.0, is-glob@^2.0.1: 917 | version "2.0.1" 918 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 919 | dependencies: 920 | is-extglob "^1.0.0" 921 | 922 | is-number@^2.1.0: 923 | version "2.1.0" 924 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 925 | dependencies: 926 | kind-of "^3.0.2" 927 | 928 | is-number@^3.0.0: 929 | version "3.0.0" 930 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 931 | dependencies: 932 | kind-of "^3.0.2" 933 | 934 | is-path-cwd@^1.0.0: 935 | version "1.0.0" 936 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 937 | 938 | is-path-in-cwd@^1.0.0: 939 | version "1.0.1" 940 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 941 | dependencies: 942 | is-path-inside "^1.0.0" 943 | 944 | is-path-inside@^1.0.0: 945 | version "1.0.1" 946 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 947 | dependencies: 948 | path-is-inside "^1.0.1" 949 | 950 | is-posix-bracket@^0.1.0: 951 | version "0.1.1" 952 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 953 | 954 | is-primitive@^2.0.0: 955 | version "2.0.0" 956 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 957 | 958 | is-promise@^2.1.0: 959 | version "2.1.0" 960 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 961 | 962 | is-resolvable@^1.0.0: 963 | version "1.1.0" 964 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 965 | 966 | is-typedarray@~1.0.0: 967 | version "1.0.0" 968 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 969 | 970 | isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: 971 | version "1.0.0" 972 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 973 | 974 | isexe@^2.0.0: 975 | version "2.0.0" 976 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 977 | 978 | isobject@^2.0.0: 979 | version "2.1.0" 980 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 981 | dependencies: 982 | isarray "1.0.0" 983 | 984 | isstream@~0.1.2: 985 | version "0.1.2" 986 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 987 | 988 | js-tokens@^3.0.2: 989 | version "3.0.2" 990 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 991 | 992 | js-yaml@^3.9.1: 993 | version "3.11.0" 994 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" 995 | dependencies: 996 | argparse "^1.0.7" 997 | esprima "^4.0.0" 998 | 999 | jsbn@~0.1.0: 1000 | version "0.1.1" 1001 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1002 | 1003 | jsdom@^11.8.0: 1004 | version "11.8.0" 1005 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.8.0.tgz#a52e9a7d2b931284f62c80dad5f17d7390499d8b" 1006 | dependencies: 1007 | abab "^1.0.4" 1008 | acorn "^5.3.0" 1009 | acorn-globals "^4.1.0" 1010 | array-equal "^1.0.0" 1011 | cssom ">= 0.3.2 < 0.4.0" 1012 | cssstyle ">= 0.2.37 < 0.3.0" 1013 | data-urls "^1.0.0" 1014 | domexception "^1.0.0" 1015 | escodegen "^1.9.0" 1016 | html-encoding-sniffer "^1.0.2" 1017 | left-pad "^1.2.0" 1018 | nwmatcher "^1.4.3" 1019 | parse5 "4.0.0" 1020 | pn "^1.1.0" 1021 | request "^2.83.0" 1022 | request-promise-native "^1.0.5" 1023 | sax "^1.2.4" 1024 | symbol-tree "^3.2.2" 1025 | tough-cookie "^2.3.3" 1026 | w3c-hr-time "^1.0.1" 1027 | webidl-conversions "^4.0.2" 1028 | whatwg-encoding "^1.0.3" 1029 | whatwg-mimetype "^2.1.0" 1030 | whatwg-url "^6.4.0" 1031 | ws "^4.0.0" 1032 | xml-name-validator "^3.0.0" 1033 | 1034 | json-schema-traverse@^0.3.0: 1035 | version "0.3.1" 1036 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1037 | 1038 | json-schema@0.2.3: 1039 | version "0.2.3" 1040 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1041 | 1042 | json-stable-stringify-without-jsonify@^1.0.1: 1043 | version "1.0.1" 1044 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1045 | 1046 | json-stringify-safe@~5.0.1: 1047 | version "5.0.1" 1048 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1049 | 1050 | jsprim@^1.2.2: 1051 | version "1.4.1" 1052 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1053 | dependencies: 1054 | assert-plus "1.0.0" 1055 | extsprintf "1.3.0" 1056 | json-schema "0.2.3" 1057 | verror "1.10.0" 1058 | 1059 | kind-of@^3.0.2: 1060 | version "3.2.2" 1061 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1062 | dependencies: 1063 | is-buffer "^1.1.5" 1064 | 1065 | kind-of@^4.0.0: 1066 | version "4.0.0" 1067 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1068 | dependencies: 1069 | is-buffer "^1.1.5" 1070 | 1071 | left-pad@^1.2.0: 1072 | version "1.3.0" 1073 | resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" 1074 | 1075 | levn@^0.3.0, levn@~0.3.0: 1076 | version "0.3.0" 1077 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1078 | dependencies: 1079 | prelude-ls "~1.1.2" 1080 | type-check "~0.3.2" 1081 | 1082 | load-json-file@^2.0.0: 1083 | version "2.0.0" 1084 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1085 | dependencies: 1086 | graceful-fs "^4.1.2" 1087 | parse-json "^2.2.0" 1088 | pify "^2.0.0" 1089 | strip-bom "^3.0.0" 1090 | 1091 | locate-path@^2.0.0: 1092 | version "2.0.0" 1093 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1094 | dependencies: 1095 | p-locate "^2.0.0" 1096 | path-exists "^3.0.0" 1097 | 1098 | lodash.sortby@^4.7.0: 1099 | version "4.7.0" 1100 | resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" 1101 | 1102 | lodash@^4.13.1, lodash@^4.17.4, lodash@^4.3.0: 1103 | version "4.17.5" 1104 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" 1105 | 1106 | lru-cache@^4.0.1: 1107 | version "4.1.2" 1108 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" 1109 | dependencies: 1110 | pseudomap "^1.0.2" 1111 | yallist "^2.1.2" 1112 | 1113 | magic-string@^0.22.4: 1114 | version "0.22.5" 1115 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" 1116 | dependencies: 1117 | vlq "^0.2.2" 1118 | 1119 | micromatch@^2.3.11: 1120 | version "2.3.11" 1121 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1122 | dependencies: 1123 | arr-diff "^2.0.0" 1124 | array-unique "^0.2.1" 1125 | braces "^1.8.2" 1126 | expand-brackets "^0.1.4" 1127 | extglob "^0.3.1" 1128 | filename-regex "^2.0.0" 1129 | is-extglob "^1.0.0" 1130 | is-glob "^2.0.1" 1131 | kind-of "^3.0.2" 1132 | normalize-path "^2.0.1" 1133 | object.omit "^2.0.0" 1134 | parse-glob "^3.0.4" 1135 | regex-cache "^0.4.2" 1136 | 1137 | mime-db@~1.33.0: 1138 | version "1.33.0" 1139 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 1140 | 1141 | mime-types@^2.1.12, mime-types@~2.1.17: 1142 | version "2.1.18" 1143 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 1144 | dependencies: 1145 | mime-db "~1.33.0" 1146 | 1147 | mimic-fn@^1.0.0: 1148 | version "1.2.0" 1149 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 1150 | 1151 | minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 1152 | version "3.0.4" 1153 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1154 | dependencies: 1155 | brace-expansion "^1.1.7" 1156 | 1157 | minimist@0.0.8: 1158 | version "0.0.8" 1159 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1160 | 1161 | minimist@^1.2.0: 1162 | version "1.2.0" 1163 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1164 | 1165 | mkdirp@0.5.1, mkdirp@^0.5.1: 1166 | version "0.5.1" 1167 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1168 | dependencies: 1169 | minimist "0.0.8" 1170 | 1171 | mocha@^5.1.1: 1172 | version "5.1.1" 1173 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.1.1.tgz#b774c75609dac05eb48f4d9ba1d827b97fde8a7b" 1174 | dependencies: 1175 | browser-stdout "1.3.1" 1176 | commander "2.11.0" 1177 | debug "3.1.0" 1178 | diff "3.5.0" 1179 | escape-string-regexp "1.0.5" 1180 | glob "7.1.2" 1181 | growl "1.10.3" 1182 | he "1.1.1" 1183 | minimatch "3.0.4" 1184 | mkdirp "0.5.1" 1185 | supports-color "4.4.0" 1186 | 1187 | ms@2.0.0: 1188 | version "2.0.0" 1189 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1190 | 1191 | mute-stream@0.0.7: 1192 | version "0.0.7" 1193 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1194 | 1195 | natural-compare@^1.4.0: 1196 | version "1.4.0" 1197 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1198 | 1199 | normalize-package-data@^2.3.2: 1200 | version "2.4.0" 1201 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1202 | dependencies: 1203 | hosted-git-info "^2.1.4" 1204 | is-builtin-module "^1.0.0" 1205 | semver "2 || 3 || 4 || 5" 1206 | validate-npm-package-license "^3.0.1" 1207 | 1208 | normalize-path@^2.0.1: 1209 | version "2.1.1" 1210 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1211 | dependencies: 1212 | remove-trailing-separator "^1.0.1" 1213 | 1214 | nwmatcher@^1.4.3: 1215 | version "1.4.4" 1216 | resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" 1217 | 1218 | oauth-sign@~0.8.2: 1219 | version "0.8.2" 1220 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1221 | 1222 | object-assign@^4.0.1: 1223 | version "4.1.1" 1224 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1225 | 1226 | object.omit@^2.0.0: 1227 | version "2.0.1" 1228 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1229 | dependencies: 1230 | for-own "^0.1.4" 1231 | is-extendable "^0.1.1" 1232 | 1233 | once@^1.3.0: 1234 | version "1.4.0" 1235 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1236 | dependencies: 1237 | wrappy "1" 1238 | 1239 | onetime@^2.0.0: 1240 | version "2.0.1" 1241 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1242 | dependencies: 1243 | mimic-fn "^1.0.0" 1244 | 1245 | optionator@^0.8.1, optionator@^0.8.2: 1246 | version "0.8.2" 1247 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1248 | dependencies: 1249 | deep-is "~0.1.3" 1250 | fast-levenshtein "~2.0.4" 1251 | levn "~0.3.0" 1252 | prelude-ls "~1.1.2" 1253 | type-check "~0.3.2" 1254 | wordwrap "~1.0.0" 1255 | 1256 | os-homedir@^1.0.1: 1257 | version "1.0.2" 1258 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1259 | 1260 | os-tmpdir@~1.0.2: 1261 | version "1.0.2" 1262 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1263 | 1264 | p-limit@^1.1.0: 1265 | version "1.2.0" 1266 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" 1267 | dependencies: 1268 | p-try "^1.0.0" 1269 | 1270 | p-locate@^2.0.0: 1271 | version "2.0.0" 1272 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1273 | dependencies: 1274 | p-limit "^1.1.0" 1275 | 1276 | p-try@^1.0.0: 1277 | version "1.0.0" 1278 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 1279 | 1280 | parse-glob@^3.0.4: 1281 | version "3.0.4" 1282 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1283 | dependencies: 1284 | glob-base "^0.3.0" 1285 | is-dotfile "^1.0.0" 1286 | is-extglob "^1.0.0" 1287 | is-glob "^2.0.0" 1288 | 1289 | parse-json@^2.2.0: 1290 | version "2.2.0" 1291 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1292 | dependencies: 1293 | error-ex "^1.2.0" 1294 | 1295 | parse5@4.0.0: 1296 | version "4.0.0" 1297 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" 1298 | 1299 | path-exists@^2.0.0: 1300 | version "2.1.0" 1301 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1302 | dependencies: 1303 | pinkie-promise "^2.0.0" 1304 | 1305 | path-exists@^3.0.0: 1306 | version "3.0.0" 1307 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1308 | 1309 | path-is-absolute@^1.0.0: 1310 | version "1.0.1" 1311 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1312 | 1313 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 1314 | version "1.0.2" 1315 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1316 | 1317 | path-parse@^1.0.5: 1318 | version "1.0.5" 1319 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1320 | 1321 | path-type@^2.0.0: 1322 | version "2.0.0" 1323 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1324 | dependencies: 1325 | pify "^2.0.0" 1326 | 1327 | performance-now@^2.1.0: 1328 | version "2.1.0" 1329 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1330 | 1331 | pify@^2.0.0: 1332 | version "2.3.0" 1333 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1334 | 1335 | pinkie-promise@^2.0.0: 1336 | version "2.0.1" 1337 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1338 | dependencies: 1339 | pinkie "^2.0.0" 1340 | 1341 | pinkie@^2.0.0: 1342 | version "2.0.4" 1343 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1344 | 1345 | pkg-dir@^1.0.0: 1346 | version "1.0.0" 1347 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1348 | dependencies: 1349 | find-up "^1.0.0" 1350 | 1351 | pluralize@^7.0.0: 1352 | version "7.0.0" 1353 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 1354 | 1355 | pn@^1.1.0: 1356 | version "1.1.0" 1357 | resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" 1358 | 1359 | prelude-ls@~1.1.2: 1360 | version "1.1.2" 1361 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1362 | 1363 | preserve@^0.2.0: 1364 | version "0.2.0" 1365 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1366 | 1367 | process-nextick-args@~2.0.0: 1368 | version "2.0.0" 1369 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1370 | 1371 | progress@^2.0.0: 1372 | version "2.0.0" 1373 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 1374 | 1375 | pseudomap@^1.0.2: 1376 | version "1.0.2" 1377 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1378 | 1379 | punycode@^1.4.1: 1380 | version "1.4.1" 1381 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1382 | 1383 | punycode@^2.1.0: 1384 | version "2.1.0" 1385 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" 1386 | 1387 | qs@~6.5.1: 1388 | version "6.5.1" 1389 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 1390 | 1391 | randomatic@^1.1.3: 1392 | version "1.1.7" 1393 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 1394 | dependencies: 1395 | is-number "^3.0.0" 1396 | kind-of "^4.0.0" 1397 | 1398 | read-pkg-up@^2.0.0: 1399 | version "2.0.0" 1400 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1401 | dependencies: 1402 | find-up "^2.0.0" 1403 | read-pkg "^2.0.0" 1404 | 1405 | read-pkg@^2.0.0: 1406 | version "2.0.0" 1407 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1408 | dependencies: 1409 | load-json-file "^2.0.0" 1410 | normalize-package-data "^2.3.2" 1411 | path-type "^2.0.0" 1412 | 1413 | readable-stream@^2.2.2: 1414 | version "2.3.6" 1415 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1416 | dependencies: 1417 | core-util-is "~1.0.0" 1418 | inherits "~2.0.3" 1419 | isarray "~1.0.0" 1420 | process-nextick-args "~2.0.0" 1421 | safe-buffer "~5.1.1" 1422 | string_decoder "~1.1.1" 1423 | util-deprecate "~1.0.1" 1424 | 1425 | regex-cache@^0.4.2: 1426 | version "0.4.4" 1427 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 1428 | dependencies: 1429 | is-equal-shallow "^0.1.3" 1430 | 1431 | regexpp@^1.0.1: 1432 | version "1.1.0" 1433 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 1434 | 1435 | remove-trailing-separator@^1.0.1: 1436 | version "1.1.0" 1437 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1438 | 1439 | repeat-element@^1.1.2: 1440 | version "1.1.2" 1441 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1442 | 1443 | repeat-string@^1.5.2: 1444 | version "1.6.1" 1445 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1446 | 1447 | request-promise-core@1.1.1: 1448 | version "1.1.1" 1449 | resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" 1450 | dependencies: 1451 | lodash "^4.13.1" 1452 | 1453 | request-promise-native@^1.0.5: 1454 | version "1.0.5" 1455 | resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" 1456 | dependencies: 1457 | request-promise-core "1.1.1" 1458 | stealthy-require "^1.1.0" 1459 | tough-cookie ">=2.3.3" 1460 | 1461 | request@^2.83.0: 1462 | version "2.85.0" 1463 | resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" 1464 | dependencies: 1465 | aws-sign2 "~0.7.0" 1466 | aws4 "^1.6.0" 1467 | caseless "~0.12.0" 1468 | combined-stream "~1.0.5" 1469 | extend "~3.0.1" 1470 | forever-agent "~0.6.1" 1471 | form-data "~2.3.1" 1472 | har-validator "~5.0.3" 1473 | hawk "~6.0.2" 1474 | http-signature "~1.2.0" 1475 | is-typedarray "~1.0.0" 1476 | isstream "~0.1.2" 1477 | json-stringify-safe "~5.0.1" 1478 | mime-types "~2.1.17" 1479 | oauth-sign "~0.8.2" 1480 | performance-now "^2.1.0" 1481 | qs "~6.5.1" 1482 | safe-buffer "^5.1.1" 1483 | stringstream "~0.0.5" 1484 | tough-cookie "~2.3.3" 1485 | tunnel-agent "^0.6.0" 1486 | uuid "^3.1.0" 1487 | 1488 | require-uncached@^1.0.3: 1489 | version "1.0.3" 1490 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 1491 | dependencies: 1492 | caller-path "^0.1.0" 1493 | resolve-from "^1.0.0" 1494 | 1495 | resolve-from@^1.0.0: 1496 | version "1.0.1" 1497 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 1498 | 1499 | resolve@^1.5.0, resolve@^1.6.0: 1500 | version "1.7.1" 1501 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" 1502 | dependencies: 1503 | path-parse "^1.0.5" 1504 | 1505 | restore-cursor@^2.0.0: 1506 | version "2.0.0" 1507 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1508 | dependencies: 1509 | onetime "^2.0.0" 1510 | signal-exit "^3.0.2" 1511 | 1512 | rimraf@^2.2.8: 1513 | version "2.6.2" 1514 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1515 | dependencies: 1516 | glob "^7.0.5" 1517 | 1518 | rollup-plugin-buble@^0.19.2: 1519 | version "0.19.2" 1520 | resolved "https://registry.yarnpkg.com/rollup-plugin-buble/-/rollup-plugin-buble-0.19.2.tgz#c0590c7d3d475b5ed59f129764ec93710cc6e8dd" 1521 | dependencies: 1522 | buble "^0.19.2" 1523 | rollup-pluginutils "^2.0.1" 1524 | 1525 | rollup-plugin-typescript@^0.8.1: 1526 | version "0.8.1" 1527 | resolved "https://registry.yarnpkg.com/rollup-plugin-typescript/-/rollup-plugin-typescript-0.8.1.tgz#2ff7eecc21cf6bb2b43fc27e5b688952ce71924a" 1528 | dependencies: 1529 | compare-versions "2.0.1" 1530 | object-assign "^4.0.1" 1531 | rollup-pluginutils "^1.3.1" 1532 | tippex "^2.1.1" 1533 | typescript "^1.8.9" 1534 | 1535 | rollup-plugin-virtual@^1.0.1: 1536 | version "1.0.1" 1537 | resolved "https://registry.yarnpkg.com/rollup-plugin-virtual/-/rollup-plugin-virtual-1.0.1.tgz#8227c94c605b981adfe433ea74de3551e42ffeb4" 1538 | 1539 | rollup-pluginutils@^1.3.1: 1540 | version "1.5.2" 1541 | resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" 1542 | dependencies: 1543 | estree-walker "^0.2.1" 1544 | minimatch "^3.0.2" 1545 | 1546 | rollup-pluginutils@^2.0.1: 1547 | version "2.0.1" 1548 | resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" 1549 | dependencies: 1550 | estree-walker "^0.3.0" 1551 | micromatch "^2.3.11" 1552 | 1553 | rollup@^0.58.1: 1554 | version "0.58.1" 1555 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.58.1.tgz#5e2e05ceb103f770868b12c4048c22d3903fa2dd" 1556 | dependencies: 1557 | "@types/estree" "0.0.38" 1558 | "@types/node" "*" 1559 | 1560 | rollup@^0.64.1: 1561 | version "0.64.1" 1562 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.64.1.tgz#9188ee368e5fcd43ffbc00ec414e72eeb5de87ba" 1563 | dependencies: 1564 | "@types/estree" "0.0.39" 1565 | "@types/node" "*" 1566 | 1567 | run-async@^2.2.0: 1568 | version "2.3.0" 1569 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1570 | dependencies: 1571 | is-promise "^2.1.0" 1572 | 1573 | rx-lite-aggregates@^4.0.8: 1574 | version "4.0.8" 1575 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 1576 | dependencies: 1577 | rx-lite "*" 1578 | 1579 | rx-lite@*, rx-lite@^4.0.8: 1580 | version "4.0.8" 1581 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 1582 | 1583 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1584 | version "5.1.1" 1585 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1586 | 1587 | safer-buffer@^2.1.0: 1588 | version "2.1.2" 1589 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1590 | 1591 | sax@^1.2.4: 1592 | version "1.2.4" 1593 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1594 | 1595 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 1596 | version "5.5.0" 1597 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 1598 | 1599 | shebang-command@^1.2.0: 1600 | version "1.2.0" 1601 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1602 | dependencies: 1603 | shebang-regex "^1.0.0" 1604 | 1605 | shebang-regex@^1.0.0: 1606 | version "1.0.0" 1607 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1608 | 1609 | signal-exit@^3.0.2: 1610 | version "3.0.2" 1611 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1612 | 1613 | slice-ansi@1.0.0: 1614 | version "1.0.0" 1615 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 1616 | dependencies: 1617 | is-fullwidth-code-point "^2.0.0" 1618 | 1619 | sntp@2.x.x: 1620 | version "2.1.0" 1621 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" 1622 | dependencies: 1623 | hoek "4.x.x" 1624 | 1625 | source-map@~0.6.1: 1626 | version "0.6.1" 1627 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1628 | 1629 | spdx-correct@^3.0.0: 1630 | version "3.0.0" 1631 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" 1632 | dependencies: 1633 | spdx-expression-parse "^3.0.0" 1634 | spdx-license-ids "^3.0.0" 1635 | 1636 | spdx-exceptions@^2.1.0: 1637 | version "2.1.0" 1638 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" 1639 | 1640 | spdx-expression-parse@^3.0.0: 1641 | version "3.0.0" 1642 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" 1643 | dependencies: 1644 | spdx-exceptions "^2.1.0" 1645 | spdx-license-ids "^3.0.0" 1646 | 1647 | spdx-license-ids@^3.0.0: 1648 | version "3.0.0" 1649 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" 1650 | 1651 | sprintf-js@~1.0.2: 1652 | version "1.0.3" 1653 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1654 | 1655 | sshpk@^1.7.0: 1656 | version "1.14.1" 1657 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" 1658 | dependencies: 1659 | asn1 "~0.2.3" 1660 | assert-plus "^1.0.0" 1661 | dashdash "^1.12.0" 1662 | getpass "^0.1.1" 1663 | optionalDependencies: 1664 | bcrypt-pbkdf "^1.0.0" 1665 | ecc-jsbn "~0.1.1" 1666 | jsbn "~0.1.0" 1667 | tweetnacl "~0.14.0" 1668 | 1669 | stealthy-require@^1.1.0: 1670 | version "1.1.1" 1671 | resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" 1672 | 1673 | string-width@^2.1.0, string-width@^2.1.1: 1674 | version "2.1.1" 1675 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1676 | dependencies: 1677 | is-fullwidth-code-point "^2.0.0" 1678 | strip-ansi "^4.0.0" 1679 | 1680 | string_decoder@~1.1.1: 1681 | version "1.1.1" 1682 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1683 | dependencies: 1684 | safe-buffer "~5.1.0" 1685 | 1686 | stringstream@~0.0.5: 1687 | version "0.0.5" 1688 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1689 | 1690 | strip-ansi@^3.0.0: 1691 | version "3.0.1" 1692 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1693 | dependencies: 1694 | ansi-regex "^2.0.0" 1695 | 1696 | strip-ansi@^4.0.0: 1697 | version "4.0.0" 1698 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1699 | dependencies: 1700 | ansi-regex "^3.0.0" 1701 | 1702 | strip-bom@^3.0.0: 1703 | version "3.0.0" 1704 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1705 | 1706 | strip-json-comments@~2.0.1: 1707 | version "2.0.1" 1708 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1709 | 1710 | supports-color@4.4.0: 1711 | version "4.4.0" 1712 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 1713 | dependencies: 1714 | has-flag "^2.0.0" 1715 | 1716 | supports-color@^2.0.0: 1717 | version "2.0.0" 1718 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1719 | 1720 | supports-color@^5.3.0: 1721 | version "5.4.0" 1722 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 1723 | dependencies: 1724 | has-flag "^3.0.0" 1725 | 1726 | svelte@^2.0.0: 1727 | version "2.0.0" 1728 | resolved "https://registry.yarnpkg.com/svelte/-/svelte-2.0.0.tgz#d10eafbdae89a66b02ac05ef913e8288c031b71c" 1729 | 1730 | symbol-tree@^3.2.2: 1731 | version "3.2.2" 1732 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" 1733 | 1734 | table@4.0.2: 1735 | version "4.0.2" 1736 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 1737 | dependencies: 1738 | ajv "^5.2.3" 1739 | ajv-keywords "^2.1.0" 1740 | chalk "^2.1.0" 1741 | lodash "^4.17.4" 1742 | slice-ansi "1.0.0" 1743 | string-width "^2.1.1" 1744 | 1745 | text-table@~0.2.0: 1746 | version "0.2.0" 1747 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1748 | 1749 | through@^2.3.6: 1750 | version "2.3.8" 1751 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1752 | 1753 | tippex@^2.1.1: 1754 | version "2.3.1" 1755 | resolved "https://registry.yarnpkg.com/tippex/-/tippex-2.3.1.tgz#a2fd5b7087d7cbfb20c9806a6c16108c2c0fafda" 1756 | 1757 | tmp@^0.0.33: 1758 | version "0.0.33" 1759 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1760 | dependencies: 1761 | os-tmpdir "~1.0.2" 1762 | 1763 | tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.3: 1764 | version "2.3.4" 1765 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" 1766 | dependencies: 1767 | punycode "^1.4.1" 1768 | 1769 | tr46@^1.0.0: 1770 | version "1.0.1" 1771 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" 1772 | dependencies: 1773 | punycode "^2.1.0" 1774 | 1775 | tunnel-agent@^0.6.0: 1776 | version "0.6.0" 1777 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1778 | dependencies: 1779 | safe-buffer "^5.0.1" 1780 | 1781 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1782 | version "0.14.5" 1783 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1784 | 1785 | type-check@~0.3.2: 1786 | version "0.3.2" 1787 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1788 | dependencies: 1789 | prelude-ls "~1.1.2" 1790 | 1791 | typedarray@^0.0.6: 1792 | version "0.0.6" 1793 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1794 | 1795 | typescript@^1.8.9: 1796 | version "1.8.10" 1797 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-1.8.10.tgz#b475d6e0dff0bf50f296e5ca6ef9fbb5c7320f1e" 1798 | 1799 | typescript@^2.4.2: 1800 | version "2.8.1" 1801 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624" 1802 | 1803 | util-deprecate@~1.0.1: 1804 | version "1.0.2" 1805 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1806 | 1807 | uuid@^3.1.0: 1808 | version "3.2.1" 1809 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" 1810 | 1811 | validate-npm-package-license@^3.0.1: 1812 | version "3.0.3" 1813 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" 1814 | dependencies: 1815 | spdx-correct "^3.0.0" 1816 | spdx-expression-parse "^3.0.0" 1817 | 1818 | verror@1.10.0: 1819 | version "1.10.0" 1820 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1821 | dependencies: 1822 | assert-plus "^1.0.0" 1823 | core-util-is "1.0.2" 1824 | extsprintf "^1.2.0" 1825 | 1826 | vlq@^0.2.2: 1827 | version "0.2.3" 1828 | resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" 1829 | 1830 | vlq@^1.0.0: 1831 | version "1.0.0" 1832 | resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806" 1833 | 1834 | w3c-hr-time@^1.0.1: 1835 | version "1.0.1" 1836 | resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" 1837 | dependencies: 1838 | browser-process-hrtime "^0.1.2" 1839 | 1840 | webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: 1841 | version "4.0.2" 1842 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 1843 | 1844 | whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: 1845 | version "1.0.3" 1846 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" 1847 | dependencies: 1848 | iconv-lite "0.4.19" 1849 | 1850 | whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: 1851 | version "2.1.0" 1852 | resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" 1853 | 1854 | whatwg-url@^6.4.0: 1855 | version "6.4.0" 1856 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" 1857 | dependencies: 1858 | lodash.sortby "^4.7.0" 1859 | tr46 "^1.0.0" 1860 | webidl-conversions "^4.0.1" 1861 | 1862 | which@^1.2.9: 1863 | version "1.3.0" 1864 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 1865 | dependencies: 1866 | isexe "^2.0.0" 1867 | 1868 | wordwrap@~1.0.0: 1869 | version "1.0.0" 1870 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1871 | 1872 | wrappy@1: 1873 | version "1.0.2" 1874 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1875 | 1876 | write@^0.2.1: 1877 | version "0.2.1" 1878 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1879 | dependencies: 1880 | mkdirp "^0.5.1" 1881 | 1882 | ws@^4.0.0: 1883 | version "4.1.0" 1884 | resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" 1885 | dependencies: 1886 | async-limiter "~1.0.0" 1887 | safe-buffer "~5.1.0" 1888 | 1889 | xml-name-validator@^3.0.0: 1890 | version "3.0.0" 1891 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" 1892 | 1893 | yallist@^2.1.2: 1894 | version "2.1.2" 1895 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1896 | --------------------------------------------------------------------------------