From 62de7d0a1b994b69032a759b796b486e6bc382e3 Mon Sep 17 00:00:00 2001 From: Saivan Date: Sun, 25 Nov 2018 16:21:53 +1300 Subject: Changed the esLint rules to avoid silly ternary operators, and to let code breathe! This commit modifies some of the eslint rules, to allow our code to be a little bit more readable. This came about because we had a particularly pesky problem, where the code was indenting ternary operators. This fixes that, and makes it easy to add new rules to eslint as we please in the future. Changes ======= - Rebuilt the library with new eslint rules - Changed the eslintrc file to a yaml file by default --- src/animation/Animator.js | 70 +++- src/animation/Controller.js | 252 ++++++++---- src/animation/Queue.js | 36 +- src/animation/Runner.js | 842 +++++++++++++++++++++++++------------- src/animation/Timeline.js | 194 ++++++--- src/elements/A.js | 50 ++- src/elements/Bare.js | 34 +- src/elements/Circle.js | 52 ++- src/elements/ClipPath.js | 50 ++- src/elements/Container.js | 30 +- src/elements/Defs.js | 22 +- src/elements/Dom.js | 268 ++++++++---- src/elements/Element.js | 142 ++++--- src/elements/Ellipse.js | 34 +- src/elements/G.js | 22 +- src/elements/Gradient.js | 66 ++- src/elements/HtmlNode.js | 2 +- src/elements/Image.js | 96 +++-- src/elements/Line.js | 68 +-- src/elements/Marker.js | 82 ++-- src/elements/Mask.js | 50 ++- src/elements/Path.js | 78 ++-- src/elements/Pattern.js | 58 ++- src/elements/Polygon.js | 26 +- src/elements/Polyline.js | 26 +- src/elements/Rect.js | 24 +- src/elements/Shape.js | 2 +- src/elements/Stop.js | 24 +- src/elements/Style.js | 64 +-- src/elements/Svg.js | 72 ++-- src/elements/Symbol.js | 22 +- src/elements/Text.js | 174 +++++--- src/elements/TextPath.js | 78 ++-- src/elements/Tspan.js | 56 ++- src/elements/Use.js | 28 +- src/main.js | 40 +- src/modules/core/attr.js | 104 +++-- src/modules/core/circled.js | 52 ++- src/modules/core/event.js | 160 +++++--- src/modules/core/gradiented.js | 20 +- src/modules/core/parser.js | 16 +- src/modules/core/pointed.js | 24 +- src/modules/core/poly.js | 30 +- src/modules/core/selector.js | 18 +- src/modules/core/textable.js | 12 +- src/modules/optional/arrange.js | 82 ++-- src/modules/optional/class.js | 48 ++- src/modules/optional/css.js | 80 ++-- src/modules/optional/data.js | 38 +- src/modules/optional/memory.js | 38 +- src/modules/optional/sugar.js | 240 +++++++---- src/modules/optional/transform.js | 78 ++-- src/svg.js | 8 +- src/types/ArrayPolyfill.js | 34 +- src/types/Box.js | 152 ++++--- src/types/EventTarget.js | 50 ++- src/types/List.js | 58 ++- src/types/Matrix.js | 382 ++++++++++------- src/types/Morphable.js | 232 +++++++---- src/types/PathArray.js | 338 ++++++++++----- src/types/Point.js | 36 +- src/types/PointArray.js | 104 +++-- src/types/SVGArray.js | 48 ++- src/types/SVGNumber.js | 94 +++-- src/utils/adopter.js | 156 ++++--- src/utils/methods.js | 50 ++- src/utils/utils.js | 98 +++-- src/utils/window.js | 4 +- 68 files changed, 4079 insertions(+), 2039 deletions(-) (limited to 'src') diff --git a/src/animation/Animator.js b/src/animation/Animator.js index 9b460f5..e9d5797 100644 --- a/src/animation/Animator.js +++ b/src/animation/Animator.js @@ -8,78 +8,106 @@ const Animator = { timer: globals.window.performance || globals.window.Date, transforms: [], - frame (fn) { + frame ( fn ) { + // Store the node - var node = Animator.frames.push({ run: fn }) + var node = Animator.frames.push( { run: fn } ) // Request an animation frame if we don't have one - if (Animator.nextDraw === null) { - Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw) + if ( Animator.nextDraw === null ) { + + Animator.nextDraw = globals.window.requestAnimationFrame( Animator._draw ) + } // Return the node so we can remove it easily return node + }, - transform_frame (fn, id) { + transform_frame ( fn, id ) { + Animator.transforms[id] = fn + }, - timeout (fn, delay) { + timeout ( fn, delay ) { + delay = delay || 0 // Work out when the event should fire var time = Animator.timer.now() + delay // Add the timeout to the end of the queue - var node = Animator.timeouts.push({ run: fn, time: time }) + var node = Animator.timeouts.push( { run: fn, time: time } ) // Request another animation frame if we need one - if (Animator.nextDraw === null) { - Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw) + if ( Animator.nextDraw === null ) { + + Animator.nextDraw = globals.window.requestAnimationFrame( Animator._draw ) + } return node + }, - cancelFrame (node) { - Animator.frames.remove(node) + cancelFrame ( node ) { + + Animator.frames.remove( node ) + }, - clearTimeout (node) { - Animator.timeouts.remove(node) + clearTimeout ( node ) { + + Animator.timeouts.remove( node ) + }, - _draw (now) { + _draw ( now ) { + // Run all the timeouts we can run, if they are not ready yet, add them // to the end of the queue immediately! (bad timeouts!!! [sarcasm]) var nextTimeout = null var lastTimeout = Animator.timeouts.last() - while ((nextTimeout = Animator.timeouts.shift())) { + while ( ( nextTimeout = Animator.timeouts.shift() ) ) { + // Run the timeout if its time, or push it to the end - if (now >= nextTimeout.time) { + if ( now >= nextTimeout.time ) { + nextTimeout.run() + } else { - Animator.timeouts.push(nextTimeout) + + Animator.timeouts.push( nextTimeout ) + } // If we hit the last item, we should stop shifting out more items - if (nextTimeout === lastTimeout) break + if ( nextTimeout === lastTimeout ) break + } // Run all of the animation frames var nextFrame = null var lastFrame = Animator.frames.last() - while ((nextFrame !== lastFrame) && (nextFrame = Animator.frames.shift())) { + while ( ( nextFrame !== lastFrame ) && ( nextFrame = Animator.frames.shift() ) ) { + nextFrame.run() + } - Animator.transforms.forEach(function (el) { el() }) + Animator.transforms.forEach( function ( el ) { + + el() + + } ) // If we have remaining timeouts or frames, draw until we don't anymore Animator.nextDraw = Animator.timeouts.first() || Animator.frames.first() - ? globals.window.requestAnimationFrame(Animator._draw) + ? globals.window.requestAnimationFrame( Animator._draw ) : null + } } diff --git a/src/animation/Controller.js b/src/animation/Controller.js index cee7115..9efe87e 100644 --- a/src/animation/Controller.js +++ b/src/animation/Controller.js @@ -7,85 +7,149 @@ Base Class The base stepper class that will be ***/ -function makeSetterGetter (k, f) { - return function (v) { - if (v == null) return this[v] +function makeSetterGetter ( k, f ) { + + return function ( v ) { + + if ( v == null ) return this[v] this[k] = v - if (f) f.call(this) + if ( f ) f.call( this ) return this + } + } export let easing = { - '-': function (pos) { return pos }, - '<>': function (pos) { return -Math.cos(pos * Math.PI) / 2 + 0.5 }, - '>': function (pos) { return Math.sin(pos * Math.PI / 2) }, - '<': function (pos) { return -Math.cos(pos * Math.PI / 2) + 1 }, - bezier: function (x1, y1, x2, y2) { + '-': function ( pos ) { + + return pos + + }, + '<>': function ( pos ) { + + return -Math.cos( pos * Math.PI ) / 2 + 0.5 + + }, + '>': function ( pos ) { + + return Math.sin( pos * Math.PI / 2 ) + + }, + '<': function ( pos ) { + + return -Math.cos( pos * Math.PI / 2 ) + 1 + + }, + bezier: function ( x1, y1, x2, y2 ) { + // see https://www.w3.org/TR/css-easing-1/#cubic-bezier-algo - return function (t) { - if (t < 0) { - if (x1 > 0) { + return function ( t ) { + + if ( t < 0 ) { + + if ( x1 > 0 ) { + return y1 / x1 * t - } else if (x2 > 0) { + + } else if ( x2 > 0 ) { + return y2 / x2 * t + } else { + return 0 + } - } else if (t > 1) { - if (x2 < 1) { - return (1 - y2) / (1 - x2) * t + (y2 - x2) / (1 - x2) - } else if (x1 < 1) { - return (1 - y1) / (1 - x1) * t + (y1 - x1) / (1 - x1) + + } else if ( t > 1 ) { + + if ( x2 < 1 ) { + + return ( 1 - y2 ) / ( 1 - x2 ) * t + ( y2 - x2 ) / ( 1 - x2 ) + + } else if ( x1 < 1 ) { + + return ( 1 - y1 ) / ( 1 - x1 ) * t + ( y1 - x1 ) / ( 1 - x1 ) + } else { + return 1 + } + } else { - return 3 * t * (1 - t) ** 2 * y1 + 3 * t ** 2 * (1 - t) * y2 + t ** 3 + + return 3 * t * ( 1 - t ) ** 2 * y1 + 3 * t ** 2 * ( 1 - t ) * y2 + t ** 3 + } + } + }, // see https://www.w3.org/TR/css-easing-1/#step-timing-function-algo - steps: function (steps, stepPosition = 'end') { + steps: function ( steps, stepPosition = 'end' ) { + // deal with "jump-" prefix - stepPosition = stepPosition.split('-').reverse()[0] + stepPosition = stepPosition.split( '-' ).reverse()[0] let jumps = steps - if (stepPosition === 'none') { + if ( stepPosition === 'none' ) { + --jumps - } else if (stepPosition === 'both') { + + } else if ( stepPosition === 'both' ) { + ++jumps + } // The beforeFlag is essentially useless - return (t, beforeFlag = false) => { + return ( t, beforeFlag = false ) => { + // Step is called currentStep in referenced url - let step = Math.floor(t * steps) - const jumping = (t * step) % 1 === 0 + let step = Math.floor( t * steps ) + const jumping = ( t * step ) % 1 === 0 + + if ( stepPosition === 'start' || stepPosition === 'both' ) { - if (stepPosition === 'start' || stepPosition === 'both') { ++step + } - if (beforeFlag && jumping) { + if ( beforeFlag && jumping ) { + --step + } - if (t >= 0 && step < 0) { + if ( t >= 0 && step < 0 ) { + step = 0 + } - if (t <= 1 && step > jumps) { + if ( t <= 1 && step > jumps ) { + step = jumps + } return step / jumps + } + } } export class Stepper { - done () { return false } + + done () { + + return false + + } + } /*** @@ -94,17 +158,25 @@ Easing Functions ***/ export class Ease extends Stepper { - constructor (fn) { + + constructor ( fn ) { + super() this.ease = easing[fn || timeline.ease] || fn + } - step (from, to, pos) { - if (typeof from !== 'number') { + step ( from, to, pos ) { + + if ( typeof from !== 'number' ) { + return pos < 1 ? from : to + } - return from + (to - from) * this.ease(pos) + return from + ( to - from ) * this.ease( pos ) + } + } /*** @@ -113,51 +185,65 @@ Controller Types ***/ export class Controller extends Stepper { - constructor (fn) { + + constructor ( fn ) { + super() this.stepper = fn + } - step (current, target, dt, c) { - return this.stepper(current, target, dt, c) + step ( current, target, dt, c ) { + + return this.stepper( current, target, dt, c ) + } - done (c) { + done ( c ) { + return c.done + } + } function recalculate () { + // Apply the default parameters - var duration = (this._duration || 500) / 1000 + var duration = ( this._duration || 500 ) / 1000 var overshoot = this._overshoot || 0 // Calculate the PID natural response var eps = 1e-10 var pi = Math.PI - var os = Math.log(overshoot / 100 + eps) - var zeta = -os / Math.sqrt(pi * pi + os * os) - var wn = 3.9 / (zeta * duration) + var os = Math.log( overshoot / 100 + eps ) + var zeta = -os / Math.sqrt( pi * pi + os * os ) + var wn = 3.9 / ( zeta * duration ) // Calculate the Spring values this.d = 2 * zeta * wn this.k = wn * wn + } export class Spring extends Controller { - constructor (duration, overshoot) { + + constructor ( duration, overshoot ) { + super() - this.duration(duration || 500) - .overshoot(overshoot || 0) + this.duration( duration || 500 ) + .overshoot( overshoot || 0 ) + } - step (current, target, dt, c) { - if (typeof current === 'string') return current + step ( current, target, dt, c ) { + + if ( typeof current === 'string' ) return current c.done = dt === Infinity - if (dt === Infinity) return target - if (dt === 0) return current + if ( dt === Infinity ) return target + if ( dt === 0 ) return current - if (dt > 100) dt = 16 + if ( dt > 100 ) dt = 16 dt /= 1000 @@ -165,65 +251,75 @@ export class Spring extends Controller { var velocity = c.velocity || 0 // Apply the control to get the new position and store it - var acceleration = -this.d * velocity - this.k * (current - target) - var newPosition = current + - velocity * dt + - acceleration * dt * dt / 2 + var acceleration = -this.d * velocity - this.k * ( current - target ) + var newPosition = current + + velocity * dt + + acceleration * dt * dt / 2 // Store the velocity c.velocity = velocity + acceleration * dt // Figure out if we have converged, and if so, pass the value - c.done = Math.abs(target - newPosition) + Math.abs(velocity) < 0.002 + c.done = Math.abs( target - newPosition ) + Math.abs( velocity ) < 0.002 return c.done ? target : newPosition + } + } -extend(Spring, { - duration: makeSetterGetter('_duration', recalculate), - overshoot: makeSetterGetter('_overshoot', recalculate) -}) +extend( Spring, { + duration: makeSetterGetter( '_duration', recalculate ), + overshoot: makeSetterGetter( '_overshoot', recalculate ) +} ) export class PID extends Controller { - constructor (p, i, d, windup) { + + constructor ( p, i, d, windup ) { + super() p = p == null ? 0.1 : p i = i == null ? 0.01 : i d = d == null ? 0 : d windup = windup == null ? 1000 : windup - this.p(p).i(i).d(d).windup(windup) + this.p( p ).i( i ).d( d ).windup( windup ) + } - step (current, target, dt, c) { - if (typeof current === 'string') return current + step ( current, target, dt, c ) { + + if ( typeof current === 'string' ) return current c.done = dt === Infinity - if (dt === Infinity) return target - if (dt === 0) return current + if ( dt === Infinity ) return target + if ( dt === 0 ) return current var p = target - current - var i = (c.integral || 0) + p * dt - var d = (p - (c.error || 0)) / dt + var i = ( c.integral || 0 ) + p * dt + var d = ( p - ( c.error || 0 ) ) / dt var windup = this.windup // antiwindup - if (windup !== false) { - i = Math.max(-windup, Math.min(i, windup)) + if ( windup !== false ) { + + i = Math.max( -windup, Math.min( i, windup ) ) + } c.error = p c.integral = i - c.done = Math.abs(p) < 0.001 + c.done = Math.abs( p ) < 0.001 + + return c.done ? target : current + ( this.P * p + this.I * i + this.D * d ) - return c.done ? target : current + (this.P * p + this.I * i + this.D * d) } + } -extend(PID, { - windup: makeSetterGetter('windup'), - p: makeSetterGetter('P'), - i: makeSetterGetter('I'), - d: makeSetterGetter('D') -}) +extend( PID, { + windup: makeSetterGetter( 'windup' ), + p: makeSetterGetter( 'P' ), + i: makeSetterGetter( 'I' ), + d: makeSetterGetter( 'D' ) +} ) diff --git a/src/animation/Queue.js b/src/animation/Queue.js index 14b92b4..b4e2722 100644 --- a/src/animation/Queue.js +++ b/src/animation/Queue.js @@ -1,59 +1,77 @@ export default class Queue { + constructor () { + this._first = null this._last = null + } - push (value) { + push ( value ) { + // An item stores an id and the provided value var item = value.next ? value : { value: value, next: null, prev: null } // Deal with the queue being empty or populated - if (this._last) { + if ( this._last ) { + item.prev = this._last this._last.next = item this._last = item + } else { + this._last = item this._first = item + } // Update the length and return the current item return item + } shift () { + // Check if we have a value var remove = this._first - if (!remove) return null + if ( !remove ) return null // If we do, remove it and relink things this._first = remove.next - if (this._first) this._first.prev = null + if ( this._first ) this._first.prev = null this._last = this._first ? this._last : null return remove.value + } // Shows us the first item in the list first () { + return this._first && this._first.value + } // Shows us the last item in the list last () { + return this._last && this._last.value + } // Removes the item that was returned from the push - remove (item) { + remove ( item ) { + // Relink the previous item - if (item.prev) item.prev.next = item.next - if (item.next) item.next.prev = item.prev - if (item === this._last) this._last = item.prev - if (item === this._first) this._first = item.next + if ( item.prev ) item.prev.next = item.next + if ( item.next ) item.next.prev = item.prev + if ( item === this._last ) this._last = item.prev + if ( item === this._first ) this._first = item.next // Invalidate item item.prev = null item.next = null + } + } diff --git a/src/animation/Runner.js b/src/animation/Runner.js index 47929fd..d2c7bdf 100644 --- a/src/animation/Runner.js +++ b/src/animation/Runner.js @@ -15,7 +15,9 @@ import SVGNumber from '../types/SVGNumber.js' import Timeline from './Timeline.js' export default class Runner extends EventTarget { - constructor (options) { + + constructor ( options ) { + super() // Store a unique id on the runner, so that we can identify it later @@ -28,7 +30,7 @@ export default class Runner extends EventTarget { // Ensure that we get a controller options = typeof options === 'function' - ? new Controller(options) + ? new Controller( options ) : options // Declare all of the variables @@ -61,6 +63,7 @@ export default class Runner extends EventTarget { this._swing = false this._wait = 0 this._times = 1 + } /* @@ -70,58 +73,75 @@ export default class Runner extends EventTarget { help us make new runners from the current runner */ - element (element) { - if (element == null) return this._element + element ( element ) { + + if ( element == null ) return this._element this._element = element element._prepareRunner() return this + } - timeline (timeline) { + timeline ( timeline ) { + // check explicitly for undefined so we can set the timeline to null - if (typeof timeline === 'undefined') return this._timeline + if ( typeof timeline === 'undefined' ) return this._timeline this._timeline = timeline return this + } - animate (duration, delay, when) { - var o = Runner.sanitise(duration, delay, when) - var runner = new Runner(o.duration) - if (this._timeline) runner.timeline(this._timeline) - if (this._element) runner.element(this._element) - return runner.loop(o).schedule(delay, when) + animate ( duration, delay, when ) { + + var o = Runner.sanitise( duration, delay, when ) + var runner = new Runner( o.duration ) + if ( this._timeline ) runner.timeline( this._timeline ) + if ( this._element ) runner.element( this._element ) + return runner.loop( o ).schedule( delay, when ) + } - schedule (timeline, delay, when) { + schedule ( timeline, delay, when ) { + // The user doesn't need to pass a timeline if we already have one - if (!(timeline instanceof Timeline)) { + if ( !( timeline instanceof Timeline ) ) { + when = delay delay = timeline timeline = this.timeline() + } // If there is no timeline, yell at the user... - if (!timeline) { - throw Error('Runner cannot be scheduled without timeline') + if ( !timeline ) { + + throw Error( 'Runner cannot be scheduled without timeline' ) + } // Schedule the runner on the timeline provided - timeline.schedule(this, delay, when) + timeline.schedule( this, delay, when ) return this + } unschedule () { + var timeline = this.timeline() - timeline && timeline.unschedule(this) + timeline && timeline.unschedule( this ) return this + } - loop (times, swing, wait) { + loop ( times, swing, wait ) { + // Deal with the user passing in an object - if (typeof times === 'object') { + if ( typeof times === 'object' ) { + swing = times.swing wait = times.wait times = times.times + } // Sanitise the values and store them @@ -129,10 +149,13 @@ export default class Runner extends EventTarget { this._swing = swing || false this._wait = wait || 0 return this + } - delay (delay) { - return this.animate(0, delay) + delay ( delay ) { + + return this.animate( 0, delay ) + } /* @@ -141,26 +164,32 @@ export default class Runner extends EventTarget { These methods allow us to attach basic functions to the runner directly */ - queue (initFn, runFn, retargetFn, isTransform) { - this._queue.push({ + queue ( initFn, runFn, retargetFn, isTransform ) { + + this._queue.push( { initialiser: initFn || noop, runner: runFn || noop, retarget: retargetFn, isTransform: isTransform, initialised: false, finished: false - }) + } ) var timeline = this.timeline() timeline && this.timeline()._continue() return this + } - during (fn) { - return this.queue(null, fn) + during ( fn ) { + + return this.queue( null, fn ) + } - after (fn) { - return this.on('finish', fn) + after ( fn ) { + + return this.on( 'finish', fn ) + } /* @@ -169,34 +198,45 @@ export default class Runner extends EventTarget { Control how the animation plays */ - time (time) { - if (time == null) { + time ( time ) { + + if ( time == null ) { + return this._time + } let dt = time - this._time - this.step(dt) + this.step( dt ) return this + } duration () { - return this._times * (this._wait + this._duration) - this._wait + + return this._times * ( this._wait + this._duration ) - this._wait + } - loops (p) { + loops ( p ) { + var loopDuration = this._duration + this._wait - if (p == null) { - var loopsDone = Math.floor(this._time / loopDuration) - var relativeTime = (this._time - loopsDone * loopDuration) + if ( p == null ) { + + var loopsDone = Math.floor( this._time / loopDuration ) + var relativeTime = ( this._time - loopsDone * loopDuration ) var position = relativeTime / this._duration - return Math.min(loopsDone + position, this._times) + return Math.min( loopsDone + position, this._times ) + } - var whole = Math.floor(p) + var whole = Math.floor( p ) var partial = p % 1 var time = loopDuration * whole + this._duration * partial - return this.time(time) + return this.time( time ) + } - position (p) { + position ( p ) { + // Get all of the variables we need var x = this._time var d = this._duration @@ -206,7 +246,8 @@ export default class Runner extends EventTarget { var r = this._reverse var position - if (p == null) { + if ( p == null ) { + /* This function converts a time to a position in the range [0, 1] The full explanation can be found in this desmos demonstration @@ -215,40 +256,49 @@ export default class Runner extends EventTarget { */ // Figure out the value without thinking about the start or end time - const f = function (x) { - var swinging = s * Math.floor(x % (2 * (w + d)) / (w + d)) - var backwards = (swinging && !r) || (!swinging && r) - var uncliped = Math.pow(-1, backwards) * (x % (w + d)) / d + backwards - var clipped = Math.max(Math.min(uncliped, 1), 0) + const f = function ( x ) { + + var swinging = s * Math.floor( x % ( 2 * ( w + d ) ) / ( w + d ) ) + var backwards = ( swinging && !r ) || ( !swinging && r ) + var uncliped = Math.pow( -1, backwards ) * ( x % ( w + d ) ) / d + backwards + var clipped = Math.max( Math.min( uncliped, 1 ), 0 ) return clipped + } // Figure out the value by incorporating the start time - var endTime = t * (w + d) - w - position = x <= 0 ? Math.round(f(1e-5)) - : x < endTime ? f(x) - : Math.round(f(endTime - 1e-5)) + var endTime = t * ( w + d ) - w + position = x <= 0 ? Math.round( f( 1e-5 ) ) + : x < endTime ? f( x ) + : Math.round( f( endTime - 1e-5 ) ) return position + } // Work out the loops done and add the position to the loops done - var loopsDone = Math.floor(this.loops()) - var swingForward = s && (loopsDone % 2 === 0) - var forwards = (swingForward && !r) || (r && swingForward) - position = loopsDone + (forwards ? p : 1 - p) - return this.loops(position) + var loopsDone = Math.floor( this.loops() ) + var swingForward = s && ( loopsDone % 2 === 0 ) + var forwards = ( swingForward && !r ) || ( r && swingForward ) + position = loopsDone + ( forwards ? p : 1 - p ) + return this.loops( position ) + } - progress (p) { - if (p == null) { - return Math.min(1, this._time / this.duration()) + progress ( p ) { + + if ( p == null ) { + + return Math.min( 1, this._time / this.duration() ) + } - return this.time(p * this.duration()) + return this.time( p * this.duration() ) + } - step (dt) { + step ( dt ) { + // If we are inactive, this stepper just gets skipped - if (!this.enabled) return this + if ( !this.enabled ) return this // Update the time and get the new position dt = dt == null ? 16 : dt @@ -264,8 +314,10 @@ export default class Runner extends EventTarget { var justStarted = this._lastTime < 0 && this._time > 0 var justFinished = this._lastTime < this._time && this.time > duration this._lastTime = this._time - if (justStarted) { - this.fire('start', this) + if ( justStarted ) { + + this.fire( 'start', this ) + } // Work out if the runner is finished set the done flag here so animations @@ -275,41 +327,54 @@ export default class Runner extends EventTarget { this.done = !declarative && !justFinished && this._time >= duration // Call initialise and the run function - if (running || declarative) { - this._initialise(running) + if ( running || declarative ) { + + this._initialise( running ) // clear the transforms on this runner so they dont get added again and again this.transforms = new Matrix() - var converged = this._run(declarative ? dt : position) - this.fire('step', this) + var converged = this._run( declarative ? dt : position ) + this.fire( 'step', this ) + } // correct the done flag here // declaritive animations itself know when they converged - this.done = this.done || (converged && declarative) - if (this.done) { - this.fire('finish', this) + this.done = this.done || ( converged && declarative ) + if ( this.done ) { + + this.fire( 'finish', this ) + } return this + } finish () { - return this.step(Infinity) + + return this.step( Infinity ) + } - reverse (reverse) { + reverse ( reverse ) { + this._reverse = reverse == null ? !this._reverse : reverse return this + } - ease (fn) { - this._stepper = new Ease(fn) + ease ( fn ) { + + this._stepper = new Ease( fn ) return this + } - active (enabled) { - if (enabled == null) return this.enabled + active ( enabled ) { + + if ( enabled == null ) return this.enabled this.enabled = enabled return this + } /* @@ -319,102 +384,135 @@ export default class Runner extends EventTarget { */ // Save a morpher to the morpher list so that we can retarget it later - _rememberMorpher (method, morpher) { + _rememberMorpher ( method, morpher ) { + this._history[method] = { morpher: morpher, caller: this._queue[this._queue.length - 1] } + } // Try to set the target for a morpher if the morpher exists, otherwise // do nothing and return false - _tryRetarget (method, target) { - if (this._history[method]) { + _tryRetarget ( method, target ) { + + if ( this._history[method] ) { + // if the last method wasnt even initialised, throw it away - if (!this._history[method].caller.initialised) { - let index = this._queue.indexOf(this._history[method].caller) - this._queue.splice(index, 1) + if ( !this._history[method].caller.initialised ) { + + let index = this._queue.indexOf( this._history[method].caller ) + this._queue.splice( index, 1 ) return false + } // for the case of transformations, we use the special retarget function // which has access to the outer scope - if (this._history[method].caller.retarget) { - this._history[method].caller.retarget(target) - // for everything else a simple morpher change is sufficient + if ( this._history[method].caller.retarget ) { + + this._history[method].caller.retarget( target ) + // for everything else a simple morpher change is sufficient + } else { - this._history[method].morpher.to(target) + + this._history[method].morpher.to( target ) + } this._history[method].caller.finished = false var timeline = this.timeline() timeline && timeline._continue() return true + } return false + } // Run each initialise function in the runner if required - _initialise (running) { + _initialise ( running ) { + // If we aren't running, we shouldn't initialise when not declarative - if (!running && !this._isDeclarative) return + if ( !running && !this._isDeclarative ) return // Loop through all of the initialisers - for (var i = 0, len = this._queue.length; i < len; ++i) { + for ( var i = 0, len = this._queue.length; i < len; ++i ) { + // Get the current initialiser var current = this._queue[i] // Determine whether we need to initialise - var needsIt = this._isDeclarative || (!current.initialised && running) + var needsIt = this._isDeclarative || ( !current.initialised && running ) running = !current.finished // Call the initialiser if we need to - if (needsIt && running) { - current.initialiser.call(this) + if ( needsIt && running ) { + + current.initialiser.call( this ) current.initialised = true + } + } + } // Run each run function for the position or dt given - _run (positionOrDt) { + _run ( positionOrDt ) { + // Run all of the _queue directly var allfinished = true - for (var i = 0, len = this._queue.length; i < len; ++i) { + for ( var i = 0, len = this._queue.length; i < len; ++i ) { + // Get the current function to run var current = this._queue[i] // Run the function if its not finished, we keep track of the finished // flag for the sake of declarative _queue - var converged = current.runner.call(this, positionOrDt) - current.finished = current.finished || (converged === true) + var converged = current.runner.call( this, positionOrDt ) + current.finished = current.finished || ( converged === true ) allfinished = allfinished && current.finished + } // We report when all of the constructors are finished return allfinished + } - addTransform (transform, index) { - this.transforms.lmultiplyO(transform) + addTransform ( transform, index ) { + + this.transforms.lmultiplyO( transform ) return this + } clearTransform () { + this.transforms = new Matrix() return this + } // TODO: Keep track of all transformations so that deletion is faster clearTransformsFromQueue () { - if (!this.done) { - this._queue = this._queue.filter((item) => { + + if ( !this.done ) { + + this._queue = this._queue.filter( ( item ) => { + return !item.isTransform - }) + + } ) + } + } - static sanitise (duration, delay, when) { + static sanitise ( duration, delay, when ) { + // Initialise the default parameters var times = 1 var swing = false @@ -424,13 +522,15 @@ export default class Runner extends EventTarget { when = when || 'last' // If we have an object, unpack the values - if (typeof duration === 'object' && !(duration instanceof Stepper)) { + if ( typeof duration === 'object' && !( duration instanceof Stepper ) ) { + delay = duration.delay || delay when = duration.when || when swing = duration.swing || swing times = duration.times || times wait = duration.wait || wait duration = duration.duration || timeline.duration + } return { @@ -441,215 +541,285 @@ export default class Runner extends EventTarget { wait: wait, when: when } + } + } Runner.id = 0 class FakeRunner { - constructor (transforms = new Matrix(), id = -1, done = true) { + + constructor ( transforms = new Matrix(), id = -1, done = true ) { + this.transforms = transforms this.id = id this.done = done + } clearTransformsFromQueue () { } + } -extend([Runner, FakeRunner], { - mergeWith (runner) { +extend( [ Runner, FakeRunner ], { + mergeWith ( runner ) { + return new FakeRunner( - runner.transforms.lmultiply(this.transforms), + runner.transforms.lmultiply( this.transforms ), runner.id ) + } -}) +} ) // FakeRunner.emptyRunner = new FakeRunner() -const lmultiply = (last, curr) => last.lmultiplyO(curr) -const getRunnerTransform = (runner) => runner.transforms +const lmultiply = ( last, curr ) => last.lmultiplyO( curr ) +const getRunnerTransform = ( runner ) => runner.transforms function mergeTransforms () { + // Find the matrix to apply to the element and apply it let runners = this._transformationRunners.runners let netTransform = runners - .map(getRunnerTransform) - .reduce(lmultiply, new Matrix()) + .map( getRunnerTransform ) + .reduce( lmultiply, new Matrix() ) - this.transform(netTransform) + this.transform( netTransform ) this._transformationRunners.merge() - if (this._transformationRunners.length() === 1) { + if ( this._transformationRunners.length() === 1 ) { + this._frameId = null + } + } class RunnerArray { + constructor () { + this.runners = [] this.ids = [] + } - add (runner) { - if (this.runners.includes(runner)) return + add ( runner ) { + + if ( this.runners.includes( runner ) ) return let id = runner.id + 1 - let leftSibling = this.ids.reduce((last, curr) => { - if (curr > last && curr < id) return curr + let leftSibling = this.ids.reduce( ( last, curr ) => { + + if ( curr > last && curr < id ) return curr return last - }, 0) - let index = this.ids.indexOf(leftSibling) + 1 + }, 0 ) - this.ids.splice(index, 0, id) - this.runners.splice(index, 0, runner) + let index = this.ids.indexOf( leftSibling ) + 1 + + this.ids.splice( index, 0, id ) + this.runners.splice( index, 0, runner ) return this + } - getByID (id) { - return this.runners[this.ids.indexOf(id + 1)] + getByID ( id ) { + + return this.runners[this.ids.indexOf( id + 1 )] + } - remove (id) { - let index = this.ids.indexOf(id + 1) - this.ids.splice(index, 1) - this.runners.splice(index, 1) + remove ( id ) { + + let index = this.ids.indexOf( id + 1 ) + this.ids.splice( index, 1 ) + this.runners.splice( index, 1 ) return this + } merge () { + let lastRunner = null - this.runners.forEach((runner, i) => { - if (lastRunner && runner.done && lastRunner.done) { - this.remove(runner.id) - this.edit(lastRunner.id, runner.mergeWith(lastRunner)) + this.runners.forEach( ( runner, i ) => { + + if ( lastRunner && runner.done && lastRunner.done ) { + + this.remove( runner.id ) + this.edit( lastRunner.id, runner.mergeWith( lastRunner ) ) + } lastRunner = runner - }) + + } ) return this + } - edit (id, newRunner) { - let index = this.ids.indexOf(id + 1) - this.ids.splice(index, 1, id) - this.runners.splice(index, 1, newRunner) + edit ( id, newRunner ) { + + let index = this.ids.indexOf( id + 1 ) + this.ids.splice( index, 1, id ) + this.runners.splice( index, 1, newRunner ) return this + } length () { + return this.ids.length + } - clearBefore (id) { - let deleteCnt = this.ids.indexOf(id + 1) || 1 - this.ids.splice(0, deleteCnt, 0) - this.runners.splice(0, deleteCnt, new FakeRunner()) - .forEach((r) => r.clearTransformsFromQueue()) + clearBefore ( id ) { + + let deleteCnt = this.ids.indexOf( id + 1 ) || 1 + this.ids.splice( 0, deleteCnt, 0 ) + this.runners.splice( 0, deleteCnt, new FakeRunner() ) + .forEach( ( r ) => r.clearTransformsFromQueue() ) return this + } + } let frameId = 0 -registerMethods({ +registerMethods( { Element: { - animate (duration, delay, when) { - var o = Runner.sanitise(duration, delay, when) + animate ( duration, delay, when ) { + + var o = Runner.sanitise( duration, delay, when ) var timeline = this.timeline() - return new Runner(o.duration) - .loop(o) - .element(this) - .timeline(timeline) - .schedule(delay, when) + return new Runner( o.duration ) + .loop( o ) + .element( this ) + .timeline( timeline ) + .schedule( delay, when ) + }, - delay (by, when) { - return this.animate(0, by, when) + delay ( by, when ) { + + return this.animate( 0, by, when ) + }, // this function searches for all runners on the element and deletes the ones // which run before the current one. This is because absolute transformations // overwfrite anything anyway so there is no need to waste time computing // other runners - _clearTransformRunnersBefore (currentRunner) { - this._transformationRunners.clearBefore(currentRunner.id) + _clearTransformRunnersBefore ( currentRunner ) { + + this._transformationRunners.clearBefore( currentRunner.id ) + }, - _currentTransform (current) { + _currentTransform ( current ) { + return this._transformationRunners.runners // we need the equal sign here to make sure, that also transformations // on the same runner which execute before the current transformation are // taken into account - .filter((runner) => runner.id <= current.id) - .map(getRunnerTransform) - .reduce(lmultiply, new Matrix()) + .filter( ( runner ) => runner.id <= current.id ) + .map( getRunnerTransform ) + .reduce( lmultiply, new Matrix() ) + }, - addRunner (runner) { - this._transformationRunners.add(runner) + addRunner ( runner ) { + + this._transformationRunners.add( runner ) Animator.transform_frame( - mergeTransforms.bind(this), this._frameId + mergeTransforms.bind( this ), this._frameId ) + }, _prepareRunner () { - if (this._frameId == null) { + + if ( this._frameId == null ) { + this._transformationRunners = new RunnerArray() - .add(new FakeRunner(new Matrix(this))) + .add( new FakeRunner( new Matrix( this ) ) ) this._frameId = frameId++ + } + } } -}) +} ) + +extend( Runner, { + attr ( a, v ) { + + return this.styleAttr( 'attr', a, v ) -extend(Runner, { - attr (a, v) { - return this.styleAttr('attr', a, v) }, // Add animatable styles - css (s, v) { - return this.styleAttr('css', s, v) + css ( s, v ) { + + return this.styleAttr( 'css', s, v ) + }, - styleAttr (type, name, val) { + styleAttr ( type, name, val ) { + // apply attributes individually - if (typeof name === 'object') { - for (var key in val) { - this.styleAttr(type, key, val[key]) + if ( typeof name === 'object' ) { + + for ( var key in val ) { + + this.styleAttr( type, key, val[key] ) + } + } - var morpher = new Morphable(this._stepper).to(val) + var morpher = new Morphable( this._stepper ).to( val ) + + this.queue( function () { + + morpher = morpher.from( this.element()[type]( name ) ) + + }, function ( pos ) { - this.queue(function () { - morpher = morpher.from(this.element()[type](name)) - }, function (pos) { - this.element()[type](name, morpher.at(pos)) + this.element()[type]( name, morpher.at( pos ) ) return morpher.done() - }) + + } ) return this + }, - zoom (level, point) { - var morpher = new Morphable(this._stepper).to(new SVGNumber(level)) + zoom ( level, point ) { + + var morpher = new Morphable( this._stepper ).to( new SVGNumber( level ) ) + + this.queue( function () { - this.queue(function () { - morpher = morpher.from(this.zoom()) - }, function (pos) { - this.element().zoom(morpher.at(pos), point) + morpher = morpher.from( this.zoom() ) + + }, function ( pos ) { + + this.element().zoom( morpher.at( pos ), point ) return morpher.done() - }) + + } ) return this + }, /** @@ -669,22 +839,25 @@ extend(Runner, { // - Note F(1) = T // 4. Now you get the delta matrix as a result: D = F * inv(M) - transform (transforms, relative, affine) { + transform ( transforms, relative, affine ) { + // If we have a declarative function, we should retarget it if possible relative = transforms.relative || relative - if (this._isDeclarative && !relative && this._tryRetarget('transform', transforms)) { + if ( this._isDeclarative && !relative && this._tryRetarget( 'transform', transforms ) ) { + return this + } // Parse the parameters - var isMatrix = Matrix.isMatrixLike(transforms) + var isMatrix = Matrix.isMatrixLike( transforms ) affine = transforms.affine != null ? transforms.affine - : (affine != null ? affine : !isMatrix) + : ( affine != null ? affine : !isMatrix ) // Create a morepher and set its type - const morpher = new Morphable(this._stepper) - .type(affine ? TransformBag : Matrix) + const morpher = new Morphable( this._stepper ) + .type( affine ? TransformBag : Matrix ) let origin let element @@ -693,249 +866,328 @@ extend(Runner, { let startTransform function setup () { + // make sure element and origin is defined element = element || this.element() - origin = origin || getOrigin(transforms, element) + origin = origin || getOrigin( transforms, element ) - startTransform = new Matrix(relative ? undefined : element) + startTransform = new Matrix( relative ? undefined : element ) // add the runner to the element so it can merge transformations - element.addRunner(this) + element.addRunner( this ) // Deactivate all transforms that have run so far if we are absolute - if (!relative) { - element._clearTransformRunnersBefore(this) + if ( !relative ) { + + element._clearTransformRunnersBefore( this ) + } + } - function run (pos) { + function run ( pos ) { + // clear all other transforms before this in case something is saved // on this runner. We are absolute. We dont need these! - if (!relative) this.clearTransform() + if ( !relative ) this.clearTransform() - let { x, y } = new Point(origin).transform(element._currentTransform(this)) + let { x, y } = new Point( origin ).transform( element._currentTransform( this ) ) - let target = new Matrix({ ...transforms, origin: [x, y] }) + let target = new Matrix( { ...transforms, origin: [ x, y ] } ) let start = this._isDeclarative && current ? current : startTransform - if (affine) { - target = target.decompose(x, y) - start = start.decompose(x, y) + if ( affine ) { + + target = target.decompose( x, y ) + start = start.decompose( x, y ) // Get the current and target angle as it was set const rTarget = target.rotate const rCurrent = start.rotate // Figure out the shortest path to rotate directly - const possibilities = [rTarget - 360, rTarget, rTarget + 360] - const distances = possibilities.map(a => Math.abs(a - rCurrent)) - const shortest = Math.min(...distances) - const index = distances.indexOf(shortest) + const possibilities = [ rTarget - 360, rTarget, rTarget + 360 ] + const distances = possibilities.map( a => Math.abs( a - rCurrent ) ) + const shortest = Math.min( ...distances ) + const index = distances.indexOf( shortest ) target.rotate = possibilities[index] + } - if (relative) { + if ( relative ) { + // we have to be careful here not to overwrite the rotation // with the rotate method of Matrix - if (!isMatrix) { + if ( !isMatrix ) { + target.rotate = transforms.rotate || 0 + } - if (this._isDeclarative && currentAngle) { + if ( this._isDeclarative && currentAngle ) { + start.rotate = currentAngle + } + } - morpher.from(start) - morpher.to(target) + morpher.from( start ) + morpher.to( target ) - let affineParameters = morpher.at(pos) + let affineParameters = morpher.at( pos ) currentAngle = affineParameters.rotate - current = new Matrix(affineParameters) + current = new Matrix( affineParameters ) - this.addTransform(current) + this.addTransform( current ) return morpher.done() + } - function retarget (newTransforms) { + function retarget ( newTransforms ) { + // only get a new origin if it changed since the last call if ( - (newTransforms.origin || 'center').toString() !== - (transforms.origin || 'center').toString() + ( newTransforms.origin || 'center' ).toString() + !== ( transforms.origin || 'center' ).toString() ) { - origin = getOrigin(transforms, element) + + origin = getOrigin( transforms, element ) + } // overwrite the old transformations with the new ones transforms = { ...newTransforms, origin } + } - this.queue(setup, run, retarget, true) - this._isDeclarative && this._rememberMorpher('transform', morpher) + this.queue( setup, run, retarget, true ) + this._isDeclarative && this._rememberMorpher( 'transform', morpher ) return this + }, // Animatable x-axis - x (x, relative) { - return this._queueNumber('x', x) + x ( x, relative ) { + + return this._queueNumber( 'x', x ) + }, // Animatable y-axis - y (y) { - return this._queueNumber('y', y) + y ( y ) { + + return this._queueNumber( 'y', y ) + }, - dx (x) { - return this._queueNumberDelta('x', x) + dx ( x ) { + + return this._queueNumberDelta( 'x', x ) + }, - dy (y) { - return this._queueNumberDelta('y', y) + dy ( y ) { + + return this._queueNumberDelta( 'y', y ) + }, - _queueNumberDelta (method, to) { - to = new SVGNumber(to) + _queueNumberDelta ( method, to ) { + + to = new SVGNumber( to ) // Try to change the target if we have this method already registerd - if (this._tryRetarget(method, to)) return this + if ( this._tryRetarget( method, to ) ) return this // Make a morpher and queue the animation - var morpher = new Morphable(this._stepper).to(to) + var morpher = new Morphable( this._stepper ).to( to ) var from = null - this.queue(function () { + this.queue( function () { + from = this.element()[method]() - morpher.from(from) - morpher.to(from + to) - }, function (pos) { - this.element()[method](morpher.at(pos)) + morpher.from( from ) + morpher.to( from + to ) + + }, function ( pos ) { + + this.element()[method]( morpher.at( pos ) ) return morpher.done() - }, function (newTo) { - morpher.to(from + new SVGNumber(newTo)) - }) + + }, function ( newTo ) { + + morpher.to( from + new SVGNumber( newTo ) ) + + } ) // Register the morpher so that if it is changed again, we can retarget it - this._rememberMorpher(method, morpher) + this._rememberMorpher( method, morpher ) return this + }, - _queueObject (method, to) { + _queueObject ( method, to ) { + // Try to change the target if we have this method already registerd - if (this._tryRetarget(method, to)) return this + if ( this._tryRetarget( method, to ) ) return this // Make a morpher and queue the animation - var morpher = new Morphable(this._stepper).to(to) - this.queue(function () { - morpher.from(this.element()[method]()) - }, function (pos) { - this.element()[method](morpher.at(pos)) + var morpher = new Morphable( this._stepper ).to( to ) + this.queue( function () { + + morpher.from( this.element()[method]() ) + + }, function ( pos ) { + + this.element()[method]( morpher.at( pos ) ) return morpher.done() - }) + + } ) // Register the morpher so that if it is changed again, we can retarget it - this._rememberMorpher(method, morpher) + this._rememberMorpher( method, morpher ) return this + }, - _queueNumber (method, value) { - return this._queueObject(method, new SVGNumber(value)) + _queueNumber ( method, value ) { + + return this._queueObject( method, new SVGNumber( value ) ) + }, // Animatable center x-axis - cx (x) { - return this._queueNumber('cx', x) + cx ( x ) { + + return this._queueNumber( 'cx', x ) + }, // Animatable center y-axis - cy (y) { - return this._queueNumber('cy', y) + cy ( y ) { + + return this._queueNumber( 'cy', y ) + }, // Add animatable move - move (x, y) { - return this.x(x).y(y) + move ( x, y ) { + + return this.x( x ).y( y ) + }, // Add animatable center - center (x, y) { - return this.cx(x).cy(y) + center ( x, y ) { + + return this.cx( x ).cy( y ) + }, // Add animatable size - size (width, height) { + size ( width, height ) { + // animate bbox based size for all other elements var box - if (!width || !height) { + if ( !width || !height ) { + box = this._element.bbox() + } - if (!width) { + if ( !width ) { + width = box.width / box.height * height + } - if (!height) { + if ( !height ) { + height = box.height / box.width * width + } return this - .width(width) - .height(height) + .width( width ) + .height( height ) + }, // Add animatable width - width (width) { - return this._queueNumber('width', width) + width ( width ) { + + return this._queueNumber( 'width', width ) + }, // Add animatable height - height (height) { - return this._queueNumber('height', height) + height ( height ) { + + return this._queueNumber( 'height', height ) + }, // Add animatable plot - plot (a, b, c, d) { + plot ( a, b, c, d ) { + // Lines can be plotted with 4 arguments - if (arguments.length === 4) { - return this.plot([a, b, c, d]) + if ( arguments.length === 4 ) { + + return this.plot( [ a, b, c, d ] ) + } - var morpher = this._element.MorphArray().to(a) + var morpher = this._element.MorphArray().to( a ) + + this.queue( function () { + + morpher.from( this._element.array() ) - this.queue(function () { - morpher.from(this._element.array()) - }, function (pos) { - this._element.plot(morpher.at(pos)) - }) + }, function ( pos ) { + + this._element.plot( morpher.at( pos ) ) + + } ) return this + }, // Add leading method - leading (value) { - return this._queueNumber('leading', value) + leading ( value ) { + + return this._queueNumber( 'leading', value ) + }, // Add animatable viewbox - viewbox (x, y, width, height) { - return this._queueObject('viewbox', new Box(x, y, width, height)) + viewbox ( x, y, width, height ) { + + return this._queueObject( 'viewbox', new Box( x, y, width, height ) ) + }, - update (o) { - if (typeof o !== 'object') { - return this.update({ + update ( o ) { + + if ( typeof o !== 'object' ) { + + return this.update( { offset: arguments[0], color: arguments[1], opacity: arguments[2] - }) + } ) + } - if (o.opacity != null) this.attr('stop-opacity', o.opacity) - if (o.color != null) this.attr('stop-color', o.color) - if (o.offset != null) this.attr('offset', o.offset) + if ( o.opacity != null ) this.attr( 'stop-opacity', o.opacity ) + if ( o.color != null ) this.attr( 'stop-color', o.color ) + if ( o.offset != null ) this.attr( 'offset', o.offset ) return this + } -}) +} ) -extend(Runner, { rx, ry, from, to }) +extend( Runner, { rx, ry, from, to } ) diff --git a/src/animation/Timeline.js b/src/animation/Timeline.js index 6abcb80..2fa281c 100644 --- a/src/animation/Timeline.js +++ b/src/animation/Timeline.js @@ -3,21 +3,27 @@ import { registerMethods } from '../utils/methods.js' import Animator from './Animator.js' import EventTarget from '../types/EventTarget.js' -var makeSchedule = function (runnerInfo) { +var makeSchedule = function ( runnerInfo ) { + var start = runnerInfo.start var duration = runnerInfo.runner.duration() var end = start + duration return { start: start, duration: duration, end: end, runner: runnerInfo.runner } + } export default class Timeline extends EventTarget { + // Construct a new timeline on the given element constructor () { + super() this._timeSource = function () { + let w = globals.window - return (w.performance || w.Date).now() + return ( w.performance || w.Date ).now() + } // Store the timing variables @@ -36,6 +42,7 @@ export default class Timeline extends EventTarget { this._time = 0 this._lastSourceTime = 0 this._lastStepTime = 0 + } /** @@ -43,19 +50,28 @@ export default class Timeline extends EventTarget { */ // schedules a runner on the timeline - schedule (runner, delay, when) { + schedule ( runner, delay, when ) { + // FIXME: how to sort? maybe by runner id? - if (runner == null) { - return this._runners.map(makeSchedule).sort(function (a, b) { - return (a.start - b.start) || (a.duration - b.duration) - }) + if ( runner == null ) { + + return this._runners.map( makeSchedule ).sort( function ( a, b ) { + + return ( a.start - b.start ) || ( a.duration - b.duration ) + + } ) + } - if (!this.active()) { + if ( !this.active() ) { + this._step() - if (when == null) { + if ( when == null ) { + when = 'now' + } + } // The start time for the next animation can either be given explicitly, @@ -65,28 +81,40 @@ export default class Timeline extends EventTarget { delay = delay || 0 // Work out when to start the animation - if (when == null || when === 'last' || when === 'after') { + if ( when == null || when === 'last' || when === 'after' ) { + // Take the last time and increment absoluteStartTime = this._startTime - } else if (when === 'absolute' || when === 'start') { + + } else if ( when === 'absolute' || when === 'start' ) { + absoluteStartTime = delay delay = 0 - } else if (when === 'now') { + + } else if ( when === 'now' ) { + absoluteStartTime = this._time - } else if (when === 'relative') { + + } else if ( when === 'relative' ) { + let runnerInfo = this._runners[runner.id] - if (runnerInfo) { + if ( runnerInfo ) { + absoluteStartTime = runnerInfo.start + delay delay = 0 + } + } else { - throw new Error('Invalid value for the "when" parameter') + + throw new Error( 'Invalid value for the "when" parameter' ) + } // Manage runner runner.unschedule() - runner.timeline(this) - runner.time(-delay) + runner.timeline( this ) + runner.time( -delay ) // Save startTime for next runner this._startTime = absoluteStartTime + runner.duration() + delay @@ -99,91 +127,115 @@ export default class Timeline extends EventTarget { } // Save order and continue - this._order.push(runner.id) + this._order.push( runner.id ) this._continue() return this + } // Remove the runner from this timeline - unschedule (runner) { - var index = this._order.indexOf(runner.id) - if (index < 0) return this + unschedule ( runner ) { + + var index = this._order.indexOf( runner.id ) + if ( index < 0 ) return this delete this._runners[runner.id] - this._order.splice(index, 1) - runner.timeline(null) + this._order.splice( index, 1 ) + runner.timeline( null ) return this + } play () { + // Now make sure we are not paused and continue the animation this._paused = false return this._continue() + } pause () { + // Cancel the next animation frame and pause this._nextFrame = null this._paused = true return this + } stop () { + // Cancel the next animation frame and go to start - this.seek(-this._time) + this.seek( -this._time ) return this.pause() + } finish () { - this.seek(Infinity) + + this.seek( Infinity ) return this.pause() + } - speed (speed) { - if (speed == null) return this._speed + speed ( speed ) { + + if ( speed == null ) return this._speed this._speed = speed return this + } - reverse (yes) { + reverse ( yes ) { + var currentSpeed = this.speed() - if (yes == null) return this.speed(-currentSpeed) + if ( yes == null ) return this.speed( -currentSpeed ) + + var positive = Math.abs( currentSpeed ) + return this.speed( yes ? positive : -positive ) - var positive = Math.abs(currentSpeed) - return this.speed(yes ? positive : -positive) } - seek (dt) { + seek ( dt ) { + this._time += dt return this._continue() + } - time (time) { - if (time == null) return this._time + time ( time ) { + + if ( time == null ) return this._time this._time = time return this + } - persist (dtOrForever) { - if (dtOrForever == null) return this._persist + persist ( dtOrForever ) { + + if ( dtOrForever == null ) return this._persist this._persist = dtOrForever return this + } - source (fn) { - if (fn == null) return this._timeSource + source ( fn ) { + + if ( fn == null ) return this._timeSource this._timeSource = fn return this + } _step () { + // If the timeline is paused, just do nothing - if (this._paused) return + if ( this._paused ) return // Get the time delta from the last time and update the time var time = this._timeSource() var dtSource = time - this._lastSourceTime - var dtTime = this._speed * dtSource + (this._time - this._lastStepTime) + var dtTime = this._speed * dtSource + ( this._time - this._lastStepTime ) this._lastSourceTime = time // Update the time @@ -193,7 +245,8 @@ export default class Timeline extends EventTarget { // Run all of the runners directly var runnersLeft = false - for (var i = 0, len = this._order.length; i < len; i++) { + for ( var i = 0, len = this._order.length; i < len; i++ ) { + // Get and run the current runner and ignore it if its inactive var runnerInfo = this._runners[this._order[i]] var runner = runnerInfo.runner @@ -204,64 +257,89 @@ export default class Timeline extends EventTarget { let dtToStart = this._time - runnerInfo.start // Dont run runner if not started yet - if (dtToStart < 0) { + if ( dtToStart < 0 ) { + runnersLeft = true continue - } else if (dtToStart < dt) { + + } else if ( dtToStart < dt ) { + // Adjust dt to make sure that animation is on point dt = dtToStart + } - if (!runner.active()) continue + if ( !runner.active() ) continue // If this runner is still going, signal that we need another animation // frame, otherwise, remove the completed runner - var finished = runner.step(dt).done - if (!finished) { + var finished = runner.step( dt ).done + if ( !finished ) { + runnersLeft = true // continue - } else if (runnerInfo.persist !== true) { + + } else if ( runnerInfo.persist !== true ) { + // runner is finished. And runner might get removed var endTime = runner.duration() - runner.time() + this._time - if (endTime + this._persist < this._time) { + if ( endTime + this._persist < this._time ) { + // Delete runner and correct index delete this._runners[this._order[i]] - this._order.splice(i--, 1) && --len - runner.timeline(null) + this._order.splice( i--, 1 ) && --len + runner.timeline( null ) + } + } + } // Get the next animation frame to keep the simulation going - if (runnersLeft) { - this._nextFrame = Animator.frame(this._step.bind(this)) + if ( runnersLeft ) { + + this._nextFrame = Animator.frame( this._step.bind( this ) ) + } else { + this._nextFrame = null + } return this + } // Checks if we are running and continues the animation _continue () { - if (this._paused) return this - if (!this._nextFrame) { - this._nextFrame = Animator.frame(this._step.bind(this)) + + if ( this._paused ) return this + if ( !this._nextFrame ) { + + this._nextFrame = Animator.frame( this._step.bind( this ) ) + } return this + } active () { + return !!this._nextFrame + } + } -registerMethods({ +registerMethods( { Element: { timeline: function () { - this._timeline = (this._timeline || new Timeline()) + + this._timeline = ( this._timeline || new Timeline() ) return this._timeline + } } -}) +} ) diff --git a/src/elements/A.js b/src/elements/A.js index 722deed..ee81975 100644 --- a/src/elements/A.js +++ b/src/elements/A.js @@ -4,40 +4,58 @@ import { xlink } from '../modules/core/namespaces.js' import Container from './Container.js' export default class A extends Container { - constructor (node) { - super(nodeOrNew('a', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'a', node ), node ) + } // Link url - to (url) { - return this.attr('href', url, xlink) + to ( url ) { + + return this.attr( 'href', url, xlink ) + } // Link target attribute - target (target) { - return this.attr('target', target) + target ( target ) { + + return this.attr( 'target', target ) + } + } -registerMethods({ +registerMethods( { Container: { // Create a hyperlink element - link: wrapWithAttrCheck(function (url) { - return this.put(new A()).to(url) - }) + link: wrapWithAttrCheck( function ( url ) { + + return this.put( new A() ).to( url ) + + } ) }, Element: { // Create a hyperlink element - linkTo: function (url) { + linkTo: function ( url ) { + var link = new A() - if (typeof url === 'function') { url.call(link, link) } else { - link.to(url) + if ( typeof url === 'function' ) { + + url.call( link, link ) + + } else { + + link.to( url ) + } - return this.parent().put(link).put(this) + return this.parent().put( link ).put( this ) + } } -}) +} ) -register(A) +register( A ) diff --git a/src/elements/Bare.js b/src/elements/Bare.js index a057634..190aa1f 100644 --- a/src/elements/Bare.js +++ b/src/elements/Bare.js @@ -4,28 +4,38 @@ import Container from './Container.js' import { globals } from '../utils/window.js' export default class Bare extends Container { - constructor (node, attrs) { - super(nodeOrNew(node, typeof node === 'string' ? null : node), attrs) + + constructor ( node, attrs ) { + + super( nodeOrNew( node, typeof node === 'string' ? null : node ), attrs ) + } - words (text) { + words ( text ) { + // remove contents - while (this.node.hasChildNodes()) { - this.node.removeChild(this.node.lastChild) + while ( this.node.hasChildNodes() ) { + + this.node.removeChild( this.node.lastChild ) + } // create text node - this.node.appendChild(globals.document.createTextNode(text)) + this.node.appendChild( globals.document.createTextNode( text ) ) return this + } + } -register(Bare) +register( Bare ) -registerMethods('Container', { +registerMethods( 'Container', { // Create an element that is not described by SVG.js - element: wrapWithAttrCheck(function (node) { - return this.put(new Bare(node)) - }) -}) + element: wrapWithAttrCheck( function ( node ) { + + return this.put( new Bare( node ) ) + + } ) +} ) diff --git a/src/elements/Circle.js b/src/elements/Circle.js index 3135ada..5aa969a 100644 --- a/src/elements/Circle.js +++ b/src/elements/Circle.js @@ -10,40 +10,54 @@ import SVGNumber from '../types/SVGNumber.js' import Shape from './Shape.js' export default class Circle extends Shape { - constructor (node) { - super(nodeOrNew('circle', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'circle', node ), node ) + } - radius (r) { - return this.attr('r', r) + radius ( r ) { + + return this.attr( 'r', r ) + } // Radius x value - rx (rx) { - return this.attr('r', rx) + rx ( rx ) { + + return this.attr( 'r', rx ) + } // Alias radius x value - ry (ry) { - return this.rx(ry) + ry ( ry ) { + + return this.rx( ry ) + } - size (size) { - return this.radius(new SVGNumber(size).divide(2)) + size ( size ) { + + return this.radius( new SVGNumber( size ).divide( 2 ) ) + } + } -extend(Circle, { x, y, cx, cy, width, height }) +extend( Circle, { x, y, cx, cy, width, height } ) -registerMethods({ +registerMethods( { Element: { // Create circle element - circle: wrapWithAttrCheck(function (size) { - return this.put(new Circle()) - .size(size) - .move(0, 0) - }) + circle: wrapWithAttrCheck( function ( size ) { + + return this.put( new Circle() ) + .size( size ) + .move( 0, 0 ) + + } ) } -}) +} ) -register(Circle) +register( Circle ) diff --git a/src/elements/ClipPath.js b/src/elements/ClipPath.js index e545baa..199ee5b 100644 --- a/src/elements/ClipPath.js +++ b/src/elements/ClipPath.js @@ -4,54 +4,72 @@ import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class ClipPath extends Container { - constructor (node) { - super(nodeOrNew('clipPath', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'clipPath', node ), node ) + } // Unclip all clipped elements and remove itself remove () { + // unclip all targets - this.targets().forEach(function (el) { + this.targets().forEach( function ( el ) { + el.unclip() - }) + + } ) // remove clipPath from parent return super.remove() + } targets () { - return baseFind('svg [clip-path*="' + this.id() + '"]') + + return baseFind( 'svg [clip-path*="' + this.id() + '"]' ) + } + } -registerMethods({ +registerMethods( { Container: { // Create clipping element - clip: wrapWithAttrCheck(function () { - return this.defs().put(new ClipPath()) - }) + clip: wrapWithAttrCheck( function () { + + return this.defs().put( new ClipPath() ) + + } ) }, Element: { // Distribute clipPath to svg element - clipWith (element) { + clipWith ( element ) { + // use given clip or create a new one let clipper = element instanceof ClipPath ? element - : this.parent().clip().add(element) + : this.parent().clip().add( element ) // apply mask - return this.attr('clip-path', 'url("#' + clipper.id() + '")') + return this.attr( 'clip-path', 'url("#' + clipper.id() + '")' ) + }, // Unclip element unclip () { - return this.attr('clip-path', null) + + return this.attr( 'clip-path', null ) + }, clipper () { - return this.reference('clip-path') + + return this.reference( 'clip-path' ) + } } -}) +} ) -register(ClipPath) +register( ClipPath ) diff --git a/src/elements/Container.js b/src/elements/Container.js index b47972e..82ee0ae 100644 --- a/src/elements/Container.js +++ b/src/elements/Container.js @@ -2,29 +2,39 @@ import { register } from '../utils/adopter.js' import Element from './Element.js' export default class Container extends Element { - flatten (parent) { - this.each(function () { - if (this instanceof Container) return this.flatten(parent).ungroup(parent) - return this.toParent(parent) - }) + + flatten ( parent ) { + + this.each( function () { + + if ( this instanceof Container ) return this.flatten( parent ).ungroup( parent ) + return this.toParent( parent ) + + } ) // we need this so that the root does not get removed this.node.firstElementChild || this.remove() return this + } - ungroup (parent) { + ungroup ( parent ) { + parent = parent || this.parent() - this.each(function () { - return this.toParent(parent) - }) + this.each( function () { + + return this.toParent( parent ) + + } ) this.remove() return this + } + } -register(Container) +register( Container ) diff --git a/src/elements/Defs.js b/src/elements/Defs.js index 2826611..bcbea01 100644 --- a/src/elements/Defs.js +++ b/src/elements/Defs.js @@ -2,12 +2,24 @@ import { nodeOrNew, register } from '../utils/adopter.js' import Container from './Container.js' export default class Defs extends Container { - constructor (node) { - super(nodeOrNew('defs', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'defs', node ), node ) + + } + + flatten () { + + return this + + } + ungroup () { + + return this + } - flatten () { return this } - ungroup () { return this } } -register(Defs) +register( Defs ) diff --git a/src/elements/Dom.js b/src/elements/Dom.js index 2fcedce..f3ea467 100644 --- a/src/elements/Dom.js +++ b/src/elements/Dom.js @@ -15,217 +15,294 @@ import List from '../types/List.js' import attr from '../modules/core/attr.js' export default class Dom extends EventTarget { - constructor (node, attrs) { - super(node) + + constructor ( node, attrs ) { + + super( node ) this.node = node this.type = node.nodeName - if (attrs && node !== attrs) { - this.attr(attrs) + if ( attrs && node !== attrs ) { + + this.attr( attrs ) + } + } // Add given element at a position - add (element, i) { - element = makeInstance(element) + add ( element, i ) { + + element = makeInstance( element ) + + if ( i == null ) { + + this.node.appendChild( element.node ) + + } else if ( element.node !== this.node.childNodes[i] ) { + + this.node.insertBefore( element.node, this.node.childNodes[i] ) - if (i == null) { - this.node.appendChild(element.node) - } else if (element.node !== this.node.childNodes[i]) { - this.node.insertBefore(element.node, this.node.childNodes[i]) } return this + } // Add element to given container and return self - addTo (parent) { - return makeInstance(parent).put(this) + addTo ( parent ) { + + return makeInstance( parent ).put( this ) + } // Returns all child elements children () { - return new List(map(this.node.children, function (node) { - return adopt(node) - })) + + return new List( map( this.node.children, function ( node ) { + + return adopt( node ) + + } ) ) + } // Remove all elements in this container clear () { + // remove children - while (this.node.hasChildNodes()) { - this.node.removeChild(this.node.lastChild) + while ( this.node.hasChildNodes() ) { + + this.node.removeChild( this.node.lastChild ) + } // remove defs reference delete this._defs return this + } // Clone element clone () { + // write dom data to the dom so the clone can pickup the data this.writeDataToDom() // clone element and assign new id - return assignNewId(this.node.cloneNode(true)) + return assignNewId( this.node.cloneNode( true ) ) + } // Iterates over all children and invokes a given block - each (block, deep) { + each ( block, deep ) { + var children = this.children() var i, il - for (i = 0, il = children.length; i < il; i++) { - block.apply(children[i], [i, children]) + for ( i = 0, il = children.length; i < il; i++ ) { + + block.apply( children[i], [ i, children ] ) + + if ( deep ) { + + children[i].each( block, deep ) - if (deep) { - children[i].each(block, deep) } + } return this + } // Get first child first () { - return adopt(this.node.firstChild) + + return adopt( this.node.firstChild ) + } // Get a element at the given index - get (i) { - return adopt(this.node.childNodes[i]) + get ( i ) { + + return adopt( this.node.childNodes[i] ) + } getEventHolder () { + return this.node + } getEventTarget () { + return this.node + } // Checks if the given element is a child - has (element) { - return this.index(element) >= 0 + has ( element ) { + + return this.index( element ) >= 0 + } // Get / set id - id (id) { + id ( id ) { + // generate new id if no id set - if (typeof id === 'undefined' && !this.node.id) { - this.node.id = eid(this.type) + if ( typeof id === 'undefined' && !this.node.id ) { + + this.node.id = eid( this.type ) + } // dont't set directly width this.node.id to make `null` work correctly - return this.attr('id', id) + return this.attr( 'id', id ) + } // Gets index of given element - index (element) { - return [].slice.call(this.node.childNodes).indexOf(element.node) + index ( element ) { + + return [].slice.call( this.node.childNodes ).indexOf( element.node ) + } // Get the last child last () { - return adopt(this.node.lastChild) + + return adopt( this.node.lastChild ) + } // matches the element vs a css selector - matches (selector) { + matches ( selector ) { + const el = this.node - return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector) + return ( el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector ).call( el, selector ) + } // Returns the parent element instance - parent (type) { + parent ( type ) { + var parent = this // check for parent - if (!parent.node.parentNode) return null + if ( !parent.node.parentNode ) return null // get parent element - parent = adopt(parent.node.parentNode) + parent = adopt( parent.node.parentNode ) - if (!type) return parent + if ( !type ) return parent // loop trough ancestors if type is given - while (parent && parent.node instanceof globals.window.SVGElement) { // FIXME: That shouldnt be neccessary - if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent - parent = adopt(parent.node.parentNode) + while ( parent && parent.node instanceof globals.window.SVGElement ) { // FIXME: That shouldnt be neccessary + + if ( typeof type === 'string' ? parent.matches( type ) : parent instanceof type ) return parent + parent = adopt( parent.node.parentNode ) + } + } // Basically does the same as `add()` but returns the added element instead - put (element, i) { - this.add(element, i) + put ( element, i ) { + + this.add( element, i ) return element + } // Add element to given container and return container - putIn (parent) { - return makeInstance(parent).add(this) + putIn ( parent ) { + + return makeInstance( parent ).add( this ) + } // Remove element remove () { - if (this.parent()) { - this.parent().removeElement(this) + + if ( this.parent() ) { + + this.parent().removeElement( this ) + } return this + } // Remove a given child - removeElement (element) { - this.node.removeChild(element.node) + removeElement ( element ) { + + this.node.removeChild( element.node ) return this + } // Replace this with element - replace (element) { - element = makeInstance(element) - this.node.parentNode.replaceChild(element.node, this.node) + replace ( element ) { + + element = makeInstance( element ) + this.node.parentNode.replaceChild( element.node, this.node ) return element + } - round (precision = 2, map) { + round ( precision = 2, map ) { + const factor = 10 ** precision const attrs = this.attr() // If we have no map, build one from attrs - if (!map) { - map = Object.keys(attrs) + if ( !map ) { + + map = Object.keys( attrs ) + } // Holds rounded attributes const newAttrs = {} - map.forEach((key) => { - newAttrs[key] = Math.round(attrs[key] * factor) / factor - }) + map.forEach( ( key ) => { + + newAttrs[key] = Math.round( attrs[key] * factor ) / factor - this.attr(newAttrs) + } ) + + this.attr( newAttrs ) return this + } // Return id on string conversion toString () { + return this.id() + } // Import raw svg - svg (svgOrFn, outerHTML) { + svg ( svgOrFn, outerHTML ) { + var well, len, fragment - if (svgOrFn === false) { + if ( svgOrFn === false ) { + outerHTML = false svgOrFn = null + } // act as getter if no svg string is given - if (svgOrFn == null || typeof svgOrFn === 'function') { + if ( svgOrFn == null || typeof svgOrFn === 'function' ) { + // The default for exports is, that the outerNode is included outerHTML = outerHTML == null ? true : outerHTML @@ -234,38 +311,49 @@ export default class Dom extends EventTarget { let current = this // An export modifier was passed - if (svgOrFn != null) { - current = adopt(current.node.cloneNode(true)) + if ( svgOrFn != null ) { + + current = adopt( current.node.cloneNode( true ) ) // If the user wants outerHTML we need to process this node, too - if (outerHTML) { - let result = svgOrFn(current) + if ( outerHTML ) { + + let result = svgOrFn( current ) current = result || current // The user does not want this node? Well, then he gets nothing - if (result === false) return '' + if ( result === false ) return '' + } // Deep loop through all children and apply modifier - current.each(function () { - let result = svgOrFn(this) + current.each( function () { + + let result = svgOrFn( this ) let _this = result || this // If modifier returns false, discard node - if (result === false) { + if ( result === false ) { + this.remove() - // If modifier returns new node, use it - } else if (result && this !== _this) { - this.replace(_this) + // If modifier returns new node, use it + + } else if ( result && this !== _this ) { + + this.replace( _this ) + } - }, true) + + }, true ) + } // Return outer or inner content return outerHTML ? current.node.outerHTML : current.node.innerHTML + } // Act as setter if we got a string @@ -274,33 +362,41 @@ export default class Dom extends EventTarget { outerHTML = outerHTML == null ? false : outerHTML // Create temporary holder - well = globals.document.createElementNS(ns, 'svg') + well = globals.document.createElementNS( ns, 'svg' ) fragment = globals.document.createDocumentFragment() // Dump raw svg well.innerHTML = svgOrFn // Transplant nodes into the fragment - for (len = well.children.length; len--;) { - fragment.appendChild(well.firstElementChild) + for ( len = well.children.length; len--; ) { + + fragment.appendChild( well.firstElementChild ) + } // Add the whole fragment at once return outerHTML - ? this.replace(fragment) - : this.add(fragment) + ? this.replace( fragment ) + : this.add( fragment ) + } // write svgjs data to the dom writeDataToDom () { + // dump variables recursively - this.each(function () { + this.each( function () { + this.writeDataToDom() - }) + + } ) return this + } + } -extend(Dom, { attr, find }) -register(Dom) +extend( Dom, { attr, find } ) +register( Dom ) diff --git a/src/elements/Element.js b/src/elements/Element.js index 91aa3e0..169c872 100644 --- a/src/elements/Element.js +++ b/src/elements/Element.js @@ -15,11 +15,13 @@ import Dom from './Dom.js' import List from '../types/List.js' import SVGNumber from '../types/SVGNumber.js' -const Svg = getClass(root) +const Svg = getClass( root ) export default class Element extends Dom { - constructor (node, attrs) { - super(node, attrs) + + constructor ( node, attrs ) { + + super( node, attrs ) // initialize data object this.dom = {} @@ -27,135 +29,177 @@ export default class Element extends Dom { // create circular reference this.node.instance = this - if (node.hasAttribute('svgjs:data')) { + if ( node.hasAttribute( 'svgjs:data' ) ) { + // pull svgjs data from the dom (getAttributeNS doesn't work in html5) - this.setData(JSON.parse(node.getAttribute('svgjs:data')) || {}) + this.setData( JSON.parse( node.getAttribute( 'svgjs:data' ) ) || {} ) + } + } // Move element by its center - center (x, y) { - return this.cx(x).cy(y) + center ( x, y ) { + + return this.cx( x ).cy( y ) + } // Move by center over x-axis - cx (x) { - return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2) + cx ( x ) { + + return x == null ? this.x() + this.width() / 2 : this.x( x - this.width() / 2 ) + } // Move by center over y-axis - cy (y) { + cy ( y ) { + return y == null ? this.y() + this.height() / 2 - : this.y(y - this.height() / 2) + : this.y( y - this.height() / 2 ) + } // Get defs defs () { + return this.root().defs() + } // Get parent document root () { - let p = this.parent(Svg) + + let p = this.parent( Svg ) return p && p.root() + } getEventHolder () { + return this + } // Set height of element - height (height) { - return this.attr('height', height) + height ( height ) { + + return this.attr( 'height', height ) + } // Checks whether the given point inside the bounding box of the element - inside (x, y) { + inside ( x, y ) { + let box = this.bbox() - return x > box.x && - y > box.y && - x < box.x + box.width && - y < box.y + box.height + return x > box.x + && y > box.y + && x < box.x + box.width + && y < box.y + box.height + } // Move element to given x and y values - move (x, y) { - return this.x(x).y(y) + move ( x, y ) { + + return this.x( x ).y( y ) + } // return array of all ancestors of given type up to the root svg - parents (until = globals.document) { - until = makeInstance(until) + parents ( until = globals.document ) { + + until = makeInstance( until ) let parents = new List() let parent = this while ( - (parent = parent.parent()) && - parent.node !== until.node && - parent.node !== globals.document + ( parent = parent.parent() ) + && parent.node !== until.node + && parent.node !== globals.document ) { - parents.push(parent) + + parents.push( parent ) + } return parents + } // Get referenced element form attribute value - reference (attr) { - attr = this.attr(attr) - if (!attr) return null + reference ( attr ) { + + attr = this.attr( attr ) + if ( !attr ) return null + + const m = attr.match( reference ) + return m ? makeInstance( m[1] ) : null - const m = attr.match(reference) - return m ? makeInstance(m[1]) : null } // set given data to the elements data property - setData (o) { + setData ( o ) { + this.dom = o return this + } // Set element size to given width and height - size (width, height) { - let p = proportionalSize(this, width, height) + size ( width, height ) { + + let p = proportionalSize( this, width, height ) return this - .width(new SVGNumber(p.width)) - .height(new SVGNumber(p.height)) + .width( new SVGNumber( p.width ) ) + .height( new SVGNumber( p.height ) ) + } // Set width of element - width (width) { - return this.attr('width', width) + width ( width ) { + + return this.attr( 'width', width ) + } // write svgjs data to the dom writeDataToDom () { + // remove previously set data - this.node.removeAttribute('svgjs:data') + this.node.removeAttribute( 'svgjs:data' ) + + if ( Object.keys( this.dom ).length ) { + + this.node.setAttribute( 'svgjs:data', JSON.stringify( this.dom ) ) // see #428 - if (Object.keys(this.dom).length) { - this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428 } return super.writeDataToDom() + } // Move over x-axis - x (x) { - return this.attr('x', x) + x ( x ) { + + return this.attr( 'x', x ) + } // Move over y-axis - y (y) { - return this.attr('y', y) + y ( y ) { + + return this.attr( 'y', y ) + } + } -extend(Element, { +extend( Element, { bbox, rbox, point, ctm, screenCTM -}) +} ) -register(Element) +register( Element ) diff --git a/src/elements/Ellipse.js b/src/elements/Ellipse.js index 0350f1f..e1e1fe0 100644 --- a/src/elements/Ellipse.js +++ b/src/elements/Ellipse.js @@ -11,26 +11,34 @@ import Shape from './Shape.js' import * as circled from '../modules/core/circled.js' export default class Ellipse extends Shape { - constructor (node) { - super(nodeOrNew('ellipse', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'ellipse', node ), node ) + } - size (width, height) { - var p = proportionalSize(this, width, height) + size ( width, height ) { + + var p = proportionalSize( this, width, height ) return this - .rx(new SVGNumber(p.width).divide(2)) - .ry(new SVGNumber(p.height).divide(2)) + .rx( new SVGNumber( p.width ).divide( 2 ) ) + .ry( new SVGNumber( p.height ).divide( 2 ) ) + } + } -extend(Ellipse, circled) +extend( Ellipse, circled ) -registerMethods('Container', { +registerMethods( 'Container', { // Create an ellipse - ellipse: wrapWithAttrCheck(function (width, height) { - return this.put(new Ellipse()).size(width, height).move(0, 0) - }) -}) + ellipse: wrapWithAttrCheck( function ( width, height ) { + + return this.put( new Ellipse() ).size( width, height ).move( 0, 0 ) + + } ) +} ) -register(Ellipse) +register( Ellipse ) diff --git a/src/elements/G.js b/src/elements/G.js index 6a93a3f..a72f1fb 100644 --- a/src/elements/G.js +++ b/src/elements/G.js @@ -3,18 +3,24 @@ import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class G extends Container { - constructor (node) { - super(nodeOrNew('g', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'g', node ), node ) + } + } -registerMethods({ +registerMethods( { Element: { // Create a group element - group: wrapWithAttrCheck(function () { - return this.put(new G()) - }) + group: wrapWithAttrCheck( function () { + + return this.put( new G() ) + + } ) } -}) +} ) -register(G) +register( G ) diff --git a/src/elements/Gradient.js b/src/elements/Gradient.js index 23de97d..7116fc8 100644 --- a/src/elements/Gradient.js +++ b/src/elements/Gradient.js @@ -12,71 +12,95 @@ import baseFind from '../modules/core/selector.js' import * as gradiented from '../modules/core/gradiented.js' export default class Gradient extends Container { - constructor (type, attrs) { + + constructor ( type, attrs ) { + super( - nodeOrNew(type + 'Gradient', typeof type === 'string' ? null : type), + nodeOrNew( type + 'Gradient', typeof type === 'string' ? null : type ), attrs ) + } // Add a color stop - stop (offset, color, opacity) { - return this.put(new Stop()).update(offset, color, opacity) + stop ( offset, color, opacity ) { + + return this.put( new Stop() ).update( offset, color, opacity ) + } // Update gradient - update (block) { + update ( block ) { + // remove all stops this.clear() // invoke passed block - if (typeof block === 'function') { - block.call(this, this) + if ( typeof block === 'function' ) { + + block.call( this, this ) + } return this + } // Return the fill id url () { + return 'url(#' + this.id() + ')' + } // Alias string convertion to fill toString () { + return this.url() + } // custom attr to handle transform - attr (a, b, c) { - if (a === 'transform') a = 'gradientTransform' - return super.attr(a, b, c) + attr ( a, b, c ) { + + if ( a === 'transform' ) a = 'gradientTransform' + return super.attr( a, b, c ) + } targets () { - return baseFind('svg [fill*="' + this.id() + '"]') + + return baseFind( 'svg [fill*="' + this.id() + '"]' ) + } bbox () { + return new Box() + } + } -extend(Gradient, gradiented) +extend( Gradient, gradiented ) -registerMethods({ +registerMethods( { Container: { // Create gradient element in defs - gradient: wrapWithAttrCheck(function (type, block) { - return this.defs().gradient(type, block) - }) + gradient: wrapWithAttrCheck( function ( type, block ) { + + return this.defs().gradient( type, block ) + + } ) }, // define gradient Defs: { - gradient: wrapWithAttrCheck(function (type, block) { - return this.put(new Gradient(type)).update(block) - }) + gradient: wrapWithAttrCheck( function ( type, block ) { + + return this.put( new Gradient( type ) ).update( block ) + + } ) } -}) +} ) -register(Gradient) +register( Gradient ) diff --git a/src/elements/HtmlNode.js b/src/elements/HtmlNode.js index 009b122..d2299ed 100644 --- a/src/elements/HtmlNode.js +++ b/src/elements/HtmlNode.js @@ -3,4 +3,4 @@ import Dom from './Dom.js' export default class HtmlNode extends Dom {} -register(HtmlNode) +register( HtmlNode ) diff --git a/src/elements/Image.js b/src/elements/Image.js index 8f27470..4945271 100644 --- a/src/elements/Image.js +++ b/src/elements/Image.js @@ -9,69 +9,99 @@ import Shape from './Shape.js' import { globals } from '../utils/window.js' export default class Image extends Shape { - constructor (node) { - super(nodeOrNew('image', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'image', node ), node ) + } // (re)load image - load (url, callback) { - if (!url) return this + load ( url, callback ) { + + if ( !url ) return this var img = new globals.window.Image() - on(img, 'load', function (e) { - var p = this.parent(Pattern) + on( img, 'load', function ( e ) { + + var p = this.parent( Pattern ) // ensure image size - if (this.width() === 0 && this.height() === 0) { - this.size(img.width, img.height) + if ( this.width() === 0 && this.height() === 0 ) { + + this.size( img.width, img.height ) + } - if (p instanceof Pattern) { + if ( p instanceof Pattern ) { + // ensure pattern size if not set - if (p.width() === 0 && p.height() === 0) { - p.size(this.width(), this.height()) + if ( p.width() === 0 && p.height() === 0 ) { + + p.size( this.width(), this.height() ) + } + } - if (typeof callback === 'function') { - callback.call(this, e) + if ( typeof callback === 'function' ) { + + callback.call( this, e ) + } - }, this) - on(img, 'load error', function () { + }, this ) + + on( img, 'load error', function () { + // dont forget to unbind memory leaking events - off(img) - }) + off( img ) + + } ) + + return this.attr( 'href', ( img.src = url ), xlink ) - return this.attr('href', (img.src = url), xlink) } + } -registerAttrHook(function (attr, val, _this) { +registerAttrHook( function ( attr, val, _this ) { + // convert image fill and stroke to patterns - if (attr === 'fill' || attr === 'stroke') { - if (isImage.test(val)) { - val = _this.root().defs().image(val) + if ( attr === 'fill' || attr === 'stroke' ) { + + if ( isImage.test( val ) ) { + + val = _this.root().defs().image( val ) + } + } - if (val instanceof Image) { - val = _this.root().defs().pattern(0, 0, (pattern) => { - pattern.add(val) - }) + if ( val instanceof Image ) { + + val = _this.root().defs().pattern( 0, 0, ( pattern ) => { + + pattern.add( val ) + + } ) + } return val -}) -registerMethods({ +} ) + +registerMethods( { Container: { // create image element, load image and set its size - image: wrapWithAttrCheck(function (source, callback) { - return this.put(new Image()).size(0, 0).load(source, callback) - }) + image: wrapWithAttrCheck( function ( source, callback ) { + + return this.put( new Image() ).size( 0, 0 ).load( source, callback ) + + } ) } -}) +} ) -register(Image) +register( Image ) diff --git a/src/elements/Line.js b/src/elements/Line.js index 99e7497..123f2bb 100644 --- a/src/elements/Line.js +++ b/src/elements/Line.js @@ -11,58 +11,78 @@ import Shape from './Shape.js' import * as pointed from '../modules/core/pointed.js' export default class Line extends Shape { + // Initialize node - constructor (node) { - super(nodeOrNew('line', node), node) + constructor ( node ) { + + super( nodeOrNew( 'line', node ), node ) + } // Get array array () { - return new PointArray([ - [ this.attr('x1'), this.attr('y1') ], - [ this.attr('x2'), this.attr('y2') ] - ]) + + return new PointArray( [ + [ this.attr( 'x1' ), this.attr( 'y1' ) ], + [ this.attr( 'x2' ), this.attr( 'y2' ) ] + ] ) + } // Overwrite native plot() method - plot (x1, y1, x2, y2) { - if (x1 == null) { + plot ( x1, y1, x2, y2 ) { + + if ( x1 == null ) { + return this.array() - } else if (typeof y1 !== 'undefined') { + + } else if ( typeof y1 !== 'undefined' ) { + x1 = { x1: x1, y1: y1, x2: x2, y2: y2 } + } else { - x1 = new PointArray(x1).toLine() + + x1 = new PointArray( x1 ).toLine() + } - return this.attr(x1) + return this.attr( x1 ) + } // Move by left top corner - move (x, y) { - return this.attr(this.array().move(x, y).toLine()) + move ( x, y ) { + + return this.attr( this.array().move( x, y ).toLine() ) + } // Set element size to given width and height - size (width, height) { - var p = proportionalSize(this, width, height) - return this.attr(this.array().size(p.width, p.height).toLine()) + size ( width, height ) { + + var p = proportionalSize( this, width, height ) + return this.attr( this.array().size( p.width, p.height ).toLine() ) + } + } -extend(Line, pointed) +extend( Line, pointed ) -registerMethods({ +registerMethods( { Container: { // Create a line element - line: wrapWithAttrCheck(function (...args) { + line: wrapWithAttrCheck( function ( ...args ) { + // make sure plot is called as a setter // x1 is not necessarily a number, it can also be an array, a string and a PointArray return Line.prototype.plot.apply( - this.put(new Line()) - , args[0] != null ? args : [0, 0, 0, 0] + this.put( new Line() ) + , args[0] != null ? args : [ 0, 0, 0, 0 ] ) - }) + + } ) } -}) +} ) -register(Line) +register( Line ) diff --git a/src/elements/Marker.js b/src/elements/Marker.js index d40d13b..1054987 100644 --- a/src/elements/Marker.js +++ b/src/elements/Marker.js @@ -3,79 +3,103 @@ import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class Marker extends Container { + // Initialize node - constructor (node) { - super(nodeOrNew('marker', node), node) + constructor ( node ) { + + super( nodeOrNew( 'marker', node ), node ) + } // Set width of element - width (width) { - return this.attr('markerWidth', width) + width ( width ) { + + return this.attr( 'markerWidth', width ) + } // Set height of element - height (height) { - return this.attr('markerHeight', height) + height ( height ) { + + return this.attr( 'markerHeight', height ) + } // Set marker refX and refY - ref (x, y) { - return this.attr('refX', x).attr('refY', y) + ref ( x, y ) { + + return this.attr( 'refX', x ).attr( 'refY', y ) + } // Update marker - update (block) { + update ( block ) { + // remove all content this.clear() // invoke passed block - if (typeof block === 'function') { block.call(this, this) } + if ( typeof block === 'function' ) { + + block.call( this, this ) + + } return this + } // Return the fill id toString () { + return 'url(#' + this.id() + ')' + } + } -registerMethods({ +registerMethods( { Container: { - marker (...args) { + marker ( ...args ) { + // Create marker element in defs - return this.defs().marker(...args) + return this.defs().marker( ...args ) + } }, Defs: { // Create marker - marker: wrapWithAttrCheck(function (width, height, block) { + marker: wrapWithAttrCheck( function ( width, height, block ) { + // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto - return this.put(new Marker()) - .size(width, height) - .ref(width / 2, height / 2) - .viewbox(0, 0, width, height) - .attr('orient', 'auto') - .update(block) - }) + return this.put( new Marker() ) + .size( width, height ) + .ref( width / 2, height / 2 ) + .viewbox( 0, 0, width, height ) + .attr( 'orient', 'auto' ) + .update( block ) + + } ) }, marker: { // Create and attach markers - marker (marker, width, height, block) { - var attr = ['marker'] + marker ( marker, width, height, block ) { + + var attr = [ 'marker' ] // Build attribute name - if (marker !== 'all') attr.push(marker) - attr = attr.join('-') + if ( marker !== 'all' ) attr.push( marker ) + attr = attr.join( '-' ) // Set marker attribute marker = arguments[1] instanceof Marker ? arguments[1] - : this.defs().marker(width, height, block) + : this.defs().marker( width, height, block ) + + return this.attr( attr, marker ) - return this.attr(attr, marker) } } -}) +} ) -register(Marker) +register( Marker ) diff --git a/src/elements/Mask.js b/src/elements/Mask.js index 8dfffd6..523b9de 100644 --- a/src/elements/Mask.js +++ b/src/elements/Mask.js @@ -4,54 +4,72 @@ import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class Mask extends Container { + // Initialize node - constructor (node) { - super(nodeOrNew('mask', node), node) + constructor ( node ) { + + super( nodeOrNew( 'mask', node ), node ) + } // Unmask all masked elements and remove itself remove () { + // unmask all targets - this.targets().forEach(function (el) { + this.targets().forEach( function ( el ) { + el.unmask() - }) + + } ) // remove mask from parent return super.remove() + } targets () { - return baseFind('svg [mask*="' + this.id() + '"]') + + return baseFind( 'svg [mask*="' + this.id() + '"]' ) + } + } -registerMethods({ +registerMethods( { Container: { - mask: wrapWithAttrCheck(function () { - return this.defs().put(new Mask()) - }) + mask: wrapWithAttrCheck( function () { + + return this.defs().put( new Mask() ) + + } ) }, Element: { // Distribute mask to svg element - maskWith (element) { + maskWith ( element ) { + // use given mask or create a new one var masker = element instanceof Mask ? element - : this.parent().mask().add(element) + : this.parent().mask().add( element ) // apply mask - return this.attr('mask', 'url("#' + masker.id() + '")') + return this.attr( 'mask', 'url("#' + masker.id() + '")' ) + }, // Unmask element unmask () { - return this.attr('mask', null) + + return this.attr( 'mask', null ) + }, masker () { - return this.reference('mask') + + return this.reference( 'mask' ) + } } -}) +} ) -register(Mask) +register( Mask ) diff --git a/src/elements/Path.js b/src/elements/Path.js index dc27320..1fe5661 100644 --- a/src/elements/Path.js +++ b/src/elements/Path.js @@ -6,76 +6,102 @@ import Shape from './Shape.js' import baseFind from '../modules/core/selector.js' export default class Path extends Shape { + // Initialize node - constructor (node) { - super(nodeOrNew('path', node), node) + constructor ( node ) { + + super( nodeOrNew( 'path', node ), node ) + } // Get array array () { - return this._array || (this._array = new PathArray(this.attr('d'))) + + return this._array || ( this._array = new PathArray( this.attr( 'd' ) ) ) + } // Plot new path - plot (d) { - return (d == null) ? this.array() - : this.clear().attr('d', typeof d === 'string' ? d : (this._array = new PathArray(d))) + plot ( d ) { + + return ( d == null ) ? this.array() + : this.clear().attr( 'd', typeof d === 'string' ? d : ( this._array = new PathArray( d ) ) ) + } // Clear array cache clear () { + delete this._array return this + } // Move by left top corner - move (x, y) { - return this.attr('d', this.array().move(x, y)) + move ( x, y ) { + + return this.attr( 'd', this.array().move( x, y ) ) + } // Move by left top corner over x-axis - x (x) { - return x == null ? this.bbox().x : this.move(x, this.bbox().y) + x ( x ) { + + return x == null ? this.bbox().x : this.move( x, this.bbox().y ) + } // Move by left top corner over y-axis - y (y) { - return y == null ? this.bbox().y : this.move(this.bbox().x, y) + y ( y ) { + + return y == null ? this.bbox().y : this.move( this.bbox().x, y ) + } // Set element size to given width and height - size (width, height) { - var p = proportionalSize(this, width, height) - return this.attr('d', this.array().size(p.width, p.height)) + size ( width, height ) { + + var p = proportionalSize( this, width, height ) + return this.attr( 'd', this.array().size( p.width, p.height ) ) + } // Set width of element - width (width) { - return width == null ? this.bbox().width : this.size(width, this.bbox().height) + width ( width ) { + + return width == null ? this.bbox().width : this.size( width, this.bbox().height ) + } // Set height of element - height (height) { - return height == null ? this.bbox().height : this.size(this.bbox().width, height) + height ( height ) { + + return height == null ? this.bbox().height : this.size( this.bbox().width, height ) + } targets () { - return baseFind('svg textpath [href*="' + this.id() + '"]') + + return baseFind( 'svg textpath [href*="' + this.id() + '"]' ) + } + } // Define morphable array Path.prototype.MorphArray = PathArray // Add parent method -registerMethods({ +registerMethods( { Container: { // Create a wrapped path element - path: wrapWithAttrCheck(function (d) { + path: wrapWithAttrCheck( function ( d ) { + // make sure plot is called as a setter - return this.put(new Path()).plot(d || new PathArray()) - }) + return this.put( new Path() ).plot( d || new PathArray() ) + + } ) } -}) +} ) -register(Path) +register( Path ) diff --git a/src/elements/Pattern.js b/src/elements/Pattern.js index 6dd4e01..6f7897b 100644 --- a/src/elements/Pattern.js +++ b/src/elements/Pattern.js @@ -5,67 +5,89 @@ import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class Pattern extends Container { + // Initialize node - constructor (node) { - super(nodeOrNew('pattern', node), node) + constructor ( node ) { + + super( nodeOrNew( 'pattern', node ), node ) + } // Return the fill id url () { + return 'url(#' + this.id() + ')' + } // Update pattern by rebuilding - update (block) { + update ( block ) { + // remove content this.clear() // invoke passed block - if (typeof block === 'function') { - block.call(this, this) + if ( typeof block === 'function' ) { + + block.call( this, this ) + } return this + } // Alias string convertion to fill toString () { + return this.url() + } // custom attr to handle transform - attr (a, b, c) { - if (a === 'transform') a = 'patternTransform' - return super.attr(a, b, c) + attr ( a, b, c ) { + + if ( a === 'transform' ) a = 'patternTransform' + return super.attr( a, b, c ) + } targets () { - return baseFind('svg [fill*="' + this.id() + '"]') + + return baseFind( 'svg [fill*="' + this.id() + '"]' ) + } bbox () { + return new Box() + } + } -registerMethods({ +registerMethods( { Container: { // Create pattern element in defs - pattern (...args) { - return this.defs().pattern(...args) + pattern ( ...args ) { + + return this.defs().pattern( ...args ) + } }, Defs: { - pattern: wrapWithAttrCheck(function (width, height, block) { - return this.put(new Pattern()).update(block).attr({ + pattern: wrapWithAttrCheck( function ( width, height, block ) { + + return this.put( new Pattern() ).update( block ).attr( { x: 0, y: 0, width: width, height: height, patternUnits: 'userSpaceOnUse' - }) - }) + } ) + + } ) } -}) +} ) -register(Pattern) +register( Pattern ) diff --git a/src/elements/Polygon.js b/src/elements/Polygon.js index afa5f31..2288b75 100644 --- a/src/elements/Polygon.js +++ b/src/elements/Polygon.js @@ -11,22 +11,28 @@ import * as pointed from '../modules/core/pointed.js' import * as poly from '../modules/core/poly.js' export default class Polygon extends Shape { + // Initialize node - constructor (node) { - super(nodeOrNew('polygon', node), node) + constructor ( node ) { + + super( nodeOrNew( 'polygon', node ), node ) + } + } -registerMethods({ +registerMethods( { Container: { // Create a wrapped polygon element - polygon: wrapWithAttrCheck(function (p) { + polygon: wrapWithAttrCheck( function ( p ) { + // make sure plot is called as a setter - return this.put(new Polygon()).plot(p || new PointArray()) - }) + return this.put( new Polygon() ).plot( p || new PointArray() ) + + } ) } -}) +} ) -extend(Polygon, pointed) -extend(Polygon, poly) -register(Polygon) +extend( Polygon, pointed ) +extend( Polygon, poly ) +register( Polygon ) diff --git a/src/elements/Polyline.js b/src/elements/Polyline.js index 5897295..3749c93 100644 --- a/src/elements/Polyline.js +++ b/src/elements/Polyline.js @@ -11,22 +11,28 @@ import * as pointed from '../modules/core/pointed.js' import * as poly from '../modules/core/poly.js' export default class Polyline extends Shape { + // Initialize node - constructor (node) { - super(nodeOrNew('polyline', node), node) + constructor ( node ) { + + super( nodeOrNew( 'polyline', node ), node ) + } + } -registerMethods({ +registerMethods( { Container: { // Create a wrapped polygon element - polyline: wrapWithAttrCheck(function (p) { + polyline: wrapWithAttrCheck( function ( p ) { + // make sure plot is called as a setter - return this.put(new Polyline()).plot(p || new PointArray()) - }) + return this.put( new Polyline() ).plot( p || new PointArray() ) + + } ) } -}) +} ) -extend(Polyline, pointed) -extend(Polyline, poly) -register(Polyline) +extend( Polyline, pointed ) +extend( Polyline, poly ) +register( Polyline ) diff --git a/src/elements/Rect.js b/src/elements/Rect.js index 6e161c9..465b52b 100644 --- a/src/elements/Rect.js +++ b/src/elements/Rect.js @@ -9,21 +9,27 @@ import { rx, ry } from '../modules/core/circled.js' import Shape from './Shape.js' export default class Rect extends Shape { + // Initialize node - constructor (node) { - super(nodeOrNew('rect', node), node) + constructor ( node ) { + + super( nodeOrNew( 'rect', node ), node ) + } + } -extend(Rect, { rx, ry }) +extend( Rect, { rx, ry } ) -registerMethods({ +registerMethods( { Container: { // Create a rect element - rect: wrapWithAttrCheck(function (width, height) { - return this.put(new Rect()).size(width, height) - }) + rect: wrapWithAttrCheck( function ( width, height ) { + + return this.put( new Rect() ).size( width, height ) + + } ) } -}) +} ) -register(Rect) +register( Rect ) diff --git a/src/elements/Shape.js b/src/elements/Shape.js index cdddc60..0d5a5b0 100644 --- a/src/elements/Shape.js +++ b/src/elements/Shape.js @@ -3,4 +3,4 @@ import Element from './Element.js' export default class Shape extends Element {} -register(Shape) +register( Shape ) diff --git a/src/elements/Stop.js b/src/elements/Stop.js index 9a5acaa..8838923 100644 --- a/src/elements/Stop.js +++ b/src/elements/Stop.js @@ -3,27 +3,35 @@ import Element from './Element.js' import SVGNumber from '../types/SVGNumber.js' export default class Stop extends Element { - constructor (node) { - super(nodeOrNew('stop', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'stop', node ), node ) + } // add color stops - update (o) { - if (typeof o === 'number' || o instanceof SVGNumber) { + update ( o ) { + + if ( typeof o === 'number' || o instanceof SVGNumber ) { + o = { offset: arguments[0], color: arguments[1], opacity: arguments[2] } + } // set attributes - if (o.opacity != null) this.attr('stop-opacity', o.opacity) - if (o.color != null) this.attr('stop-color', o.color) - if (o.offset != null) this.attr('offset', new SVGNumber(o.offset)) + if ( o.opacity != null ) this.attr( 'stop-opacity', o.opacity ) + if ( o.color != null ) this.attr( 'stop-color', o.color ) + if ( o.offset != null ) this.attr( 'offset', new SVGNumber( o.offset ) ) return this + } + } -register(Stop) +register( Stop ) diff --git a/src/elements/Style.js b/src/elements/Style.js index 50ec50e..643f356 100644 --- a/src/elements/Style.js +++ b/src/elements/Style.js @@ -3,51 +3,69 @@ import { registerMethods } from '../utils/methods.js' import { unCamelCase } from '../utils/utils.js' import Element from './Element.js' -function cssRule (selector, rule) { - if (!selector) return '' - if (!rule) return selector +function cssRule ( selector, rule ) { + + if ( !selector ) return '' + if ( !rule ) return selector var ret = selector + '{' - for (var i in rule) { - ret += unCamelCase(i) + ':' + rule[i] + ';' + for ( var i in rule ) { + + ret += unCamelCase( i ) + ':' + rule[i] + ';' + } ret += '}' return ret + } export default class Style extends Element { - constructor (node) { - super(nodeOrNew('style', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'style', node ), node ) + } - words (w) { - this.node.textContent += (w || '') + words ( w ) { + + this.node.textContent += ( w || '' ) return this + } - font (name, src, params = {}) { - return this.rule('@font-face', { + font ( name, src, params = {} ) { + + return this.rule( '@font-face', { fontFamily: name, src: src, ...params - }) + } ) + } - rule (selector, obj) { - return this.words(cssRule(selector, obj)) + rule ( selector, obj ) { + + return this.words( cssRule( selector, obj ) ) + } + } -registerMethods('Dom', { - style: wrapWithAttrCheck(function (selector, obj) { - return this.put(new Style()).rule(selector, obj) - }), - fontface: wrapWithAttrCheck(function (name, src, params) { - return this.put(new Style()).font(name, src, params) - }) -}) +registerMethods( 'Dom', { + style: wrapWithAttrCheck( function ( selector, obj ) { + + return this.put( new Style() ).rule( selector, obj ) + + } ), + fontface: wrapWithAttrCheck( function ( name, src, params ) { + + return this.put( new Style() ).font( name, src, params ) + + } ) +} ) -register(Style) +register( Style ) diff --git a/src/elements/Svg.js b/src/elements/Svg.js index 6172454..1326900 100644 --- a/src/elements/Svg.js +++ b/src/elements/Svg.js @@ -11,68 +11,90 @@ import Defs from './Defs.js' import { globals } from '../utils/window.js' export default class Svg extends Container { - constructor (node) { - super(nodeOrNew('svg', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'svg', node ), node ) this.namespace() + } isRoot () { - return !this.node.parentNode || - !(this.node.parentNode instanceof globals.window.SVGElement) || - this.node.parentNode.nodeName === '#document' + + return !this.node.parentNode + || !( this.node.parentNode instanceof globals.window.SVGElement ) + || this.node.parentNode.nodeName === '#document' + } // Check if this is a root svg // If not, call docs from this element root () { - if (this.isRoot()) return this + + if ( this.isRoot() ) return this return super.root() + } // Add namespaces namespace () { - if (!this.isRoot()) return this.root().namespace() + + if ( !this.isRoot() ) return this.root().namespace() return this - .attr({ xmlns: ns, version: '1.1' }) - .attr('xmlns:xlink', xlink, xmlns) - .attr('xmlns:svgjs', svgjs, xmlns) + .attr( { xmlns: ns, version: '1.1' } ) + .attr( 'xmlns:xlink', xlink, xmlns ) + .attr( 'xmlns:svgjs', svgjs, xmlns ) + } // Creates and returns defs element defs () { - if (!this.isRoot()) return this.root().defs() - return adopt(this.node.getElementsByTagName('defs')[0]) || - this.put(new Defs()) + if ( !this.isRoot() ) return this.root().defs() + + return adopt( this.node.getElementsByTagName( 'defs' )[0] ) + || this.put( new Defs() ) + } // custom parent method - parent (type) { - if (this.isRoot()) { + parent ( type ) { + + if ( this.isRoot() ) { + return this.node.parentNode.nodeName === '#document' ? null - : adopt(this.node.parentNode) + : adopt( this.node.parentNode ) + } - return super.parent(type) + return super.parent( type ) + } clear () { + // remove children - while (this.node.hasChildNodes()) { - this.node.removeChild(this.node.lastChild) + while ( this.node.hasChildNodes() ) { + + this.node.removeChild( this.node.lastChild ) + } return this + } + } -registerMethods({ +registerMethods( { Container: { // Create nested svg document - nested: wrapWithAttrCheck(function () { - return this.put(new Svg()) - }) + nested: wrapWithAttrCheck( function () { + + return this.put( new Svg() ) + + } ) } -}) +} ) -register(Svg, 'Svg', true) +register( Svg, 'Svg', true ) diff --git a/src/elements/Symbol.js b/src/elements/Symbol.js index f44125c..577d1f1 100644 --- a/src/elements/Symbol.js +++ b/src/elements/Symbol.js @@ -3,18 +3,24 @@ import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class Symbol extends Container { + // Initialize node - constructor (node) { - super(nodeOrNew('symbol', node), node) + constructor ( node ) { + + super( nodeOrNew( 'symbol', node ), node ) + } + } -registerMethods({ +registerMethods( { Container: { - symbol: wrapWithAttrCheck(function () { - return this.put(new Symbol()) - }) + symbol: wrapWithAttrCheck( function () { + + return this.put( new Symbol() ) + + } ) } -}) +} ) -register(Symbol) +register( Symbol ) diff --git a/src/elements/Text.js b/src/elements/Text.js index db9c2ee..a981d73 100644 --- a/src/elements/Text.js +++ b/src/elements/Text.js @@ -13,175 +13,233 @@ import { globals } from '../utils/window.js' import * as textable from '../modules/core/textable.js' export default class Text extends Shape { + // Initialize node - constructor (node) { - super(nodeOrNew('text', node), node) + constructor ( node ) { + + super( nodeOrNew( 'text', node ), node ) - this.dom.leading = new SVGNumber(1.3) // store leading value for rebuilding + this.dom.leading = new SVGNumber( 1.3 ) // store leading value for rebuilding this._rebuild = true // enable automatic updating of dy values this._build = false // disable build mode for adding multiple lines // set default font - this.attr('font-family', attrs['font-family']) + this.attr( 'font-family', attrs['font-family'] ) + } // Move over x-axis - x (x) { + x ( x ) { + // act as getter - if (x == null) { - return this.attr('x') + if ( x == null ) { + + return this.attr( 'x' ) + } - return this.attr('x', x) + return this.attr( 'x', x ) + } // Move over y-axis - y (y) { - var oy = this.attr('y') + y ( y ) { + + var oy = this.attr( 'y' ) var o = typeof oy === 'number' ? oy - this.bbox().y : 0 // act as getter - if (y == null) { + if ( y == null ) { + return typeof oy === 'number' ? oy - o : oy + } - return this.attr('y', typeof y === 'number' ? y + o : y) + return this.attr( 'y', typeof y === 'number' ? y + o : y ) + } // Move center over x-axis - cx (x) { - return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2) + cx ( x ) { + + return x == null ? this.bbox().cx : this.x( x - this.bbox().width / 2 ) + } // Move center over y-axis - cy (y) { - return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2) + cy ( y ) { + + return y == null ? this.bbox().cy : this.y( y - this.bbox().height / 2 ) + } // Set the text content - text (text) { + text ( text ) { + // act as getter - if (text === undefined) { + if ( text === undefined ) { + var children = this.node.childNodes var firstLine = 0 text = '' - for (var i = 0, len = children.length; i < len; ++i) { + for ( var i = 0, len = children.length; i < len; ++i ) { + // skip textPaths - they are no lines - if (children[i].nodeName === 'textPath') { - if (i === 0) firstLine = 1 + if ( children[i].nodeName === 'textPath' ) { + + if ( i === 0 ) firstLine = 1 continue + } // add newline if its not the first child and newLined is set to true - if (i !== firstLine && children[i].nodeType !== 3 && adopt(children[i]).dom.newLined === true) { + if ( i !== firstLine && children[i].nodeType !== 3 && adopt( children[i] ).dom.newLined === true ) { + text += '\n' + } // add content of this node text += children[i].textContent + } return text + } // remove existing content - this.clear().build(true) + this.clear().build( true ) + + if ( typeof text === 'function' ) { - if (typeof text === 'function') { // call block - text.call(this, this) + text.call( this, this ) + } else { + // store text and make sure text is not blank - text = text.split('\n') + text = text.split( '\n' ) // build new lines - for (var j = 0, jl = text.length; j < jl; j++) { - this.tspan(text[j]).newLine() + for ( var j = 0, jl = text.length; j < jl; j++ ) { + + this.tspan( text[j] ).newLine() + } + } // disable build mode and rebuild lines - return this.build(false).rebuild() + return this.build( false ).rebuild() + } // Set / get leading - leading (value) { + leading ( value ) { + // act as getter - if (value == null) { + if ( value == null ) { + return this.dom.leading + } // act as setter - this.dom.leading = new SVGNumber(value) + this.dom.leading = new SVGNumber( value ) return this.rebuild() + } // Rebuild appearance type - rebuild (rebuild) { + rebuild ( rebuild ) { + // store new rebuild flag if given - if (typeof rebuild === 'boolean') { + if ( typeof rebuild === 'boolean' ) { + this._rebuild = rebuild + } // define position of all lines - if (this._rebuild) { + if ( this._rebuild ) { + var self = this var blankLineOffset = 0 var leading = this.dom.leading - this.each(function () { - var fontSize = globals.window.getComputedStyle(this.node) - .getPropertyValue('font-size') - var dy = leading * new SVGNumber(fontSize) + this.each( function () { + + var fontSize = globals.window.getComputedStyle( this.node ) + .getPropertyValue( 'font-size' ) + var dy = leading * new SVGNumber( fontSize ) + + if ( this.dom.newLined ) { - if (this.dom.newLined) { - this.attr('x', self.attr('x')) + this.attr( 'x', self.attr( 'x' ) ) + + if ( this.text() === '\n' ) { - if (this.text() === '\n') { blankLineOffset += dy + } else { - this.attr('dy', dy + blankLineOffset) + + this.attr( 'dy', dy + blankLineOffset ) blankLineOffset = 0 + } + } - }) - this.fire('rebuild') + } ) + + this.fire( 'rebuild' ) + } return this + } // Enable / disable build mode - build (build) { + build ( build ) { + this._build = !!build return this + } // overwrite method from parent to set data properly - setData (o) { + setData ( o ) { + this.dom = o - this.dom.leading = new SVGNumber(o.leading || 1.3) + this.dom.leading = new SVGNumber( o.leading || 1.3 ) return this + } + } -extend(Text, textable) +extend( Text, textable ) -registerMethods({ +registerMethods( { Container: { // Create text element - text: wrapWithAttrCheck(function (text) { - return this.put(new Text()).text(text) - }), + text: wrapWithAttrCheck( function ( text ) { + + return this.put( new Text() ).text( text ) + + } ), // Create plain text element - plain: wrapWithAttrCheck(function (text) { - return this.put(new Text()).plain(text) - }) + plain: wrapWithAttrCheck( function ( text ) { + + return this.put( new Text() ).plain( text ) + + } ) } -}) +} ) -register(Text) +register( Text ) diff --git a/src/elements/TextPath.js b/src/elements/TextPath.js index 91c48ae..af89ef7 100644 --- a/src/elements/TextPath.js +++ b/src/elements/TextPath.js @@ -7,80 +7,106 @@ import Text from './Text.js' import baseFind from '../modules/core/selector.js' export default class TextPath extends Text { + // Initialize node - constructor (node) { - super(nodeOrNew('textPath', node), node) + constructor ( node ) { + + super( nodeOrNew( 'textPath', node ), node ) + } // return the array of the path track element array () { + var track = this.track() return track ? track.array() : null + } // Plot path if any - plot (d) { + plot ( d ) { + var track = this.track() var pathArray = null - if (track) { - pathArray = track.plot(d) + if ( track ) { + + pathArray = track.plot( d ) + } - return (d == null) ? pathArray : this + return ( d == null ) ? pathArray : this + } // Get the path element track () { - return this.reference('href') + + return this.reference( 'href' ) + } + } -registerMethods({ +registerMethods( { Container: { - textPath: wrapWithAttrCheck(function (text, path) { - return this.defs().path(path).text(text).addTo(this) - }) + textPath: wrapWithAttrCheck( function ( text, path ) { + + return this.defs().path( path ).text( text ).addTo( this ) + + } ) }, Text: { // Create path for text to run on - path: wrapWithAttrCheck(function (track) { + path: wrapWithAttrCheck( function ( track ) { + var path = new TextPath() // if track is a path, reuse it - if (!(track instanceof Path)) { + if ( !( track instanceof Path ) ) { + // create path element - track = this.root().defs().path(track) + track = this.root().defs().path( track ) + } // link textPath to path and add content - path.attr('href', '#' + track, xlink) + path.attr( 'href', '#' + track, xlink ) // add textPath element as child node and return textPath - return this.put(path) - }), + return this.put( path ) + + } ), // Get the textPath children textPath () { - return this.find('textPath')[0] + + return this.find( 'textPath' )[0] + } }, Path: { // creates a textPath from this path - text: wrapWithAttrCheck(function (text) { - if (text instanceof Text) { + text: wrapWithAttrCheck( function ( text ) { + + if ( text instanceof Text ) { + var txt = text.text() - return text.clear().path(this).text(txt) + return text.clear().path( this ).text( txt ) + } - return this.parent().put(new Text()).path(this).text(text) - }), + return this.parent().put( new Text() ).path( this ).text( text ) + + } ), targets () { - return baseFind('svg [href*="' + this.id() + '"]') + + return baseFind( 'svg [href*="' + this.id() + '"]' ) + } } -}) +} ) TextPath.prototype.MorphArray = PathArray -register(TextPath) +register( TextPath ) diff --git a/src/elements/Tspan.js b/src/elements/Tspan.js index abd032f..fcf8cf5 100644 --- a/src/elements/Tspan.js +++ b/src/elements/Tspan.js @@ -9,61 +9,77 @@ import Text from './Text.js' import * as textable from '../modules/core/textable.js' export default class Tspan extends Text { + // Initialize node - constructor (node) { - super(nodeOrNew('tspan', node), node) + constructor ( node ) { + + super( nodeOrNew( 'tspan', node ), node ) + } // Set text content - text (text) { - if (text == null) return this.node.textContent + (this.dom.newLined ? '\n' : '') + text ( text ) { + + if ( text == null ) return this.node.textContent + ( this.dom.newLined ? '\n' : '' ) - typeof text === 'function' ? text.call(this, this) : this.plain(text) + typeof text === 'function' ? text.call( this, this ) : this.plain( text ) return this + } // Shortcut dx - dx (dx) { - return this.attr('dx', dx) + dx ( dx ) { + + return this.attr( 'dx', dx ) + } // Shortcut dy - dy (dy) { - return this.attr('dy', dy) + dy ( dy ) { + + return this.attr( 'dy', dy ) + } // Create new line newLine () { + // fetch text parent - var t = this.parent(Text) + var t = this.parent( Text ) // mark new line this.dom.newLined = true // apply new position - return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x()) + return this.dy( t.dom.leading * t.attr( 'font-size' ) ).attr( 'x', t.x() ) + } + } -extend(Tspan, textable) +extend( Tspan, textable ) -registerMethods({ +registerMethods( { Tspan: { - tspan: wrapWithAttrCheck(function (text) { + tspan: wrapWithAttrCheck( function ( text ) { + var tspan = new Tspan() // clear if build mode is disabled - if (!this._build) { + if ( !this._build ) { + this.clear() + } // add new tspan - this.node.appendChild(tspan.node) + this.node.appendChild( tspan.node ) + + return tspan.text( text ) - return tspan.text(text) - }) + } ) } -}) +} ) -register(Tspan) +register( Tspan ) diff --git a/src/elements/Use.js b/src/elements/Use.js index 7921461..9237e08 100644 --- a/src/elements/Use.js +++ b/src/elements/Use.js @@ -4,24 +4,32 @@ import { xlink } from '../modules/core/namespaces.js' import Shape from './Shape.js' export default class Use extends Shape { - constructor (node) { - super(nodeOrNew('use', node), node) + + constructor ( node ) { + + super( nodeOrNew( 'use', node ), node ) + } // Use element as a reference - element (element, file) { + element ( element, file ) { + // Set lined element - return this.attr('href', (file || '') + '#' + element, xlink) + return this.attr( 'href', ( file || '' ) + '#' + element, xlink ) + } + } -registerMethods({ +registerMethods( { Container: { // Create a use element - use: wrapWithAttrCheck(function (element, file) { - return this.put(new Use()).element(element, file) - }) + use: wrapWithAttrCheck( function ( element, file ) { + + return this.put( new Use() ).element( element, file ) + + } ) } -}) +} ) -register(Use) +register( Use ) diff --git a/src/main.js b/src/main.js index 919fb25..951cc69 100644 --- a/src/main.js +++ b/src/main.js @@ -116,50 +116,50 @@ export { default as TextPath } from './elements/TextPath.js' export { default as Tspan } from './elements/Tspan.js' export { default as Use } from './elements/Use.js' -extend([ +extend( [ Svg, Symbol, Image, Pattern, Marker -], getMethodsFor('viewbox')) +], getMethodsFor( 'viewbox' ) ) -extend([ +extend( [ Line, Polyline, Polygon, Path -], getMethodsFor('marker')) +], getMethodsFor( 'marker' ) ) -extend(Text, getMethodsFor('Text')) -extend(Path, getMethodsFor('Path')) +extend( Text, getMethodsFor( 'Text' ) ) +extend( Path, getMethodsFor( 'Path' ) ) -extend(Defs, getMethodsFor('Defs')) +extend( Defs, getMethodsFor( 'Defs' ) ) -extend([ +extend( [ Text, Tspan -], getMethodsFor('Tspan')) +], getMethodsFor( 'Tspan' ) ) -extend([ +extend( [ Rect, Ellipse, Circle, Gradient -], getMethodsFor('radius')) +], getMethodsFor( 'radius' ) ) -extend(EventTarget, getMethodsFor('EventTarget')) -extend(Dom, getMethodsFor('Dom')) -extend(Element, getMethodsFor('Element')) -extend(Shape, getMethodsFor('Shape')) +extend( EventTarget, getMethodsFor( 'EventTarget' ) ) +extend( Dom, getMethodsFor( 'Dom' ) ) +extend( Element, getMethodsFor( 'Element' ) ) +extend( Shape, getMethodsFor( 'Shape' ) ) // extend(Element, getConstructor('Memory')) -extend(Container, getMethodsFor('Container')) +extend( Container, getMethodsFor( 'Container' ) ) -extend(Runner, getMethodsFor('Runner')) +extend( Runner, getMethodsFor( 'Runner' ) ) -List.extend(getMethodNames()) +List.extend( getMethodNames() ) -registerMorphableType([ +registerMorphableType( [ SVGNumber, Color, Box, @@ -167,6 +167,6 @@ registerMorphableType([ SVGArray, PointArray, PathArray -]) +] ) makeMorphable() diff --git a/src/modules/core/attr.js b/src/modules/core/attr.js index f90dcb9..7cb9e2a 100644 --- a/src/modules/core/attr.js +++ b/src/modules/core/attr.js @@ -5,77 +5,113 @@ import SVGArray from '../../types/SVGArray.js' import SVGNumber from '../../types/SVGNumber.js' const hooks = [] -export function registerAttrHook (fn) { - hooks.push(fn) +export function registerAttrHook ( fn ) { + + hooks.push( fn ) + } // Set svg element attribute -export default function attr (attr, val, ns) { +export default function attr ( attr, val, ns ) { + // act as full getter - if (attr == null) { + if ( attr == null ) { + // get an object of attributes attr = {} val = this.node.attributes - for (let node of val) { - attr[node.nodeName] = isNumber.test(node.nodeValue) - ? parseFloat(node.nodeValue) + for ( let node of val ) { + + attr[node.nodeName] = isNumber.test( node.nodeValue ) + ? parseFloat( node.nodeValue ) : node.nodeValue + } return attr - } else if (attr instanceof Array) { + + } else if ( attr instanceof Array ) { + // loop through array and get all values - return attr.reduce((last, curr) => { - last[curr] = this.attr(curr) + return attr.reduce( ( last, curr ) => { + + last[curr] = this.attr( curr ) return last - }, {}) - } else if (typeof attr === 'object') { + + }, {} ) + + } else if ( typeof attr === 'object' ) { + // apply every attribute individually if an object is passed - for (val in attr) this.attr(val, attr[val]) - } else if (val === null) { + for ( val in attr ) this.attr( val, attr[val] ) + + } else if ( val === null ) { + // remove value - this.node.removeAttribute(attr) - } else if (val == null) { + this.node.removeAttribute( attr ) + + } else if ( val == null ) { + // act as a getter if the first and only argument is not an object - val = this.node.getAttribute(attr) + val = this.node.getAttribute( attr ) return val == null ? defaults[attr] - : isNumber.test(val) ? parseFloat(val) - : val + : isNumber.test( val ) ? parseFloat( val ) + : val + } else { + // Loop through hooks and execute them to convert value - val = hooks.reduce((_val, hook) => { - return hook(attr, _val, this) - }, val) + val = hooks.reduce( ( _val, hook ) => { + + return hook( attr, _val, this ) + + }, val ) // ensure correct numeric values (also accepts NaN and Infinity) - if (typeof val === 'number') { - val = new SVGNumber(val) - } else if (Color.isColor(val)) { + if ( typeof val === 'number' ) { + + val = new SVGNumber( val ) + + } else if ( Color.isColor( val ) ) { + // ensure full hex color - val = new Color(val) - } else if (val.constructor === Array) { + val = new Color( val ) + + } else if ( val.constructor === Array ) { + // Check for plain arrays and parse array values - val = new SVGArray(val) + val = new SVGArray( val ) + } // if the passed attribute is leading... - if (attr === 'leading') { + if ( attr === 'leading' ) { + // ... call the leading method instead - if (this.leading) { - this.leading(val) + if ( this.leading ) { + + this.leading( val ) + } + } else { + // set given attribute on node - typeof ns === 'string' ? this.node.setAttributeNS(ns, attr, val.toString()) - : this.node.setAttribute(attr, val.toString()) + typeof ns === 'string' ? this.node.setAttributeNS( ns, attr, val.toString() ) + : this.node.setAttribute( attr, val.toString() ) + } // rebuild if required - if (this.rebuild && (attr === 'font-size' || attr === 'x')) { + if ( this.rebuild && ( attr === 'font-size' || attr === 'x' ) ) { + this.rebuild() + } + } return this + } diff --git a/src/modules/core/circled.js b/src/modules/core/circled.js index 597d252..ad901b9 100644 --- a/src/modules/core/circled.js +++ b/src/modules/core/circled.js @@ -1,53 +1,69 @@ import SVGNumber from '../../types/SVGNumber.js' // Radius x value -export function rx (rx) { - return this.attr('rx', rx) +export function rx ( rx ) { + + return this.attr( 'rx', rx ) + } // Radius y value -export function ry (ry) { - return this.attr('ry', ry) +export function ry ( ry ) { + + return this.attr( 'ry', ry ) + } // Move over x-axis -export function x (x) { +export function x ( x ) { + return x == null ? this.cx() - this.rx() - : this.cx(x + this.rx()) + : this.cx( x + this.rx() ) + } // Move over y-axis -export function y (y) { +export function y ( y ) { + return y == null ? this.cy() - this.ry() - : this.cy(y + this.ry()) + : this.cy( y + this.ry() ) + } // Move by center over x-axis -export function cx (x) { +export function cx ( x ) { + return x == null - ? this.attr('cx') - : this.attr('cx', x) + ? this.attr( 'cx' ) + : this.attr( 'cx', x ) + } // Move by center over y-axis -export function cy (y) { +export function cy ( y ) { + return y == null - ? this.attr('cy') - : this.attr('cy', y) + ? this.attr( 'cy' ) + : this.attr( 'cy', y ) + } // Set width of element -export function width (width) { +export function width ( width ) { + return width == null ? this.rx() * 2 - : this.rx(new SVGNumber(width).divide(2)) + : this.rx( new SVGNumber( width ).divide( 2 ) ) + } // Set height of element -export function height (height) { +export function height ( height ) { + return height == null ? this.ry() * 2 - : this.ry(new SVGNumber(height).divide(2)) + : this.ry( new SVGNumber( height ).divide( 2 ) ) + } diff --git a/src/modules/core/event.js b/src/modules/core/event.js index a52a744..23459fb 100644 --- a/src/modules/core/event.js +++ b/src/modules/core/event.js @@ -4,38 +4,48 @@ import { globals } from '../../utils/window.js' let listenerId = 0 -function getEvents (node) { - const n = makeInstance(node).getEventHolder() - if (!n.events) n.events = {} +function getEvents ( node ) { + + const n = makeInstance( node ).getEventHolder() + if ( !n.events ) n.events = {} return n.events + } -function getEventTarget (node) { - return makeInstance(node).getEventTarget() +function getEventTarget ( node ) { + + return makeInstance( node ).getEventTarget() + } -function clearEvents (node) { - const n = makeInstance(node).getEventHolder() - if (n.events) n.events = {} +function clearEvents ( node ) { + + const n = makeInstance( node ).getEventHolder() + if ( n.events ) n.events = {} + } // Add event binder in the SVG namespace -export function on (node, events, listener, binding, options) { - var l = listener.bind(binding || node) - var bag = getEvents(node) - var n = getEventTarget(node) +export function on ( node, events, listener, binding, options ) { + + var l = listener.bind( binding || node ) + var bag = getEvents( node ) + var n = getEventTarget( node ) // events can be an array of events or a string of events - events = Array.isArray(events) ? events : events.split(delimiter) + events = Array.isArray( events ) ? events : events.split( delimiter ) // add id to listener - if (!listener._svgjsListenerId) { + if ( !listener._svgjsListenerId ) { + listener._svgjsListenerId = ++listenerId + } - events.forEach(function (event) { - var ev = event.split('.')[0] - var ns = event.split('.')[1] || '*' + events.forEach( function ( event ) { + + var ev = event.split( '.' )[0] + var ns = event.split( '.' )[1] || '*' // ensure valid object bag[ev] = bag[ev] || {} @@ -45,76 +55,126 @@ export function on (node, events, listener, binding, options) { bag[ev][ns][listener._svgjsListenerId] = l // add listener - n.addEventListener(ev, l, options || false) - }) + n.addEventListener( ev, l, options || false ) + + } ) + } // Add event unbinder in the SVG namespace -export function off (node, events, listener, options) { - var bag = getEvents(node) - var n = getEventTarget(node) +export function off ( node, events, listener, options ) { + + var bag = getEvents( node ) + var n = getEventTarget( node ) // listener can be a function or a number - if (typeof listener === 'function') { + if ( typeof listener === 'function' ) { + listener = listener._svgjsListenerId - if (!listener) return + if ( !listener ) return + } // events can be an array of events or a string or undefined - events = Array.isArray(events) ? events : (events || '').split(delimiter) + events = Array.isArray( events ) ? events : ( events || '' ).split( delimiter ) + + events.forEach( function ( event ) { - events.forEach(function (event) { - var ev = event && event.split('.')[0] - var ns = event && event.split('.')[1] + var ev = event && event.split( '.' )[0] + var ns = event && event.split( '.' )[1] var namespace, l - if (listener) { + if ( listener ) { + // remove listener reference - if (bag[ev] && bag[ev][ns || '*']) { + if ( bag[ev] && bag[ev][ns || '*'] ) { + // removeListener - n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false) + n.removeEventListener( ev, bag[ev][ns || '*'][listener], options || false ) delete bag[ev][ns || '*'][listener] + } - } else if (ev && ns) { + + } else if ( ev && ns ) { + // remove all listeners for a namespaced event - if (bag[ev] && bag[ev][ns]) { - for (l in bag[ev][ns]) { off(n, [ev, ns].join('.'), l) } + if ( bag[ev] && bag[ev][ns] ) { + + for ( l in bag[ev][ns] ) { + + off( n, [ ev, ns ].join( '.' ), l ) + + } delete bag[ev][ns] + } - } else if (ns) { + + } else if ( ns ) { + // remove all listeners for a specific namespace - for (event in bag) { - for (namespace in bag[event]) { - if (ns === namespace) { off(n, [event, ns].join('.')) } + for ( event in bag ) { + + for ( namespace in bag[event] ) { + + if ( ns === namespace ) { + + off( n, [ event, ns ].join( '.' ) ) + + } + } + } - } else if (ev) { + + } else if ( ev ) { + // remove all listeners for the event - if (bag[ev]) { - for (namespace in bag[ev]) { off(n, [ev, namespace].join('.')) } + if ( bag[ev] ) { + + for ( namespace in bag[ev] ) { + + off( n, [ ev, namespace ].join( '.' ) ) + + } delete bag[ev] + } + } else { + // remove all listeners on a given node - for (event in bag) { off(n, event) } + for ( event in bag ) { + + off( n, event ) + + } + + clearEvents( node ) - clearEvents(node) } - }) + + } ) + } -export function dispatch (node, event, data) { - var n = getEventTarget(node) +export function dispatch ( node, event, data ) { + + var n = getEventTarget( node ) // Dispatch event - if (event instanceof globals.window.Event) { - n.dispatchEvent(event) + if ( event instanceof globals.window.Event ) { + + n.dispatchEvent( event ) + } else { - event = new globals.window.CustomEvent(event, { detail: data, cancelable: true }) - n.dispatchEvent(event) + + event = new globals.window.CustomEvent( event, { detail: data, cancelable: true } ) + n.dispatchEvent( event ) + } return event + } diff --git a/src/modules/core/gradiented.js b/src/modules/core/gradiented.js index 6c744e4..dd9c46f 100644 --- a/src/modules/core/gradiented.js +++ b/src/modules/core/gradiented.js @@ -1,13 +1,17 @@ import SVGNumber from '../../types/SVGNumber.js' -export function from (x, y) { - return (this._element || this).type === 'radialGradient' - ? this.attr({ fx: new SVGNumber(x), fy: new SVGNumber(y) }) - : this.attr({ x1: new SVGNumber(x), y1: new SVGNumber(y) }) +export function from ( x, y ) { + + return ( this._element || this ).type === 'radialGradient' + ? this.attr( { fx: new SVGNumber( x ), fy: new SVGNumber( y ) } ) + : this.attr( { x1: new SVGNumber( x ), y1: new SVGNumber( y ) } ) + } -export function to (x, y) { - return (this._element || this).type === 'radialGradient' - ? this.attr({ cx: new SVGNumber(x), cy: new SVGNumber(y) }) - : this.attr({ x2: new SVGNumber(x), y2: new SVGNumber(y) }) +export function to ( x, y ) { + + return ( this._element || this ).type === 'radialGradient' + ? this.attr( { cx: new SVGNumber( x ), cy: new SVGNumber( y ) } ) + : this.attr( { x2: new SVGNumber( x ), y2: new SVGNumber( y ) } ) + } diff --git a/src/modules/core/parser.js b/src/modules/core/parser.js index 1ff2380..12c9728 100644 --- a/src/modules/core/parser.js +++ b/src/modules/core/parser.js @@ -2,26 +2,32 @@ import { globals } from '../../utils/window.js' import { makeInstance } from '../../utils/adopter.js' export default function parser () { + // Reuse cached element if possible - if (!parser.nodes) { - let svg = makeInstance().size(2, 0) + if ( !parser.nodes ) { + + let svg = makeInstance().size( 2, 0 ) svg.node.cssText = [ 'opacity: 0', 'position: absolute', 'left: -100%', 'top: -100%', 'overflow: hidden' - ].join(';') + ].join( ';' ) let path = svg.path().node parser.nodes = { svg, path } + } - if (!parser.nodes.svg.node.parentNode) { + if ( !parser.nodes.svg.node.parentNode ) { + let b = globals.document.body || globals.document.documentElement - parser.nodes.svg.addTo(b) + parser.nodes.svg.addTo( b ) + } return parser.nodes + } diff --git a/src/modules/core/pointed.js b/src/modules/core/pointed.js index 95e6819..813b0e3 100644 --- a/src/modules/core/pointed.js +++ b/src/modules/core/pointed.js @@ -3,23 +3,31 @@ import PointArray from '../../types/PointArray.js' export let MorphArray = PointArray // Move by left top corner over x-axis -export function x (x) { - return x == null ? this.bbox().x : this.move(x, this.bbox().y) +export function x ( x ) { + + return x == null ? this.bbox().x : this.move( x, this.bbox().y ) + } // Move by left top corner over y-axis -export function y (y) { - return y == null ? this.bbox().y : this.move(this.bbox().x, y) +export function y ( y ) { + + return y == null ? this.bbox().y : this.move( this.bbox().x, y ) + } // Set width of element -export function width (width) { +export function width ( width ) { + let b = this.bbox() - return width == null ? b.width : this.size(width, b.height) + return width == null ? b.width : this.size( width, b.height ) + } // Set height of element -export function height (height) { +export function height ( height ) { + let b = this.bbox() - return height == null ? b.height : this.size(b.width, height) + return height == null ? b.height : this.size( b.width, height ) + } diff --git a/src/modules/core/poly.js b/src/modules/core/poly.js index ad12020..56703a5 100644 --- a/src/modules/core/poly.js +++ b/src/modules/core/poly.js @@ -3,29 +3,39 @@ import PointArray from '../../types/PointArray.js' // Get array export function array () { - return this._array || (this._array = new PointArray(this.attr('points'))) + + return this._array || ( this._array = new PointArray( this.attr( 'points' ) ) ) + } // Plot new path -export function plot (p) { - return (p == null) ? this.array() - : this.clear().attr('points', typeof p === 'string' ? p - : (this._array = new PointArray(p))) +export function plot ( p ) { + + return ( p == null ) ? this.array() + : this.clear().attr( 'points', typeof p === 'string' ? p + : ( this._array = new PointArray( p ) ) ) + } // Clear array cache export function clear () { + delete this._array return this + } // Move by left top corner -export function move (x, y) { - return this.attr('points', this.array().move(x, y)) +export function move ( x, y ) { + + return this.attr( 'points', this.array().move( x, y ) ) + } // Set element size to given width and height -export function size (width, height) { - let p = proportionalSize(this, width, height) - return this.attr('points', this.array().size(p.width, p.height)) +export function size ( width, height ) { + + let p = proportionalSize( this, width, height ) + return this.attr( 'points', this.array().size( p.width, p.height ) ) + } diff --git a/src/modules/core/selector.js b/src/modules/core/selector.js index 24841c5..a60df02 100644 --- a/src/modules/core/selector.js +++ b/src/modules/core/selector.js @@ -3,13 +3,19 @@ import { globals } from '../../utils/window.js' import { map } from '../../utils/utils.js' import List from '../../types/List.js' -export default function baseFind (query, parent) { - return new List(map((parent || globals.document).querySelectorAll(query), function (node) { - return adopt(node) - })) +export default function baseFind ( query, parent ) { + + return new List( map( ( parent || globals.document ).querySelectorAll( query ), function ( node ) { + + return adopt( node ) + + } ) ) + } // Scoped find method -export function find (query) { - return baseFind(query, this.node) +export function find ( query ) { + + return baseFind( query, this.node ) + } diff --git a/src/modules/core/textable.js b/src/modules/core/textable.js index 55df7c6..b0a0993 100644 --- a/src/modules/core/textable.js +++ b/src/modules/core/textable.js @@ -1,19 +1,25 @@ import { globals } from '../../utils/window.js' // Create plain text node -export function plain (text) { +export function plain ( text ) { + // clear if build mode is disabled - if (this._build === false) { + if ( this._build === false ) { + this.clear() + } // create text node - this.node.appendChild(globals.document.createTextNode(text)) + this.node.appendChild( globals.document.createTextNode( text ) ) return this + } // Get length of text element export function length () { + return this.node.getComputedTextLength() + } diff --git a/src/modules/optional/arrange.js b/src/modules/optional/arrange.js index 6ce2eea..51e8605 100644 --- a/src/modules/optional/arrange.js +++ b/src/modules/optional/arrange.js @@ -3,109 +3,141 @@ import { registerMethods } from '../../utils/methods.js' // Get all siblings, including myself export function siblings () { + return this.parent().children() + } // Get the curent position siblings export function position () { - return this.parent().index(this) + + return this.parent().index( this ) + } // Get the next element (will return null if there is none) export function next () { + return this.siblings()[this.position() + 1] + } // Get the next element (will return null if there is none) export function prev () { + return this.siblings()[this.position() - 1] + } // Send given element one step forward export function forward () { + var i = this.position() + 1 var p = this.parent() // move node one step forward - p.removeElement(this).add(this, i) + p.removeElement( this ).add( this, i ) // make sure defs node is always at the top - if (typeof p.isRoot === 'function' && p.isRoot()) { - p.node.appendChild(p.defs().node) + if ( typeof p.isRoot === 'function' && p.isRoot() ) { + + p.node.appendChild( p.defs().node ) + } return this + } // Send given element one step backward export function backward () { + var i = this.position() - if (i > 0) { - this.parent().removeElement(this).add(this, i - 1) + if ( i > 0 ) { + + this.parent().removeElement( this ).add( this, i - 1 ) + } return this + } // Send given element all the way to the front export function front () { + var p = this.parent() // Move node forward - p.node.appendChild(this.node) + p.node.appendChild( this.node ) // Make sure defs node is always at the top - if (typeof p.isRoot === 'function' && p.isRoot()) { - p.node.appendChild(p.defs().node) + if ( typeof p.isRoot === 'function' && p.isRoot() ) { + + p.node.appendChild( p.defs().node ) + } return this + } // Send given element all the way to the back export function back () { - if (this.position() > 0) { - this.parent().removeElement(this).add(this, 0) + + if ( this.position() > 0 ) { + + this.parent().removeElement( this ).add( this, 0 ) + } return this + } // Inserts a given element before the targeted element -export function before (element) { - element = makeInstance(element) +export function before ( element ) { + + element = makeInstance( element ) element.remove() var i = this.position() - this.parent().add(element, i) + this.parent().add( element, i ) return this + } // Inserts a given element after the targeted element -export function after (element) { - element = makeInstance(element) +export function after ( element ) { + + element = makeInstance( element ) element.remove() var i = this.position() - this.parent().add(element, i + 1) + this.parent().add( element, i + 1 ) return this + } -export function insertBefore (element) { - element = makeInstance(element) - element.before(this) +export function insertBefore ( element ) { + + element = makeInstance( element ) + element.before( this ) + } -export function insertAfter (element) { - element = makeInstance(element) - element.after(this) +export function insertAfter ( element ) { + + element = makeInstance( element ) + element.after( this ) + } -registerMethods('Dom', { +registerMethods( 'Dom', { siblings, position, next, prev, forward, backward, front, back, before, after -}) +} ) diff --git a/src/modules/optional/class.js b/src/modules/optional/class.js index b08c82b..93ccd0e 100644 --- a/src/modules/optional/class.js +++ b/src/modules/optional/class.js @@ -3,42 +3,58 @@ import { registerMethods } from '../../utils/methods.js' // Return array of classes on the node export function classes () { - var attr = this.attr('class') - return attr == null ? [] : attr.trim().split(delimiter) + + var attr = this.attr( 'class' ) + return attr == null ? [] : attr.trim().split( delimiter ) + } // Return true if class exists on the node, false otherwise -export function hasClass (name) { - return this.classes().indexOf(name) !== -1 +export function hasClass ( name ) { + + return this.classes().indexOf( name ) !== -1 + } // Add class to the node -export function addClass (name) { - if (!this.hasClass(name)) { +export function addClass ( name ) { + + if ( !this.hasClass( name ) ) { + var array = this.classes() - array.push(name) - this.attr('class', array.join(' ')) + array.push( name ) + this.attr( 'class', array.join( ' ' ) ) + } return this + } // Remove class from the node -export function removeClass (name) { - if (this.hasClass(name)) { - this.attr('class', this.classes().filter(function (c) { +export function removeClass ( name ) { + + if ( this.hasClass( name ) ) { + + this.attr( 'class', this.classes().filter( function ( c ) { + return c !== name - }).join(' ')) + + } ).join( ' ' ) ) + } return this + } // Toggle the presence of a class on the node -export function toggleClass (name) { - return this.hasClass(name) ? this.removeClass(name) : this.addClass(name) +export function toggleClass ( name ) { + + return this.hasClass( name ) ? this.removeClass( name ) : this.addClass( name ) + } -registerMethods('Dom', { +registerMethods( 'Dom', { classes, hasClass, addClass, removeClass, toggleClass -}) +} ) diff --git a/src/modules/optional/css.js b/src/modules/optional/css.js index babee7a..d5378f4 100644 --- a/src/modules/optional/css.js +++ b/src/modules/optional/css.js @@ -3,68 +3,98 @@ import { isBlank } from '../core/regex.js' import { registerMethods } from '../../utils/methods.js' // Dynamic style generator -export function css (style, val) { +export function css ( style, val ) { + let ret = {} - if (arguments.length === 0) { + if ( arguments.length === 0 ) { + // get full style as object - this.node.style.cssText.split(/\s*;\s*/) - .filter(function (el) { return !!el.length }) - .forEach(function (el) { - let t = el.split(/\s*:\s*/) + this.node.style.cssText.split( /\s*;\s*/ ) + .filter( function ( el ) { + + return !!el.length + + } ) + .forEach( function ( el ) { + + let t = el.split( /\s*:\s*/ ) ret[t[0]] = t[1] - }) + + } ) return ret + } - if (arguments.length < 2) { + if ( arguments.length < 2 ) { + // get style properties in the array - if (Array.isArray(style)) { - for (let name of style) { - let cased = camelCase(name) + if ( Array.isArray( style ) ) { + + for ( let name of style ) { + + let cased = camelCase( name ) ret[cased] = this.node.style[cased] + } return ret + } // get style for property - if (typeof style === 'string') { - return this.node.style[camelCase(style)] + if ( typeof style === 'string' ) { + + return this.node.style[camelCase( style )] + } // set styles in object - if (typeof style === 'object') { - for (let name in style) { + if ( typeof style === 'object' ) { + + for ( let name in style ) { + // set empty string if null/undefined/'' was given - this.node.style[camelCase(name)] = - (style[name] == null || isBlank.test(style[name])) ? '' : style[name] + this.node.style[camelCase( name )] + = ( style[name] == null || isBlank.test( style[name] ) ) ? '' : style[name] + } + } + } // set style for property - if (arguments.length === 2) { - this.node.style[camelCase(style)] = - (val == null || isBlank.test(val)) ? '' : val + if ( arguments.length === 2 ) { + + this.node.style[camelCase( style )] + = ( val == null || isBlank.test( val ) ) ? '' : val + } return this + } // Show element export function show () { - return this.css('display', '') + + return this.css( 'display', '' ) + } // Hide element export function hide () { - return this.css('display', 'none') + + return this.css( 'display', 'none' ) + } // Is element visible? export function visible () { - return this.css('display') !== 'none' + + return this.css( 'display' ) !== 'none' + } -registerMethods('Dom', { +registerMethods( 'Dom', { css, show, hide, visible -}) +} ) diff --git a/src/modules/optional/data.js b/src/modules/optional/data.js index 341d129..498e65a 100644 --- a/src/modules/optional/data.js +++ b/src/modules/optional/data.js @@ -1,26 +1,40 @@ import { registerMethods } from '../../utils/methods.js' // Store data values on svg nodes -export function data (a, v, r) { - if (typeof a === 'object') { - for (v in a) { - this.data(v, a[v]) +export function data ( a, v, r ) { + + if ( typeof a === 'object' ) { + + for ( v in a ) { + + this.data( v, a[v] ) + } - } else if (arguments.length < 2) { + + } else if ( arguments.length < 2 ) { + try { - return JSON.parse(this.attr('data-' + a)) - } catch (e) { - return this.attr('data-' + a) + + return JSON.parse( this.attr( 'data-' + a ) ) + + } catch ( e ) { + + return this.attr( 'data-' + a ) + } + } else { - this.attr('data-' + a, + + this.attr( 'data-' + a, v === null ? null - : r === true || typeof v === 'string' || typeof v === 'number' ? v - : JSON.stringify(v) + : r === true || typeof v === 'string' || typeof v === 'number' ? v + : JSON.stringify( v ) ) + } return this + } -registerMethods('Dom', { data }) +registerMethods( 'Dom', { data } ) diff --git a/src/modules/optional/memory.js b/src/modules/optional/memory.js index 6478367..7c599f0 100644 --- a/src/modules/optional/memory.js +++ b/src/modules/optional/memory.js @@ -1,40 +1,60 @@ import { registerMethods } from '../../utils/methods.js' // Remember arbitrary data -export function remember (k, v) { +export function remember ( k, v ) { + // remember every item in an object individually - if (typeof arguments[0] === 'object') { - for (var key in k) { - this.remember(key, k[key]) + if ( typeof arguments[0] === 'object' ) { + + for ( var key in k ) { + + this.remember( key, k[key] ) + } - } else if (arguments.length === 1) { + + } else if ( arguments.length === 1 ) { + // retrieve memory return this.memory()[k] + } else { + // store memory this.memory()[k] = v + } return this + } // Erase a given memory export function forget () { - if (arguments.length === 0) { + + if ( arguments.length === 0 ) { + this._memory = {} + } else { - for (var i = arguments.length - 1; i >= 0; i--) { + + for ( var i = arguments.length - 1; i >= 0; i-- ) { + delete this.memory()[arguments[i]] + } + } return this + } // This triggers creation of a new hidden class which is not performant // However, this function is not rarely used so it will not happen frequently // Return local memory object export function memory () { - return (this._memory = this._memory || {}) + + return ( this._memory = this._memory || {} ) + } -registerMethods('Dom', { remember, forget, memory }) +registerMethods( 'Dom', { remember, forget, memory } ) diff --git a/src/modules/optional/sugar.js b/src/modules/optional/sugar.js index 6001631..4b6e6f3 100644 --- a/src/modules/optional/sugar.js +++ b/src/modules/optional/sugar.js @@ -8,169 +8,227 @@ import SVGNumber from '../../types/SVGNumber.js' // Define list of available attributes for stroke and fill var sugar = { - stroke: ['color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset'], - fill: ['color', 'opacity', 'rule'], - prefix: function (t, a) { + stroke: [ 'color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset' ], + fill: [ 'color', 'opacity', 'rule' ], + prefix: function ( t, a ) { + return a === 'color' ? t : t + '-' + a + } } // Add sugar for fill and stroke -;['fill', 'stroke'].forEach(function (m) { +;[ 'fill', 'stroke' ].forEach( function ( m ) { + var extension = {} var i - extension[m] = function (o) { - if (typeof o === 'undefined') { - return this.attr(m) + extension[m] = function ( o ) { + + if ( typeof o === 'undefined' ) { + + return this.attr( m ) + } - if (typeof o === 'string' || Color.isRgb(o) || (o instanceof Element)) { - this.attr(m, o) + if ( typeof o === 'string' || Color.isRgb( o ) || ( o instanceof Element ) ) { + + this.attr( m, o ) + } else { + // set all attributes from sugar.fill and sugar.stroke list - for (i = sugar[m].length - 1; i >= 0; i--) { - if (o[sugar[m][i]] != null) { - this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]]) + for ( i = sugar[m].length - 1; i >= 0; i-- ) { + + if ( o[sugar[m][i]] != null ) { + + this.attr( sugar.prefix( m, sugar[m][i] ), o[sugar[m][i]] ) + } + } + } return this + } - registerMethods(['Shape', 'Runner'], extension) -}) + registerMethods( [ 'Shape', 'Runner' ], extension ) -registerMethods(['Element', 'Runner'], { +} ) + +registerMethods( [ 'Element', 'Runner' ], { // Let the user set the matrix directly - matrix: function (mat, b, c, d, e, f) { + matrix: function ( mat, b, c, d, e, f ) { + // Act as a getter - if (mat == null) { - return new Matrix(this) + if ( mat == null ) { + + return new Matrix( this ) + } // Act as a setter, the user can pass a matrix or a set of numbers - return this.attr('transform', new Matrix(mat, b, c, d, e, f)) + return this.attr( 'transform', new Matrix( mat, b, c, d, e, f ) ) + }, // Map rotation to transform - rotate: function (angle, cx, cy) { - return this.transform({ rotate: angle, ox: cx, oy: cy }, true) + rotate: function ( angle, cx, cy ) { + + return this.transform( { rotate: angle, ox: cx, oy: cy }, true ) + }, // Map skew to transform - skew: function (x, y, cx, cy) { + skew: function ( x, y, cx, cy ) { + return arguments.length === 1 || arguments.length === 3 - ? this.transform({ skew: x, ox: y, oy: cx }, true) - : this.transform({ skew: [x, y], ox: cx, oy: cy }, true) + ? this.transform( { skew: x, ox: y, oy: cx }, true ) + : this.transform( { skew: [ x, y ], ox: cx, oy: cy }, true ) + }, - shear: function (lam, cx, cy) { - return this.transform({ shear: lam, ox: cx, oy: cy }, true) + shear: function ( lam, cx, cy ) { + + return this.transform( { shear: lam, ox: cx, oy: cy }, true ) + }, // Map scale to transform - scale: function (x, y, cx, cy) { + scale: function ( x, y, cx, cy ) { + return arguments.length === 1 || arguments.length === 3 - ? this.transform({ scale: x, ox: y, oy: cx }, true) - : this.transform({ scale: [x, y], ox: cx, oy: cy }, true) + ? this.transform( { scale: x, ox: y, oy: cx }, true ) + : this.transform( { scale: [ x, y ], ox: cx, oy: cy }, true ) + }, // Map translate to transform - translate: function (x, y) { - return this.transform({ translate: [x, y] }, true) + translate: function ( x, y ) { + + return this.transform( { translate: [ x, y ] }, true ) + }, // Map relative translations to transform - relative: function (x, y) { - return this.transform({ relative: [x, y] }, true) + relative: function ( x, y ) { + + return this.transform( { relative: [ x, y ] }, true ) + }, // Map flip to transform - flip: function (direction, around) { + flip: function ( direction, around ) { + var directionString = typeof direction === 'string' ? direction - : isFinite(direction) ? 'both' - : 'both' - var origin = (direction === 'both' && isFinite(around)) ? [around, around] - : (direction === 'x') ? [around, 0] - : (direction === 'y') ? [0, around] - : isFinite(direction) ? [direction, direction] - : [0, 0] - this.transform({ flip: directionString, origin: origin }, true) + : isFinite( direction ) ? 'both' + : 'both' + var origin = ( direction === 'both' && isFinite( around ) ) ? [ around, around ] + : ( direction === 'x' ) ? [ around, 0 ] + : ( direction === 'y' ) ? [ 0, around ] + : isFinite( direction ) ? [ direction, direction ] + : [ 0, 0 ] + this.transform( { flip: directionString, origin: origin }, true ) + }, // Opacity - opacity: function (value) { - return this.attr('opacity', value) + opacity: function ( value ) { + + return this.attr( 'opacity', value ) + }, // Relative move over x and y axes - dmove: function (x, y) { - return this.dx(x).dy(y) + dmove: function ( x, y ) { + + return this.dx( x ).dy( y ) + } -}) +} ) -registerMethods('Element', { +registerMethods( 'Element', { // Relative move over x axis - dx: function (x) { - return this.x(new SVGNumber(x).plus(this.x())) + dx: function ( x ) { + + return this.x( new SVGNumber( x ).plus( this.x() ) ) + }, // Relative move over y axis - dy: function (y) { - return this.y(new SVGNumber(y).plus(this.y())) + dy: function ( y ) { + + return this.y( new SVGNumber( y ).plus( this.y() ) ) + } -}) +} ) -registerMethods('radius', { +registerMethods( 'radius', { // Add x and y radius - radius: function (x, y) { - var type = (this._element || this).type + radius: function ( x, y ) { + + var type = ( this._element || this ).type return type === 'radialGradient' || type === 'radialGradient' - ? this.attr('r', new SVGNumber(x)) - : this.rx(x).ry(y == null ? x : y) + ? this.attr( 'r', new SVGNumber( x ) ) + : this.rx( x ).ry( y == null ? x : y ) + } -}) +} ) -registerMethods('Path', { +registerMethods( 'Path', { // Get path length length: function () { + return this.node.getTotalLength() + }, // Get point at length - pointAt: function (length) { - return new Point(this.node.getPointAtLength(length)) + pointAt: function ( length ) { + + return new Point( this.node.getPointAtLength( length ) ) + } -}) +} ) -registerMethods(['Element', 'Runner'], { +registerMethods( [ 'Element', 'Runner' ], { // Set font - font: function (a, v) { - if (typeof a === 'object') { - for (v in a) this.font(v, a[v]) + font: function ( a, v ) { + + if ( typeof a === 'object' ) { + + for ( v in a ) this.font( v, a[v] ) + } return a === 'leading' - ? this.leading(v) + ? this.leading( v ) : a === 'anchor' - ? this.attr('text-anchor', v) + ? this.attr( 'text-anchor', v ) : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style' - ? this.attr('font-' + a, v) - : this.attr(a, v) + ? this.attr( 'font-' + a, v ) + : this.attr( a, v ) + } -}) +} ) + +registerMethods( 'Text', { + ax ( x ) { + + return this.attr( 'x', x ) -registerMethods('Text', { - ax (x) { - return this.attr('x', x) }, - ay (y) { - return this.attr('y', y) + ay ( y ) { + + return this.attr( 'y', y ) + }, - amove (x, y) { - return this.ax(x).ay(y) + amove ( x, y ) { + + return this.ax( x ).ay( y ) + } -}) +} ) // Add events to elements const methods = [ 'click', @@ -186,19 +244,27 @@ const methods = [ 'click', 'touchmove', 'touchleave', 'touchend', - 'touchcancel' ].reduce(function (last, event) { + 'touchcancel' ].reduce( function ( last, event ) { + // add event to Element - const fn = function (f) { - if (f === null) { - off(this, event) + const fn = function ( f ) { + + if ( f === null ) { + + off( this, event ) + } else { - on(this, event, f) + + on( this, event, f ) + } return this + } last[event] = fn return last -}, {}) -registerMethods('Element', methods) +}, {} ) + +registerMethods( 'Element', methods ) diff --git a/src/modules/optional/transform.js b/src/modules/optional/transform.js index b8f4c74..717fbf3 100644 --- a/src/modules/optional/transform.js +++ b/src/modules/optional/transform.js @@ -5,68 +5,92 @@ import Matrix from '../../types/Matrix.js' // Reset all transformations export function untransform () { - return this.attr('transform', null) + + return this.attr( 'transform', null ) + } // merge the whole transformation chain into one matrix and returns it export function matrixify () { - var matrix = (this.attr('transform') || '') + + var matrix = ( this.attr( 'transform' ) || '' ) // split transformations - .split(transforms).slice(0, -1).map(function (str) { + .split( transforms ).slice( 0, -1 ).map( function ( str ) { + // generate key => value pairs - var kv = str.trim().split('(') - return [kv[0], - kv[1].split(delimiter) - .map(function (str) { return parseFloat(str) }) + var kv = str.trim().split( '(' ) + return [ kv[0], + kv[1].split( delimiter ) + .map( function ( str ) { + + return parseFloat( str ) + + } ) ] - }) + + } ) .reverse() // merge every transformation into one matrix - .reduce(function (matrix, transform) { - if (transform[0] === 'matrix') { - return matrix.lmultiply(Matrix.fromArray(transform[1])) + .reduce( function ( matrix, transform ) { + + if ( transform[0] === 'matrix' ) { + + return matrix.lmultiply( Matrix.fromArray( transform[1] ) ) + } - return matrix[transform[0]].apply(matrix, transform[1]) - }, new Matrix()) + return matrix[transform[0]].apply( matrix, transform[1] ) + + }, new Matrix() ) return matrix + } // add an element to another parent without changing the visual representation on the screen -export function toParent (parent) { - if (this === parent) return this +export function toParent ( parent ) { + + if ( this === parent ) return this var ctm = this.screenCTM() var pCtm = parent.screenCTM().inverse() - this.addTo(parent).untransform().transform(pCtm.multiply(ctm)) + this.addTo( parent ).untransform().transform( pCtm.multiply( ctm ) ) return this + } // same as above with parent equals root-svg export function toRoot () { - return this.toParent(this.root()) + + return this.toParent( this.root() ) + } // Add transformations -export function transform (o, relative) { +export function transform ( o, relative ) { + // Act as a getter if no object was passed - if (o == null || typeof o === 'string') { - var decomposed = new Matrix(this).decompose() + if ( o == null || typeof o === 'string' ) { + + var decomposed = new Matrix( this ).decompose() return decomposed[o] || decomposed + } - if (!Matrix.isMatrixLike(o)) { + if ( !Matrix.isMatrixLike( o ) ) { + // Set the origin according to the defined transform - o = { ...o, origin: getOrigin(o, this) } + o = { ...o, origin: getOrigin( o, this ) } + } // The user can pass a boolean, an Element or an Matrix or nothing - var cleanRelative = relative === true ? this : (relative || false) - var result = new Matrix(cleanRelative).transform(o) - return this.attr('transform', result) + var cleanRelative = relative === true ? this : ( relative || false ) + var result = new Matrix( cleanRelative ).transform( o ) + return this.attr( 'transform', result ) + } -registerMethods('Element', { +registerMethods( 'Element', { untransform, matrixify, toParent, toRoot, transform -}) +} ) diff --git a/src/svg.js b/src/svg.js index 4026598..7b79af9 100644 --- a/src/svg.js +++ b/src/svg.js @@ -3,11 +3,13 @@ import * as regex from './modules/core/regex.js' import { makeInstance } from './utils/adopter' // The main wrapping element -export default function SVG (element) { - return makeInstance(element) +export default function SVG ( element ) { + + return makeInstance( element ) + } -Object.assign(SVG, svgMembers) +Object.assign( SVG, svgMembers ) SVG.utils = SVG SVG.regex = regex diff --git a/src/types/ArrayPolyfill.js b/src/types/ArrayPolyfill.js index 4d2309f..0ee29a5 100644 --- a/src/types/ArrayPolyfill.js +++ b/src/types/ArrayPolyfill.js @@ -1,8 +1,10 @@ /* eslint no-new-func: "off" */ -export const subClassArray = (function () { +export const subClassArray = ( function () { + try { + // try es6 subclassing - return Function('name', 'baseClass', '_constructor', [ + return Function( 'name', 'baseClass', '_constructor', [ 'baseClass = baseClass || Array', 'return {', ' [name]: class extends baseClass {', @@ -12,25 +14,35 @@ export const subClassArray = (function () { ' }', ' }', '}[name]' - ].join('\n')) - } catch (e) { + ].join( '\n' ) ) + + } catch ( e ) { + // Use es5 approach - return (name, baseClass = Array, _constructor) => { + return ( name, baseClass = Array, _constructor ) => { + const Arr = function () { - baseClass.apply(this, arguments) - _constructor && _constructor.apply(this, arguments) + + baseClass.apply( this, arguments ) + _constructor && _constructor.apply( this, arguments ) + } - Arr.prototype = Object.create(baseClass.prototype) + Arr.prototype = Object.create( baseClass.prototype ) Arr.prototype.constructor = Arr - Arr.prototype.map = function (fn) { + Arr.prototype.map = function ( fn ) { + const arr = new Arr() - arr.push.apply(arr, Array.prototype.map.call(this, fn)) + arr.push.apply( arr, Array.prototype.map.call( this, fn ) ) return arr + } return Arr + } + } -})() + +} )() diff --git a/src/types/Box.js b/src/types/Box.js index e55f114..2fcb923 100644 --- a/src/types/Box.js +++ b/src/types/Box.js @@ -4,33 +4,45 @@ import { globals } from '../utils/window.js' import Point from './Point.js' import parser from '../modules/core/parser.js' -function isNulledBox (box) { +function isNulledBox ( box ) { + return !box.w && !box.h && !box.x && !box.y + } -function domContains (node) { - return (globals.document.documentElement.contains || function (node) { +function domContains ( node ) { + + return ( globals.document.documentElement.contains || function ( node ) { + // This is IE - it does not support contains() for top-level SVGs - while (node.parentNode) { + while ( node.parentNode ) { + node = node.parentNode + } return node === document - }).call(globals.document.documentElement, node) + + } ).call( globals.document.documentElement, node ) + } export default class Box { - constructor (...args) { - this.init(...args) + + constructor ( ...args ) { + + this.init( ...args ) + } - init (source) { - var base = [0, 0, 0, 0] - source = typeof source === 'string' ? source.split(delimiter).map(parseFloat) - : Array.isArray(source) ? source - : typeof source === 'object' ? [source.left != null ? source.left - : source.x, source.top != null ? source.top : source.y, source.width, source.height] - : arguments.length === 4 ? [].slice.call(arguments) - : base + init ( source ) { + + var base = [ 0, 0, 0, 0 ] + source = typeof source === 'string' ? source.split( delimiter ).map( parseFloat ) + : Array.isArray( source ) ? source + : typeof source === 'object' ? [ source.left != null ? source.left + : source.x, source.top != null ? source.top : source.y, source.width, source.height ] + : arguments.length === 4 ? [].slice.call( arguments ) + : base this.x = source[0] || 0 this.y = source[1] || 0 @@ -44,105 +56,139 @@ export default class Box { this.cy = this.y + this.h / 2 return this + } // Merge rect box with another, return a new instance - merge (box) { - let x = Math.min(this.x, box.x) - let y = Math.min(this.y, box.y) - let width = Math.max(this.x + this.width, box.x + box.width) - x - let height = Math.max(this.y + this.height, box.y + box.height) - y + merge ( box ) { + + let x = Math.min( this.x, box.x ) + let y = Math.min( this.y, box.y ) + let width = Math.max( this.x + this.width, box.x + box.width ) - x + let height = Math.max( this.y + this.height, box.y + box.height ) - y + + return new Box( x, y, width, height ) - return new Box(x, y, width, height) } - transform (m) { + transform ( m ) { + let xMin = Infinity let xMax = -Infinity let yMin = Infinity let yMax = -Infinity let pts = [ - new Point(this.x, this.y), - new Point(this.x2, this.y), - new Point(this.x, this.y2), - new Point(this.x2, this.y2) + new Point( this.x, this.y ), + new Point( this.x2, this.y ), + new Point( this.x, this.y2 ), + new Point( this.x2, this.y2 ) ] - pts.forEach(function (p) { - p = p.transform(m) - xMin = Math.min(xMin, p.x) - xMax = Math.max(xMax, p.x) - yMin = Math.min(yMin, p.y) - yMax = Math.max(yMax, p.y) - }) + pts.forEach( function ( p ) { + + p = p.transform( m ) + xMin = Math.min( xMin, p.x ) + xMax = Math.max( xMax, p.x ) + yMin = Math.min( yMin, p.y ) + yMax = Math.max( yMax, p.y ) + + } ) return new Box( xMin, yMin, xMax - xMin, yMax - yMin ) + } addOffset () { + // offset by window scroll position, because getBoundingClientRect changes when window is scrolled this.x += globals.window.pageXOffset this.y += globals.window.pageYOffset return this + } toString () { + return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height + } toArray () { - return [this.x, this.y, this.width, this.height] + + return [ this.x, this.y, this.width, this.height ] + } isNulled () { - return isNulledBox(this) + + return isNulledBox( this ) + } + } -function getBox (cb) { +function getBox ( cb ) { + let box try { - box = cb(this.node) - if (isNulledBox(box) && !domContains(this.node)) { - throw new Error('Element not in the dom') + box = cb( this.node ) + + if ( isNulledBox( box ) && !domContains( this.node ) ) { + + throw new Error( 'Element not in the dom' ) + } - } catch (e) { + + } catch ( e ) { + try { - let clone = this.clone().addTo(parser().svg).show() - box = cb(clone.node) + + let clone = this.clone().addTo( parser().svg ).show() + box = cb( clone.node ) clone.remove() - } catch (e) { - throw new Error('Getting a bounding box of element "' + this.node.nodeName + '" is not possible') + + } catch ( e ) { + + throw new Error( 'Getting a bounding box of element "' + this.node.nodeName + '" is not possible' ) + } + } return box + } export function bbox () { - return new Box(getBox.call(this, (node) => node.getBBox())) + + return new Box( getBox.call( this, ( node ) => node.getBBox() ) ) + } -export function rbox (el) { - let box = new Box(getBox.call(this, (node) => node.getBoundingClientRect())) - if (el) return box.transform(el.screenCTM().inverse()) +export function rbox ( el ) { + + let box = new Box( getBox.call( this, ( node ) => node.getBoundingClientRect() ) ) + if ( el ) return box.transform( el.screenCTM().inverse() ) return box.addOffset() + } -registerMethods({ +registerMethods( { viewbox: { - viewbox (x, y, width, height) { + viewbox ( x, y, width, height ) { + // act as getter - if (x == null) return new Box(this.attr('viewBox')) + if ( x == null ) return new Box( this.attr( 'viewBox' ) ) // act as setter - return this.attr('viewBox', new Box(x, y, width, height)) + return this.attr( 'viewBox', new Box( x, y, width, height ) ) + } } -}) +} ) diff --git a/src/types/EventTarget.js b/src/types/EventTarget.js index 5a005fd..3d755bf 100644 --- a/src/types/EventTarget.js +++ b/src/types/EventTarget.js @@ -2,57 +2,79 @@ import { dispatch, off, on } from '../modules/core/event.js' import Base from './Base.js' export default class EventTarget extends Base { - constructor ({ events = {} } = {}) { + + constructor ( { events = {} } = {} ) { + super() this.events = events + } addEventListener () {} - dispatch (event, data) { - return dispatch(this, event, data) + dispatch ( event, data ) { + + return dispatch( this, event, data ) + } - dispatchEvent (event) { + dispatchEvent ( event ) { + const bag = this.getEventHolder().events - if (!bag) return true + if ( !bag ) return true const events = bag[event.type] - for (let i in events) { - for (let j in events[i]) { - events[i][j](event) + for ( let i in events ) { + + for ( let j in events[i] ) { + + events[i][j]( event ) + } + } return !event.defaultPrevented + } // Fire given event - fire (event, data) { - this.dispatch(event, data) + fire ( event, data ) { + + this.dispatch( event, data ) return this + } getEventHolder () { + return this + } getEventTarget () { + return this + } // Unbind event from listener - off (event, listener) { - off(this, event, listener) + off ( event, listener ) { + + off( this, event, listener ) return this + } // Bind given event to listener - on (event, listener, binding, options) { - on(this, event, listener, binding, options) + on ( event, listener, binding, options ) { + + on( this, event, listener, binding, options ) return this + } removeEventListener () {} + } diff --git a/src/types/List.js b/src/types/List.js index 8bd3985..a2d2226 100644 --- a/src/types/List.js +++ b/src/types/List.js @@ -1,38 +1,62 @@ import { extend } from '../utils/adopter.js' import { subClassArray } from './ArrayPolyfill.js' -const List = subClassArray('List', Array, function (arr = []) { +const List = subClassArray( 'List', Array, function ( arr = [] ) { + // This catches the case, that native map tries to create an array with new Array(1) - if (typeof arr === 'number') return this + if ( typeof arr === 'number' ) return this this.length = 0 - this.push(...arr) -}) + this.push( ...arr ) + +} ) export default List -extend(List, { - each (fnOrMethodName, ...args) { - if (typeof fnOrMethodName === 'function') { - this.forEach((el) => { fnOrMethodName.call(el, el) }) +extend( List, { + each ( fnOrMethodName, ...args ) { + + if ( typeof fnOrMethodName === 'function' ) { + + this.forEach( ( el ) => { + + fnOrMethodName.call( el, el ) + + } ) + } else { - return this.map(el => { return el[fnOrMethodName](...args) }) + + return this.map( el => { + + return el[fnOrMethodName]( ...args ) + + } ) + } return this + }, toArray () { - return Array.prototype.concat.apply([], this) + + return Array.prototype.concat.apply( [], this ) + } -}) +} ) + +List.extend = function ( methods ) { + + methods = methods.reduce( ( obj, name ) => { + + obj[name] = function ( ...attrs ) { + + return this.each( name, ...attrs ) -List.extend = function (methods) { - methods = methods.reduce((obj, name) => { - obj[name] = function (...attrs) { - return this.each(name, ...attrs) } return obj - }, {}) - extend(List, methods) + }, {} ) + + extend( List, methods ) + } diff --git a/src/types/Matrix.js b/src/types/Matrix.js index a1eb317..a9a311e 100644 --- a/src/types/Matrix.js +++ b/src/types/Matrix.js @@ -3,27 +3,33 @@ import { radians } from '../utils/utils.js' import Element from '../elements/Element.js' import Point from './Point.js' -function closeEnough (a, b, threshold) { - return Math.abs(b - a) < (threshold || 1e-6) +function closeEnough ( a, b, threshold ) { + + return Math.abs( b - a ) < ( threshold || 1e-6 ) + } export default class Matrix { - constructor (...args) { - this.init(...args) + + constructor ( ...args ) { + + this.init( ...args ) + } // Initialize - init (source) { - var base = Matrix.fromArray([1, 0, 0, 1, 0, 0]) + init ( source ) { + + var base = Matrix.fromArray( [ 1, 0, 0, 1, 0, 0 ] ) // ensure source as object source = source instanceof Element ? source.matrixify() - : typeof source === 'string' ? Matrix.fromArray(source.split(delimiter).map(parseFloat)) - : Array.isArray(source) ? Matrix.fromArray(source) - : (typeof source === 'object' && Matrix.isMatrixLike(source)) ? source - : (typeof source === 'object') ? new Matrix().transform(source) - : arguments.length === 6 ? Matrix.fromArray([].slice.call(arguments)) - : base + : typeof source === 'string' ? Matrix.fromArray( source.split( delimiter ).map( parseFloat ) ) + : Array.isArray( source ) ? Matrix.fromArray( source ) + : ( typeof source === 'object' && Matrix.isMatrixLike( source ) ) ? source + : ( typeof source === 'object' ) ? new Matrix().transform( source ) + : arguments.length === 6 ? Matrix.fromArray( [].slice.call( arguments ) ) + : base // Merge the source matrix with the base matrix this.a = source.a != null ? source.a : base.a @@ -34,56 +40,68 @@ export default class Matrix { this.f = source.f != null ? source.f : base.f return this + } // Clones this matrix clone () { - return new Matrix(this) + + return new Matrix( this ) + } // Transform a matrix into another matrix by manipulating the space - transform (o) { + transform ( o ) { + // Check if o is a matrix and then left multiply it directly - if (Matrix.isMatrixLike(o)) { - var matrix = new Matrix(o) - return matrix.multiplyO(this) + if ( Matrix.isMatrixLike( o ) ) { + + var matrix = new Matrix( o ) + return matrix.multiplyO( this ) + } // Get the proposed transformations and the current transformations - var t = Matrix.formatTransforms(o) + var t = Matrix.formatTransforms( o ) var current = this - let { x: ox, y: oy } = new Point(t.ox, t.oy).transform(current) + let { x: ox, y: oy } = new Point( t.ox, t.oy ).transform( current ) // Construct the resulting matrix var transformer = new Matrix() - .translateO(t.rx, t.ry) - .lmultiplyO(current) - .translateO(-ox, -oy) - .scaleO(t.scaleX, t.scaleY) - .skewO(t.skewX, t.skewY) - .shearO(t.shear) - .rotateO(t.theta) - .translateO(ox, oy) + .translateO( t.rx, t.ry ) + .lmultiplyO( current ) + .translateO( -ox, -oy ) + .scaleO( t.scaleX, t.scaleY ) + .skewO( t.skewX, t.skewY ) + .shearO( t.shear ) + .rotateO( t.theta ) + .translateO( ox, oy ) // If we want the origin at a particular place, we force it there - if (isFinite(t.px) || isFinite(t.py)) { - const origin = new Point(ox, oy).transform(transformer) + if ( isFinite( t.px ) || isFinite( t.py ) ) { + + const origin = new Point( ox, oy ).transform( transformer ) // TODO: Replace t.px with isFinite(t.px) const dx = t.px ? t.px - origin.x : 0 const dy = t.py ? t.py - origin.y : 0 - transformer.translateO(dx, dy) + transformer.translateO( dx, dy ) + } // Translate now after positioning - transformer.translateO(t.tx, t.ty) + transformer.translateO( t.tx, t.ty ) return transformer + } // Applies a matrix defined by its affine parameters - compose (o) { - if (o.origin) { + compose ( o ) { + + if ( o.origin ) { + o.originX = o.origin[0] o.originY = o.origin[1] + } // Get the parameters var ox = o.originX || 0 @@ -97,18 +115,20 @@ export default class Matrix { // Apply the standard matrix var result = new Matrix() - .translateO(-ox, -oy) - .scaleO(sx, sy) - .shearO(lam) - .rotateO(theta) - .translateO(tx, ty) - .lmultiplyO(this) - .translateO(ox, oy) + .translateO( -ox, -oy ) + .scaleO( sx, sy ) + .shearO( lam ) + .rotateO( theta ) + .translateO( tx, ty ) + .lmultiplyO( this ) + .translateO( ox, oy ) return result + } // Decomposes this matrix into its affine parameters - decompose (cx = 0, cy = 0) { + decompose ( cx = 0, cy = 0 ) { + // Get the parameters from the matrix var a = this.a var b = this.b @@ -123,20 +143,20 @@ export default class Matrix { // Since we only shear in x, we can use the x basis to get the x scale // and the rotation of the resulting matrix - var sx = ccw * Math.sqrt(a * a + b * b) - var thetaRad = Math.atan2(ccw * b, ccw * a) + var sx = ccw * Math.sqrt( a * a + b * b ) + var thetaRad = Math.atan2( ccw * b, ccw * a ) var theta = 180 / Math.PI * thetaRad - var ct = Math.cos(thetaRad) - var st = Math.sin(thetaRad) + var ct = Math.cos( thetaRad ) + var st = Math.sin( thetaRad ) // We can then solve the y basis vector simultaneously to get the other // two affine parameters directly from these parameters - var lam = (a * c + b * d) / determinant - var sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a)) + var lam = ( a * c + b * d ) / determinant + var sy = ( ( c * sx ) / ( lam * a - b ) ) || ( ( d * sx ) / ( lam * b + a ) ) // Use the translations - let tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy) - let ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy) + let tx = e - cx + cx * ct * sx + cy * ( lam * ct * sx - st * sy ) + let ty = f - cy + cx * st * sx + cy * ( lam * st * sx + ct * sy ) // Construct the decomposition and return it return { @@ -158,38 +178,48 @@ export default class Matrix { e: this.e, f: this.f } + } // Left multiplies by the given matrix - multiply (matrix) { - return this.clone().multiplyO(matrix) + multiply ( matrix ) { + + return this.clone().multiplyO( matrix ) + } - multiplyO (matrix) { + multiplyO ( matrix ) { + // Get the matrices var l = this var r = matrix instanceof Matrix ? matrix - : new Matrix(matrix) + : new Matrix( matrix ) + + return Matrix.matrixMultiply( l, r, this ) - return Matrix.matrixMultiply(l, r, this) } - lmultiply (matrix) { - return this.clone().lmultiplyO(matrix) + lmultiply ( matrix ) { + + return this.clone().lmultiplyO( matrix ) + } - lmultiplyO (matrix) { + lmultiplyO ( matrix ) { + var r = this var l = matrix instanceof Matrix ? matrix - : new Matrix(matrix) + : new Matrix( matrix ) + + return Matrix.matrixMultiply( l, r, this ) - return Matrix.matrixMultiply(l, r, this) } // Inverses matrix inverseO () { + // Get the current parameters out of the matrix var a = this.a var b = this.b @@ -200,7 +230,7 @@ export default class Matrix { // Invert the 2x2 matrix in the top left var det = a * d - b * c - if (!det) throw new Error('Cannot invert ' + this) + if ( !det ) throw new Error( 'Cannot invert ' + this ) // Calculate the top 2x2 matrix var na = d / det @@ -209,8 +239,8 @@ export default class Matrix { var nd = a / det // Apply the inverted matrix to the top right - var ne = -(na * e + nc * f) - var nf = -(nb * e + nd * f) + var ne = -( na * e + nc * f ) + var nf = -( nb * e + nd * f ) // Construct the inverted matrix this.a = na @@ -221,34 +251,46 @@ export default class Matrix { this.f = nf return this + } inverse () { + return this.clone().inverseO() + } // Translate matrix - translate (x, y) { - return this.clone().translateO(x, y) + translate ( x, y ) { + + return this.clone().translateO( x, y ) + } - translateO (x, y) { + translateO ( x, y ) { + this.e += x || 0 this.f += y || 0 return this + } // Scale matrix - scale (x, y, cx, cy) { - return this.clone().scaleO(...arguments) + scale ( x, y, cx, cy ) { + + return this.clone().scaleO( ...arguments ) + } - scaleO (x, y = x, cx = 0, cy = 0) { + scaleO ( x, y = x, cx = 0, cy = 0 ) { + // Support uniform scaling - if (arguments.length === 3) { + if ( arguments.length === 3 ) { + cy = cx cx = y y = x + } let { a, b, c, d, e, f } = this @@ -261,19 +303,23 @@ export default class Matrix { this.f = f * y - cy * y + cy return this + } // Rotate matrix - rotate (r, cx, cy) { - return this.clone().rotateO(r, cx, cy) + rotate ( r, cx, cy ) { + + return this.clone().rotateO( r, cx, cy ) + } - rotateO (r, cx = 0, cy = 0) { + rotateO ( r, cx = 0, cy = 0 ) { + // Convert degrees to radians - r = radians(r) + r = radians( r ) - let cos = Math.cos(r) - let sin = Math.sin(r) + let cos = Math.cos( r ) + let sin = Math.sin( r ) let { a, b, c, d, e, f } = this @@ -285,25 +331,33 @@ export default class Matrix { this.f = f * cos + e * sin - cx * sin - cy * cos + cy return this + } // Flip matrix on x or y, at a given offset - flip (axis, around) { - return this.clone().flipO(axis, around) + flip ( axis, around ) { + + return this.clone().flipO( axis, around ) + } - flipO (axis, around) { - return axis === 'x' ? this.scaleO(-1, 1, around, 0) - : axis === 'y' ? this.scaleO(1, -1, 0, around) - : this.scaleO(-1, -1, axis, around || axis) // Define an x, y flip point + flipO ( axis, around ) { + + return axis === 'x' ? this.scaleO( -1, 1, around, 0 ) + : axis === 'y' ? this.scaleO( 1, -1, 0, around ) + : this.scaleO( -1, -1, axis, around || axis ) // Define an x, y flip point + } // Shear matrix - shear (a, cx, cy) { - return this.clone().shearO(a, cx, cy) + shear ( a, cx, cy ) { + + return this.clone().shearO( a, cx, cy ) + } - shearO (lx, cx = 0, cy = 0) { + shearO ( lx, cx = 0, cy = 0 ) { + let { a, b, c, d, e, f } = this this.a = a + b * lx @@ -311,27 +365,33 @@ export default class Matrix { this.e = e + f * lx - cy * lx return this + } // Skew Matrix - skew (x, y, cx, cy) { - return this.clone().skewO(...arguments) + skew ( x, y, cx, cy ) { + + return this.clone().skewO( ...arguments ) + } - skewO (x, y = x, cx = 0, cy = 0) { + skewO ( x, y = x, cx = 0, cy = 0 ) { + // support uniformal skew - if (arguments.length === 3) { + if ( arguments.length === 3 ) { + cy = cx cx = y y = x + } // Convert degrees to radians - x = radians(x) - y = radians(y) + x = radians( x ) + y = radians( y ) - let lx = Math.tan(x) - let ly = Math.tan(y) + let lx = Math.tan( x ) + let ly = Math.tan( y ) let { a, b, c, d, e, f } = this @@ -343,55 +403,75 @@ export default class Matrix { this.f = f + e * ly - cx * ly return this + } // SkewX - skewX (x, cx, cy) { - return this.skew(x, 0, cx, cy) + skewX ( x, cx, cy ) { + + return this.skew( x, 0, cx, cy ) + } - skewXO (x, cx, cy) { - return this.skewO(x, 0, cx, cy) + skewXO ( x, cx, cy ) { + + return this.skewO( x, 0, cx, cy ) + } // SkewY - skewY (y, cx, cy) { - return this.skew(0, y, cx, cy) + skewY ( y, cx, cy ) { + + return this.skew( 0, y, cx, cy ) + } - skewYO (y, cx, cy) { - return this.skewO(0, y, cx, cy) + skewYO ( y, cx, cy ) { + + return this.skewO( 0, y, cx, cy ) + } // Transform around a center point - aroundO (cx, cy, matrix) { + aroundO ( cx, cy, matrix ) { + var dx = cx || 0 var dy = cy || 0 - return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy) + return this.translateO( -dx, -dy ).lmultiplyO( matrix ).translateO( dx, dy ) + } - around (cx, cy, matrix) { - return this.clone().aroundO(cx, cy, matrix) + around ( cx, cy, matrix ) { + + return this.clone().aroundO( cx, cy, matrix ) + } // Check if two matrices are equal - equals (other) { - var comp = new Matrix(other) - return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) && - closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) && - closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f) + equals ( other ) { + + var comp = new Matrix( other ) + return closeEnough( this.a, comp.a ) && closeEnough( this.b, comp.b ) + && closeEnough( this.c, comp.c ) && closeEnough( this.d, comp.d ) + && closeEnough( this.e, comp.e ) && closeEnough( this.f, comp.f ) + } // Convert matrix to string toString () { + return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')' + } toArray () { - return [this.a, this.b, this.c, this.d, this.e, this.f] + + return [ this.a, this.b, this.c, this.d, this.e, this.f ] + } valueOf () { + return { a: this.a, b: this.b, @@ -400,56 +480,62 @@ export default class Matrix { e: this.e, f: this.f } + } - static fromArray (a) { + static fromArray ( a ) { + return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] } + } - static isMatrixLike (o) { + static isMatrixLike ( o ) { + return ( - o.a != null || - o.b != null || - o.c != null || - o.d != null || - o.e != null || - o.f != null + o.a != null + || o.b != null + || o.c != null + || o.d != null + || o.e != null + || o.f != null ) + } - static formatTransforms (o) { + static formatTransforms ( o ) { + // Get all of the parameters required to form the matrix var flipBoth = o.flip === 'both' || o.flip === true - var flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1 - var flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1 + var flipX = o.flip && ( flipBoth || o.flip === 'x' ) ? -1 : 1 + var flipY = o.flip && ( flipBoth || o.flip === 'y' ) ? -1 : 1 var skewX = o.skew && o.skew.length ? o.skew[0] - : isFinite(o.skew) ? o.skew - : isFinite(o.skewX) ? o.skewX - : 0 + : isFinite( o.skew ) ? o.skew + : isFinite( o.skewX ) ? o.skewX + : 0 var skewY = o.skew && o.skew.length ? o.skew[1] - : isFinite(o.skew) ? o.skew - : isFinite(o.skewY) ? o.skewY - : 0 + : isFinite( o.skew ) ? o.skew + : isFinite( o.skewY ) ? o.skewY + : 0 var scaleX = o.scale && o.scale.length ? o.scale[0] * flipX - : isFinite(o.scale) ? o.scale * flipX - : isFinite(o.scaleX) ? o.scaleX * flipX - : flipX + : isFinite( o.scale ) ? o.scale * flipX + : isFinite( o.scaleX ) ? o.scaleX * flipX + : flipX var scaleY = o.scale && o.scale.length ? o.scale[1] * flipY - : isFinite(o.scale) ? o.scale * flipY - : isFinite(o.scaleY) ? o.scaleY * flipY - : flipY + : isFinite( o.scale ) ? o.scale * flipY + : isFinite( o.scaleY ) ? o.scaleY * flipY + : flipY var shear = o.shear || 0 var theta = o.rotate || o.theta || 0 - var origin = new Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY) + var origin = new Point( o.origin || o.around || o.ox || o.originX, o.oy || o.originY ) var ox = origin.x var oy = origin.y - var position = new Point(o.position || o.px || o.positionX, o.py || o.positionY) + var position = new Point( o.position || o.px || o.positionX, o.py || o.positionY ) var px = position.x var py = position.y - var translate = new Point(o.translate || o.tx || o.translateX, o.ty || o.translateY) + var translate = new Point( o.translate || o.tx || o.translateX, o.ty || o.translateY ) var tx = translate.x var ty = translate.y - var relative = new Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY) + var relative = new Point( o.relative || o.rx || o.relativeX, o.ry || o.relativeY ) var rx = relative.x var ry = relative.y @@ -457,10 +543,12 @@ export default class Matrix { return { scaleX, scaleY, skewX, skewY, shear, theta, rx, ry, tx, ty, ox, oy, px, py } + } // left matrix, right matrix, target matrix which is overwritten - static matrixMultiply (l, r, o) { + static matrixMultiply ( l, r, o ) { + // Work out the product directly var a = l.a * r.a + l.c * r.b var b = l.b * r.a + l.d * r.b @@ -478,23 +566,31 @@ export default class Matrix { o.f = f return o + } + } export function ctm () { - return new Matrix(this.node.getCTM()) + + return new Matrix( this.node.getCTM() ) + } export function screenCTM () { + /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537 This is needed because FF does not return the transformation matrix for the inner coordinate system when getScreenCTM() is called on nested svgs. However all other Browsers do that */ - if (typeof this.isRoot === 'function' && !this.isRoot()) { - var rect = this.rect(1, 1) + if ( typeof this.isRoot === 'function' && !this.isRoot() ) { + + var rect = this.rect( 1, 1 ) var m = rect.node.getScreenCTM() rect.remove() - return new Matrix(m) + return new Matrix( m ) + } - return new Matrix(this.node.getScreenCTM()) + return new Matrix( this.node.getScreenCTM() ) + } diff --git a/src/types/Morphable.js b/src/types/Morphable.js index 703cc00..87fa800 100644 --- a/src/types/Morphable.js +++ b/src/types/Morphable.js @@ -11,135 +11,200 @@ import SVGArray from './SVGArray.js' import SVGNumber from './SVGNumber.js' export default class Morphable { - constructor (stepper) { - this._stepper = stepper || new Ease('-') + + constructor ( stepper ) { + + this._stepper = stepper || new Ease( '-' ) this._from = null this._to = null this._type = null this._context = null this._morphObj = null + } - from (val) { - if (val == null) { + from ( val ) { + + if ( val == null ) { + return this._from + } - this._from = this._set(val) + this._from = this._set( val ) return this + } - to (val) { - if (val == null) { + to ( val ) { + + if ( val == null ) { + return this._to + } - this._to = this._set(val) + this._to = this._set( val ) return this + } - type (type) { + type ( type ) { + // getter - if (type == null) { + if ( type == null ) { + return this._type + } // setter this._type = type return this + } - _set (value) { - if (!this._type) { + _set ( value ) { + + if ( !this._type ) { + var type = typeof value - if (type === 'number') { - this.type(SVGNumber) - } else if (type === 'string') { - if (Color.isColor(value)) { - this.type(Color) - } else if (delimiter.test(value)) { - this.type(pathLetters.test(value) + if ( type === 'number' ) { + + this.type( SVGNumber ) + + } else if ( type === 'string' ) { + + if ( Color.isColor( value ) ) { + + this.type( Color ) + + } else if ( delimiter.test( value ) ) { + + this.type( pathLetters.test( value ) ? PathArray : SVGArray ) - } else if (numberAndUnit.test(value)) { - this.type(SVGNumber) + + } else if ( numberAndUnit.test( value ) ) { + + this.type( SVGNumber ) + } else { - this.type(NonMorphable) + + this.type( NonMorphable ) + } - } else if (morphableTypes.indexOf(value.constructor) > -1) { - this.type(value.constructor) - } else if (Array.isArray(value)) { - this.type(SVGArray) - } else if (type === 'object') { - this.type(ObjectBag) + + } else if ( morphableTypes.indexOf( value.constructor ) > -1 ) { + + this.type( value.constructor ) + + } else if ( Array.isArray( value ) ) { + + this.type( SVGArray ) + + } else if ( type === 'object' ) { + + this.type( ObjectBag ) + } else { - this.type(NonMorphable) + + this.type( NonMorphable ) + } + } - var result = (new this._type(value)).toArray() + var result = ( new this._type( value ) ).toArray() this._morphObj = this._morphObj || new this._type() - this._context = this._context || - Array.apply(null, Array(result.length)).map(Object) + this._context = this._context + || Array.apply( null, Array( result.length ) ).map( Object ) return result + } - stepper (stepper) { - if (stepper == null) return this._stepper + stepper ( stepper ) { + + if ( stepper == null ) return this._stepper this._stepper = stepper return this + } done () { + var complete = this._context - .map(this._stepper.done) - .reduce(function (last, curr) { + .map( this._stepper.done ) + .reduce( function ( last, curr ) { + return last && curr - }, true) + + }, true ) return complete + } - at (pos) { + at ( pos ) { + var _this = this return this._morphObj.fromArray( - this._from.map(function (i, index) { - return _this._stepper.step(i, _this._to[index], pos, _this._context[index], _this._context) - }) + this._from.map( function ( i, index ) { + + return _this._stepper.step( i, _this._to[index], pos, _this._context[index], _this._context ) + + } ) ) + } + } export class NonMorphable { - constructor (...args) { - this.init(...args) + + constructor ( ...args ) { + + this.init( ...args ) + } - init (val) { - val = Array.isArray(val) ? val[0] : val + init ( val ) { + + val = Array.isArray( val ) ? val[0] : val this.value = val return this + } valueOf () { + return this.value + } toArray () { - return [this.value] + + return [ this.value ] + } + } export class TransformBag { - constructor (...args) { - this.init(...args) + + constructor ( ...args ) { + + this.init( ...args ) + } - init (obj) { - if (Array.isArray(obj)) { + init ( obj ) { + + if ( Array.isArray( obj ) ) { + obj = { scaleX: obj[0], scaleY: obj[1], @@ -150,13 +215,16 @@ export class TransformBag { originX: obj[6], originY: obj[7] } + } - Object.assign(this, TransformBag.defaults, obj) + Object.assign( this, TransformBag.defaults, obj ) return this + } toArray () { + var v = this return [ @@ -169,7 +237,9 @@ export class TransformBag { v.originX, v.originY ] + } + } TransformBag.defaults = { @@ -184,40 +254,56 @@ TransformBag.defaults = { } export class ObjectBag { - constructor (...args) { - this.init(...args) + + constructor ( ...args ) { + + this.init( ...args ) + } - init (objOrArr) { + init ( objOrArr ) { + this.values = [] - if (Array.isArray(objOrArr)) { + if ( Array.isArray( objOrArr ) ) { + this.values = objOrArr return + } - var entries = Object.entries(objOrArr || {}).sort((a, b) => { + var entries = Object.entries( objOrArr || {} ).sort( ( a, b ) => { + return a[0] - b[0] - }) - this.values = entries.reduce((last, curr) => last.concat(curr), []) + } ) + + this.values = entries.reduce( ( last, curr ) => last.concat( curr ), [] ) return this + } valueOf () { + var obj = {} var arr = this.values - for (var i = 0, len = arr.length; i < len; i += 2) { + for ( var i = 0, len = arr.length; i < len; i += 2 ) { + obj[arr[i]] = arr[i + 1] + } return obj + } toArray () { + return this.values + } + } const morphableTypes = [ @@ -226,21 +312,29 @@ const morphableTypes = [ ObjectBag ] -export function registerMorphableType (type = []) { - morphableTypes.push(...[].concat(type)) +export function registerMorphableType ( type = [] ) { + + morphableTypes.push( ...[].concat( type ) ) + } export function makeMorphable () { - extend(morphableTypes, { - to (val) { + + extend( morphableTypes, { + to ( val ) { + return new Morphable() - .type(this.constructor) - .from(this.valueOf()) - .to(val) + .type( this.constructor ) + .from( this.valueOf() ) + .to( val ) + }, - fromArray (arr) { - this.init(arr) + fromArray ( arr ) { + + this.init( arr ) return this + } - }) + } ) + } diff --git a/src/types/PathArray.js b/src/types/PathArray.js index 989cd8f..739218d 100644 --- a/src/types/PathArray.js +++ b/src/types/PathArray.js @@ -12,131 +12,182 @@ import Point from './Point.js' import SVGArray from './SVGArray.js' import parser from '../modules/core/parser.js' -const PathArray = subClassArray('PathArray', SVGArray) +const PathArray = subClassArray( 'PathArray', SVGArray ) export default PathArray -export function pathRegReplace (a, b, c, d) { - return c + d.replace(dots, ' .') +export function pathRegReplace ( a, b, c, d ) { + + return c + d.replace( dots, ' .' ) + } -function arrayToString (a) { - for (var i = 0, il = a.length, s = ''; i < il; i++) { +function arrayToString ( a ) { + + for ( var i = 0, il = a.length, s = ''; i < il; i++ ) { + s += a[i][0] - if (a[i][1] != null) { + if ( a[i][1] != null ) { + s += a[i][1] - if (a[i][2] != null) { + if ( a[i][2] != null ) { + s += ' ' s += a[i][2] - if (a[i][3] != null) { + if ( a[i][3] != null ) { + s += ' ' s += a[i][3] s += ' ' s += a[i][4] - if (a[i][5] != null) { + if ( a[i][5] != null ) { + s += ' ' s += a[i][5] s += ' ' s += a[i][6] - if (a[i][7] != null) { + if ( a[i][7] != null ) { + s += ' ' s += a[i][7] + } + } + } + } + } + } return s + ' ' + } const pathHandlers = { - M: function (c, p, p0) { + M: function ( c, p, p0 ) { + p.x = p0.x = c[0] p.y = p0.y = c[1] - return ['M', p.x, p.y] + return [ 'M', p.x, p.y ] + }, - L: function (c, p) { + L: function ( c, p ) { + p.x = c[0] p.y = c[1] - return ['L', c[0], c[1]] + return [ 'L', c[0], c[1] ] + }, - H: function (c, p) { + H: function ( c, p ) { + p.x = c[0] - return ['H', c[0]] + return [ 'H', c[0] ] + }, - V: function (c, p) { + V: function ( c, p ) { + p.y = c[0] - return ['V', c[0]] + return [ 'V', c[0] ] + }, - C: function (c, p) { + C: function ( c, p ) { + p.x = c[4] p.y = c[5] - return ['C', c[0], c[1], c[2], c[3], c[4], c[5]] + return [ 'C', c[0], c[1], c[2], c[3], c[4], c[5] ] + }, - S: function (c, p) { + S: function ( c, p ) { + p.x = c[2] p.y = c[3] - return ['S', c[0], c[1], c[2], c[3]] + return [ 'S', c[0], c[1], c[2], c[3] ] + }, - Q: function (c, p) { + Q: function ( c, p ) { + p.x = c[2] p.y = c[3] - return ['Q', c[0], c[1], c[2], c[3]] + return [ 'Q', c[0], c[1], c[2], c[3] ] + }, - T: function (c, p) { + T: function ( c, p ) { + p.x = c[0] p.y = c[1] - return ['T', c[0], c[1]] + return [ 'T', c[0], c[1] ] + }, - Z: function (c, p, p0) { + Z: function ( c, p, p0 ) { + p.x = p0.x p.y = p0.y - return ['Z'] + return [ 'Z' ] + }, - A: function (c, p) { + A: function ( c, p ) { + p.x = c[5] p.y = c[6] - return ['A', c[0], c[1], c[2], c[3], c[4], c[5], c[6]] + return [ 'A', c[0], c[1], c[2], c[3], c[4], c[5], c[6] ] + } } -let mlhvqtcsaz = 'mlhvqtcsaz'.split('') +let mlhvqtcsaz = 'mlhvqtcsaz'.split( '' ) + +for ( var i = 0, il = mlhvqtcsaz.length; i < il; ++i ) { + + pathHandlers[mlhvqtcsaz[i]] = ( function ( i ) { + + return function ( c, p, p0 ) { + + if ( i === 'H' ) c[0] = c[0] + p.x + else if ( i === 'V' ) c[0] = c[0] + p.y + else if ( i === 'A' ) { -for (var i = 0, il = mlhvqtcsaz.length; i < il; ++i) { - pathHandlers[mlhvqtcsaz[i]] = (function (i) { - return function (c, p, p0) { - if (i === 'H') c[0] = c[0] + p.x - else if (i === 'V') c[0] = c[0] + p.y - else if (i === 'A') { c[5] = c[5] + p.x c[6] = c[6] + p.y + } else { - for (var j = 0, jl = c.length; j < jl; ++j) { - c[j] = c[j] + (j % 2 ? p.y : p.x) + + for ( var j = 0, jl = c.length; j < jl; ++j ) { + + c[j] = c[j] + ( j % 2 ? p.y : p.x ) + } + } - return pathHandlers[i](c, p, p0) + return pathHandlers[i]( c, p, p0 ) + } - })(mlhvqtcsaz[i].toUpperCase()) + + } )( mlhvqtcsaz[i].toUpperCase() ) + } -extend(PathArray, { +extend( PathArray, { // Convert array to string toString () { - return arrayToString(this) + + return arrayToString( this ) + }, // Move path string - move (x, y) { + move ( x, y ) { + // get bounding box of current situation var box = this.bbox() @@ -144,110 +195,154 @@ extend(PathArray, { x -= box.x y -= box.y - if (!isNaN(x) && !isNaN(y)) { + if ( !isNaN( x ) && !isNaN( y ) ) { + // move every point - for (var l, i = this.length - 1; i >= 0; i--) { + for ( var l, i = this.length - 1; i >= 0; i-- ) { + l = this[i][0] - if (l === 'M' || l === 'L' || l === 'T') { + if ( l === 'M' || l === 'L' || l === 'T' ) { + this[i][1] += x this[i][2] += y - } else if (l === 'H') { + + } else if ( l === 'H' ) { + this[i][1] += x - } else if (l === 'V') { + + } else if ( l === 'V' ) { + this[i][1] += y - } else if (l === 'C' || l === 'S' || l === 'Q') { + + } else if ( l === 'C' || l === 'S' || l === 'Q' ) { + this[i][1] += x this[i][2] += y this[i][3] += x this[i][4] += y - if (l === 'C') { + if ( l === 'C' ) { + this[i][5] += x this[i][6] += y + } - } else if (l === 'A') { + + } else if ( l === 'A' ) { + this[i][6] += x this[i][7] += y + } + } + } return this + }, // Resize path string - size (width, height) { + size ( width, height ) { + // get bounding box of current situation var box = this.bbox() var i, l // recalculate position of all points according to new size - for (i = this.length - 1; i >= 0; i--) { + for ( i = this.length - 1; i >= 0; i-- ) { + l = this[i][0] - if (l === 'M' || l === 'L' || l === 'T') { - this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x - this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y - } else if (l === 'H') { - this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x - } else if (l === 'V') { - this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y - } else if (l === 'C' || l === 'S' || l === 'Q') { - this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x - this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y - this[i][3] = ((this[i][3] - box.x) * width) / box.width + box.x - this[i][4] = ((this[i][4] - box.y) * height) / box.height + box.y - - if (l === 'C') { - this[i][5] = ((this[i][5] - box.x) * width) / box.width + box.x - this[i][6] = ((this[i][6] - box.y) * height) / box.height + box.y + if ( l === 'M' || l === 'L' || l === 'T' ) { + + this[i][1] = ( ( this[i][1] - box.x ) * width ) / box.width + box.x + this[i][2] = ( ( this[i][2] - box.y ) * height ) / box.height + box.y + + } else if ( l === 'H' ) { + + this[i][1] = ( ( this[i][1] - box.x ) * width ) / box.width + box.x + + } else if ( l === 'V' ) { + + this[i][1] = ( ( this[i][1] - box.y ) * height ) / box.height + box.y + + } else if ( l === 'C' || l === 'S' || l === 'Q' ) { + + this[i][1] = ( ( this[i][1] - box.x ) * width ) / box.width + box.x + this[i][2] = ( ( this[i][2] - box.y ) * height ) / box.height + box.y + this[i][3] = ( ( this[i][3] - box.x ) * width ) / box.width + box.x + this[i][4] = ( ( this[i][4] - box.y ) * height ) / box.height + box.y + + if ( l === 'C' ) { + + this[i][5] = ( ( this[i][5] - box.x ) * width ) / box.width + box.x + this[i][6] = ( ( this[i][6] - box.y ) * height ) / box.height + box.y + } - } else if (l === 'A') { + + } else if ( l === 'A' ) { + // resize radii - this[i][1] = (this[i][1] * width) / box.width - this[i][2] = (this[i][2] * height) / box.height + this[i][1] = ( this[i][1] * width ) / box.width + this[i][2] = ( this[i][2] * height ) / box.height // move position values - this[i][6] = ((this[i][6] - box.x) * width) / box.width + box.x - this[i][7] = ((this[i][7] - box.y) * height) / box.height + box.y + this[i][6] = ( ( this[i][6] - box.x ) * width ) / box.width + box.x + this[i][7] = ( ( this[i][7] - box.y ) * height ) / box.height + box.y + } + } return this + }, // Test if the passed path array use the same path data commands as this path array - equalCommands (pathArray) { + equalCommands ( pathArray ) { + var i, il, equalCommands - pathArray = new PathArray(pathArray) + pathArray = new PathArray( pathArray ) equalCommands = this.length === pathArray.length - for (i = 0, il = this.length; equalCommands && i < il; i++) { + for ( i = 0, il = this.length; equalCommands && i < il; i++ ) { + equalCommands = this[i][0] === pathArray[i][0] + } return equalCommands + }, // Make path array morphable - morph (pathArray) { - pathArray = new PathArray(pathArray) + morph ( pathArray ) { + + pathArray = new PathArray( pathArray ) + + if ( this.equalCommands( pathArray ) ) { - if (this.equalCommands(pathArray)) { this.destination = pathArray + } else { + this.destination = null + } return this + }, // Get morphed path array at given position - at (pos) { + at ( pos ) { + // make sure a destination is defined - if (!this.destination) return this + if ( !this.destination ) return this var sourceArray = this var destinationArray = this.destination.value @@ -257,47 +352,61 @@ extend(PathArray, { // Animate has specified in the SVG spec // See: https://www.w3.org/TR/SVG11/paths.html#PathElement - for (i = 0, il = sourceArray.length; i < il; i++) { - array[i] = [sourceArray[i][0]] - for (j = 1, jl = sourceArray[i].length; j < jl; j++) { - array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos + for ( i = 0, il = sourceArray.length; i < il; i++ ) { + + array[i] = [ sourceArray[i][0] ] + for ( j = 1, jl = sourceArray[i].length; j < jl; j++ ) { + + array[i][j] = sourceArray[i][j] + ( destinationArray[i][j] - sourceArray[i][j] ) * pos + } // For the two flags of the elliptical arc command, the SVG spec say: // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true // Elliptical arc command as an array followed by corresponding indexes: // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y] // 0 1 2 3 4 5 6 7 - if (array[i][0] === 'A') { - array[i][4] = +(array[i][4] !== 0) - array[i][5] = +(array[i][5] !== 0) + if ( array[i][0] === 'A' ) { + + array[i][4] = +( array[i][4] !== 0 ) + array[i][5] = +( array[i][5] !== 0 ) + } + } // Directly modify the value of a path array, this is done this way for performance pathArray.value = array return pathArray + }, // Absolutize and parse path to array - parse (array = [['M', 0, 0]]) { + parse ( array = [ [ 'M', 0, 0 ] ] ) { + // if it's already a patharray, no need to parse it - if (array instanceof PathArray) return array + if ( array instanceof PathArray ) return array // prepare for parsing var s var paramCnt = { 'M': 2, 'L': 2, 'H': 1, 'V': 1, 'C': 6, 'S': 4, 'Q': 4, 'T': 2, 'A': 7, 'Z': 0 } - if (typeof array === 'string') { + if ( typeof array === 'string' ) { + array = array - .replace(numbersWithDots, pathRegReplace) // convert 45.123.123 to 45.123 .123 - .replace(pathLetters, ' $& ') // put some room between letters and numbers - .replace(hyphen, '$1 -') // add space before hyphen + .replace( numbersWithDots, pathRegReplace ) // convert 45.123.123 to 45.123 .123 + .replace( pathLetters, ' $& ' ) // put some room between letters and numbers + .replace( hyphen, '$1 -' ) // add space before hyphen .trim() // trim - .split(delimiter) // split into array + .split( delimiter ) // split into array + } else { - array = array.reduce(function (prev, curr) { - return [].concat.call(prev, curr) - }, []) + + array = array.reduce( function ( prev, curr ) { + + return [].concat.call( prev, curr ) + + }, [] ) + } // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...] @@ -308,30 +417,41 @@ extend(PathArray, { var len = array.length do { + // Test if we have a path letter - if (isPathLetter.test(array[index])) { + if ( isPathLetter.test( array[index] ) ) { + s = array[index] ++index - // If last letter was a move command and we got no new, it defaults to [L]ine - } else if (s === 'M') { + // If last letter was a move command and we got no new, it defaults to [L]ine + + } else if ( s === 'M' ) { + s = 'L' - } else if (s === 'm') { + + } else if ( s === 'm' ) { + s = 'l' + } - result.push(pathHandlers[s].call(null, - array.slice(index, (index = index + paramCnt[s.toUpperCase()])).map(parseFloat), + result.push( pathHandlers[s].call( null, + array.slice( index, ( index = index + paramCnt[s.toUpperCase()] ) ).map( parseFloat ), p, p0 ) ) - } while (len > index) + + } while ( len > index ) return result + }, // Get bounding box of path bbox () { - parser().path.setAttribute('d', this.toString()) + + parser().path.setAttribute( 'd', this.toString() ) return parser.nodes.path.getBBox() + } -}) +} ) diff --git a/src/types/Point.js b/src/types/Point.js index 27d81ea..16ae44d 100644 --- a/src/types/Point.js +++ b/src/types/Point.js @@ -1,45 +1,59 @@ export default class Point { + // Initialize - constructor (...args) { - this.init(...args) + constructor ( ...args ) { + + this.init( ...args ) + } - init (x, y) { + init ( x, y ) { + let source let base = { x: 0, y: 0 } // ensure source as object - source = Array.isArray(x) ? { x: x[0], y: x[1] } + source = Array.isArray( x ) ? { x: x[0], y: x[1] } : typeof x === 'object' ? { x: x.x, y: x.y } - : { x: x, y: y } + : { x: x, y: y } // merge source this.x = source.x == null ? base.x : source.x this.y = source.y == null ? base.y : source.y return this + } // Clone point clone () { - return new Point(this) + + return new Point( this ) + } // transform point with matrix - transform (m) { + transform ( m ) { + // Perform the matrix multiplication var x = m.a * this.x + m.c * this.y + m.e var y = m.b * this.x + m.d * this.y + m.f // Return the required point - return new Point(x, y) + return new Point( x, y ) + } toArray () { - return [this.x, this.y] + + return [ this.x, this.y ] + } + } -export function point (x, y) { - return new Point(x, y).transform(this.screenCTM().inverse()) +export function point ( x, y ) { + + return new Point( x, y ).transform( this.screenCTM().inverse() ) + } diff --git a/src/types/PointArray.js b/src/types/PointArray.js index b246b2f..581b7dc 100644 --- a/src/types/PointArray.js +++ b/src/types/PointArray.js @@ -3,76 +3,97 @@ import { extend } from '../utils/adopter.js' import { subClassArray } from './ArrayPolyfill.js' import SVGArray from './SVGArray.js' -const PointArray = subClassArray('PointArray', SVGArray) +const PointArray = subClassArray( 'PointArray', SVGArray ) export default PointArray -extend(PointArray, { +extend( PointArray, { // Convert array to string toString () { + // convert to a poly point string - for (var i = 0, il = this.length, array = []; i < il; i++) { - array.push(this[i].join(',')) + for ( var i = 0, il = this.length, array = []; i < il; i++ ) { + + array.push( this[i].join( ',' ) ) + } - return array.join(' ') + return array.join( ' ' ) + }, // Convert array to line object toLine () { + return { x1: this[0][0], y1: this[0][1], x2: this[1][0], y2: this[1][1] } + }, // Get morphed array at given position - at (pos) { + at ( pos ) { + // make sure a destination is defined - if (!this.destination) return this + if ( !this.destination ) return this // generate morphed point string - for (var i = 0, il = this.length, array = []; i < il; i++) { - array.push([ - this[i][0] + (this.destination[i][0] - this[i][0]) * pos, - this[i][1] + (this.destination[i][1] - this[i][1]) * pos - ]) + for ( var i = 0, il = this.length, array = []; i < il; i++ ) { + + array.push( [ + this[i][0] + ( this.destination[i][0] - this[i][0] ) * pos, + this[i][1] + ( this.destination[i][1] - this[i][1] ) * pos + ] ) + } - return new PointArray(array) + return new PointArray( array ) + }, // Parse point string and flat array - parse (array = [[0, 0]]) { + parse ( array = [ [ 0, 0 ] ] ) { + var points = [] // if it is an array - if (array instanceof Array) { + if ( array instanceof Array ) { + // and it is not flat, there is no need to parse it - if (array[0] instanceof Array) { + if ( array[0] instanceof Array ) { + return array + } + } else { // Else, it is considered as a string + // parse points - array = array.trim().split(delimiter).map(parseFloat) + array = array.trim().split( delimiter ).map( parseFloat ) + } // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints // Odd number of coordinates is an error. In such cases, drop the last odd coordinate. - if (array.length % 2 !== 0) array.pop() + if ( array.length % 2 !== 0 ) array.pop() // wrap points in two-tuples and parse points as floats - for (var i = 0, len = array.length; i < len; i = i + 2) { - points.push([ array[i], array[i + 1] ]) + for ( var i = 0, len = array.length; i < len; i = i + 2 ) { + + points.push( [ array[i], array[i + 1] ] ) + } return points + }, // Move point string - move (x, y) { + move ( x, y ) { + var box = this.bbox() // get relative offset @@ -80,41 +101,54 @@ extend(PointArray, { y -= box.y // move every point - if (!isNaN(x) && !isNaN(y)) { - for (var i = this.length - 1; i >= 0; i--) { - this[i] = [this[i][0] + x, this[i][1] + y] + if ( !isNaN( x ) && !isNaN( y ) ) { + + for ( var i = this.length - 1; i >= 0; i-- ) { + + this[i] = [ this[i][0] + x, this[i][1] + y ] + } + } return this + }, // Resize poly string - size (width, height) { + size ( width, height ) { + var i var box = this.bbox() // recalculate position of all points according to new size - for (i = this.length - 1; i >= 0; i--) { - if (box.width) this[i][0] = ((this[i][0] - box.x) * width) / box.width + box.x - if (box.height) this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y + for ( i = this.length - 1; i >= 0; i-- ) { + + if ( box.width ) this[i][0] = ( ( this[i][0] - box.x ) * width ) / box.width + box.x + if ( box.height ) this[i][1] = ( ( this[i][1] - box.y ) * height ) / box.height + box.y + } return this + }, // Get bounding box of points bbox () { + var maxX = -Infinity var maxY = -Infinity var minX = Infinity var minY = Infinity - this.forEach(function (el) { - maxX = Math.max(el[0], maxX) - maxY = Math.max(el[1], maxY) - minX = Math.min(el[0], minX) - minY = Math.min(el[1], minY) - }) + this.forEach( function ( el ) { + + maxX = Math.max( el[0], maxX ) + maxY = Math.max( el[1], maxY ) + minX = Math.min( el[0], minX ) + minY = Math.min( el[1], minY ) + + } ) return { x: minX, y: minY, width: maxX - minX, height: maxY - minY } + } -}) +} ) diff --git a/src/types/SVGArray.js b/src/types/SVGArray.js index 7f27ec4..7d59af1 100644 --- a/src/types/SVGArray.js +++ b/src/types/SVGArray.js @@ -2,49 +2,65 @@ import { delimiter } from '../modules/core/regex.js' import { extend } from '../utils/adopter.js' import { subClassArray } from './ArrayPolyfill.js' -const SVGArray = subClassArray('SVGArray', Array, function (arr) { - this.init(arr) -}) +const SVGArray = subClassArray( 'SVGArray', Array, function ( arr ) { + + this.init( arr ) + +} ) export default SVGArray -extend(SVGArray, { - init (arr) { +extend( SVGArray, { + init ( arr ) { + // This catches the case, that native map tries to create an array with new Array(1) - if (typeof arr === 'number') return this + if ( typeof arr === 'number' ) return this this.length = 0 - this.push(...this.parse(arr)) + this.push( ...this.parse( arr ) ) return this + }, toArray () { - return Array.prototype.concat.apply([], this) + + return Array.prototype.concat.apply( [], this ) + }, toString () { - return this.join(' ') + + return this.join( ' ' ) + }, // Flattens the array if needed valueOf () { + const ret = [] - ret.push(...this) + ret.push( ...this ) return ret + }, // Parse whitespace separated string - parse (array = []) { + parse ( array = [] ) { + // If already is an array, no need to parse it - if (array instanceof Array) return array + if ( array instanceof Array ) return array + + return array.trim().split( delimiter ).map( parseFloat ) - return array.trim().split(delimiter).map(parseFloat) }, clone () { - return new this.constructor(this) + + return new this.constructor( this ) + }, toSet () { - return new Set(this) + + return new Set( this ) + } -}) +} ) diff --git a/src/types/SVGNumber.js b/src/types/SVGNumber.js index ea21cbd..a35ed66 100644 --- a/src/types/SVGNumber.js +++ b/src/types/SVGNumber.js @@ -2,88 +2,126 @@ import { numberAndUnit } from '../modules/core/regex.js' // Module for unit convertions export default class SVGNumber { + // Initialize - constructor (...args) { - this.init(...args) + constructor ( ...args ) { + + this.init( ...args ) + } - init (value, unit) { - unit = Array.isArray(value) ? value[1] : unit - value = Array.isArray(value) ? value[0] : value + init ( value, unit ) { + + unit = Array.isArray( value ) ? value[1] : unit + value = Array.isArray( value ) ? value[0] : value // initialize defaults this.value = 0 this.unit = unit || '' // parse value - if (typeof value === 'number') { + if ( typeof value === 'number' ) { + // ensure a valid numeric value - this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value - } else if (typeof value === 'string') { - unit = value.match(numberAndUnit) + this.value = isNaN( value ) ? 0 : !isFinite( value ) ? ( value < 0 ? -3.4e+38 : +3.4e+38 ) : value + + } else if ( typeof value === 'string' ) { + + unit = value.match( numberAndUnit ) + + if ( unit ) { - if (unit) { // make value numeric - this.value = parseFloat(unit[1]) + this.value = parseFloat( unit[1] ) // normalize - if (unit[5] === '%') { this.value /= 100 } else if (unit[5] === 's') { + if ( unit[5] === '%' ) { + + this.value /= 100 + + } else if ( unit[5] === 's' ) { + this.value *= 1000 + } // store unit this.unit = unit[5] + } + } else { - if (value instanceof SVGNumber) { + + if ( value instanceof SVGNumber ) { + this.value = value.valueOf() this.unit = value.unit + } + } return this + } toString () { - return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6 + + return ( this.unit === '%' ? ~~( this.value * 1e8 ) / 1e6 : this.unit === 's' ? this.value / 1e3 - : this.value + : this.value ) + this.unit + } toJSON () { + return this.toString() + } toArray () { - return [this.value, this.unit] + + return [ this.value, this.unit ] + } valueOf () { + return this.value + } // Add number - plus (number) { - number = new SVGNumber(number) - return new SVGNumber(this + number, this.unit || number.unit) + plus ( number ) { + + number = new SVGNumber( number ) + return new SVGNumber( this + number, this.unit || number.unit ) + } // Subtract number - minus (number) { - number = new SVGNumber(number) - return new SVGNumber(this - number, this.unit || number.unit) + minus ( number ) { + + number = new SVGNumber( number ) + return new SVGNumber( this - number, this.unit || number.unit ) + } // Multiply number - times (number) { - number = new SVGNumber(number) - return new SVGNumber(this * number, this.unit || number.unit) + times ( number ) { + + number = new SVGNumber( number ) + return new SVGNumber( this * number, this.unit || number.unit ) + } // Divide number - divide (number) { - number = new SVGNumber(number) - return new SVGNumber(this / number, this.unit || number.unit) + divide ( number ) { + + number = new SVGNumber( number ) + return new SVGNumber( this / number, this.unit || number.unit ) + } + } diff --git a/src/utils/adopter.js b/src/utils/adopter.js index 80bfd8a..6e526e3 100644 --- a/src/utils/adopter.js +++ b/src/utils/adopter.js @@ -5,136 +5,190 @@ import { globals } from '../utils/window.js' import Base from '../types/Base.js' const elements = {} -export const root = Symbol('root') +export const root = Symbol( 'root' ) // Method for element creation -export function makeNode (name) { +export function makeNode ( name ) { + // create element - return globals.document.createElementNS(ns, name) + return globals.document.createElementNS( ns, name ) + } -export function makeInstance (element) { - if (element instanceof Base) return element +export function makeInstance ( element ) { + + if ( element instanceof Base ) return element + + if ( typeof element === 'object' ) { + + return adopt( element ) - if (typeof element === 'object') { - return adopt(element) } - if (element == null) { + if ( element == null ) { + return new elements[root]() + } - if (typeof element === 'string' && element.charAt(0) !== '<') { - return adopt(globals.document.querySelector(element)) + if ( typeof element === 'string' && element.charAt( 0 ) !== '<' ) { + + return adopt( globals.document.querySelector( element ) ) + } - var node = makeNode('svg') + var node = makeNode( 'svg' ) node.innerHTML = element // We can use firstChild here because we know, // that the first char is < and thus an element - element = adopt(node.firstChild) + element = adopt( node.firstChild ) return element + } -export function nodeOrNew (name, node) { - return node instanceof globals.window.Node ? node : makeNode(name) +export function nodeOrNew ( name, node ) { + + return node instanceof globals.window.Node ? node : makeNode( name ) + } // Adopt existing svg elements -export function adopt (node) { +export function adopt ( node ) { + // check for presence of node - if (!node) return null + if ( !node ) return null // make sure a node isn't already adopted - if (node.instance instanceof Base) return node.instance + if ( node.instance instanceof Base ) return node.instance + + if ( !( node instanceof globals.window.SVGElement ) ) { + + return new elements.HtmlNode( node ) - if (!(node instanceof globals.window.SVGElement)) { - return new elements.HtmlNode(node) } // initialize variables var element // adopt with element-specific settings - if (node.nodeName === 'svg') { - element = new elements[root](node) - } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') { - element = new elements.Gradient(node) - } else if (elements[capitalize(node.nodeName)]) { - element = new elements[capitalize(node.nodeName)](node) + if ( node.nodeName === 'svg' ) { + + element = new elements[root]( node ) + + } else if ( node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient' ) { + + element = new elements.Gradient( node ) + + } else if ( elements[capitalize( node.nodeName )] ) { + + element = new elements[capitalize( node.nodeName )]( node ) + } else { - element = new elements.Bare(node) + + element = new elements.Bare( node ) + } return element + } -export function register (element, name = element.name, asRoot = false) { +export function register ( element, name = element.name, asRoot = false ) { + elements[name] = element - if (asRoot) elements[root] = element + if ( asRoot ) elements[root] = element - addMethodNames(Object.keys(element.prototype)) + addMethodNames( Object.keys( element.prototype ) ) return element + } -export function getClass (name) { +export function getClass ( name ) { + return elements[name] + } // Element id sequence let did = 1000 // Get next named element id -export function eid (name) { - return 'Svgjs' + capitalize(name) + (did++) +export function eid ( name ) { + + return 'Svgjs' + capitalize( name ) + ( did++ ) + } // Deep new id assignment -export function assignNewId (node) { +export function assignNewId ( node ) { + // do the same for SVG child nodes as well - for (var i = node.children.length - 1; i >= 0; i--) { - assignNewId(node.children[i]) + for ( var i = node.children.length - 1; i >= 0; i-- ) { + + assignNewId( node.children[i] ) + } - if (node.id) { - return adopt(node).id(eid(node.nodeName)) + if ( node.id ) { + + return adopt( node ).id( eid( node.nodeName ) ) + } - return adopt(node) + return adopt( node ) + } // Method for extending objects -export function extend (modules, methods, attrCheck) { +export function extend ( modules, methods, attrCheck ) { + var key, i - modules = Array.isArray(modules) ? modules : [modules] + modules = Array.isArray( modules ) ? modules : [ modules ] + + for ( i = modules.length - 1; i >= 0; i-- ) { + + for ( key in methods ) { - for (i = modules.length - 1; i >= 0; i--) { - for (key in methods) { let method = methods[key] - if (attrCheck) { - method = wrapWithAttrCheck(methods[key]) + if ( attrCheck ) { + + method = wrapWithAttrCheck( methods[key] ) + } modules[i].prototype[key] = method + } + } + } -export function extendWithAttrCheck (...args) { - extend(...args, true) +export function extendWithAttrCheck ( ...args ) { + + extend( ...args, true ) + } -export function wrapWithAttrCheck (fn) { - return function (...args) { +export function wrapWithAttrCheck ( fn ) { + + return function ( ...args ) { + let o = args[args.length - 1] - if (o && o.constructor === Object && !(o instanceof Array)) { - return fn.apply(this, args.slice(0, -1)).attr(o) + if ( o && o.constructor === Object && !( o instanceof Array ) ) { + + return fn.apply( this, args.slice( 0, -1 ) ).attr( o ) + } else { - return fn.apply(this, args) + + return fn.apply( this, args ) + } + } + } diff --git a/src/utils/methods.js b/src/utils/methods.js index 70f9329..4973d13 100644 --- a/src/utils/methods.js +++ b/src/utils/methods.js @@ -2,41 +2,61 @@ const methods = {} const constructors = {} const names = [] -export function registerMethods (name, m) { - if (Array.isArray(name)) { - for (let _name of name) { - registerMethods(_name, m) +export function registerMethods ( name, m ) { + + if ( Array.isArray( name ) ) { + + for ( let _name of name ) { + + registerMethods( _name, m ) + } return + } - if (typeof name === 'object') { - for (let [_name, _m] of Object.entries(name)) { - registerMethods(_name, _m) + if ( typeof name === 'object' ) { + + for ( let [ _name, _m ] of Object.entries( name ) ) { + + registerMethods( _name, _m ) + } return + } - addMethodNames(Object.keys(m)) - methods[name] = Object.assign(methods[name] || {}, m) + addMethodNames( Object.keys( m ) ) + methods[name] = Object.assign( methods[name] || {}, m ) + } -export function getMethodsFor (name) { +export function getMethodsFor ( name ) { + return methods[name] || {} + } export function getMethodNames () { - return [...new Set(names)] + + return [ ...new Set( names ) ] + } -export function addMethodNames (_names) { - names.push(..._names) +export function addMethodNames ( _names ) { + + names.push( ..._names ) + } -export function registerConstructor (name, setup) { +export function registerConstructor ( name, setup ) { + constructors[name] = setup + } -export function getConstructor (name) { +export function getConstructor ( name ) { + return constructors[name] ? { setup: constructors[name], name } : {} + } diff --git a/src/utils/utils.js b/src/utils/utils.js index 64c0eed..01cd49f 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -1,103 +1,143 @@ // Map function -export function map (array, block) { +export function map ( array, block ) { + var i var il = array.length var result = [] - for (i = 0; i < il; i++) { - result.push(block(array[i])) + for ( i = 0; i < il; i++ ) { + + result.push( block( array[i] ) ) + } return result + } // Filter function -export function filter (array, block) { +export function filter ( array, block ) { + var i var il = array.length var result = [] - for (i = 0; i < il; i++) { - if (block(array[i])) { result.push(array[i]) } + for ( i = 0; i < il; i++ ) { + + if ( block( array[i] ) ) { + + result.push( array[i] ) + + } + } return result + } // Degrees to radians -export function radians (d) { +export function radians ( d ) { + return d % 360 * Math.PI / 180 + } // Radians to degrees -export function degrees (r) { +export function degrees ( r ) { + return r * 180 / Math.PI % 360 + } // Convert dash-separated-string to camelCase -export function camelCase (s) { - return s.toLowerCase().replace(/-(.)/g, function (m, g) { +export function camelCase ( s ) { + + return s.toLowerCase().replace( /-(.)/g, function ( m, g ) { + return g.toUpperCase() - }) + + } ) + } // Convert camel cased string to string seperated -export function unCamelCase (s) { - return s.replace(/([A-Z])/g, function (m, g) { +export function unCamelCase ( s ) { + + return s.replace( /([A-Z])/g, function ( m, g ) { + return '-' + g.toLowerCase() - }) + + } ) + } // Capitalize first letter of a string -export function capitalize (s) { - return s.charAt(0).toUpperCase() + s.slice(1) +export function capitalize ( s ) { + + return s.charAt( 0 ).toUpperCase() + s.slice( 1 ) + } // Calculate proportional width and height values when necessary -export function proportionalSize (element, width, height) { - if (width == null || height == null) { +export function proportionalSize ( element, width, height ) { + + if ( width == null || height == null ) { + var box = element.bbox() - if (width == null) { + if ( width == null ) { + width = box.width / box.height * height - } else if (height == null) { + + } else if ( height == null ) { + height = box.height / box.width * width + } + } return { width: width, height: height } + } -export function getOrigin (o, element) { +export function getOrigin ( o, element ) { + // Allow origin or around as the names let origin = o.origin // o.around == null ? o.origin : o.around let ox, oy // Allow the user to pass a string to rotate around a given point - if (typeof origin === 'string' || origin == null) { + if ( typeof origin === 'string' || origin == null ) { + // Get the bounding box of the element with no transformations applied - const string = (origin || 'center').toLowerCase().trim() + const string = ( origin || 'center' ).toLowerCase().trim() const { height, width, x, y } = element.bbox() // Calculate the transformed x and y coordinates - let bx = string.includes('left') ? x - : string.includes('right') ? x + width - : x + width / 2 - let by = string.includes('top') ? y - : string.includes('bottom') ? y + height - : y + height / 2 + let bx = string.includes( 'left' ) ? x + : string.includes( 'right' ) ? x + width + : x + width / 2 + let by = string.includes( 'top' ) ? y + : string.includes( 'bottom' ) ? y + height + : y + height / 2 // Set the bounds eg : "bottom-left", "Top right", "middle" etc... ox = o.ox != null ? o.ox : bx oy = o.oy != null ? o.oy : by + } else { + ox = origin[0] oy = origin[1] + } // Return the origin as it is if it wasn't a string return [ ox, oy ] + } diff --git a/src/utils/window.js b/src/utils/window.js index 9e51339..55f0bb6 100644 --- a/src/utils/window.js +++ b/src/utils/window.js @@ -3,7 +3,9 @@ export const globals = { document: typeof document === 'undefined' ? null : document } -export function registerWindow (win = null, doc = null) { +export function registerWindow ( win = null, doc = null ) { + globals.window = win globals.document = doc + } -- cgit v1.2.3 From 599fda2f11c88b2c18d0cd0b57d4adeca20db2eb Mon Sep 17 00:00:00 2001 From: Saivan Date: Sun, 25 Nov 2018 16:23:35 +1300 Subject: Updated all of the color modules and old tests are passing again This commit updates the color modules, so that the old tests pass, we just need to modify the tests to test some of the new functionality (Since there was a lot of copy and paste work done haha) Changes ======= - Updated the color module to support a number of color spaces - Made sure all of the old tests are working again --- spec/SpecRunner.html | 8 +- spec/spec/color.js | 100 +++++++--- src/types/Color.js | 521 ++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 489 insertions(+), 140 deletions(-) (limited to 'src') diff --git a/spec/SpecRunner.html b/spec/SpecRunner.html index 9d84677..967f327 100644 --- a/spec/SpecRunner.html +++ b/spec/SpecRunner.html @@ -54,15 +54,15 @@ - + - + diff --git a/spec/spec/color.js b/spec/spec/color.js index 410577f..9710d69 100644 --- a/spec/spec/color.js +++ b/spec/spec/color.js @@ -1,3 +1,4 @@ + describe('Color', function() { var color @@ -5,42 +6,87 @@ describe('Color', function() { color = new SVG.Color({ r: 0, g: 102, b: 255 }) }) - it('correclty parses a rgb string', function() { - color = new SVG.Color('rgb(255,0,128)') - expect(color.r).toBe(255) - expect(color.g).toBe(0) - expect(color.b).toBe(128) - }) + describe ('construct: constructs a color in different formats', () => { - it('correclty parses a 3 digit hex string', function() { - color = new SVG.Color('#f06') - expect(color.r).toBe(255) - expect(color.g).toBe(0) - expect(color.b).toBe(102) - }) + it ('constructs a color from an object in the correct color space') - it('correclty parses a 6 digit hex string', function() { - color = new SVG.Color('#0066ff') - expect(color.r).toBe(0) - expect(color.g).toBe(102) - expect(color.b).toBe(255) - }) + it ('constructs a color from an array', () => { + let color = new SVG.Color([ 30, 24, 50 ]) + expect( color.r ).toBe( 30 ) + expect( color.g ).toBe( 24 ) + expect( color.b ).toBe( 50 ) - describe('toHex()', function() { - it('returns a hex color', function() { - expect(color.toHex()).toBe('#0066ff') }) + + it('correclty parses an rgb string', () => { + let color = new SVG.Color('rgb(255,0,128)') + expect(color.r).toBe(255) + expect(color.g).toBe(0) + expect(color.b).toBe(128) + }) + + it('correclty parses a 3 digit hex string', () => { + color = new SVG.Color('#f06') + expect(color.r).toBe(255) + expect(color.g).toBe(0) + expect(color.b).toBe(102) + }) + + it('correclty parses a 6 digit hex string', () => { + color = new SVG.Color('#0066ff') + expect(color.r).toBe(0) + expect(color.g).toBe(102) + expect(color.b).toBe(255) + }) + }) - describe('toRgb()', function() { - it('returns a rgb string color', function() { - expect(color.toRgb()).toBe('rgb(0,102,255)') + describe ('input and output: Importing and exporting colors', () => { + describe('hex()', function() { + it('returns a hex color', function() { + expect(color.hex()).toBe('#0066ff') + }) + }) + + describe('toRgb()', function() { + it('returns a rgb string color', function() { + expect(color.toRgb()).toBe('rgb(0,102,255)') + }) + }) + + describe('brightness()', function() { + it('returns the percieved brightness value of a color', function() { + expect(color.brightness()).toBe(0.346) + }) }) }) - describe('brightness()', function() { - it('returns the percieved brightness value of a color', function() { - expect(color.brightness()).toBe(0.346) + describe('color spaces: The color spaces supported by our library', () => { + + describe('lab()', () => { + it ('can convert rgb to lab') + it ('can convert from lab to rgb') + }) + + describe('lch()', () => { + it ('can convert rgb to lch') + it ('can convert from lch to rgb') + }) + + describe('hsl()', () => { + it ('can convert from rgb to hsl') + it ('can convert from hsl to rgb') + }) + + describe('xyz()', () => { + it ('can convert from rgb to xyz') + it ('can convert from xyz to rgb') + }) + + describe('cymk()', () => { + it ('can convert from rgb to cymk') + it ('can convert from cymk to rgb') }) }) + }) diff --git a/src/types/Color.js b/src/types/Color.js index a96958b..e5104b8 100644 --- a/src/types/Color.js +++ b/src/types/Color.js @@ -1,148 +1,451 @@ -/* - -Color { - constructor (a, b, c, space) { - space: 'hsl' - a: 30 - b: 20 - c: 10 - }, - - toRgb () { return new Color in rgb space } - toHsl () { return new Color in hsl space } - toLab () { return new Color in lab space } - - toArray () { [space, a, b, c] } - fromArray () { convert it back } -} - -// Conversions aren't always exact because of monitor profiles etc... -new Color(h, s, l, 'hsl') !== new Color(r, g, b).hsl() -new Color(100, 100, 100, [space]) -new Color('hsl(30, 20, 10)') - -// Sugar -SVG.rgb(30, 20, 50).lab() -SVG.hsl() -SVG.lab('rgb(100, 100, 100)') -*/ import { hex, isHex, isRgb, rgb, whitespace } from '../modules/core/regex.js' -// Ensure to six-based hex -function fullHex (hex) { +function sixDigitHex ( hex ) { return hex.length === 4 ? [ '#', - hex.substring(1, 2), hex.substring(1, 2), - hex.substring(2, 3), hex.substring(2, 3), - hex.substring(3, 4), hex.substring(3, 4) - ].join('') + hex.substring( 1, 2 ), hex.substring( 1, 2 ), + hex.substring( 2, 3 ), hex.substring( 2, 3 ), + hex.substring( 3, 4 ), hex.substring( 3, 4 ) + ].join( '' ) : hex } -// Component to hex value -function compToHex (comp) { - var hex = comp.toString(16) +function componentHex ( component ) { + const integer = Math.round( component ) + const hex = integer.toString( 16 ) return hex.length === 1 ? '0' + hex : hex } +function is ( object, space ) { + for ( const key of space ) { + if ( object[key] == null ) { + return false + } + } + return true +} + +function getParameters ( a ) { + const params = is( a, 'rgb' ) ? { _a: a.r, _b: a.g, _c: a.b, space: 'rgb' } + : is( a, 'xyz' ) ? { _a: a.x, _b: a.y, _c: a.z, space: 'xyz' } + : is( a, 'hsl' ) ? { _a: a.h, _b: a.s, _c: a.l, space: 'hsl' } + : is( a, 'lab' ) ? { _a: a.l, _b: a.a, _c: a.b, space: 'lab' } + : is( a, 'lch' ) ? { _a: a.l, _b: a.c, _c: a.h, space: 'lch' } + : is( a, 'cmyk' ) ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' } + : { _a: 0, _b: 0, _c: 0, space: 'rgb' } + return params +} + +function cieSpace ( space ) { + if ( space === 'lab' || space === 'xyz' || space === 'lch' ) { + return true + } else { + return false + } +} + +function hueToRgb ( p, q, t ) { + if ( t < 0 ) t += 1 + if ( t > 1 ) t -= 1 + if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t + if ( t < 1 / 2 ) return q + if ( t < 2 / 3 ) return p + ( q - p ) * ( 2 / 3 - t ) * 6 + return p +} + export default class Color { - constructor (...args) { - this.init(...args) - } - - init (color, g, b) { - let match - - // initialize defaults - this.r = 0 - this.g = 0 - this.b = 0 - - if (!color) return - - // parse color - if (typeof color === 'string') { - if (isRgb.test(color)) { - // get rgb values - match = rgb.exec(color.replace(whitespace, '')) - - // parse numeric values - this.r = parseInt(match[1]) - this.g = parseInt(match[2]) - this.b = parseInt(match[3]) - } else if (isHex.test(color)) { - // get hex values - match = hex.exec(fullHex(color)) - - // parse numeric values - this.r = parseInt(match[1], 16) - this.g = parseInt(match[2], 16) - this.b = parseInt(match[3], 16) + + constructor ( a = 0, b = 0, c = 0, d = 0, space = 'rgb' ) { + + // If the user gave us an array, make the color from it + if ( typeof a === 'number' ) { + + // Allow for the case that we don't need d... + space = typeof d === 'string' ? d : space + d = typeof d === 'string' ? undefined : d + + // Assign the values straight to the color + Object.assign( this, { _a: a, _b: b, _c: c, _d: d, space } ) + + } else if ( a instanceof Array ) { + + this.space = b || 'rgb' + Object.assign( this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] } ) + + } else if ( a instanceof Object ) { + + // Set the object up and assign its values directly + const values = getParameters( a ) + Object.assign( this, values ) + + } else if ( typeof a === 'string' ) { + + if ( isRgb.test( a ) ) { + + const noWhitespace = a.replace( whitespace, '' ) + const [ _a, _b, _c ] = rgb.exec( noWhitespace ) + .slice( 1, 4 ).map( v => parseInt( v ) ) + Object.assign( this, { _a, _b, _c, space: 'rgb' } ) + + } else if ( isHex.test( a ) ) { + + const hexParse = v => parseInt( v, 16 ) + const [ , _a, _b, _c ] = hex.exec( sixDigitHex( a ) ).map( hexParse ) + Object.assign( this, { _a, _b, _c, space: 'rgb' } ) + + } else throw Error( `Unsupported string format, can't construct Color` ) + } + + // Now add the components as a convenience + const { _a, _b, _c, _d } = this + const components = this.space === 'rgb' ? { r: _a, g: _b, b: _c } + : this.space === 'xyz' ? { x: _a, y: _b, z: _c } + : this.space === 'hsl' ? { h: _a, s: _b, l: _c } + : this.space === 'lab' ? { l: _a, a: _b, b: _c } + : this.space === 'lch' ? { l: _a, c: _b, h: _c } + : this.space === 'cmyk' ? { c: _a, y: _b, m: _c, k: _d } + : {} + Object.assign( this, components ) + } + + opacity ( opacity = 1 ) { + + this.opacity = opacity + + } + + /* + + */ + + brightness () { + const { _a: r, _b: g, _c: b } = this.rgb() + const value = ( r / 255 * 0.30 ) + ( g / 255 * 0.59 ) + ( b / 255 * 0.11 ) + return value + } + + /* + Conversion Methods + */ + + rgb () { + + if ( this.space === 'rgb' ) { + return this + + } else if ( cieSpace( this.space ) ) { + + // Convert to the xyz color space + let { x, y, z } = this + if ( this.space === 'lab' || this.space === 'lch' ) { + + // Get the values in the lab space + let { l, a, b } = this + if ( this.space === 'lch' ) { + let { c, h } = this + const dToR = Math.PI / 180 + a = c * Math.cos( dToR * h ) + b = c * Math.sin( dToR * h ) + } + + // Undo the nonlinear function + const yL = ( l + 16 ) / 116 + const xL = a / 500 + y + const zL = y - b / 200 + + // Get the xyz values + const ct = 16 / 116 + const mx = 0.008856 + const nm = 7.787 + x = 0.95047 * ( ( xL ** 3 > mx ) ? xL ** 3 : ( xL - ct ) / nm ) + y = 1.00000 * ( ( yL ** 3 > mx ) ? yL ** 3 : ( yL - ct ) / nm ) + z = 1.08883 * ( ( zL ** 3 > mx ) ? zL ** 3 : ( zL - ct ) / nm ) } - } else if (Array.isArray(color)) { - this.r = color[0] - this.g = color[1] - this.b = color[2] - } else if (typeof color === 'object') { - this.r = color.r - this.g = color.g - this.b = color.b - } else if (arguments.length === 3) { - this.r = color - this.g = g - this.b = b + + // Convert xyz to unbounded rgb values + const rU = x * 3.2406 + y * -1.5372 + z * -0.4986 + const gU = x * -0.9689 + y * 1.8758 + z * 0.0415 + const bU = x * 0.0557 + y * -0.2040 + z * 1.0570 + + // Convert the values to true rgb values + let pow = Math.pow + let bd = 0.0031308 + const r = ( rU > bd ) ? ( 1.055 * pow( rU, 1 / 2.4 ) - 0.055 ) : 12.92 * rU + const g = ( gU > bd ) ? ( 1.055 * pow( gU, 1 / 2.4 ) - 0.055 ) : 12.92 * gU + const b = ( bU > bd ) ? ( 1.055 * pow( bU, 1 / 2.4 ) - 0.055 ) : 12.92 * bU + + // Make and return the color + const color = new Color( r, g, b ) + return color + + } else if ( this.space === 'hsl' ) { + + // stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion + // Get the current hsl values + const { h, s, l } = this + + // If we are grey, then just make the color directly + if ( s === 0 ) { + let color = new Color( l, l, l ) + return color + } + + // TODO I have no idea what this does :D If you figure it out, tell me! + const q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s + const p = 2 * l - q + + // Get the rgb values + const r = hueToRgb( p, q, h + 1 / 3 ) + const g = hueToRgb( p, q, h ) + const b = hueToRgb( p, q, h - 1 / 3 ) + + // Make a new color + const color = new Color( r, g, b ) + return color + + } else if ( this.space === 'cmyk' ) { + + // https://gist.github.com/felipesabino/5066336 + // Get the normalised cmyk values + const { _a, _b, _c, _d } = this + const [ c, m, y, k ] = [ _a, _b, _c, _d ].map( v => v / 100 ) + + // Get the rgb values + const r = 1 - Math.min( 1, c * ( 1 - k ) + k ) + const g = 1 - Math.min( 1, m * ( 1 - k ) + k ) + const b = 1 - Math.min( 1, y * ( 1 - k ) + k ) + + // Form the color and return it + const color = new Color( r, g, b ) + return color + + } else { + return this + } + } + + lab () { + + // Get the xyz color + const { x, y, z } = this.xyz() + + // Get the lab components + const l = ( 116 * y ) - 16 + const a = 500 * ( x - y ) + const b = 200 * ( y - z ) + + // Construct and return a new color + const color = new Color( l, a, b, 'lab' ) + return color + } + + xyz () { + + // Normalise the red, green and blue values + const { _a: r255, _b: g255, _c: b255 } = this.rgb() + const [ r, g, b ] = [ r255, g255, b255 ].map( v => v / 255 ) + + // Convert to the lab rgb space + const rL = ( r > 0.04045 ) ? Math.pow( ( r + 0.055 ) / 1.055, 2.4 ) : r / 12.92 + const gL = ( g > 0.04045 ) ? Math.pow( ( g + 0.055 ) / 1.055, 2.4 ) : g / 12.92 + const bL = ( b > 0.04045 ) ? Math.pow( ( b + 0.055 ) / 1.055, 2.4 ) : b / 12.92 + + // Convert to the xyz color space without bounding the values + const xU = ( rL * 0.4124 + gL * 0.3576 + bL * 0.1805 ) / 0.95047 + const yU = ( rL * 0.2126 + gL * 0.7152 + bL * 0.0722 ) / 1.00000 + const zU = ( rL * 0.0193 + gL * 0.1192 + bL * 0.9505 ) / 1.08883 + + // Get the proper xyz values by applying the bounding + const x = ( xU > 0.008856 ) ? Math.pow( xU, 1 / 3 ) : ( 7.787 * xU ) + 16 / 116 + const y = ( yU > 0.008856 ) ? Math.pow( yU, 1 / 3 ) : ( 7.787 * yU ) + 16 / 116 + const z = ( zU > 0.008856 ) ? Math.pow( zU, 1 / 3 ) : ( 7.787 * zU ) + 16 / 116 + + // Make and return the color + const color = new Color( x, y, z, 'xyz' ) + return color + } + + lch () { + + // Get the lab color directly + const { l, a, b } = this.lab() + + // Get the chromaticity and the hue using polar coordinates + const c = Math.sqrt( a ** 2 + b ** 2 ) + let h = 180 * Math.atan2( b, a ) / Math.PI + if ( h < 0 ) { + h *= -1 + h = 360 - h } - return this + // Make a new color and return it + const color = new Color( l, c, h, 'lch' ) + return color } - // Default to hex conversion - toString () { - return this.toHex() + hsl () { + + // Get the rgb values + const { _a, _b, _c } = this.rgb() + const [ r, g, b ] = [ _a, _b, _c ].map( v => v / 255 ) + + // Find the maximum and minimum values to get the lightness + const max = Math.max( r, g, b ) + const min = Math.min( r, g, b ) + const l = ( max + min ) / 2 + + // If the r, g, v values are identical then we are grey + const isGrey = max === min + + // Calculate the hue and saturation + const delta = max - min + const s = isGrey ? 0 + : l > 0.5 ? delta / ( 2 - max - min ) + : delta / ( max + min ) + const h = isGrey ? 0 + : max === r ? ( ( g - b ) / delta + ( g < b ? 6 : 0 ) ) / 6 + : max === g ? ( ( b - r ) / delta + 2 ) / 6 + : max === b ? ( ( r - g ) / delta + 4 ) / 6 + : 0 + + // Construct and return the new color + const color = new Color( h, s, l, 'hsl' ) + return color } - toArray () { - return [this.r, this.g, this.b] + cmyk () { + + // Get the rgb values for the current color + const { _a, _b, _c } = this.rgb() + const [ r, g, b ] = [ _a, _b, _c ].map( v => v / 255 ) + + // Get the cmyk values in an unbounded format + const k = 100 * Math.min( 1 - r, 1 - g, 1 - b ) + const c = 100 * ( 1 - r - k ) / ( 1 - k ) + const m = 100 * ( 1 - g - k ) / ( 1 - k ) + const y = 100 * ( 1 - b - k ) / ( 1 - k ) + + // Construct the new color + const color = new Color( c, m, y, k, 'cmyk' ) + return color + } + + /* + Modifying the color + */ + + brighten ( amount = 0.1 ) { + + } + + darken ( amount = 0.1 ) { + + } + + /* + Mixing methods + */ + + to ( otherColor, space ) { + + // Force both colors to the color of this space (or let the user decide) + space = space || this.space + + // Get the starting and ending colors + // let start = this[ space ]() + // let end = otherColor[ space ]() + + // Return a function that blends between the two colors + return function ( t ) { + + } + } - // Build hex value - toHex () { - return '#' + - compToHex(Math.round(this.r)) + - compToHex(Math.round(this.g)) + - compToHex(Math.round(this.b)) + avearge ( otherColor, space ) { + + } + + /* + Input and Output methods + */ + + hex () { + let { _a, _b, _c } = this.rgb() + let [ r, g, b ] = [ _a, _b, _c ].map( componentHex ) + return `#${r}${g}${b}` + } + + toString () { + return this.hex() } - // Build rgb value toRgb () { - return 'rgb(' + [this.r, this.g, this.b].join() + ')' + let { r, g, b } = this.rgb() + let { max, min, round } = Math + let format = v => max( 0, min( round( v ), 255 ) ) + let [ rV, gV, bV ] = [ r, g, b ].map( format ) + let string = `rgb(${rV},${gV},${bV})` + return string } - // Calculate true brightness - brightness () { - return (this.r / 255 * 0.30) + - (this.g / 255 * 0.59) + - (this.b / 255 * 0.11) + toArray () { + let { _a, _b, _c, _d, space } = this + return [ _a, _b, _c, _d, space ] } - // Testers + static fromArray ( array ) { + + let newColor = new Color( ...array ) + return newColor + + } + + /* + Generating random colors + */ + + static random ( mode = 'vibrant' ) { + + 'sine' + 'pastel' + 'vibrant' + 'dark' + 'rgb' + 'lab' + 'grey' + + } + + /* + Constructing colors + */ + + static temperature ( kelvin ) {} // Test if given value is a color string - static test (color) { + static test ( color ) { + color += '' - return isHex.test(color) || isRgb.test(color) + return isHex.test( color ) || isRgb.test( color ) + } // Test if given value is a rgb object - static isRgb (color) { - return color && typeof color.r === 'number' && - typeof color.g === 'number' && - typeof color.b === 'number' + static isRgb ( color ) { + + return color && typeof color.r === 'number' + && typeof color.g === 'number' + && typeof color.b === 'number' + } // Test if given value is a color - static isColor (color) { - return this.isRgb(color) || this.test(color) + static isColor ( color ) { + + return this.isRgb( color ) || this.test( color ) + } + } -- cgit v1.2.3 From 617aa12304541cf1d80b2bf5567ac633958c38de Mon Sep 17 00:00:00 2001 From: Saivan Date: Mon, 26 Nov 2018 00:17:41 +1300 Subject: Reverted some of the lint rules after chatting with fuzzy This commit reverts some of the rules we added on the linter, it changed a lot of code again... but these won't happen too often. Changes ======= - Modified the linter again --- .eslintrc.yaml | 1 - dist/svg.js | 380 +++++++---------- src/animation/Animator.js | 70 +--- src/animation/Controller.js | 240 ++++------- src/animation/Queue.js | 36 +- src/animation/Runner.js | 838 +++++++++++++------------------------- src/animation/Timeline.js | 194 +++------ src/elements/A.js | 50 +-- src/elements/Bare.js | 34 +- src/elements/Circle.js | 52 +-- src/elements/ClipPath.js | 50 +-- src/elements/Container.js | 30 +- src/elements/Defs.js | 14 +- src/elements/Dom.js | 266 ++++-------- src/elements/Element.js | 130 ++---- src/elements/Ellipse.js | 34 +- src/elements/G.js | 22 +- src/elements/Gradient.js | 66 +-- src/elements/HtmlNode.js | 2 +- src/elements/Image.js | 96 ++--- src/elements/Line.js | 66 ++- src/elements/Marker.js | 80 ++-- src/elements/Mask.js | 50 +-- src/elements/Path.js | 78 ++-- src/elements/Pattern.js | 58 +-- src/elements/Polygon.js | 26 +- src/elements/Polyline.js | 26 +- src/elements/Rect.js | 24 +- src/elements/Shape.js | 2 +- src/elements/Stop.js | 24 +- src/elements/Style.js | 64 ++- src/elements/Svg.js | 68 ++-- src/elements/Symbol.js | 22 +- src/elements/Text.js | 174 +++----- src/elements/TextPath.js | 78 ++-- src/elements/Tspan.js | 56 +-- src/elements/Use.js | 28 +- src/main.js | 40 +- src/modules/core/attr.js | 102 ++--- src/modules/core/circled.js | 52 +-- src/modules/core/event.js | 160 +++----- src/modules/core/gradiented.js | 20 +- src/modules/core/parser.js | 16 +- src/modules/core/pointed.js | 24 +- src/modules/core/poly.js | 30 +- src/modules/core/selector.js | 18 +- src/modules/core/textable.js | 12 +- src/modules/optional/arrange.js | 82 ++-- src/modules/optional/class.js | 48 +-- src/modules/optional/css.js | 80 ++-- src/modules/optional/data.js | 36 +- src/modules/optional/memory.js | 38 +- src/modules/optional/sugar.js | 232 ++++------- src/modules/optional/transform.js | 78 ++-- src/svg.js | 8 +- src/types/ArrayPolyfill.js | 34 +- src/types/Box.js | 142 +++---- src/types/EventTarget.js | 50 +-- src/types/List.js | 62 +-- src/types/Matrix.js | 358 ++++++---------- src/types/Morphable.js | 228 +++-------- src/types/PathArray.js | 314 +++++--------- src/types/Point.js | 32 +- src/types/PointArray.js | 102 ++--- src/types/SVGArray.js | 48 +-- src/types/SVGNumber.js | 90 ++-- src/utils/adopter.js | 156 +++---- src/utils/methods.js | 50 +-- src/utils/utils.js | 94 ++--- src/utils/window.js | 4 +- 70 files changed, 2148 insertions(+), 4221 deletions(-) (limited to 'src') diff --git a/.eslintrc.yaml b/.eslintrc.yaml index 6243075..c2212c7 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yaml @@ -7,4 +7,3 @@ rules: flatTernaryExpressions: true }] padded-blocks: off - space-in-parens: [ error, always ] diff --git a/dist/svg.js b/dist/svg.js index 2072971..2b7a05e 100644 --- a/dist/svg.js +++ b/dist/svg.js @@ -6,7 +6,7 @@ * @copyright Wout Fierens * @license MIT * -* BUILT: Sun Nov 25 2018 16:17:19 GMT+1300 (New Zealand Daylight Time) +* BUILT: Mon Nov 26 2018 00:15:11 GMT+1300 (New Zealand Daylight Time) */; var SVG = (function () { 'use strict'; @@ -112,36 +112,6 @@ var SVG = (function () { return _setPrototypeOf(o, p); } - function isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } - } - - function _construct(Parent, args, Class) { - if (isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - - return _construct.apply(null, arguments); - } - function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); @@ -1107,112 +1077,117 @@ var SVG = (function () { /*#__PURE__*/ function () { function Color() { - var a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - var c = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - var d = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; - var space = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'rgb'; - _classCallCheck(this, Color); - // If the user gave us an array, make the color from it - if (typeof a === 'number') { - // Allow for the case that we don't need d... - space = typeof d === 'string' ? d : space; - d = typeof d === 'string' ? undefined : d; // Assign the values straight to the color - - Object.assign(this, { - _a: a, - _b: b, - _c: c, - _d: d, - space: space - }); - } else if (a instanceof Array) { - this.space = b || 'rgb'; - Object.assign(this, { - _a: a[0], - _b: a[1], - _c: a[2], - _d: a[3] - }); - } else if (a instanceof Object) { - // Set the object up and assign its values directly - var values = getParameters(a); - Object.assign(this, values); - } else if (typeof a === 'string') { - if (isRgb.test(a)) { - var noWhitespace = a.replace(whitespace, ''); - - var _rgb$exec$slice$map = rgb.exec(noWhitespace).slice(1, 4).map(function (v) { - return parseInt(v); - }), - _rgb$exec$slice$map2 = _slicedToArray(_rgb$exec$slice$map, 3), - _a2 = _rgb$exec$slice$map2[0], - _b2 = _rgb$exec$slice$map2[1], - _c2 = _rgb$exec$slice$map2[2]; + this.init.apply(this, arguments); + } + + _createClass(Color, [{ + key: "init", + value: function init() { + var a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var c = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var d = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; + var space = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'rgb'; + + // If the user gave us an array, make the color from it + if (typeof a === 'number') { + // Allow for the case that we don't need d... + space = typeof d === 'string' ? d : space; + d = typeof d === 'string' ? undefined : d; // Assign the values straight to the color Object.assign(this, { - _a: _a2, - _b: _b2, - _c: _c2, - space: 'rgb' + _a: a, + _b: b, + _c: c, + _d: d, + space: space }); - } else if (isHex.test(a)) { - var hexParse = function hexParse(v) { - return parseInt(v, 16); - }; - - var _hex$exec$map = hex.exec(sixDigitHex(a)).map(hexParse), - _hex$exec$map2 = _slicedToArray(_hex$exec$map, 4), - _a3 = _hex$exec$map2[1], - _b3 = _hex$exec$map2[2], - _c3 = _hex$exec$map2[3]; - + } else if (a instanceof Array) { + this.space = b || 'rgb'; Object.assign(this, { - _a: _a3, - _b: _b3, - _c: _c3, - space: 'rgb' + _a: a[0], + _b: a[1], + _c: a[2], + _d: a[3] }); - } else throw Error("Unsupported string format, can't construct Color"); - } // Now add the components as a convenience - - - var _a = this._a, - _b = this._b, - _c = this._c, - _d = this._d; - var components = this.space === 'rgb' ? { - r: _a, - g: _b, - b: _c - } : this.space === 'xyz' ? { - x: _a, - y: _b, - z: _c - } : this.space === 'hsl' ? { - h: _a, - s: _b, - l: _c - } : this.space === 'lab' ? { - l: _a, - a: _b, - b: _c - } : this.space === 'lch' ? { - l: _a, - c: _b, - h: _c - } : this.space === 'cmyk' ? { - c: _a, - y: _b, - m: _c, - k: _d - } : {}; - Object.assign(this, components); - } + } else if (a instanceof Object) { + // Set the object up and assign its values directly + var values = getParameters(a); + Object.assign(this, values); + } else if (typeof a === 'string') { + if (isRgb.test(a)) { + var noWhitespace = a.replace(whitespace, ''); + + var _rgb$exec$slice$map = rgb.exec(noWhitespace).slice(1, 4).map(function (v) { + return parseInt(v); + }), + _rgb$exec$slice$map2 = _slicedToArray(_rgb$exec$slice$map, 3), + _a2 = _rgb$exec$slice$map2[0], + _b2 = _rgb$exec$slice$map2[1], + _c2 = _rgb$exec$slice$map2[2]; + + Object.assign(this, { + _a: _a2, + _b: _b2, + _c: _c2, + space: 'rgb' + }); + } else if (isHex.test(a)) { + var hexParse = function hexParse(v) { + return parseInt(v, 16); + }; + + var _hex$exec$map = hex.exec(sixDigitHex(a)).map(hexParse), + _hex$exec$map2 = _slicedToArray(_hex$exec$map, 4), + _a3 = _hex$exec$map2[1], + _b3 = _hex$exec$map2[2], + _c3 = _hex$exec$map2[3]; + + Object.assign(this, { + _a: _a3, + _b: _b3, + _c: _c3, + space: 'rgb' + }); + } else throw Error("Unsupported string format, can't construct Color"); + } // Now add the components as a convenience - _createClass(Color, [{ + + var _a = this._a, + _b = this._b, + _c = this._c, + _d = this._d; + var components = this.space === 'rgb' ? { + r: _a, + g: _b, + b: _c + } : this.space === 'xyz' ? { + x: _a, + y: _b, + z: _c + } : this.space === 'hsl' ? { + h: _a, + s: _b, + l: _c + } : this.space === 'lab' ? { + l: _a, + a: _b, + b: _c + } : this.space === 'lch' ? { + l: _a, + c: _b, + h: _c + } : this.space === 'cmyk' ? { + c: _a, + m: _b, + y: _c, + k: _d + } : {}; + Object.assign(this, components); + } + }, { key: "opacity", value: function opacity() { var _opacity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; @@ -1264,8 +1239,8 @@ var SVG = (function () { var yL = (l + 16) / 116; - var xL = a / 500 + y; - var zL = y - _b4 / 200; // Get the xyz values + var xL = a / 500 + yL; + var zL = yL - _b4 / 200; // Get the xyz values var ct = 16 / 116; var mx = 0.008856; @@ -1286,14 +1261,17 @@ var SVG = (function () { var g = gU > bd ? 1.055 * pow(gU, 1 / 2.4) - 0.055 : 12.92 * gU; var b = bU > bd ? 1.055 * pow(bU, 1 / 2.4) - 0.055 : 12.92 * bU; // Make and return the color - var color = new Color(r, g, b); + var color = new Color(255 * r, 255 * g, 255 * b); return color; } else if (this.space === 'hsl') { - // stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion + // https://bgrins.github.io/TinyColor/docs/tinycolor.html // Get the current hsl values var _h = this.h, s = this.s, - _l = this.l; // If we are grey, then just make the color directly + _l = this.l; + _h /= 360; + s /= 100; + _l /= 100; // If we are grey, then just make the color directly if (s === 0) { var _color2 = new Color(_l, _l, _l); @@ -1305,11 +1283,11 @@ var SVG = (function () { var q = _l < 0.5 ? _l * (1 + s) : _l + s - _l * s; var p = 2 * _l - q; // Get the rgb values - var _r = hueToRgb(p, q, _h + 1 / 3); + var _r = 255 * hueToRgb(p, q, _h + 1 / 3); - var _g = hueToRgb(p, q, _h); + var _g = 255 * hueToRgb(p, q, _h); - var _b5 = hueToRgb(p, q, _h - 1 / 3); // Make a new color + var _b5 = 255 * hueToRgb(p, q, _h - 1 / 3); // Make a new color var _color = new Color(_r, _g, _b5); @@ -1318,26 +1296,16 @@ var SVG = (function () { } else if (this.space === 'cmyk') { // https://gist.github.com/felipesabino/5066336 // Get the normalised cmyk values - var _a = this._a, - _b = this._b, - _c = this._c, - _d = this._d; - - var _map = [_a, _b, _c, _d].map(function (v) { - return v / 100; - }), - _map2 = _slicedToArray(_map, 4), - _c4 = _map2[0], - m = _map2[1], - _y = _map2[2], - k = _map2[3]; // Get the rgb values - + var _c4 = this.c, + m = this.m, + _y = this.y, + k = this.k; // Get the rgb values - var _r2 = 1 - Math.min(1, _c4 * (1 - k) + k); + var _r2 = 255 * (1 - Math.min(1, _c4 * (1 - k) + k)); - var _g2 = 1 - Math.min(1, m * (1 - k) + k); + var _g2 = 255 * (1 - Math.min(1, m * (1 - k) + k)); - var _b6 = 1 - Math.min(1, _y * (1 - k) + k); // Form the color and return it + var _b6 = 255 * (1 - Math.min(1, _y * (1 - k) + k)); // Form the color and return it var _color3 = new Color(_r2, _g2, _b6); @@ -1373,13 +1341,13 @@ var SVG = (function () { g255 = _this$rgb2._b, b255 = _this$rgb2._c; - var _map3 = [r255, g255, b255].map(function (v) { + var _map = [r255, g255, b255].map(function (v) { return v / 255; }), - _map4 = _slicedToArray(_map3, 3), - r = _map4[0], - g = _map4[1], - b = _map4[2]; // Convert to the lab rgb space + _map2 = _slicedToArray(_map, 3), + r = _map2[0], + g = _map2[1], + b = _map2[2]; // Convert to the lab rgb space var rL = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92; @@ -1428,13 +1396,13 @@ var SVG = (function () { _b = _this$rgb3._b, _c = _this$rgb3._c; - var _map5 = [_a, _b, _c].map(function (v) { + var _map3 = [_a, _b, _c].map(function (v) { return v / 255; }), - _map6 = _slicedToArray(_map5, 3), - r = _map6[0], - g = _map6[1], - b = _map6[2]; // Find the maximum and minimum values to get the lightness + _map4 = _slicedToArray(_map3, 3), + r = _map4[0], + g = _map4[1], + b = _map4[2]; // Find the maximum and minimum values to get the lightness var max = Math.max(r, g, b); @@ -1447,7 +1415,7 @@ var SVG = (function () { var s = isGrey ? 0 : l > 0.5 ? delta / (2 - max - min) : delta / (max + min); var h = isGrey ? 0 : max === r ? ((g - b) / delta + (g < b ? 6 : 0)) / 6 : max === g ? ((b - r) / delta + 2) / 6 : max === b ? ((r - g) / delta + 4) / 6 : 0; // Construct and return the new color - var color = new Color(h, s, l, 'hsl'); + var color = new Color(360 * h, 100 * s, 100 * l, 'hsl'); return color; } }, { @@ -1459,54 +1427,24 @@ var SVG = (function () { _b = _this$rgb4._b, _c = _this$rgb4._c; - var _map7 = [_a, _b, _c].map(function (v) { + var _map5 = [_a, _b, _c].map(function (v) { return v / 255; }), - _map8 = _slicedToArray(_map7, 3), - r = _map8[0], - g = _map8[1], - b = _map8[2]; // Get the cmyk values in an unbounded format + _map6 = _slicedToArray(_map5, 3), + r = _map6[0], + g = _map6[1], + b = _map6[2]; // Get the cmyk values in an unbounded format - var k = 100 * Math.min(1 - r, 1 - g, 1 - b); - var c = 100 * (1 - r - k) / (1 - k); - var m = 100 * (1 - g - k) / (1 - k); - var y = 100 * (1 - b - k) / (1 - k); // Construct the new color + var k = Math.min(1 - r, 1 - g, 1 - b); + var c = (1 - r - k) / (1 - k); + var m = (1 - g - k) / (1 - k); + var y = (1 - b - k) / (1 - k); // Construct the new color var color = new Color(c, m, y, k, 'cmyk'); return color; } /* - Modifying the color - */ - - }, { - key: "brighten", - value: function brighten() { - } - }, { - key: "darken", - value: function darken() { - } - /* - Mixing methods - */ - - }, { - key: "to", - value: function to(otherColor, space) { - // Force both colors to the color of this space (or let the user decide) - space = space || this.space; // Get the starting and ending colors - // let start = this[ space ]() - // let end = otherColor[ space ]() - // Return a function that blends between the two colors - - return function (t) {}; - } - }, { - key: "avearge", - value: function avearge(otherColor, space) {} - /* Input and Output methods */ @@ -1518,11 +1456,11 @@ var SVG = (function () { _b = _this$rgb5._b, _c = _this$rgb5._c; - var _map9 = [_a, _b, _c].map(componentHex), - _map10 = _slicedToArray(_map9, 3), - r = _map10[0], - g = _map10[1], - b = _map10[2]; + var _map7 = [_a, _b, _c].map(componentHex), + _map8 = _slicedToArray(_map7, 3), + r = _map8[0], + g = _map8[1], + b = _map8[2]; return "#".concat(r).concat(g).concat(b); } @@ -1547,11 +1485,11 @@ var SVG = (function () { return max(0, min(round(v), 255)); }; - var _map11 = [r, g, b].map(format), - _map12 = _slicedToArray(_map11, 3), - rV = _map12[0], - gV = _map12[1], - bV = _map12[2]; + var _map9 = [r, g, b].map(format), + _map10 = _slicedToArray(_map9, 3), + rV = _map10[0], + gV = _map10[1], + bV = _map10[2]; var string = "rgb(".concat(rV, ",").concat(gV, ",").concat(bV, ")"); return string; @@ -1566,18 +1504,11 @@ var SVG = (function () { space = this.space; return [_a, _b, _c, _d, space]; } - }], [{ - key: "fromArray", - value: function fromArray(array) { - var newColor = _construct(Color, _toConsumableArray(array)); - - return newColor; - } /* Generating random colors */ - }, { + }], [{ key: "random", value: function random() { 'sine'; @@ -1591,10 +1522,7 @@ var SVG = (function () { /* Constructing colors */ - - }, { - key: "temperature", - value: function temperature(kelvin) {} // Test if given value is a color string + // Test if given value is a color string }, { key: "test", diff --git a/src/animation/Animator.js b/src/animation/Animator.js index e9d5797..cac0eb9 100644 --- a/src/animation/Animator.js +++ b/src/animation/Animator.js @@ -8,106 +8,80 @@ const Animator = { timer: globals.window.performance || globals.window.Date, transforms: [], - frame ( fn ) { - + frame (fn) { // Store the node - var node = Animator.frames.push( { run: fn } ) + var node = Animator.frames.push({ run: fn }) // Request an animation frame if we don't have one - if ( Animator.nextDraw === null ) { - - Animator.nextDraw = globals.window.requestAnimationFrame( Animator._draw ) - + if (Animator.nextDraw === null) { + Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw) } // Return the node so we can remove it easily return node - }, - transform_frame ( fn, id ) { - + transform_frame (fn, id) { Animator.transforms[id] = fn - }, - timeout ( fn, delay ) { - + timeout (fn, delay) { delay = delay || 0 // Work out when the event should fire var time = Animator.timer.now() + delay // Add the timeout to the end of the queue - var node = Animator.timeouts.push( { run: fn, time: time } ) + var node = Animator.timeouts.push({ run: fn, time: time }) // Request another animation frame if we need one - if ( Animator.nextDraw === null ) { - - Animator.nextDraw = globals.window.requestAnimationFrame( Animator._draw ) - + if (Animator.nextDraw === null) { + Animator.nextDraw = globals.window.requestAnimationFrame(Animator._draw) } return node - }, - cancelFrame ( node ) { - - Animator.frames.remove( node ) - + cancelFrame (node) { + Animator.frames.remove(node) }, - clearTimeout ( node ) { - - Animator.timeouts.remove( node ) - + clearTimeout (node) { + Animator.timeouts.remove(node) }, - _draw ( now ) { - + _draw (now) { // Run all the timeouts we can run, if they are not ready yet, add them // to the end of the queue immediately! (bad timeouts!!! [sarcasm]) var nextTimeout = null var lastTimeout = Animator.timeouts.last() - while ( ( nextTimeout = Animator.timeouts.shift() ) ) { - + while ((nextTimeout = Animator.timeouts.shift())) { // Run the timeout if its time, or push it to the end - if ( now >= nextTimeout.time ) { - + if (now >= nextTimeout.time) { nextTimeout.run() - } else { - - Animator.timeouts.push( nextTimeout ) - + Animator.timeouts.push(nextTimeout) } // If we hit the last item, we should stop shifting out more items - if ( nextTimeout === lastTimeout ) break - + if (nextTimeout === lastTimeout) break } // Run all of the animation frames var nextFrame = null var lastFrame = Animator.frames.last() - while ( ( nextFrame !== lastFrame ) && ( nextFrame = Animator.frames.shift() ) ) { - + while ((nextFrame !== lastFrame) && (nextFrame = Animator.frames.shift())) { nextFrame.run() - } - Animator.transforms.forEach( function ( el ) { - + Animator.transforms.forEach(function (el) { el() - - } ) + }) // If we have remaining timeouts or frames, draw until we don't anymore Animator.nextDraw = Animator.timeouts.first() || Animator.frames.first() - ? globals.window.requestAnimationFrame( Animator._draw ) + ? globals.window.requestAnimationFrame(Animator._draw) : null - } } diff --git a/src/animation/Controller.js b/src/animation/Controller.js index 9efe87e..6cf58cd 100644 --- a/src/animation/Controller.js +++ b/src/animation/Controller.js @@ -7,149 +7,95 @@ Base Class The base stepper class that will be ***/ -function makeSetterGetter ( k, f ) { - - return function ( v ) { - - if ( v == null ) return this[v] +function makeSetterGetter (k, f) { + return function (v) { + if (v == null) return this[v] this[k] = v - if ( f ) f.call( this ) + if (f) f.call(this) return this - } - } export let easing = { - '-': function ( pos ) { - + '-': function (pos) { return pos - }, - '<>': function ( pos ) { - - return -Math.cos( pos * Math.PI ) / 2 + 0.5 - + '<>': function (pos) { + return -Math.cos(pos * Math.PI) / 2 + 0.5 }, - '>': function ( pos ) { - - return Math.sin( pos * Math.PI / 2 ) - + '>': function (pos) { + return Math.sin(pos * Math.PI / 2) }, - '<': function ( pos ) { - - return -Math.cos( pos * Math.PI / 2 ) + 1 - + '<': function (pos) { + return -Math.cos(pos * Math.PI / 2) + 1 }, - bezier: function ( x1, y1, x2, y2 ) { - + bezier: function (x1, y1, x2, y2) { // see https://www.w3.org/TR/css-easing-1/#cubic-bezier-algo - return function ( t ) { - - if ( t < 0 ) { - - if ( x1 > 0 ) { - + return function (t) { + if (t < 0) { + if (x1 > 0) { return y1 / x1 * t - - } else if ( x2 > 0 ) { - + } else if (x2 > 0) { return y2 / x2 * t - } else { - return 0 - } - - } else if ( t > 1 ) { - - if ( x2 < 1 ) { - - return ( 1 - y2 ) / ( 1 - x2 ) * t + ( y2 - x2 ) / ( 1 - x2 ) - - } else if ( x1 < 1 ) { - - return ( 1 - y1 ) / ( 1 - x1 ) * t + ( y1 - x1 ) / ( 1 - x1 ) - + } else if (t > 1) { + if (x2 < 1) { + return (1 - y2) / (1 - x2) * t + (y2 - x2) / (1 - x2) + } else if (x1 < 1) { + return (1 - y1) / (1 - x1) * t + (y1 - x1) / (1 - x1) } else { - return 1 - } - } else { - - return 3 * t * ( 1 - t ) ** 2 * y1 + 3 * t ** 2 * ( 1 - t ) * y2 + t ** 3 - + return 3 * t * (1 - t) ** 2 * y1 + 3 * t ** 2 * (1 - t) * y2 + t ** 3 } - } - }, // see https://www.w3.org/TR/css-easing-1/#step-timing-function-algo - steps: function ( steps, stepPosition = 'end' ) { - + steps: function (steps, stepPosition = 'end') { // deal with "jump-" prefix - stepPosition = stepPosition.split( '-' ).reverse()[0] + stepPosition = stepPosition.split('-').reverse()[0] let jumps = steps - if ( stepPosition === 'none' ) { - + if (stepPosition === 'none') { --jumps - - } else if ( stepPosition === 'both' ) { - + } else if (stepPosition === 'both') { ++jumps - } // The beforeFlag is essentially useless - return ( t, beforeFlag = false ) => { - + return (t, beforeFlag = false) => { // Step is called currentStep in referenced url - let step = Math.floor( t * steps ) - const jumping = ( t * step ) % 1 === 0 - - if ( stepPosition === 'start' || stepPosition === 'both' ) { + let step = Math.floor(t * steps) + const jumping = (t * step) % 1 === 0 + if (stepPosition === 'start' || stepPosition === 'both') { ++step - } - if ( beforeFlag && jumping ) { - + if (beforeFlag && jumping) { --step - } - if ( t >= 0 && step < 0 ) { - + if (t >= 0 && step < 0) { step = 0 - } - if ( t <= 1 && step > jumps ) { - + if (t <= 1 && step > jumps) { step = jumps - } return step / jumps - } - } } export class Stepper { - done () { - return false - } - } /*** @@ -158,25 +104,17 @@ Easing Functions ***/ export class Ease extends Stepper { - - constructor ( fn ) { - + constructor (fn) { super() this.ease = easing[fn || timeline.ease] || fn - } - step ( from, to, pos ) { - - if ( typeof from !== 'number' ) { - + step (from, to, pos) { + if (typeof from !== 'number') { return pos < 1 ? from : to - } - return from + ( to - from ) * this.ease( pos ) - + return from + (to - from) * this.ease(pos) } - } /*** @@ -185,65 +123,51 @@ Controller Types ***/ export class Controller extends Stepper { - - constructor ( fn ) { - + constructor (fn) { super() this.stepper = fn - } - step ( current, target, dt, c ) { - - return this.stepper( current, target, dt, c ) - + step (current, target, dt, c) { + return this.stepper(current, target, dt, c) } - done ( c ) { - + done (c) { return c.done - } - } function recalculate () { - // Apply the default parameters - var duration = ( this._duration || 500 ) / 1000 + var duration = (this._duration || 500) / 1000 var overshoot = this._overshoot || 0 // Calculate the PID natural response var eps = 1e-10 var pi = Math.PI - var os = Math.log( overshoot / 100 + eps ) - var zeta = -os / Math.sqrt( pi * pi + os * os ) - var wn = 3.9 / ( zeta * duration ) + var os = Math.log(overshoot / 100 + eps) + var zeta = -os / Math.sqrt(pi * pi + os * os) + var wn = 3.9 / (zeta * duration) // Calculate the Spring values this.d = 2 * zeta * wn this.k = wn * wn - } export class Spring extends Controller { - - constructor ( duration, overshoot ) { - + constructor (duration, overshoot) { super() - this.duration( duration || 500 ) - .overshoot( overshoot || 0 ) - + this.duration(duration || 500) + .overshoot(overshoot || 0) } - step ( current, target, dt, c ) { - - if ( typeof current === 'string' ) return current + step (current, target, dt, c) { + if (typeof current === 'string') return current c.done = dt === Infinity - if ( dt === Infinity ) return target - if ( dt === 0 ) return current + if (dt === Infinity) return target + if (dt === 0) return current - if ( dt > 100 ) dt = 16 + if (dt > 100) dt = 16 dt /= 1000 @@ -251,7 +175,7 @@ export class Spring extends Controller { var velocity = c.velocity || 0 // Apply the control to get the new position and store it - var acceleration = -this.d * velocity - this.k * ( current - target ) + var acceleration = -this.d * velocity - this.k * (current - target) var newPosition = current + velocity * dt + acceleration * dt * dt / 2 @@ -260,66 +184,56 @@ export class Spring extends Controller { c.velocity = velocity + acceleration * dt // Figure out if we have converged, and if so, pass the value - c.done = Math.abs( target - newPosition ) + Math.abs( velocity ) < 0.002 + c.done = Math.abs(target - newPosition) + Math.abs(velocity) < 0.002 return c.done ? target : newPosition - } - } -extend( Spring, { - duration: makeSetterGetter( '_duration', recalculate ), - overshoot: makeSetterGetter( '_overshoot', recalculate ) -} ) +extend(Spring, { + duration: makeSetterGetter('_duration', recalculate), + overshoot: makeSetterGetter('_overshoot', recalculate) +}) export class PID extends Controller { - - constructor ( p, i, d, windup ) { - + constructor (p, i, d, windup) { super() p = p == null ? 0.1 : p i = i == null ? 0.01 : i d = d == null ? 0 : d windup = windup == null ? 1000 : windup - this.p( p ).i( i ).d( d ).windup( windup ) - + this.p(p).i(i).d(d).windup(windup) } - step ( current, target, dt, c ) { - - if ( typeof current === 'string' ) return current + step (current, target, dt, c) { + if (typeof current === 'string') return current c.done = dt === Infinity - if ( dt === Infinity ) return target - if ( dt === 0 ) return current + if (dt === Infinity) return target + if (dt === 0) return current var p = target - current - var i = ( c.integral || 0 ) + p * dt - var d = ( p - ( c.error || 0 ) ) / dt + var i = (c.integral || 0) + p * dt + var d = (p - (c.error || 0)) / dt var windup = this.windup // antiwindup - if ( windup !== false ) { - - i = Math.max( -windup, Math.min( i, windup ) ) - + if (windup !== false) { + i = Math.max(-windup, Math.min(i, windup)) } c.error = p c.integral = i - c.done = Math.abs( p ) < 0.001 - - return c.done ? target : current + ( this.P * p + this.I * i + this.D * d ) + c.done = Math.abs(p) < 0.001 + return c.done ? target : current + (this.P * p + this.I * i + this.D * d) } - } -extend( PID, { - windup: makeSetterGetter( 'windup' ), - p: makeSetterGetter( 'P' ), - i: makeSetterGetter( 'I' ), - d: makeSetterGetter( 'D' ) -} ) +extend(PID, { + windup: makeSetterGetter('windup'), + p: makeSetterGetter('P'), + i: makeSetterGetter('I'), + d: makeSetterGetter('D') +}) diff --git a/src/animation/Queue.js b/src/animation/Queue.js index b4e2722..14b92b4 100644 --- a/src/animation/Queue.js +++ b/src/animation/Queue.js @@ -1,77 +1,59 @@ export default class Queue { - constructor () { - this._first = null this._last = null - } - push ( value ) { - + push (value) { // An item stores an id and the provided value var item = value.next ? value : { value: value, next: null, prev: null } // Deal with the queue being empty or populated - if ( this._last ) { - + if (this._last) { item.prev = this._last this._last.next = item this._last = item - } else { - this._last = item this._first = item - } // Update the length and return the current item return item - } shift () { - // Check if we have a value var remove = this._first - if ( !remove ) return null + if (!remove) return null // If we do, remove it and relink things this._first = remove.next - if ( this._first ) this._first.prev = null + if (this._first) this._first.prev = null this._last = this._first ? this._last : null return remove.value - } // Shows us the first item in the list first () { - return this._first && this._first.value - } // Shows us the last item in the list last () { - return this._last && this._last.value - } // Removes the item that was returned from the push - remove ( item ) { - + remove (item) { // Relink the previous item - if ( item.prev ) item.prev.next = item.next - if ( item.next ) item.next.prev = item.prev - if ( item === this._last ) this._last = item.prev - if ( item === this._first ) this._first = item.next + if (item.prev) item.prev.next = item.next + if (item.next) item.next.prev = item.prev + if (item === this._last) this._last = item.prev + if (item === this._first) this._first = item.next // Invalidate item item.prev = null item.next = null - } - } diff --git a/src/animation/Runner.js b/src/animation/Runner.js index d2c7bdf..7e04c21 100644 --- a/src/animation/Runner.js +++ b/src/animation/Runner.js @@ -15,9 +15,7 @@ import SVGNumber from '../types/SVGNumber.js' import Timeline from './Timeline.js' export default class Runner extends EventTarget { - - constructor ( options ) { - + constructor (options) { super() // Store a unique id on the runner, so that we can identify it later @@ -30,7 +28,7 @@ export default class Runner extends EventTarget { // Ensure that we get a controller options = typeof options === 'function' - ? new Controller( options ) + ? new Controller(options) : options // Declare all of the variables @@ -63,7 +61,6 @@ export default class Runner extends EventTarget { this._swing = false this._wait = 0 this._times = 1 - } /* @@ -73,75 +70,58 @@ export default class Runner extends EventTarget { help us make new runners from the current runner */ - element ( element ) { - - if ( element == null ) return this._element + element (element) { + if (element == null) return this._element this._element = element element._prepareRunner() return this - } - timeline ( timeline ) { - + timeline (timeline) { // check explicitly for undefined so we can set the timeline to null - if ( typeof timeline === 'undefined' ) return this._timeline + if (typeof timeline === 'undefined') return this._timeline this._timeline = timeline return this - } - animate ( duration, delay, when ) { - - var o = Runner.sanitise( duration, delay, when ) - var runner = new Runner( o.duration ) - if ( this._timeline ) runner.timeline( this._timeline ) - if ( this._element ) runner.element( this._element ) - return runner.loop( o ).schedule( delay, when ) - + animate (duration, delay, when) { + var o = Runner.sanitise(duration, delay, when) + var runner = new Runner(o.duration) + if (this._timeline) runner.timeline(this._timeline) + if (this._element) runner.element(this._element) + return runner.loop(o).schedule(delay, when) } - schedule ( timeline, delay, when ) { - + schedule (timeline, delay, when) { // The user doesn't need to pass a timeline if we already have one - if ( !( timeline instanceof Timeline ) ) { - + if (!(timeline instanceof Timeline)) { when = delay delay = timeline timeline = this.timeline() - } // If there is no timeline, yell at the user... - if ( !timeline ) { - - throw Error( 'Runner cannot be scheduled without timeline' ) - + if (!timeline) { + throw Error('Runner cannot be scheduled without timeline') } // Schedule the runner on the timeline provided - timeline.schedule( this, delay, when ) + timeline.schedule(this, delay, when) return this - } unschedule () { - var timeline = this.timeline() - timeline && timeline.unschedule( this ) + timeline && timeline.unschedule(this) return this - } - loop ( times, swing, wait ) { - + loop (times, swing, wait) { // Deal with the user passing in an object - if ( typeof times === 'object' ) { - + if (typeof times === 'object') { swing = times.swing wait = times.wait times = times.times - } // Sanitise the values and store them @@ -149,13 +129,10 @@ export default class Runner extends EventTarget { this._swing = swing || false this._wait = wait || 0 return this - } - delay ( delay ) { - - return this.animate( 0, delay ) - + delay (delay) { + return this.animate(0, delay) } /* @@ -164,32 +141,26 @@ export default class Runner extends EventTarget { These methods allow us to attach basic functions to the runner directly */ - queue ( initFn, runFn, retargetFn, isTransform ) { - - this._queue.push( { + queue (initFn, runFn, retargetFn, isTransform) { + this._queue.push({ initialiser: initFn || noop, runner: runFn || noop, retarget: retargetFn, isTransform: isTransform, initialised: false, finished: false - } ) + }) var timeline = this.timeline() timeline && this.timeline()._continue() return this - } - during ( fn ) { - - return this.queue( null, fn ) - + during (fn) { + return this.queue(null, fn) } - after ( fn ) { - - return this.on( 'finish', fn ) - + after (fn) { + return this.on('finish', fn) } /* @@ -198,45 +169,34 @@ export default class Runner extends EventTarget { Control how the animation plays */ - time ( time ) { - - if ( time == null ) { - + time (time) { + if (time == null) { return this._time - } let dt = time - this._time - this.step( dt ) + this.step(dt) return this - } duration () { - - return this._times * ( this._wait + this._duration ) - this._wait - + return this._times * (this._wait + this._duration) - this._wait } - loops ( p ) { - + loops (p) { var loopDuration = this._duration + this._wait - if ( p == null ) { - - var loopsDone = Math.floor( this._time / loopDuration ) - var relativeTime = ( this._time - loopsDone * loopDuration ) + if (p == null) { + var loopsDone = Math.floor(this._time / loopDuration) + var relativeTime = (this._time - loopsDone * loopDuration) var position = relativeTime / this._duration - return Math.min( loopsDone + position, this._times ) - + return Math.min(loopsDone + position, this._times) } - var whole = Math.floor( p ) + var whole = Math.floor(p) var partial = p % 1 var time = loopDuration * whole + this._duration * partial - return this.time( time ) - + return this.time(time) } - position ( p ) { - + position (p) { // Get all of the variables we need var x = this._time var d = this._duration @@ -246,8 +206,7 @@ export default class Runner extends EventTarget { var r = this._reverse var position - if ( p == null ) { - + if (p == null) { /* This function converts a time to a position in the range [0, 1] The full explanation can be found in this desmos demonstration @@ -256,49 +215,40 @@ export default class Runner extends EventTarget { */ // Figure out the value without thinking about the start or end time - const f = function ( x ) { - - var swinging = s * Math.floor( x % ( 2 * ( w + d ) ) / ( w + d ) ) - var backwards = ( swinging && !r ) || ( !swinging && r ) - var uncliped = Math.pow( -1, backwards ) * ( x % ( w + d ) ) / d + backwards - var clipped = Math.max( Math.min( uncliped, 1 ), 0 ) + const f = function (x) { + var swinging = s * Math.floor(x % (2 * (w + d)) / (w + d)) + var backwards = (swinging && !r) || (!swinging && r) + var uncliped = Math.pow(-1, backwards) * (x % (w + d)) / d + backwards + var clipped = Math.max(Math.min(uncliped, 1), 0) return clipped - } // Figure out the value by incorporating the start time - var endTime = t * ( w + d ) - w - position = x <= 0 ? Math.round( f( 1e-5 ) ) - : x < endTime ? f( x ) - : Math.round( f( endTime - 1e-5 ) ) + var endTime = t * (w + d) - w + position = x <= 0 ? Math.round(f(1e-5)) + : x < endTime ? f(x) + : Math.round(f(endTime - 1e-5)) return position - } // Work out the loops done and add the position to the loops done - var loopsDone = Math.floor( this.loops() ) - var swingForward = s && ( loopsDone % 2 === 0 ) - var forwards = ( swingForward && !r ) || ( r && swingForward ) - position = loopsDone + ( forwards ? p : 1 - p ) - return this.loops( position ) - + var loopsDone = Math.floor(this.loops()) + var swingForward = s && (loopsDone % 2 === 0) + var forwards = (swingForward && !r) || (r && swingForward) + position = loopsDone + (forwards ? p : 1 - p) + return this.loops(position) } - progress ( p ) { - - if ( p == null ) { - - return Math.min( 1, this._time / this.duration() ) - + progress (p) { + if (p == null) { + return Math.min(1, this._time / this.duration()) } - return this.time( p * this.duration() ) - + return this.time(p * this.duration()) } - step ( dt ) { - + step (dt) { // If we are inactive, this stepper just gets skipped - if ( !this.enabled ) return this + if (!this.enabled) return this // Update the time and get the new position dt = dt == null ? 16 : dt @@ -314,10 +264,8 @@ export default class Runner extends EventTarget { var justStarted = this._lastTime < 0 && this._time > 0 var justFinished = this._lastTime < this._time && this.time > duration this._lastTime = this._time - if ( justStarted ) { - - this.fire( 'start', this ) - + if (justStarted) { + this.fire('start', this) } // Work out if the runner is finished set the done flag here so animations @@ -327,54 +275,41 @@ export default class Runner extends EventTarget { this.done = !declarative && !justFinished && this._time >= duration // Call initialise and the run function - if ( running || declarative ) { - - this._initialise( running ) + if (running || declarative) { + this._initialise(running) // clear the transforms on this runner so they dont get added again and again this.transforms = new Matrix() - var converged = this._run( declarative ? dt : position ) - this.fire( 'step', this ) - + var converged = this._run(declarative ? dt : position) + this.fire('step', this) } // correct the done flag here // declaritive animations itself know when they converged - this.done = this.done || ( converged && declarative ) - if ( this.done ) { - - this.fire( 'finish', this ) - + this.done = this.done || (converged && declarative) + if (this.done) { + this.fire('finish', this) } return this - } finish () { - - return this.step( Infinity ) - + return this.step(Infinity) } - reverse ( reverse ) { - + reverse (reverse) { this._reverse = reverse == null ? !this._reverse : reverse return this - } - ease ( fn ) { - - this._stepper = new Ease( fn ) + ease (fn) { + this._stepper = new Ease(fn) return this - } - active ( enabled ) { - - if ( enabled == null ) return this.enabled + active (enabled) { + if (enabled == null) return this.enabled this.enabled = enabled return this - } /* @@ -384,135 +319,102 @@ export default class Runner extends EventTarget { */ // Save a morpher to the morpher list so that we can retarget it later - _rememberMorpher ( method, morpher ) { - + _rememberMorpher (method, morpher) { this._history[method] = { morpher: morpher, caller: this._queue[this._queue.length - 1] } - } // Try to set the target for a morpher if the morpher exists, otherwise // do nothing and return false - _tryRetarget ( method, target ) { - - if ( this._history[method] ) { - + _tryRetarget (method, target) { + if (this._history[method]) { // if the last method wasnt even initialised, throw it away - if ( !this._history[method].caller.initialised ) { - - let index = this._queue.indexOf( this._history[method].caller ) - this._queue.splice( index, 1 ) + if (!this._history[method].caller.initialised) { + let index = this._queue.indexOf(this._history[method].caller) + this._queue.splice(index, 1) return false - } // for the case of transformations, we use the special retarget function // which has access to the outer scope - if ( this._history[method].caller.retarget ) { - - this._history[method].caller.retarget( target ) + if (this._history[method].caller.retarget) { + this._history[method].caller.retarget(target) // for everything else a simple morpher change is sufficient - } else { - - this._history[method].morpher.to( target ) - + this._history[method].morpher.to(target) } this._history[method].caller.finished = false var timeline = this.timeline() timeline && timeline._continue() return true - } return false - } // Run each initialise function in the runner if required - _initialise ( running ) { - + _initialise (running) { // If we aren't running, we shouldn't initialise when not declarative - if ( !running && !this._isDeclarative ) return + if (!running && !this._isDeclarative) return // Loop through all of the initialisers - for ( var i = 0, len = this._queue.length; i < len; ++i ) { - + for (var i = 0, len = this._queue.length; i < len; ++i) { // Get the current initialiser var current = this._queue[i] // Determine whether we need to initialise - var needsIt = this._isDeclarative || ( !current.initialised && running ) + var needsIt = this._isDeclarative || (!current.initialised && running) running = !current.finished // Call the initialiser if we need to - if ( needsIt && running ) { - - current.initialiser.call( this ) + if (needsIt && running) { + current.initialiser.call(this) current.initialised = true - } - } - } // Run each run function for the position or dt given - _run ( positionOrDt ) { - + _run (positionOrDt) { // Run all of the _queue directly var allfinished = true - for ( var i = 0, len = this._queue.length; i < len; ++i ) { - + for (var i = 0, len = this._queue.length; i < len; ++i) { // Get the current function to run var current = this._queue[i] // Run the function if its not finished, we keep track of the finished // flag for the sake of declarative _queue - var converged = current.runner.call( this, positionOrDt ) - current.finished = current.finished || ( converged === true ) + var converged = current.runner.call(this, positionOrDt) + current.finished = current.finished || (converged === true) allfinished = allfinished && current.finished - } // We report when all of the constructors are finished return allfinished - } - addTransform ( transform, index ) { - - this.transforms.lmultiplyO( transform ) + addTransform (transform, index) { + this.transforms.lmultiplyO(transform) return this - } clearTransform () { - this.transforms = new Matrix() return this - } // TODO: Keep track of all transformations so that deletion is faster clearTransformsFromQueue () { - - if ( !this.done ) { - - this._queue = this._queue.filter( ( item ) => { - + if (!this.done) { + this._queue = this._queue.filter((item) => { return !item.isTransform - - } ) - + }) } - } - static sanitise ( duration, delay, when ) { - + static sanitise (duration, delay, when) { // Initialise the default parameters var times = 1 var swing = false @@ -522,15 +424,13 @@ export default class Runner extends EventTarget { when = when || 'last' // If we have an object, unpack the values - if ( typeof duration === 'object' && !( duration instanceof Stepper ) ) { - + if (typeof duration === 'object' && !(duration instanceof Stepper)) { delay = duration.delay || delay when = duration.when || when swing = duration.swing || swing times = duration.times || times wait = duration.wait || wait duration = duration.duration || timeline.duration - } return { @@ -541,285 +441,215 @@ export default class Runner extends EventTarget { wait: wait, when: when } - } - } Runner.id = 0 class FakeRunner { - - constructor ( transforms = new Matrix(), id = -1, done = true ) { - + constructor (transforms = new Matrix(), id = -1, done = true) { this.transforms = transforms this.id = id this.done = done - } clearTransformsFromQueue () { } - } -extend( [ Runner, FakeRunner ], { - mergeWith ( runner ) { - +extend([ Runner, FakeRunner ], { + mergeWith (runner) { return new FakeRunner( - runner.transforms.lmultiply( this.transforms ), + runner.transforms.lmultiply(this.transforms), runner.id ) - } -} ) +}) // FakeRunner.emptyRunner = new FakeRunner() -const lmultiply = ( last, curr ) => last.lmultiplyO( curr ) -const getRunnerTransform = ( runner ) => runner.transforms +const lmultiply = (last, curr) => last.lmultiplyO(curr) +const getRunnerTransform = (runner) => runner.transforms function mergeTransforms () { - // Find the matrix to apply to the element and apply it let runners = this._transformationRunners.runners let netTransform = runners - .map( getRunnerTransform ) - .reduce( lmultiply, new Matrix() ) + .map(getRunnerTransform) + .reduce(lmultiply, new Matrix()) - this.transform( netTransform ) + this.transform(netTransform) this._transformationRunners.merge() - if ( this._transformationRunners.length() === 1 ) { - + if (this._transformationRunners.length() === 1) { this._frameId = null - } - } class RunnerArray { - constructor () { - this.runners = [] this.ids = [] - } - add ( runner ) { - - if ( this.runners.includes( runner ) ) return + add (runner) { + if (this.runners.includes(runner)) return let id = runner.id + 1 - let leftSibling = this.ids.reduce( ( last, curr ) => { - - if ( curr > last && curr < id ) return curr + let leftSibling = this.ids.reduce((last, curr) => { + if (curr > last && curr < id) return curr return last + }, 0) - }, 0 ) + let index = this.ids.indexOf(leftSibling) + 1 - let index = this.ids.indexOf( leftSibling ) + 1 - - this.ids.splice( index, 0, id ) - this.runners.splice( index, 0, runner ) + this.ids.splice(index, 0, id) + this.runners.splice(index, 0, runner) return this - } - getByID ( id ) { - - return this.runners[this.ids.indexOf( id + 1 )] - + getByID (id) { + return this.runners[this.ids.indexOf(id + 1)] } - remove ( id ) { - - let index = this.ids.indexOf( id + 1 ) - this.ids.splice( index, 1 ) - this.runners.splice( index, 1 ) + remove (id) { + let index = this.ids.indexOf(id + 1) + this.ids.splice(index, 1) + this.runners.splice(index, 1) return this - } merge () { - let lastRunner = null - this.runners.forEach( ( runner, i ) => { - - if ( lastRunner && runner.done && lastRunner.done ) { - - this.remove( runner.id ) - this.edit( lastRunner.id, runner.mergeWith( lastRunner ) ) - + this.runners.forEach((runner, i) => { + if (lastRunner && runner.done && lastRunner.done) { + this.remove(runner.id) + this.edit(lastRunner.id, runner.mergeWith(lastRunner)) } lastRunner = runner - - } ) + }) return this - } - edit ( id, newRunner ) { - - let index = this.ids.indexOf( id + 1 ) - this.ids.splice( index, 1, id ) - this.runners.splice( index, 1, newRunner ) + edit (id, newRunner) { + let index = this.ids.indexOf(id + 1) + this.ids.splice(index, 1, id) + this.runners.splice(index, 1, newRunner) return this - } length () { - return this.ids.length - } - clearBefore ( id ) { - - let deleteCnt = this.ids.indexOf( id + 1 ) || 1 - this.ids.splice( 0, deleteCnt, 0 ) - this.runners.splice( 0, deleteCnt, new FakeRunner() ) - .forEach( ( r ) => r.clearTransformsFromQueue() ) + clearBefore (id) { + let deleteCnt = this.ids.indexOf(id + 1) || 1 + this.ids.splice(0, deleteCnt, 0) + this.runners.splice(0, deleteCnt, new FakeRunner()) + .forEach((r) => r.clearTransformsFromQueue()) return this - } - } let frameId = 0 -registerMethods( { +registerMethods({ Element: { - animate ( duration, delay, when ) { - - var o = Runner.sanitise( duration, delay, when ) + animate (duration, delay, when) { + var o = Runner.sanitise(duration, delay, when) var timeline = this.timeline() - return new Runner( o.duration ) - .loop( o ) - .element( this ) - .timeline( timeline ) - .schedule( delay, when ) - + return new Runner(o.duration) + .loop(o) + .element(this) + .timeline(timeline) + .schedule(delay, when) }, - delay ( by, when ) { - - return this.animate( 0, by, when ) - + delay (by, when) { + return this.animate(0, by, when) }, // this function searches for all runners on the element and deletes the ones // which run before the current one. This is because absolute transformations // overwfrite anything anyway so there is no need to waste time computing // other runners - _clearTransformRunnersBefore ( currentRunner ) { - - this._transformationRunners.clearBefore( currentRunner.id ) - + _clearTransformRunnersBefore (currentRunner) { + this._transformationRunners.clearBefore(currentRunner.id) }, - _currentTransform ( current ) { - + _currentTransform (current) { return this._transformationRunners.runners // we need the equal sign here to make sure, that also transformations // on the same runner which execute before the current transformation are // taken into account - .filter( ( runner ) => runner.id <= current.id ) - .map( getRunnerTransform ) - .reduce( lmultiply, new Matrix() ) - + .filter((runner) => runner.id <= current.id) + .map(getRunnerTransform) + .reduce(lmultiply, new Matrix()) }, - addRunner ( runner ) { - - this._transformationRunners.add( runner ) + addRunner (runner) { + this._transformationRunners.add(runner) Animator.transform_frame( - mergeTransforms.bind( this ), this._frameId + mergeTransforms.bind(this), this._frameId ) - }, _prepareRunner () { - - if ( this._frameId == null ) { - + if (this._frameId == null) { this._transformationRunners = new RunnerArray() - .add( new FakeRunner( new Matrix( this ) ) ) + .add(new FakeRunner(new Matrix(this))) this._frameId = frameId++ - } - } } -} ) - -extend( Runner, { - attr ( a, v ) { - - return this.styleAttr( 'attr', a, v ) +}) +extend(Runner, { + attr (a, v) { + return this.styleAttr('attr', a, v) }, // Add animatable styles - css ( s, v ) { - - return this.styleAttr( 'css', s, v ) - + css (s, v) { + return this.styleAttr('css', s, v) }, - styleAttr ( type, name, val ) { - + styleAttr (type, name, val) { // apply attributes individually - if ( typeof name === 'object' ) { - - for ( var key in val ) { - - this.styleAttr( type, key, val[key] ) - + if (typeof name === 'object') { + for (var key in val) { + this.styleAttr(type, key, val[key]) } - } - var morpher = new Morphable( this._stepper ).to( val ) - - this.queue( function () { - - morpher = morpher.from( this.element()[type]( name ) ) - - }, function ( pos ) { + var morpher = new Morphable(this._stepper).to(val) - this.element()[type]( name, morpher.at( pos ) ) + this.queue(function () { + morpher = morpher.from(this.element()[type](name)) + }, function (pos) { + this.element()[type](name, morpher.at(pos)) return morpher.done() - - } ) + }) return this - }, - zoom ( level, point ) { - - var morpher = new Morphable( this._stepper ).to( new SVGNumber( level ) ) - - this.queue( function () { + zoom (level, point) { + var morpher = new Morphable(this._stepper).to(new SVGNumber(level)) - morpher = morpher.from( this.zoom() ) - - }, function ( pos ) { - - this.element().zoom( morpher.at( pos ), point ) + this.queue(function () { + morpher = morpher.from(this.zoom()) + }, function (pos) { + this.element().zoom(morpher.at(pos), point) return morpher.done() - - } ) + }) return this - }, /** @@ -839,25 +669,22 @@ extend( Runner, { // - Note F(1) = T // 4. Now you get the delta matrix as a result: D = F * inv(M) - transform ( transforms, relative, affine ) { - + transform (transforms, relative, affine) { // If we have a declarative function, we should retarget it if possible relative = transforms.relative || relative - if ( this._isDeclarative && !relative && this._tryRetarget( 'transform', transforms ) ) { - + if (this._isDeclarative && !relative && this._tryRetarget('transform', transforms)) { return this - } // Parse the parameters - var isMatrix = Matrix.isMatrixLike( transforms ) + var isMatrix = Matrix.isMatrixLike(transforms) affine = transforms.affine != null ? transforms.affine - : ( affine != null ? affine : !isMatrix ) + : (affine != null ? affine : !isMatrix) // Create a morepher and set its type - const morpher = new Morphable( this._stepper ) - .type( affine ? TransformBag : Matrix ) + const morpher = new Morphable(this._stepper) + .type(affine ? TransformBag : Matrix) let origin let element @@ -866,42 +693,36 @@ extend( Runner, { let startTransform function setup () { - // make sure element and origin is defined element = element || this.element() - origin = origin || getOrigin( transforms, element ) + origin = origin || getOrigin(transforms, element) - startTransform = new Matrix( relative ? undefined : element ) + startTransform = new Matrix(relative ? undefined : element) // add the runner to the element so it can merge transformations - element.addRunner( this ) + element.addRunner(this) // Deactivate all transforms that have run so far if we are absolute - if ( !relative ) { - - element._clearTransformRunnersBefore( this ) - + if (!relative) { + element._clearTransformRunnersBefore(this) } - } - function run ( pos ) { - + function run (pos) { // clear all other transforms before this in case something is saved // on this runner. We are absolute. We dont need these! - if ( !relative ) this.clearTransform() + if (!relative) this.clearTransform() - let { x, y } = new Point( origin ).transform( element._currentTransform( this ) ) + let { x, y } = new Point(origin).transform(element._currentTransform(this)) - let target = new Matrix( { ...transforms, origin: [ x, y ] } ) + let target = new Matrix({ ...transforms, origin: [ x, y ] }) let start = this._isDeclarative && current ? current : startTransform - if ( affine ) { - - target = target.decompose( x, y ) - start = start.decompose( x, y ) + if (affine) { + target = target.decompose(x, y) + start = start.decompose(x, y) // Get the current and target angle as it was set const rTarget = target.rotate @@ -909,285 +730,212 @@ extend( Runner, { // Figure out the shortest path to rotate directly const possibilities = [ rTarget - 360, rTarget, rTarget + 360 ] - const distances = possibilities.map( a => Math.abs( a - rCurrent ) ) - const shortest = Math.min( ...distances ) - const index = distances.indexOf( shortest ) + const distances = possibilities.map(a => Math.abs(a - rCurrent)) + const shortest = Math.min(...distances) + const index = distances.indexOf(shortest) target.rotate = possibilities[index] - } - if ( relative ) { - + if (relative) { // we have to be careful here not to overwrite the rotation // with the rotate method of Matrix - if ( !isMatrix ) { - + if (!isMatrix) { target.rotate = transforms.rotate || 0 - } - if ( this._isDeclarative && currentAngle ) { - + if (this._isDeclarative && currentAngle) { start.rotate = currentAngle - } - } - morpher.from( start ) - morpher.to( target ) + morpher.from(start) + morpher.to(target) - let affineParameters = morpher.at( pos ) + let affineParameters = morpher.at(pos) currentAngle = affineParameters.rotate - current = new Matrix( affineParameters ) + current = new Matrix(affineParameters) - this.addTransform( current ) + this.addTransform(current) return morpher.done() - } - function retarget ( newTransforms ) { - + function retarget (newTransforms) { // only get a new origin if it changed since the last call if ( - ( newTransforms.origin || 'center' ).toString() - !== ( transforms.origin || 'center' ).toString() + (newTransforms.origin || 'center').toString() + !== (transforms.origin || 'center').toString() ) { - - origin = getOrigin( transforms, element ) - + origin = getOrigin(transforms, element) } // overwrite the old transformations with the new ones transforms = { ...newTransforms, origin } - } - this.queue( setup, run, retarget, true ) - this._isDeclarative && this._rememberMorpher( 'transform', morpher ) + this.queue(setup, run, retarget, true) + this._isDeclarative && this._rememberMorpher('transform', morpher) return this - }, // Animatable x-axis - x ( x, relative ) { - - return this._queueNumber( 'x', x ) - + x (x, relative) { + return this._queueNumber('x', x) }, // Animatable y-axis - y ( y ) { - - return this._queueNumber( 'y', y ) - + y (y) { + return this._queueNumber('y', y) }, - dx ( x ) { - - return this._queueNumberDelta( 'x', x ) - + dx (x) { + return this._queueNumberDelta('x', x) }, - dy ( y ) { - - return this._queueNumberDelta( 'y', y ) - + dy (y) { + return this._queueNumberDelta('y', y) }, - _queueNumberDelta ( method, to ) { - - to = new SVGNumber( to ) + _queueNumberDelta (method, to) { + to = new SVGNumber(to) // Try to change the target if we have this method already registerd - if ( this._tryRetarget( method, to ) ) return this + if (this._tryRetarget(method, to)) return this // Make a morpher and queue the animation - var morpher = new Morphable( this._stepper ).to( to ) + var morpher = new Morphable(this._stepper).to(to) var from = null - this.queue( function () { - + this.queue(function () { from = this.element()[method]() - morpher.from( from ) - morpher.to( from + to ) - - }, function ( pos ) { - - this.element()[method]( morpher.at( pos ) ) + morpher.from(from) + morpher.to(from + to) + }, function (pos) { + this.element()[method](morpher.at(pos)) return morpher.done() - - }, function ( newTo ) { - - morpher.to( from + new SVGNumber( newTo ) ) - - } ) + }, function (newTo) { + morpher.to(from + new SVGNumber(newTo)) + }) // Register the morpher so that if it is changed again, we can retarget it - this._rememberMorpher( method, morpher ) + this._rememberMorpher(method, morpher) return this - }, - _queueObject ( method, to ) { - + _queueObject (method, to) { // Try to change the target if we have this method already registerd - if ( this._tryRetarget( method, to ) ) return this + if (this._tryRetarget(method, to)) return this // Make a morpher and queue the animation - var morpher = new Morphable( this._stepper ).to( to ) - this.queue( function () { - - morpher.from( this.element()[method]() ) - - }, function ( pos ) { - - this.element()[method]( morpher.at( pos ) ) + var morpher = new Morphable(this._stepper).to(to) + this.queue(function () { + morpher.from(this.element()[method]()) + }, function (pos) { + this.element()[method](morpher.at(pos)) return morpher.done() - - } ) + }) // Register the morpher so that if it is changed again, we can retarget it - this._rememberMorpher( method, morpher ) + this._rememberMorpher(method, morpher) return this - }, - _queueNumber ( method, value ) { - - return this._queueObject( method, new SVGNumber( value ) ) - + _queueNumber (method, value) { + return this._queueObject(method, new SVGNumber(value)) }, // Animatable center x-axis - cx ( x ) { - - return this._queueNumber( 'cx', x ) - + cx (x) { + return this._queueNumber('cx', x) }, // Animatable center y-axis - cy ( y ) { - - return this._queueNumber( 'cy', y ) - + cy (y) { + return this._queueNumber('cy', y) }, // Add animatable move - move ( x, y ) { - - return this.x( x ).y( y ) - + move (x, y) { + return this.x(x).y(y) }, // Add animatable center - center ( x, y ) { - - return this.cx( x ).cy( y ) - + center (x, y) { + return this.cx(x).cy(y) }, // Add animatable size - size ( width, height ) { - + size (width, height) { // animate bbox based size for all other elements var box - if ( !width || !height ) { - + if (!width || !height) { box = this._element.bbox() - } - if ( !width ) { - + if (!width) { width = box.width / box.height * height - } - if ( !height ) { - + if (!height) { height = box.height / box.width * width - } return this - .width( width ) - .height( height ) - + .width(width) + .height(height) }, // Add animatable width - width ( width ) { - - return this._queueNumber( 'width', width ) - + width (width) { + return this._queueNumber('width', width) }, // Add animatable height - height ( height ) { - - return this._queueNumber( 'height', height ) - + height (height) { + return this._queueNumber('height', height) }, // Add animatable plot - plot ( a, b, c, d ) { - + plot (a, b, c, d) { // Lines can be plotted with 4 arguments - if ( arguments.length === 4 ) { - - return this.plot( [ a, b, c, d ] ) - + if (arguments.length === 4) { + return this.plot([ a, b, c, d ]) } - var morpher = this._element.MorphArray().to( a ) - - this.queue( function () { - - morpher.from( this._element.array() ) + var morpher = this._element.MorphArray().to(a) - }, function ( pos ) { - - this._element.plot( morpher.at( pos ) ) - - } ) + this.queue(function () { + morpher.from(this._element.array()) + }, function (pos) { + this._element.plot(morpher.at(pos)) + }) return this - }, // Add leading method - leading ( value ) { - - return this._queueNumber( 'leading', value ) - + leading (value) { + return this._queueNumber('leading', value) }, // Add animatable viewbox - viewbox ( x, y, width, height ) { - - return this._queueObject( 'viewbox', new Box( x, y, width, height ) ) - + viewbox (x, y, width, height) { + return this._queueObject('viewbox', new Box(x, y, width, height)) }, - update ( o ) { - - if ( typeof o !== 'object' ) { - - return this.update( { + update (o) { + if (typeof o !== 'object') { + return this.update({ offset: arguments[0], color: arguments[1], opacity: arguments[2] - } ) - + }) } - if ( o.opacity != null ) this.attr( 'stop-opacity', o.opacity ) - if ( o.color != null ) this.attr( 'stop-color', o.color ) - if ( o.offset != null ) this.attr( 'offset', o.offset ) + if (o.opacity != null) this.attr('stop-opacity', o.opacity) + if (o.color != null) this.attr('stop-color', o.color) + if (o.offset != null) this.attr('offset', o.offset) return this - } -} ) +}) -extend( Runner, { rx, ry, from, to } ) +extend(Runner, { rx, ry, from, to }) diff --git a/src/animation/Timeline.js b/src/animation/Timeline.js index 2fa281c..6abcb80 100644 --- a/src/animation/Timeline.js +++ b/src/animation/Timeline.js @@ -3,27 +3,21 @@ import { registerMethods } from '../utils/methods.js' import Animator from './Animator.js' import EventTarget from '../types/EventTarget.js' -var makeSchedule = function ( runnerInfo ) { - +var makeSchedule = function (runnerInfo) { var start = runnerInfo.start var duration = runnerInfo.runner.duration() var end = start + duration return { start: start, duration: duration, end: end, runner: runnerInfo.runner } - } export default class Timeline extends EventTarget { - // Construct a new timeline on the given element constructor () { - super() this._timeSource = function () { - let w = globals.window - return ( w.performance || w.Date ).now() - + return (w.performance || w.Date).now() } // Store the timing variables @@ -42,7 +36,6 @@ export default class Timeline extends EventTarget { this._time = 0 this._lastSourceTime = 0 this._lastStepTime = 0 - } /** @@ -50,28 +43,19 @@ export default class Timeline extends EventTarget { */ // schedules a runner on the timeline - schedule ( runner, delay, when ) { - + schedule (runner, delay, when) { // FIXME: how to sort? maybe by runner id? - if ( runner == null ) { - - return this._runners.map( makeSchedule ).sort( function ( a, b ) { - - return ( a.start - b.start ) || ( a.duration - b.duration ) - - } ) - + if (runner == null) { + return this._runners.map(makeSchedule).sort(function (a, b) { + return (a.start - b.start) || (a.duration - b.duration) + }) } - if ( !this.active() ) { - + if (!this.active()) { this._step() - if ( when == null ) { - + if (when == null) { when = 'now' - } - } // The start time for the next animation can either be given explicitly, @@ -81,40 +65,28 @@ export default class Timeline extends EventTarget { delay = delay || 0 // Work out when to start the animation - if ( when == null || when === 'last' || when === 'after' ) { - + if (when == null || when === 'last' || when === 'after') { // Take the last time and increment absoluteStartTime = this._startTime - - } else if ( when === 'absolute' || when === 'start' ) { - + } else if (when === 'absolute' || when === 'start') { absoluteStartTime = delay delay = 0 - - } else if ( when === 'now' ) { - + } else if (when === 'now') { absoluteStartTime = this._time - - } else if ( when === 'relative' ) { - + } else if (when === 'relative') { let runnerInfo = this._runners[runner.id] - if ( runnerInfo ) { - + if (runnerInfo) { absoluteStartTime = runnerInfo.start + delay delay = 0 - } - } else { - - throw new Error( 'Invalid value for the "when" parameter' ) - + throw new Error('Invalid value for the "when" parameter') } // Manage runner runner.unschedule() - runner.timeline( this ) - runner.time( -delay ) + runner.timeline(this) + runner.time(-delay) // Save startTime for next runner this._startTime = absoluteStartTime + runner.duration() + delay @@ -127,115 +99,91 @@ export default class Timeline extends EventTarget { } // Save order and continue - this._order.push( runner.id ) + this._order.push(runner.id) this._continue() return this - } // Remove the runner from this timeline - unschedule ( runner ) { - - var index = this._order.indexOf( runner.id ) - if ( index < 0 ) return this + unschedule (runner) { + var index = this._order.indexOf(runner.id) + if (index < 0) return this delete this._runners[runner.id] - this._order.splice( index, 1 ) - runner.timeline( null ) + this._order.splice(index, 1) + runner.timeline(null) return this - } play () { - // Now make sure we are not paused and continue the animation this._paused = false return this._continue() - } pause () { - // Cancel the next animation frame and pause this._nextFrame = null this._paused = true return this - } stop () { - // Cancel the next animation frame and go to start - this.seek( -this._time ) + this.seek(-this._time) return this.pause() - } finish () { - - this.seek( Infinity ) + this.seek(Infinity) return this.pause() - } - speed ( speed ) { - - if ( speed == null ) return this._speed + speed (speed) { + if (speed == null) return this._speed this._speed = speed return this - } - reverse ( yes ) { - + reverse (yes) { var currentSpeed = this.speed() - if ( yes == null ) return this.speed( -currentSpeed ) - - var positive = Math.abs( currentSpeed ) - return this.speed( yes ? positive : -positive ) + if (yes == null) return this.speed(-currentSpeed) + var positive = Math.abs(currentSpeed) + return this.speed(yes ? positive : -positive) } - seek ( dt ) { - + seek (dt) { this._time += dt return this._continue() - } - time ( time ) { - - if ( time == null ) return this._time + time (time) { + if (time == null) return this._time this._time = time return this - } - persist ( dtOrForever ) { - - if ( dtOrForever == null ) return this._persist + persist (dtOrForever) { + if (dtOrForever == null) return this._persist this._persist = dtOrForever return this - } - source ( fn ) { - - if ( fn == null ) return this._timeSource + source (fn) { + if (fn == null) return this._timeSource this._timeSource = fn return this - } _step () { - // If the timeline is paused, just do nothing - if ( this._paused ) return + if (this._paused) return // Get the time delta from the last time and update the time var time = this._timeSource() var dtSource = time - this._lastSourceTime - var dtTime = this._speed * dtSource + ( this._time - this._lastStepTime ) + var dtTime = this._speed * dtSource + (this._time - this._lastStepTime) this._lastSourceTime = time // Update the time @@ -245,8 +193,7 @@ export default class Timeline extends EventTarget { // Run all of the runners directly var runnersLeft = false - for ( var i = 0, len = this._order.length; i < len; i++ ) { - + for (var i = 0, len = this._order.length; i < len; i++) { // Get and run the current runner and ignore it if its inactive var runnerInfo = this._runners[this._order[i]] var runner = runnerInfo.runner @@ -257,89 +204,64 @@ export default class Timeline extends EventTarget { let dtToStart = this._time - runnerInfo.start // Dont run runner if not started yet - if ( dtToStart < 0 ) { - + if (dtToStart < 0) { runnersLeft = true continue - - } else if ( dtToStart < dt ) { - + } else if (dtToStart < dt) { // Adjust dt to make sure that animation is on point dt = dtToStart - } - if ( !runner.active() ) continue + if (!runner.active()) continue // If this runner is still going, signal that we need another animation // frame, otherwise, remove the completed runner - var finished = runner.step( dt ).done - if ( !finished ) { - + var finished = runner.step(dt).done + if (!finished) { runnersLeft = true // continue - - } else if ( runnerInfo.persist !== true ) { - + } else if (runnerInfo.persist !== true) { // runner is finished. And runner might get removed var endTime = runner.duration() - runner.time() + this._time - if ( endTime + this._persist < this._time ) { - + if (endTime + this._persist < this._time) { // Delete runner and correct index delete this._runners[this._order[i]] - this._order.splice( i--, 1 ) && --len - runner.timeline( null ) - + this._order.splice(i--, 1) && --len + runner.timeline(null) } - } - } // Get the next animation frame to keep the simulation going - if ( runnersLeft ) { - - this._nextFrame = Animator.frame( this._step.bind( this ) ) - + if (runnersLeft) { + this._nextFrame = Animator.frame(this._step.bind(this)) } else { - this._nextFrame = null - } return this - } // Checks if we are running and continues the animation _continue () { - - if ( this._paused ) return this - if ( !this._nextFrame ) { - - this._nextFrame = Animator.frame( this._step.bind( this ) ) - + if (this._paused) return this + if (!this._nextFrame) { + this._nextFrame = Animator.frame(this._step.bind(this)) } return this - } active () { - return !!this._nextFrame - } - } -registerMethods( { +registerMethods({ Element: { timeline: function () { - - this._timeline = ( this._timeline || new Timeline() ) + this._timeline = (this._timeline || new Timeline()) return this._timeline - } } -} ) +}) diff --git a/src/elements/A.js b/src/elements/A.js index ee81975..ef047a2 100644 --- a/src/elements/A.js +++ b/src/elements/A.js @@ -4,58 +4,42 @@ import { xlink } from '../modules/core/namespaces.js' import Container from './Container.js' export default class A extends Container { - - constructor ( node ) { - - super( nodeOrNew( 'a', node ), node ) - + constructor (node) { + super(nodeOrNew('a', node), node) } // Link url - to ( url ) { - - return this.attr( 'href', url, xlink ) - + to (url) { + return this.attr('href', url, xlink) } // Link target attribute - target ( target ) { - - return this.attr( 'target', target ) - + target (target) { + return this.attr('target', target) } - } -registerMethods( { +registerMethods({ Container: { // Create a hyperlink element - link: wrapWithAttrCheck( function ( url ) { - - return this.put( new A() ).to( url ) - - } ) + link: wrapWithAttrCheck(function (url) { + return this.put(new A()).to(url) + }) }, Element: { // Create a hyperlink element - linkTo: function ( url ) { - + linkTo: function (url) { var link = new A() - if ( typeof url === 'function' ) { - - url.call( link, link ) - + if (typeof url === 'function') { + url.call(link, link) } else { - - link.to( url ) - + link.to(url) } - return this.parent().put( link ).put( this ) - + return this.parent().put(link).put(this) } } -} ) +}) -register( A ) +register(A) diff --git a/src/elements/Bare.js b/src/elements/Bare.js index 190aa1f..a057634 100644 --- a/src/elements/Bare.js +++ b/src/elements/Bare.js @@ -4,38 +4,28 @@ import Container from './Container.js' import { globals } from '../utils/window.js' export default class Bare extends Container { - - constructor ( node, attrs ) { - - super( nodeOrNew( node, typeof node === 'string' ? null : node ), attrs ) - + constructor (node, attrs) { + super(nodeOrNew(node, typeof node === 'string' ? null : node), attrs) } - words ( text ) { - + words (text) { // remove contents - while ( this.node.hasChildNodes() ) { - - this.node.removeChild( this.node.lastChild ) - + while (this.node.hasChildNodes()) { + this.node.removeChild(this.node.lastChild) } // create text node - this.node.appendChild( globals.document.createTextNode( text ) ) + this.node.appendChild(globals.document.createTextNode(text)) return this - } - } -register( Bare ) +register(Bare) -registerMethods( 'Container', { +registerMethods('Container', { // Create an element that is not described by SVG.js - element: wrapWithAttrCheck( function ( node ) { - - return this.put( new Bare( node ) ) - - } ) -} ) + element: wrapWithAttrCheck(function (node) { + return this.put(new Bare(node)) + }) +}) diff --git a/src/elements/Circle.js b/src/elements/Circle.js index 5aa969a..3135ada 100644 --- a/src/elements/Circle.js +++ b/src/elements/Circle.js @@ -10,54 +10,40 @@ import SVGNumber from '../types/SVGNumber.js' import Shape from './Shape.js' export default class Circle extends Shape { - - constructor ( node ) { - - super( nodeOrNew( 'circle', node ), node ) - + constructor (node) { + super(nodeOrNew('circle', node), node) } - radius ( r ) { - - return this.attr( 'r', r ) - + radius (r) { + return this.attr('r', r) } // Radius x value - rx ( rx ) { - - return this.attr( 'r', rx ) - + rx (rx) { + return this.attr('r', rx) } // Alias radius x value - ry ( ry ) { - - return this.rx( ry ) - + ry (ry) { + return this.rx(ry) } - size ( size ) { - - return this.radius( new SVGNumber( size ).divide( 2 ) ) - + size (size) { + return this.radius(new SVGNumber(size).divide(2)) } - } -extend( Circle, { x, y, cx, cy, width, height } ) +extend(Circle, { x, y, cx, cy, width, height }) -registerMethods( { +registerMethods({ Element: { // Create circle element - circle: wrapWithAttrCheck( function ( size ) { - - return this.put( new Circle() ) - .size( size ) - .move( 0, 0 ) - - } ) + circle: wrapWithAttrCheck(function (size) { + return this.put(new Circle()) + .size(size) + .move(0, 0) + }) } -} ) +}) -register( Circle ) +register(Circle) diff --git a/src/elements/ClipPath.js b/src/elements/ClipPath.js index 199ee5b..e545baa 100644 --- a/src/elements/ClipPath.js +++ b/src/elements/ClipPath.js @@ -4,72 +4,54 @@ import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class ClipPath extends Container { - - constructor ( node ) { - - super( nodeOrNew( 'clipPath', node ), node ) - + constructor (node) { + super(nodeOrNew('clipPath', node), node) } // Unclip all clipped elements and remove itself remove () { - // unclip all targets - this.targets().forEach( function ( el ) { - + this.targets().forEach(function (el) { el.unclip() - - } ) + }) // remove clipPath from parent return super.remove() - } targets () { - - return baseFind( 'svg [clip-path*="' + this.id() + '"]' ) - + return baseFind('svg [clip-path*="' + this.id() + '"]') } - } -registerMethods( { +registerMethods({ Container: { // Create clipping element - clip: wrapWithAttrCheck( function () { - - return this.defs().put( new ClipPath() ) - - } ) + clip: wrapWithAttrCheck(function () { + return this.defs().put(new ClipPath()) + }) }, Element: { // Distribute clipPath to svg element - clipWith ( element ) { - + clipWith (element) { // use given clip or create a new one let clipper = element instanceof ClipPath ? element - : this.parent().clip().add( element ) + : this.parent().clip().add(element) // apply mask - return this.attr( 'clip-path', 'url("#' + clipper.id() + '")' ) - + return this.attr('clip-path', 'url("#' + clipper.id() + '")') }, // Unclip element unclip () { - - return this.attr( 'clip-path', null ) - + return this.attr('clip-path', null) }, clipper () { - - return this.reference( 'clip-path' ) - + return this.reference('clip-path') } } -} ) +}) -register( ClipPath ) +register(ClipPath) diff --git a/src/elements/Container.js b/src/elements/Container.js index 82ee0ae..b47972e 100644 --- a/src/elements/Container.js +++ b/src/elements/Container.js @@ -2,39 +2,29 @@ import { register } from '../utils/adopter.js' import Element from './Element.js' export default class Container extends Element { - - flatten ( parent ) { - - this.each( function () { - - if ( this instanceof Container ) return this.flatten( parent ).ungroup( parent ) - return this.toParent( parent ) - - } ) + flatten (parent) { + this.each(function () { + if (this instanceof Container) return this.flatten(parent).ungroup(parent) + return this.toParent(parent) + }) // we need this so that the root does not get removed this.node.firstElementChild || this.remove() return this - } - ungroup ( parent ) { - + ungroup (parent) { parent = parent || this.parent() - this.each( function () { - - return this.toParent( parent ) - - } ) + this.each(function () { + return this.toParent(parent) + }) this.remove() return this - } - } -register( Container ) +register(Container) diff --git a/src/elements/Defs.js b/src/elements/Defs.js index bcbea01..6b486ca 100644 --- a/src/elements/Defs.js +++ b/src/elements/Defs.js @@ -2,24 +2,16 @@ import { nodeOrNew, register } from '../utils/adopter.js' import Container from './Container.js' export default class Defs extends Container { - - constructor ( node ) { - - super( nodeOrNew( 'defs', node ), node ) - + constructor (node) { + super(nodeOrNew('defs', node), node) } flatten () { - return this - } ungroup () { - return this - } - } -register( Defs ) +register(Defs) diff --git a/src/elements/Dom.js b/src/elements/Dom.js index f3ea467..566008c 100644 --- a/src/elements/Dom.js +++ b/src/elements/Dom.js @@ -15,294 +15,217 @@ import List from '../types/List.js' import attr from '../modules/core/attr.js' export default class Dom extends EventTarget { - - constructor ( node, attrs ) { - - super( node ) + constructor (node, attrs) { + super(node) this.node = node this.type = node.nodeName - if ( attrs && node !== attrs ) { - - this.attr( attrs ) - + if (attrs && node !== attrs) { + this.attr(attrs) } - } // Add given element at a position - add ( element, i ) { - - element = makeInstance( element ) - - if ( i == null ) { - - this.node.appendChild( element.node ) - - } else if ( element.node !== this.node.childNodes[i] ) { - - this.node.insertBefore( element.node, this.node.childNodes[i] ) + add (element, i) { + element = makeInstance(element) + if (i == null) { + this.node.appendChild(element.node) + } else if (element.node !== this.node.childNodes[i]) { + this.node.insertBefore(element.node, this.node.childNodes[i]) } return this - } // Add element to given container and return self - addTo ( parent ) { - - return makeInstance( parent ).put( this ) - + addTo (parent) { + return makeInstance(parent).put(this) } // Returns all child elements children () { - - return new List( map( this.node.children, function ( node ) { - - return adopt( node ) - - } ) ) - + return new List(map(this.node.children, function (node) { + return adopt(node) + })) } // Remove all elements in this container clear () { - // remove children - while ( this.node.hasChildNodes() ) { - - this.node.removeChild( this.node.lastChild ) - + while (this.node.hasChildNodes()) { + this.node.removeChild(this.node.lastChild) } // remove defs reference delete this._defs return this - } // Clone element clone () { - // write dom data to the dom so the clone can pickup the data this.writeDataToDom() // clone element and assign new id - return assignNewId( this.node.cloneNode( true ) ) - + return assignNewId(this.node.cloneNode(true)) } // Iterates over all children and invokes a given block - each ( block, deep ) { - + each (block, deep) { var children = this.children() var i, il - for ( i = 0, il = children.length; i < il; i++ ) { - - block.apply( children[i], [ i, children ] ) - - if ( deep ) { - - children[i].each( block, deep ) + for (i = 0, il = children.length; i < il; i++) { + block.apply(children[i], [ i, children ]) + if (deep) { + children[i].each(block, deep) } - } return this - } // Get first child first () { - - return adopt( this.node.firstChild ) - + return adopt(this.node.firstChild) } // Get a element at the given index - get ( i ) { - - return adopt( this.node.childNodes[i] ) - + get (i) { + return adopt(this.node.childNodes[i]) } getEventHolder () { - return this.node - } getEventTarget () { - return this.node - } // Checks if the given element is a child - has ( element ) { - - return this.index( element ) >= 0 - + has (element) { + return this.index(element) >= 0 } // Get / set id - id ( id ) { - + id (id) { // generate new id if no id set - if ( typeof id === 'undefined' && !this.node.id ) { - - this.node.id = eid( this.type ) - + if (typeof id === 'undefined' && !this.node.id) { + this.node.id = eid(this.type) } // dont't set directly width this.node.id to make `null` work correctly - return this.attr( 'id', id ) - + return this.attr('id', id) } // Gets index of given element - index ( element ) { - - return [].slice.call( this.node.childNodes ).indexOf( element.node ) - + index (element) { + return [].slice.call(this.node.childNodes).indexOf(element.node) } // Get the last child last () { - - return adopt( this.node.lastChild ) - + return adopt(this.node.lastChild) } // matches the element vs a css selector - matches ( selector ) { - + matches (selector) { const el = this.node - return ( el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector ).call( el, selector ) - + return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector) } // Returns the parent element instance - parent ( type ) { - + parent (type) { var parent = this // check for parent - if ( !parent.node.parentNode ) return null + if (!parent.node.parentNode) return null // get parent element - parent = adopt( parent.node.parentNode ) + parent = adopt(parent.node.parentNode) - if ( !type ) return parent + if (!type) return parent // loop trough ancestors if type is given - while ( parent && parent.node instanceof globals.window.SVGElement ) { // FIXME: That shouldnt be neccessary - - if ( typeof type === 'string' ? parent.matches( type ) : parent instanceof type ) return parent - parent = adopt( parent.node.parentNode ) - + while (parent && parent.node instanceof globals.window.SVGElement) { // FIXME: That shouldnt be neccessary + if (typeof type === 'string' ? parent.matches(type) : parent instanceof type) return parent + parent = adopt(parent.node.parentNode) } - } // Basically does the same as `add()` but returns the added element instead - put ( element, i ) { - - this.add( element, i ) + put (element, i) { + this.add(element, i) return element - } // Add element to given container and return container - putIn ( parent ) { - - return makeInstance( parent ).add( this ) - + putIn (parent) { + return makeInstance(parent).add(this) } // Remove element remove () { - - if ( this.parent() ) { - - this.parent().removeElement( this ) - + if (this.parent()) { + this.parent().removeElement(this) } return this - } // Remove a given child - removeElement ( element ) { - - this.node.removeChild( element.node ) + removeElement (element) { + this.node.removeChild(element.node) return this - } // Replace this with element - replace ( element ) { - - element = makeInstance( element ) - this.node.parentNode.replaceChild( element.node, this.node ) + replace (element) { + element = makeInstance(element) + this.node.parentNode.replaceChild(element.node, this.node) return element - } - round ( precision = 2, map ) { - + round (precision = 2, map) { const factor = 10 ** precision const attrs = this.attr() // If we have no map, build one from attrs - if ( !map ) { - - map = Object.keys( attrs ) - + if (!map) { + map = Object.keys(attrs) } // Holds rounded attributes const newAttrs = {} - map.forEach( ( key ) => { - - newAttrs[key] = Math.round( attrs[key] * factor ) / factor + map.forEach((key) => { + newAttrs[key] = Math.round(attrs[key] * factor) / factor + }) - } ) - - this.attr( newAttrs ) + this.attr(newAttrs) return this - } // Return id on string conversion toString () { - return this.id() - } // Import raw svg - svg ( svgOrFn, outerHTML ) { - + svg (svgOrFn, outerHTML) { var well, len, fragment - if ( svgOrFn === false ) { - + if (svgOrFn === false) { outerHTML = false svgOrFn = null - } // act as getter if no svg string is given - if ( svgOrFn == null || typeof svgOrFn === 'function' ) { - + if (svgOrFn == null || typeof svgOrFn === 'function') { // The default for exports is, that the outerNode is included outerHTML = outerHTML == null ? true : outerHTML @@ -311,49 +234,38 @@ export default class Dom extends EventTarget { let current = this // An export modifier was passed - if ( svgOrFn != null ) { - - current = adopt( current.node.cloneNode( true ) ) + if (svgOrFn != null) { + current = adopt(current.node.cloneNode(true)) // If the user wants outerHTML we need to process this node, too - if ( outerHTML ) { - - let result = svgOrFn( current ) + if (outerHTML) { + let result = svgOrFn(current) current = result || current // The user does not want this node? Well, then he gets nothing - if ( result === false ) return '' - + if (result === false) return '' } // Deep loop through all children and apply modifier - current.each( function () { - - let result = svgOrFn( this ) + current.each(function () { + let result = svgOrFn(this) let _this = result || this // If modifier returns false, discard node - if ( result === false ) { - + if (result === false) { this.remove() // If modifier returns new node, use it - - } else if ( result && this !== _this ) { - - this.replace( _this ) - + } else if (result && this !== _this) { + this.replace(_this) } - - }, true ) - + }, true) } // Return outer or inner content return outerHTML ? current.node.outerHTML : current.node.innerHTML - } // Act as setter if we got a string @@ -362,41 +274,33 @@ export default class Dom extends EventTarget { outerHTML = outerHTML == null ? false : outerHTML // Create temporary holder - well = globals.document.createElementNS( ns, 'svg' ) + well = globals.document.createElementNS(ns, 'svg') fragment = globals.document.createDocumentFragment() // Dump raw svg well.innerHTML = svgOrFn // Transplant nodes into the fragment - for ( len = well.children.length; len--; ) { - - fragment.appendChild( well.firstElementChild ) - + for (len = well.children.length; len--;) { + fragment.appendChild(well.firstElementChild) } // Add the whole fragment at once return outerHTML - ? this.replace( fragment ) - : this.add( fragment ) - + ? this.replace(fragment) + : this.add(fragment) } // write svgjs data to the dom writeDataToDom () { - // dump variables recursively - this.each( function () { - + this.each(function () { this.writeDataToDom() - - } ) + }) return this - } - } -extend( Dom, { attr, find } ) -register( Dom ) +extend(Dom, { attr, find }) +register(Dom) diff --git a/src/elements/Element.js b/src/elements/Element.js index 169c872..594daa1 100644 --- a/src/elements/Element.js +++ b/src/elements/Element.js @@ -15,13 +15,11 @@ import Dom from './Dom.js' import List from '../types/List.js' import SVGNumber from '../types/SVGNumber.js' -const Svg = getClass( root ) +const Svg = getClass(root) export default class Element extends Dom { - - constructor ( node, attrs ) { - - super( node, attrs ) + constructor (node, attrs) { + super(node, attrs) // initialize data object this.dom = {} @@ -29,177 +27,135 @@ export default class Element extends Dom { // create circular reference this.node.instance = this - if ( node.hasAttribute( 'svgjs:data' ) ) { - + if (node.hasAttribute('svgjs:data')) { // pull svgjs data from the dom (getAttributeNS doesn't work in html5) - this.setData( JSON.parse( node.getAttribute( 'svgjs:data' ) ) || {} ) - + this.setData(JSON.parse(node.getAttribute('svgjs:data')) || {}) } - } // Move element by its center - center ( x, y ) { - - return this.cx( x ).cy( y ) - + center (x, y) { + return this.cx(x).cy(y) } // Move by center over x-axis - cx ( x ) { - - return x == null ? this.x() + this.width() / 2 : this.x( x - this.width() / 2 ) - + cx (x) { + return x == null ? this.x() + this.width() / 2 : this.x(x - this.width() / 2) } // Move by center over y-axis - cy ( y ) { - + cy (y) { return y == null ? this.y() + this.height() / 2 - : this.y( y - this.height() / 2 ) - + : this.y(y - this.height() / 2) } // Get defs defs () { - return this.root().defs() - } // Get parent document root () { - - let p = this.parent( Svg ) + let p = this.parent(Svg) return p && p.root() - } getEventHolder () { - return this - } // Set height of element - height ( height ) { - - return this.attr( 'height', height ) - + height (height) { + return this.attr('height', height) } // Checks whether the given point inside the bounding box of the element - inside ( x, y ) { - + inside (x, y) { let box = this.bbox() return x > box.x && y > box.y && x < box.x + box.width && y < box.y + box.height - } // Move element to given x and y values - move ( x, y ) { - - return this.x( x ).y( y ) - + move (x, y) { + return this.x(x).y(y) } // return array of all ancestors of given type up to the root svg - parents ( until = globals.document ) { - - until = makeInstance( until ) + parents (until = globals.document) { + until = makeInstance(until) let parents = new List() let parent = this while ( - ( parent = parent.parent() ) + (parent = parent.parent()) && parent.node !== until.node && parent.node !== globals.document ) { - - parents.push( parent ) - + parents.push(parent) } return parents - } // Get referenced element form attribute value - reference ( attr ) { - - attr = this.attr( attr ) - if ( !attr ) return null - - const m = attr.match( reference ) - return m ? makeInstance( m[1] ) : null + reference (attr) { + attr = this.attr(attr) + if (!attr) return null + const m = attr.match(reference) + return m ? makeInstance(m[1]) : null } // set given data to the elements data property - setData ( o ) { - + setData (o) { this.dom = o return this - } // Set element size to given width and height - size ( width, height ) { - - let p = proportionalSize( this, width, height ) + size (width, height) { + let p = proportionalSize(this, width, height) return this - .width( new SVGNumber( p.width ) ) - .height( new SVGNumber( p.height ) ) - + .width(new SVGNumber(p.width)) + .height(new SVGNumber(p.height)) } // Set width of element - width ( width ) { - - return this.attr( 'width', width ) - + width (width) { + return this.attr('width', width) } // write svgjs data to the dom writeDataToDom () { - // remove previously set data - this.node.removeAttribute( 'svgjs:data' ) - - if ( Object.keys( this.dom ).length ) { - - this.node.setAttribute( 'svgjs:data', JSON.stringify( this.dom ) ) // see #428 + this.node.removeAttribute('svgjs:data') + if (Object.keys(this.dom).length) { + this.node.setAttribute('svgjs:data', JSON.stringify(this.dom)) // see #428 } return super.writeDataToDom() - } // Move over x-axis - x ( x ) { - - return this.attr( 'x', x ) - + x (x) { + return this.attr('x', x) } // Move over y-axis - y ( y ) { - - return this.attr( 'y', y ) - + y (y) { + return this.attr('y', y) } - } -extend( Element, { +extend(Element, { bbox, rbox, point, ctm, screenCTM -} ) +}) -register( Element ) +register(Element) diff --git a/src/elements/Ellipse.js b/src/elements/Ellipse.js index e1e1fe0..0350f1f 100644 --- a/src/elements/Ellipse.js +++ b/src/elements/Ellipse.js @@ -11,34 +11,26 @@ import Shape from './Shape.js' import * as circled from '../modules/core/circled.js' export default class Ellipse extends Shape { - - constructor ( node ) { - - super( nodeOrNew( 'ellipse', node ), node ) - + constructor (node) { + super(nodeOrNew('ellipse', node), node) } - size ( width, height ) { - - var p = proportionalSize( this, width, height ) + size (width, height) { + var p = proportionalSize(this, width, height) return this - .rx( new SVGNumber( p.width ).divide( 2 ) ) - .ry( new SVGNumber( p.height ).divide( 2 ) ) - + .rx(new SVGNumber(p.width).divide(2)) + .ry(new SVGNumber(p.height).divide(2)) } - } -extend( Ellipse, circled ) +extend(Ellipse, circled) -registerMethods( 'Container', { +registerMethods('Container', { // Create an ellipse - ellipse: wrapWithAttrCheck( function ( width, height ) { - - return this.put( new Ellipse() ).size( width, height ).move( 0, 0 ) - - } ) -} ) + ellipse: wrapWithAttrCheck(function (width, height) { + return this.put(new Ellipse()).size(width, height).move(0, 0) + }) +}) -register( Ellipse ) +register(Ellipse) diff --git a/src/elements/G.js b/src/elements/G.js index a72f1fb..6a93a3f 100644 --- a/src/elements/G.js +++ b/src/elements/G.js @@ -3,24 +3,18 @@ import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class G extends Container { - - constructor ( node ) { - - super( nodeOrNew( 'g', node ), node ) - + constructor (node) { + super(nodeOrNew('g', node), node) } - } -registerMethods( { +registerMethods({ Element: { // Create a group element - group: wrapWithAttrCheck( function () { - - return this.put( new G() ) - - } ) + group: wrapWithAttrCheck(function () { + return this.put(new G()) + }) } -} ) +}) -register( G ) +register(G) diff --git a/src/elements/Gradient.js b/src/elements/Gradient.js index 7116fc8..23de97d 100644 --- a/src/elements/Gradient.js +++ b/src/elements/Gradient.js @@ -12,95 +12,71 @@ import baseFind from '../modules/core/selector.js' import * as gradiented from '../modules/core/gradiented.js' export default class Gradient extends Container { - - constructor ( type, attrs ) { - + constructor (type, attrs) { super( - nodeOrNew( type + 'Gradient', typeof type === 'string' ? null : type ), + nodeOrNew(type + 'Gradient', typeof type === 'string' ? null : type), attrs ) - } // Add a color stop - stop ( offset, color, opacity ) { - - return this.put( new Stop() ).update( offset, color, opacity ) - + stop (offset, color, opacity) { + return this.put(new Stop()).update(offset, color, opacity) } // Update gradient - update ( block ) { - + update (block) { // remove all stops this.clear() // invoke passed block - if ( typeof block === 'function' ) { - - block.call( this, this ) - + if (typeof block === 'function') { + block.call(this, this) } return this - } // Return the fill id url () { - return 'url(#' + this.id() + ')' - } // Alias string convertion to fill toString () { - return this.url() - } // custom attr to handle transform - attr ( a, b, c ) { - - if ( a === 'transform' ) a = 'gradientTransform' - return super.attr( a, b, c ) - + attr (a, b, c) { + if (a === 'transform') a = 'gradientTransform' + return super.attr(a, b, c) } targets () { - - return baseFind( 'svg [fill*="' + this.id() + '"]' ) - + return baseFind('svg [fill*="' + this.id() + '"]') } bbox () { - return new Box() - } - } -extend( Gradient, gradiented ) +extend(Gradient, gradiented) -registerMethods( { +registerMethods({ Container: { // Create gradient element in defs - gradient: wrapWithAttrCheck( function ( type, block ) { - - return this.defs().gradient( type, block ) - - } ) + gradient: wrapWithAttrCheck(function (type, block) { + return this.defs().gradient(type, block) + }) }, // define gradient Defs: { - gradient: wrapWithAttrCheck( function ( type, block ) { - - return this.put( new Gradient( type ) ).update( block ) - - } ) + gradient: wrapWithAttrCheck(function (type, block) { + return this.put(new Gradient(type)).update(block) + }) } -} ) +}) -register( Gradient ) +register(Gradient) diff --git a/src/elements/HtmlNode.js b/src/elements/HtmlNode.js index d2299ed..009b122 100644 --- a/src/elements/HtmlNode.js +++ b/src/elements/HtmlNode.js @@ -3,4 +3,4 @@ import Dom from './Dom.js' export default class HtmlNode extends Dom {} -register( HtmlNode ) +register(HtmlNode) diff --git a/src/elements/Image.js b/src/elements/Image.js index 4945271..8f27470 100644 --- a/src/elements/Image.js +++ b/src/elements/Image.js @@ -9,99 +9,69 @@ import Shape from './Shape.js' import { globals } from '../utils/window.js' export default class Image extends Shape { - - constructor ( node ) { - - super( nodeOrNew( 'image', node ), node ) - + constructor (node) { + super(nodeOrNew('image', node), node) } // (re)load image - load ( url, callback ) { - - if ( !url ) return this + load (url, callback) { + if (!url) return this var img = new globals.window.Image() - on( img, 'load', function ( e ) { - - var p = this.parent( Pattern ) + on(img, 'load', function (e) { + var p = this.parent(Pattern) // ensure image size - if ( this.width() === 0 && this.height() === 0 ) { - - this.size( img.width, img.height ) - + if (this.width() === 0 && this.height() === 0) { + this.size(img.width, img.height) } - if ( p instanceof Pattern ) { - + if (p instanceof Pattern) { // ensure pattern size if not set - if ( p.width() === 0 && p.height() === 0 ) { - - p.size( this.width(), this.height() ) - + if (p.width() === 0 && p.height() === 0) { + p.size(this.width(), this.height()) } - } - if ( typeof callback === 'function' ) { - - callback.call( this, e ) - + if (typeof callback === 'function') { + callback.call(this, e) } + }, this) - }, this ) - - on( img, 'load error', function () { - + on(img, 'load error', function () { // dont forget to unbind memory leaking events - off( img ) - - } ) - - return this.attr( 'href', ( img.src = url ), xlink ) + off(img) + }) + return this.attr('href', (img.src = url), xlink) } - } -registerAttrHook( function ( attr, val, _this ) { - +registerAttrHook(function (attr, val, _this) { // convert image fill and stroke to patterns - if ( attr === 'fill' || attr === 'stroke' ) { - - if ( isImage.test( val ) ) { - - val = _this.root().defs().image( val ) - + if (attr === 'fill' || attr === 'stroke') { + if (isImage.test(val)) { + val = _this.root().defs().image(val) } - } - if ( val instanceof Image ) { - - val = _this.root().defs().pattern( 0, 0, ( pattern ) => { - - pattern.add( val ) - - } ) - + if (val instanceof Image) { + val = _this.root().defs().pattern(0, 0, (pattern) => { + pattern.add(val) + }) } return val +}) -} ) - -registerMethods( { +registerMethods({ Container: { // create image element, load image and set its size - image: wrapWithAttrCheck( function ( source, callback ) { - - return this.put( new Image() ).size( 0, 0 ).load( source, callback ) - - } ) + image: wrapWithAttrCheck(function (source, callback) { + return this.put(new Image()).size(0, 0).load(source, callback) + }) } -} ) +}) -register( Image ) +register(Image) diff --git a/src/elements/Line.js b/src/elements/Line.js index 123f2bb..edf10e7 100644 --- a/src/elements/Line.js +++ b/src/elements/Line.js @@ -11,78 +11,58 @@ import Shape from './Shape.js' import * as pointed from '../modules/core/pointed.js' export default class Line extends Shape { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'line', node ), node ) - + constructor (node) { + super(nodeOrNew('line', node), node) } // Get array array () { - - return new PointArray( [ - [ this.attr( 'x1' ), this.attr( 'y1' ) ], - [ this.attr( 'x2' ), this.attr( 'y2' ) ] - ] ) - + return new PointArray([ + [ this.attr('x1'), this.attr('y1') ], + [ this.attr('x2'), this.attr('y2') ] + ]) } // Overwrite native plot() method - plot ( x1, y1, x2, y2 ) { - - if ( x1 == null ) { - + plot (x1, y1, x2, y2) { + if (x1 == null) { return this.array() - - } else if ( typeof y1 !== 'undefined' ) { - + } else if (typeof y1 !== 'undefined') { x1 = { x1: x1, y1: y1, x2: x2, y2: y2 } - } else { - - x1 = new PointArray( x1 ).toLine() - + x1 = new PointArray(x1).toLine() } - return this.attr( x1 ) - + return this.attr(x1) } // Move by left top corner - move ( x, y ) { - - return this.attr( this.array().move( x, y ).toLine() ) - + move (x, y) { + return this.attr(this.array().move(x, y).toLine()) } // Set element size to given width and height - size ( width, height ) { - - var p = proportionalSize( this, width, height ) - return this.attr( this.array().size( p.width, p.height ).toLine() ) - + size (width, height) { + var p = proportionalSize(this, width, height) + return this.attr(this.array().size(p.width, p.height).toLine()) } - } -extend( Line, pointed ) +extend(Line, pointed) -registerMethods( { +registerMethods({ Container: { // Create a line element - line: wrapWithAttrCheck( function ( ...args ) { - + line: wrapWithAttrCheck(function (...args) { // make sure plot is called as a setter // x1 is not necessarily a number, it can also be an array, a string and a PointArray return Line.prototype.plot.apply( - this.put( new Line() ) + this.put(new Line()) , args[0] != null ? args : [ 0, 0, 0, 0 ] ) - - } ) + }) } -} ) +}) -register( Line ) +register(Line) diff --git a/src/elements/Marker.js b/src/elements/Marker.js index 1054987..238f559 100644 --- a/src/elements/Marker.js +++ b/src/elements/Marker.js @@ -3,103 +3,81 @@ import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class Marker extends Container { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'marker', node ), node ) - + constructor (node) { + super(nodeOrNew('marker', node), node) } // Set width of element - width ( width ) { - - return this.attr( 'markerWidth', width ) - + width (width) { + return this.attr('markerWidth', width) } // Set height of element - height ( height ) { - - return this.attr( 'markerHeight', height ) - + height (height) { + return this.attr('markerHeight', height) } // Set marker refX and refY - ref ( x, y ) { - - return this.attr( 'refX', x ).attr( 'refY', y ) - + ref (x, y) { + return this.attr('refX', x).attr('refY', y) } // Update marker - update ( block ) { - + update (block) { // remove all content this.clear() // invoke passed block - if ( typeof block === 'function' ) { - - block.call( this, this ) - + if (typeof block === 'function') { + block.call(this, this) } return this - } // Return the fill id toString () { - return 'url(#' + this.id() + ')' - } - } -registerMethods( { +registerMethods({ Container: { - marker ( ...args ) { - + marker (...args) { // Create marker element in defs - return this.defs().marker( ...args ) - + return this.defs().marker(...args) } }, Defs: { // Create marker - marker: wrapWithAttrCheck( function ( width, height, block ) { - + marker: wrapWithAttrCheck(function (width, height, block) { // Set default viewbox to match the width and height, set ref to cx and cy and set orient to auto - return this.put( new Marker() ) - .size( width, height ) - .ref( width / 2, height / 2 ) - .viewbox( 0, 0, width, height ) - .attr( 'orient', 'auto' ) - .update( block ) - - } ) + return this.put(new Marker()) + .size(width, height) + .ref(width / 2, height / 2) + .viewbox(0, 0, width, height) + .attr('orient', 'auto') + .update(block) + }) }, marker: { // Create and attach markers - marker ( marker, width, height, block ) { - + marker (marker, width, height, block) { var attr = [ 'marker' ] // Build attribute name - if ( marker !== 'all' ) attr.push( marker ) - attr = attr.join( '-' ) + if (marker !== 'all') attr.push(marker) + attr = attr.join('-') // Set marker attribute marker = arguments[1] instanceof Marker ? arguments[1] - : this.defs().marker( width, height, block ) - - return this.attr( attr, marker ) + : this.defs().marker(width, height, block) + return this.attr(attr, marker) } } -} ) +}) -register( Marker ) +register(Marker) diff --git a/src/elements/Mask.js b/src/elements/Mask.js index 523b9de..8dfffd6 100644 --- a/src/elements/Mask.js +++ b/src/elements/Mask.js @@ -4,72 +4,54 @@ import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class Mask extends Container { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'mask', node ), node ) - + constructor (node) { + super(nodeOrNew('mask', node), node) } // Unmask all masked elements and remove itself remove () { - // unmask all targets - this.targets().forEach( function ( el ) { - + this.targets().forEach(function (el) { el.unmask() - - } ) + }) // remove mask from parent return super.remove() - } targets () { - - return baseFind( 'svg [mask*="' + this.id() + '"]' ) - + return baseFind('svg [mask*="' + this.id() + '"]') } - } -registerMethods( { +registerMethods({ Container: { - mask: wrapWithAttrCheck( function () { - - return this.defs().put( new Mask() ) - - } ) + mask: wrapWithAttrCheck(function () { + return this.defs().put(new Mask()) + }) }, Element: { // Distribute mask to svg element - maskWith ( element ) { - + maskWith (element) { // use given mask or create a new one var masker = element instanceof Mask ? element - : this.parent().mask().add( element ) + : this.parent().mask().add(element) // apply mask - return this.attr( 'mask', 'url("#' + masker.id() + '")' ) - + return this.attr('mask', 'url("#' + masker.id() + '")') }, // Unmask element unmask () { - - return this.attr( 'mask', null ) - + return this.attr('mask', null) }, masker () { - - return this.reference( 'mask' ) - + return this.reference('mask') } } -} ) +}) -register( Mask ) +register(Mask) diff --git a/src/elements/Path.js b/src/elements/Path.js index 1fe5661..dc27320 100644 --- a/src/elements/Path.js +++ b/src/elements/Path.js @@ -6,102 +6,76 @@ import Shape from './Shape.js' import baseFind from '../modules/core/selector.js' export default class Path extends Shape { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'path', node ), node ) - + constructor (node) { + super(nodeOrNew('path', node), node) } // Get array array () { - - return this._array || ( this._array = new PathArray( this.attr( 'd' ) ) ) - + return this._array || (this._array = new PathArray(this.attr('d'))) } // Plot new path - plot ( d ) { - - return ( d == null ) ? this.array() - : this.clear().attr( 'd', typeof d === 'string' ? d : ( this._array = new PathArray( d ) ) ) - + plot (d) { + return (d == null) ? this.array() + : this.clear().attr('d', typeof d === 'string' ? d : (this._array = new PathArray(d))) } // Clear array cache clear () { - delete this._array return this - } // Move by left top corner - move ( x, y ) { - - return this.attr( 'd', this.array().move( x, y ) ) - + move (x, y) { + return this.attr('d', this.array().move(x, y)) } // Move by left top corner over x-axis - x ( x ) { - - return x == null ? this.bbox().x : this.move( x, this.bbox().y ) - + x (x) { + return x == null ? this.bbox().x : this.move(x, this.bbox().y) } // Move by left top corner over y-axis - y ( y ) { - - return y == null ? this.bbox().y : this.move( this.bbox().x, y ) - + y (y) { + return y == null ? this.bbox().y : this.move(this.bbox().x, y) } // Set element size to given width and height - size ( width, height ) { - - var p = proportionalSize( this, width, height ) - return this.attr( 'd', this.array().size( p.width, p.height ) ) - + size (width, height) { + var p = proportionalSize(this, width, height) + return this.attr('d', this.array().size(p.width, p.height)) } // Set width of element - width ( width ) { - - return width == null ? this.bbox().width : this.size( width, this.bbox().height ) - + width (width) { + return width == null ? this.bbox().width : this.size(width, this.bbox().height) } // Set height of element - height ( height ) { - - return height == null ? this.bbox().height : this.size( this.bbox().width, height ) - + height (height) { + return height == null ? this.bbox().height : this.size(this.bbox().width, height) } targets () { - - return baseFind( 'svg textpath [href*="' + this.id() + '"]' ) - + return baseFind('svg textpath [href*="' + this.id() + '"]') } - } // Define morphable array Path.prototype.MorphArray = PathArray // Add parent method -registerMethods( { +registerMethods({ Container: { // Create a wrapped path element - path: wrapWithAttrCheck( function ( d ) { - + path: wrapWithAttrCheck(function (d) { // make sure plot is called as a setter - return this.put( new Path() ).plot( d || new PathArray() ) - - } ) + return this.put(new Path()).plot(d || new PathArray()) + }) } -} ) +}) -register( Path ) +register(Path) diff --git a/src/elements/Pattern.js b/src/elements/Pattern.js index 6f7897b..6dd4e01 100644 --- a/src/elements/Pattern.js +++ b/src/elements/Pattern.js @@ -5,89 +5,67 @@ import Container from './Container.js' import baseFind from '../modules/core/selector.js' export default class Pattern extends Container { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'pattern', node ), node ) - + constructor (node) { + super(nodeOrNew('pattern', node), node) } // Return the fill id url () { - return 'url(#' + this.id() + ')' - } // Update pattern by rebuilding - update ( block ) { - + update (block) { // remove content this.clear() // invoke passed block - if ( typeof block === 'function' ) { - - block.call( this, this ) - + if (typeof block === 'function') { + block.call(this, this) } return this - } // Alias string convertion to fill toString () { - return this.url() - } // custom attr to handle transform - attr ( a, b, c ) { - - if ( a === 'transform' ) a = 'patternTransform' - return super.attr( a, b, c ) - + attr (a, b, c) { + if (a === 'transform') a = 'patternTransform' + return super.attr(a, b, c) } targets () { - - return baseFind( 'svg [fill*="' + this.id() + '"]' ) - + return baseFind('svg [fill*="' + this.id() + '"]') } bbox () { - return new Box() - } - } -registerMethods( { +registerMethods({ Container: { // Create pattern element in defs - pattern ( ...args ) { - - return this.defs().pattern( ...args ) - + pattern (...args) { + return this.defs().pattern(...args) } }, Defs: { - pattern: wrapWithAttrCheck( function ( width, height, block ) { - - return this.put( new Pattern() ).update( block ).attr( { + pattern: wrapWithAttrCheck(function (width, height, block) { + return this.put(new Pattern()).update(block).attr({ x: 0, y: 0, width: width, height: height, patternUnits: 'userSpaceOnUse' - } ) - - } ) + }) + }) } -} ) +}) -register( Pattern ) +register(Pattern) diff --git a/src/elements/Polygon.js b/src/elements/Polygon.js index 2288b75..afa5f31 100644 --- a/src/elements/Polygon.js +++ b/src/elements/Polygon.js @@ -11,28 +11,22 @@ import * as pointed from '../modules/core/pointed.js' import * as poly from '../modules/core/poly.js' export default class Polygon extends Shape { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'polygon', node ), node ) - + constructor (node) { + super(nodeOrNew('polygon', node), node) } - } -registerMethods( { +registerMethods({ Container: { // Create a wrapped polygon element - polygon: wrapWithAttrCheck( function ( p ) { - + polygon: wrapWithAttrCheck(function (p) { // make sure plot is called as a setter - return this.put( new Polygon() ).plot( p || new PointArray() ) - - } ) + return this.put(new Polygon()).plot(p || new PointArray()) + }) } -} ) +}) -extend( Polygon, pointed ) -extend( Polygon, poly ) -register( Polygon ) +extend(Polygon, pointed) +extend(Polygon, poly) +register(Polygon) diff --git a/src/elements/Polyline.js b/src/elements/Polyline.js index 3749c93..5897295 100644 --- a/src/elements/Polyline.js +++ b/src/elements/Polyline.js @@ -11,28 +11,22 @@ import * as pointed from '../modules/core/pointed.js' import * as poly from '../modules/core/poly.js' export default class Polyline extends Shape { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'polyline', node ), node ) - + constructor (node) { + super(nodeOrNew('polyline', node), node) } - } -registerMethods( { +registerMethods({ Container: { // Create a wrapped polygon element - polyline: wrapWithAttrCheck( function ( p ) { - + polyline: wrapWithAttrCheck(function (p) { // make sure plot is called as a setter - return this.put( new Polyline() ).plot( p || new PointArray() ) - - } ) + return this.put(new Polyline()).plot(p || new PointArray()) + }) } -} ) +}) -extend( Polyline, pointed ) -extend( Polyline, poly ) -register( Polyline ) +extend(Polyline, pointed) +extend(Polyline, poly) +register(Polyline) diff --git a/src/elements/Rect.js b/src/elements/Rect.js index 465b52b..6e161c9 100644 --- a/src/elements/Rect.js +++ b/src/elements/Rect.js @@ -9,27 +9,21 @@ import { rx, ry } from '../modules/core/circled.js' import Shape from './Shape.js' export default class Rect extends Shape { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'rect', node ), node ) - + constructor (node) { + super(nodeOrNew('rect', node), node) } - } -extend( Rect, { rx, ry } ) +extend(Rect, { rx, ry }) -registerMethods( { +registerMethods({ Container: { // Create a rect element - rect: wrapWithAttrCheck( function ( width, height ) { - - return this.put( new Rect() ).size( width, height ) - - } ) + rect: wrapWithAttrCheck(function (width, height) { + return this.put(new Rect()).size(width, height) + }) } -} ) +}) -register( Rect ) +register(Rect) diff --git a/src/elements/Shape.js b/src/elements/Shape.js index 0d5a5b0..cdddc60 100644 --- a/src/elements/Shape.js +++ b/src/elements/Shape.js @@ -3,4 +3,4 @@ import Element from './Element.js' export default class Shape extends Element {} -register( Shape ) +register(Shape) diff --git a/src/elements/Stop.js b/src/elements/Stop.js index 8838923..9a5acaa 100644 --- a/src/elements/Stop.js +++ b/src/elements/Stop.js @@ -3,35 +3,27 @@ import Element from './Element.js' import SVGNumber from '../types/SVGNumber.js' export default class Stop extends Element { - - constructor ( node ) { - - super( nodeOrNew( 'stop', node ), node ) - + constructor (node) { + super(nodeOrNew('stop', node), node) } // add color stops - update ( o ) { - - if ( typeof o === 'number' || o instanceof SVGNumber ) { - + update (o) { + if (typeof o === 'number' || o instanceof SVGNumber) { o = { offset: arguments[0], color: arguments[1], opacity: arguments[2] } - } // set attributes - if ( o.opacity != null ) this.attr( 'stop-opacity', o.opacity ) - if ( o.color != null ) this.attr( 'stop-color', o.color ) - if ( o.offset != null ) this.attr( 'offset', new SVGNumber( o.offset ) ) + if (o.opacity != null) this.attr('stop-opacity', o.opacity) + if (o.color != null) this.attr('stop-color', o.color) + if (o.offset != null) this.attr('offset', new SVGNumber(o.offset)) return this - } - } -register( Stop ) +register(Stop) diff --git a/src/elements/Style.js b/src/elements/Style.js index 643f356..50ec50e 100644 --- a/src/elements/Style.js +++ b/src/elements/Style.js @@ -3,69 +3,51 @@ import { registerMethods } from '../utils/methods.js' import { unCamelCase } from '../utils/utils.js' import Element from './Element.js' -function cssRule ( selector, rule ) { - - if ( !selector ) return '' - if ( !rule ) return selector +function cssRule (selector, rule) { + if (!selector) return '' + if (!rule) return selector var ret = selector + '{' - for ( var i in rule ) { - - ret += unCamelCase( i ) + ':' + rule[i] + ';' - + for (var i in rule) { + ret += unCamelCase(i) + ':' + rule[i] + ';' } ret += '}' return ret - } export default class Style extends Element { - - constructor ( node ) { - - super( nodeOrNew( 'style', node ), node ) - + constructor (node) { + super(nodeOrNew('style', node), node) } - words ( w ) { - - this.node.textContent += ( w || '' ) + words (w) { + this.node.textContent += (w || '') return this - } - font ( name, src, params = {} ) { - - return this.rule( '@font-face', { + font (name, src, params = {}) { + return this.rule('@font-face', { fontFamily: name, src: src, ...params - } ) - + }) } - rule ( selector, obj ) { - - return this.words( cssRule( selector, obj ) ) - + rule (selector, obj) { + return this.words(cssRule(selector, obj)) } - } -registerMethods( 'Dom', { - style: wrapWithAttrCheck( function ( selector, obj ) { - - return this.put( new Style() ).rule( selector, obj ) - - } ), - fontface: wrapWithAttrCheck( function ( name, src, params ) { - - return this.put( new Style() ).font( name, src, params ) - - } ) -} ) +registerMethods('Dom', { + style: wrapWithAttrCheck(function (selector, obj) { + return this.put(new Style()).rule(selector, obj) + }), + fontface: wrapWithAttrCheck(function (name, src, params) { + return this.put(new Style()).font(name, src, params) + }) +}) -register( Style ) +register(Style) diff --git a/src/elements/Svg.js b/src/elements/Svg.js index 1326900..ab7d89f 100644 --- a/src/elements/Svg.js +++ b/src/elements/Svg.js @@ -11,90 +11,68 @@ import Defs from './Defs.js' import { globals } from '../utils/window.js' export default class Svg extends Container { - - constructor ( node ) { - - super( nodeOrNew( 'svg', node ), node ) + constructor (node) { + super(nodeOrNew('svg', node), node) this.namespace() - } isRoot () { - return !this.node.parentNode - || !( this.node.parentNode instanceof globals.window.SVGElement ) + || !(this.node.parentNode instanceof globals.window.SVGElement) || this.node.parentNode.nodeName === '#document' - } // Check if this is a root svg // If not, call docs from this element root () { - - if ( this.isRoot() ) return this + if (this.isRoot()) return this return super.root() - } // Add namespaces namespace () { - - if ( !this.isRoot() ) return this.root().namespace() + if (!this.isRoot()) return this.root().namespace() return this - .attr( { xmlns: ns, version: '1.1' } ) - .attr( 'xmlns:xlink', xlink, xmlns ) - .attr( 'xmlns:svgjs', svgjs, xmlns ) - + .attr({ xmlns: ns, version: '1.1' }) + .attr('xmlns:xlink', xlink, xmlns) + .attr('xmlns:svgjs', svgjs, xmlns) } // Creates and returns defs element defs () { + if (!this.isRoot()) return this.root().defs() - if ( !this.isRoot() ) return this.root().defs() - - return adopt( this.node.getElementsByTagName( 'defs' )[0] ) - || this.put( new Defs() ) - + return adopt(this.node.getElementsByTagName('defs')[0]) + || this.put(new Defs()) } // custom parent method - parent ( type ) { - - if ( this.isRoot() ) { - + parent (type) { + if (this.isRoot()) { return this.node.parentNode.nodeName === '#document' ? null - : adopt( this.node.parentNode ) - + : adopt(this.node.parentNode) } - return super.parent( type ) - + return super.parent(type) } clear () { - // remove children - while ( this.node.hasChildNodes() ) { - - this.node.removeChild( this.node.lastChild ) - + while (this.node.hasChildNodes()) { + this.node.removeChild(this.node.lastChild) } return this - } - } -registerMethods( { +registerMethods({ Container: { // Create nested svg document - nested: wrapWithAttrCheck( function () { - - return this.put( new Svg() ) - - } ) + nested: wrapWithAttrCheck(function () { + return this.put(new Svg()) + }) } -} ) +}) -register( Svg, 'Svg', true ) +register(Svg, 'Svg', true) diff --git a/src/elements/Symbol.js b/src/elements/Symbol.js index 577d1f1..f44125c 100644 --- a/src/elements/Symbol.js +++ b/src/elements/Symbol.js @@ -3,24 +3,18 @@ import { registerMethods } from '../utils/methods.js' import Container from './Container.js' export default class Symbol extends Container { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'symbol', node ), node ) - + constructor (node) { + super(nodeOrNew('symbol', node), node) } - } -registerMethods( { +registerMethods({ Container: { - symbol: wrapWithAttrCheck( function () { - - return this.put( new Symbol() ) - - } ) + symbol: wrapWithAttrCheck(function () { + return this.put(new Symbol()) + }) } -} ) +}) -register( Symbol ) +register(Symbol) diff --git a/src/elements/Text.js b/src/elements/Text.js index a981d73..db9c2ee 100644 --- a/src/elements/Text.js +++ b/src/elements/Text.js @@ -13,233 +13,175 @@ import { globals } from '../utils/window.js' import * as textable from '../modules/core/textable.js' export default class Text extends Shape { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'text', node ), node ) + constructor (node) { + super(nodeOrNew('text', node), node) - this.dom.leading = new SVGNumber( 1.3 ) // store leading value for rebuilding + this.dom.leading = new SVGNumber(1.3) // store leading value for rebuilding this._rebuild = true // enable automatic updating of dy values this._build = false // disable build mode for adding multiple lines // set default font - this.attr( 'font-family', attrs['font-family'] ) - + this.attr('font-family', attrs['font-family']) } // Move over x-axis - x ( x ) { - + x (x) { // act as getter - if ( x == null ) { - - return this.attr( 'x' ) - + if (x == null) { + return this.attr('x') } - return this.attr( 'x', x ) - + return this.attr('x', x) } // Move over y-axis - y ( y ) { - - var oy = this.attr( 'y' ) + y (y) { + var oy = this.attr('y') var o = typeof oy === 'number' ? oy - this.bbox().y : 0 // act as getter - if ( y == null ) { - + if (y == null) { return typeof oy === 'number' ? oy - o : oy - } - return this.attr( 'y', typeof y === 'number' ? y + o : y ) - + return this.attr('y', typeof y === 'number' ? y + o : y) } // Move center over x-axis - cx ( x ) { - - return x == null ? this.bbox().cx : this.x( x - this.bbox().width / 2 ) - + cx (x) { + return x == null ? this.bbox().cx : this.x(x - this.bbox().width / 2) } // Move center over y-axis - cy ( y ) { - - return y == null ? this.bbox().cy : this.y( y - this.bbox().height / 2 ) - + cy (y) { + return y == null ? this.bbox().cy : this.y(y - this.bbox().height / 2) } // Set the text content - text ( text ) { - + text (text) { // act as getter - if ( text === undefined ) { - + if (text === undefined) { var children = this.node.childNodes var firstLine = 0 text = '' - for ( var i = 0, len = children.length; i < len; ++i ) { - + for (var i = 0, len = children.length; i < len; ++i) { // skip textPaths - they are no lines - if ( children[i].nodeName === 'textPath' ) { - - if ( i === 0 ) firstLine = 1 + if (children[i].nodeName === 'textPath') { + if (i === 0) firstLine = 1 continue - } // add newline if its not the first child and newLined is set to true - if ( i !== firstLine && children[i].nodeType !== 3 && adopt( children[i] ).dom.newLined === true ) { - + if (i !== firstLine && children[i].nodeType !== 3 && adopt(children[i]).dom.newLined === true) { text += '\n' - } // add content of this node text += children[i].textContent - } return text - } // remove existing content - this.clear().build( true ) - - if ( typeof text === 'function' ) { + this.clear().build(true) + if (typeof text === 'function') { // call block - text.call( this, this ) - + text.call(this, this) } else { - // store text and make sure text is not blank - text = text.split( '\n' ) + text = text.split('\n') // build new lines - for ( var j = 0, jl = text.length; j < jl; j++ ) { - - this.tspan( text[j] ).newLine() - + for (var j = 0, jl = text.length; j < jl; j++) { + this.tspan(text[j]).newLine() } - } // disable build mode and rebuild lines - return this.build( false ).rebuild() - + return this.build(false).rebuild() } // Set / get leading - leading ( value ) { - + leading (value) { // act as getter - if ( value == null ) { - + if (value == null) { return this.dom.leading - } // act as setter - this.dom.leading = new SVGNumber( value ) + this.dom.leading = new SVGNumber(value) return this.rebuild() - } // Rebuild appearance type - rebuild ( rebuild ) { - + rebuild (rebuild) { // store new rebuild flag if given - if ( typeof rebuild === 'boolean' ) { - + if (typeof rebuild === 'boolean') { this._rebuild = rebuild - } // define position of all lines - if ( this._rebuild ) { - + if (this._rebuild) { var self = this var blankLineOffset = 0 var leading = this.dom.leading - this.each( function () { - - var fontSize = globals.window.getComputedStyle( this.node ) - .getPropertyValue( 'font-size' ) - var dy = leading * new SVGNumber( fontSize ) - - if ( this.dom.newLined ) { + this.each(function () { + var fontSize = globals.window.getComputedStyle(this.node) + .getPropertyValue('font-size') + var dy = leading * new SVGNumber(fontSize) - this.attr( 'x', self.attr( 'x' ) ) - - if ( this.text() === '\n' ) { + if (this.dom.newLined) { + this.attr('x', self.attr('x')) + if (this.text() === '\n') { blankLineOffset += dy - } else { - - this.attr( 'dy', dy + blankLineOffset ) + this.attr('dy', dy + blankLineOffset) blankLineOffset = 0 - } - } + }) - } ) - - this.fire( 'rebuild' ) - + this.fire('rebuild') } return this - } // Enable / disable build mode - build ( build ) { - + build (build) { this._build = !!build return this - } // overwrite method from parent to set data properly - setData ( o ) { - + setData (o) { this.dom = o - this.dom.leading = new SVGNumber( o.leading || 1.3 ) + this.dom.leading = new SVGNumber(o.leading || 1.3) return this - } - } -extend( Text, textable ) +extend(Text, textable) -registerMethods( { +registerMethods({ Container: { // Create text element - text: wrapWithAttrCheck( function ( text ) { - - return this.put( new Text() ).text( text ) - - } ), + text: wrapWithAttrCheck(function (text) { + return this.put(new Text()).text(text) + }), // Create plain text element - plain: wrapWithAttrCheck( function ( text ) { - - return this.put( new Text() ).plain( text ) - - } ) + plain: wrapWithAttrCheck(function (text) { + return this.put(new Text()).plain(text) + }) } -} ) +}) -register( Text ) +register(Text) diff --git a/src/elements/TextPath.js b/src/elements/TextPath.js index af89ef7..91c48ae 100644 --- a/src/elements/TextPath.js +++ b/src/elements/TextPath.js @@ -7,106 +7,80 @@ import Text from './Text.js' import baseFind from '../modules/core/selector.js' export default class TextPath extends Text { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'textPath', node ), node ) - + constructor (node) { + super(nodeOrNew('textPath', node), node) } // return the array of the path track element array () { - var track = this.track() return track ? track.array() : null - } // Plot path if any - plot ( d ) { - + plot (d) { var track = this.track() var pathArray = null - if ( track ) { - - pathArray = track.plot( d ) - + if (track) { + pathArray = track.plot(d) } - return ( d == null ) ? pathArray : this - + return (d == null) ? pathArray : this } // Get the path element track () { - - return this.reference( 'href' ) - + return this.reference('href') } - } -registerMethods( { +registerMethods({ Container: { - textPath: wrapWithAttrCheck( function ( text, path ) { - - return this.defs().path( path ).text( text ).addTo( this ) - - } ) + textPath: wrapWithAttrCheck(function (text, path) { + return this.defs().path(path).text(text).addTo(this) + }) }, Text: { // Create path for text to run on - path: wrapWithAttrCheck( function ( track ) { - + path: wrapWithAttrCheck(function (track) { var path = new TextPath() // if track is a path, reuse it - if ( !( track instanceof Path ) ) { - + if (!(track instanceof Path)) { // create path element - track = this.root().defs().path( track ) - + track = this.root().defs().path(track) } // link textPath to path and add content - path.attr( 'href', '#' + track, xlink ) + path.attr('href', '#' + track, xlink) // add textPath element as child node and return textPath - return this.put( path ) - - } ), + return this.put(path) + }), // Get the textPath children textPath () { - - return this.find( 'textPath' )[0] - + return this.find('textPath')[0] } }, Path: { // creates a textPath from this path - text: wrapWithAttrCheck( function ( text ) { - - if ( text instanceof Text ) { - + text: wrapWithAttrCheck(function (text) { + if (text instanceof Text) { var txt = text.text() - return text.clear().path( this ).text( txt ) - + return text.clear().path(this).text(txt) } - return this.parent().put( new Text() ).path( this ).text( text ) - - } ), + return this.parent().put(new Text()).path(this).text(text) + }), targets () { - - return baseFind( 'svg [href*="' + this.id() + '"]' ) - + return baseFind('svg [href*="' + this.id() + '"]') } } -} ) +}) TextPath.prototype.MorphArray = PathArray -register( TextPath ) +register(TextPath) diff --git a/src/elements/Tspan.js b/src/elements/Tspan.js index fcf8cf5..abd032f 100644 --- a/src/elements/Tspan.js +++ b/src/elements/Tspan.js @@ -9,77 +9,61 @@ import Text from './Text.js' import * as textable from '../modules/core/textable.js' export default class Tspan extends Text { - // Initialize node - constructor ( node ) { - - super( nodeOrNew( 'tspan', node ), node ) - + constructor (node) { + super(nodeOrNew('tspan', node), node) } // Set text content - text ( text ) { - - if ( text == null ) return this.node.textContent + ( this.dom.newLined ? '\n' : '' ) + text (text) { + if (text == null) return this.node.textContent + (this.dom.newLined ? '\n' : '') - typeof text === 'function' ? text.call( this, this ) : this.plain( text ) + typeof text === 'function' ? text.call(this, this) : this.plain(text) return this - } // Shortcut dx - dx ( dx ) { - - return this.attr( 'dx', dx ) - + dx (dx) { + return this.attr('dx', dx) } // Shortcut dy - dy ( dy ) { - - return this.attr( 'dy', dy ) - + dy (dy) { + return this.attr('dy', dy) } // Create new line newLine () { - // fetch text parent - var t = this.parent( Text ) + var t = this.parent(Text) // mark new line this.dom.newLined = true // apply new position - return this.dy( t.dom.leading * t.attr( 'font-size' ) ).attr( 'x', t.x() ) - + return this.dy(t.dom.leading * t.attr('font-size')).attr('x', t.x()) } - } -extend( Tspan, textable ) +extend(Tspan, textable) -registerMethods( { +registerMethods({ Tspan: { - tspan: wrapWithAttrCheck( function ( text ) { - + tspan: wrapWithAttrCheck(function (text) { var tspan = new Tspan() // clear if build mode is disabled - if ( !this._build ) { - + if (!this._build) { this.clear() - } // add new tspan - this.node.appendChild( tspan.node ) - - return tspan.text( text ) + this.node.appendChild(tspan.node) - } ) + return tspan.text(text) + }) } -} ) +}) -register( Tspan ) +register(Tspan) diff --git a/src/elements/Use.js b/src/elements/Use.js index 9237e08..7921461 100644 --- a/src/elements/Use.js +++ b/src/elements/Use.js @@ -4,32 +4,24 @@ import { xlink } from '../modules/core/namespaces.js' import Shape from './Shape.js' export default class Use extends Shape { - - constructor ( node ) { - - super( nodeOrNew( 'use', node ), node ) - + constructor (node) { + super(nodeOrNew('use', node), node) } // Use element as a reference - element ( element, file ) { - + element (element, file) { // Set lined element - return this.attr( 'href', ( file || '' ) + '#' + element, xlink ) - + return this.attr('href', (file || '') + '#' + element, xlink) } - } -registerMethods( { +registerMethods({ Container: { // Create a use element - use: wrapWithAttrCheck( function ( element, file ) { - - return this.put( new Use() ).element( element, file ) - - } ) + use: wrapWithAttrCheck(function (element, file) { + return this.put(new Use()).element(element, file) + }) } -} ) +}) -register( Use ) +register(Use) diff --git a/src/main.js b/src/main.js index 951cc69..919fb25 100644 --- a/src/main.js +++ b/src/main.js @@ -116,50 +116,50 @@ export { default as TextPath } from './elements/TextPath.js' export { default as Tspan } from './elements/Tspan.js' export { default as Use } from './elements/Use.js' -extend( [ +extend([ Svg, Symbol, Image, Pattern, Marker -], getMethodsFor( 'viewbox' ) ) +], getMethodsFor('viewbox')) -extend( [ +extend([ Line, Polyline, Polygon, Path -], getMethodsFor( 'marker' ) ) +], getMethodsFor('marker')) -extend( Text, getMethodsFor( 'Text' ) ) -extend( Path, getMethodsFor( 'Path' ) ) +extend(Text, getMethodsFor('Text')) +extend(Path, getMethodsFor('Path')) -extend( Defs, getMethodsFor( 'Defs' ) ) +extend(Defs, getMethodsFor('Defs')) -extend( [ +extend([ Text, Tspan -], getMethodsFor( 'Tspan' ) ) +], getMethodsFor('Tspan')) -extend( [ +extend([ Rect, Ellipse, Circle, Gradient -], getMethodsFor( 'radius' ) ) +], getMethodsFor('radius')) -extend( EventTarget, getMethodsFor( 'EventTarget' ) ) -extend( Dom, getMethodsFor( 'Dom' ) ) -extend( Element, getMethodsFor( 'Element' ) ) -extend( Shape, getMethodsFor( 'Shape' ) ) +extend(EventTarget, getMethodsFor('EventTarget')) +extend(Dom, getMethodsFor('Dom')) +extend(Element, getMethodsFor('Element')) +extend(Shape, getMethodsFor('Shape')) // extend(Element, getConstructor('Memory')) -extend( Container, getMethodsFor( 'Container' ) ) +extend(Container, getMethodsFor('Container')) -extend( Runner, getMethodsFor( 'Runner' ) ) +extend(Runner, getMethodsFor('Runner')) -List.extend( getMethodNames() ) +List.extend(getMethodNames()) -registerMorphableType( [ +registerMorphableType([ SVGNumber, Color, Box, @@ -167,6 +167,6 @@ registerMorphableType( [ SVGArray, PointArray, PathArray -] ) +]) makeMorphable() diff --git a/src/modules/core/attr.js b/src/modules/core/attr.js index 7cb9e2a..79dd0d7 100644 --- a/src/modules/core/attr.js +++ b/src/modules/core/attr.js @@ -5,113 +5,77 @@ import SVGArray from '../../types/SVGArray.js' import SVGNumber from '../../types/SVGNumber.js' const hooks = [] -export function registerAttrHook ( fn ) { - - hooks.push( fn ) - +export function registerAttrHook (fn) { + hooks.push(fn) } // Set svg element attribute -export default function attr ( attr, val, ns ) { - +export default function attr (attr, val, ns) { // act as full getter - if ( attr == null ) { - + if (attr == null) { // get an object of attributes attr = {} val = this.node.attributes - for ( let node of val ) { - - attr[node.nodeName] = isNumber.test( node.nodeValue ) - ? parseFloat( node.nodeValue ) + for (let node of val) { + attr[node.nodeName] = isNumber.test(node.nodeValue) + ? parseFloat(node.nodeValue) : node.nodeValue - } return attr - - } else if ( attr instanceof Array ) { - + } else if (attr instanceof Array) { // loop through array and get all values - return attr.reduce( ( last, curr ) => { - - last[curr] = this.attr( curr ) + return attr.reduce((last, curr) => { + last[curr] = this.attr(curr) return last - - }, {} ) - - } else if ( typeof attr === 'object' ) { - + }, {}) + } else if (typeof attr === 'object') { // apply every attribute individually if an object is passed - for ( val in attr ) this.attr( val, attr[val] ) - - } else if ( val === null ) { - + for (val in attr) this.attr(val, attr[val]) + } else if (val === null) { // remove value - this.node.removeAttribute( attr ) - - } else if ( val == null ) { - + this.node.removeAttribute(attr) + } else if (val == null) { // act as a getter if the first and only argument is not an object - val = this.node.getAttribute( attr ) + val = this.node.getAttribute(attr) return val == null ? defaults[attr] - : isNumber.test( val ) ? parseFloat( val ) + : isNumber.test(val) ? parseFloat(val) : val - } else { - // Loop through hooks and execute them to convert value - val = hooks.reduce( ( _val, hook ) => { - - return hook( attr, _val, this ) - - }, val ) + val = hooks.reduce((_val, hook) => { + return hook(attr, _val, this) + }, val) // ensure correct numeric values (also accepts NaN and Infinity) - if ( typeof val === 'number' ) { - - val = new SVGNumber( val ) - - } else if ( Color.isColor( val ) ) { - + if (typeof val === 'number') { + val = new SVGNumber(val) + } else if (Color.isColor(val)) { // ensure full hex color - val = new Color( val ) - - } else if ( val.constructor === Array ) { - + val = new Color(val) + } else if (val.constructor === Array) { // Check for plain arrays and parse array values - val = new SVGArray( val ) - + val = new SVGArray(val) } // if the passed attribute is leading... - if ( attr === 'leading' ) { - + if (attr === 'leading') { // ... call the leading method instead - if ( this.leading ) { - - this.leading( val ) - + if (this.leading) { + this.leading(val) } - } else { - // set given attribute on node - typeof ns === 'string' ? this.node.setAttributeNS( ns, attr, val.toString() ) - : this.node.setAttribute( attr, val.toString() ) - + typeof ns === 'string' ? this.node.setAttributeNS(ns, attr, val.toString()) + : this.node.setAttribute(attr, val.toString()) } // rebuild if required - if ( this.rebuild && ( attr === 'font-size' || attr === 'x' ) ) { - + if (this.rebuild && (attr === 'font-size' || attr === 'x')) { this.rebuild() - } - } return this - } diff --git a/src/modules/core/circled.js b/src/modules/core/circled.js index ad901b9..597d252 100644 --- a/src/modules/core/circled.js +++ b/src/modules/core/circled.js @@ -1,69 +1,53 @@ import SVGNumber from '../../types/SVGNumber.js' // Radius x value -export function rx ( rx ) { - - return this.attr( 'rx', rx ) - +export function rx (rx) { + return this.attr('rx', rx) } // Radius y value -export function ry ( ry ) { - - return this.attr( 'ry', ry ) - +export function ry (ry) { + return this.attr('ry', ry) } // Move over x-axis -export function x ( x ) { - +export function x (x) { return x == null ? this.cx() - this.rx() - : this.cx( x + this.rx() ) - + : this.cx(x + this.rx()) } // Move over y-axis -export function y ( y ) { - +export function y (y) { return y == null ? this.cy() - this.ry() - : this.cy( y + this.ry() ) - + : this.cy(y + this.ry()) } // Move by center over x-axis -export function cx ( x ) { - +export function cx (x) { return x == null - ? this.attr( 'cx' ) - : this.attr( 'cx', x ) - + ? this.attr('cx') + : this.attr('cx', x) } // Move by center over y-axis -export function cy ( y ) { - +export function cy (y) { return y == null - ? this.attr( 'cy' ) - : this.attr( 'cy', y ) - + ? this.attr('cy') + : this.attr('cy', y) } // Set width of element -export function width ( width ) { - +export function width (width) { return width == null ? this.rx() * 2 - : this.rx( new SVGNumber( width ).divide( 2 ) ) - + : this.rx(new SVGNumber(width).divide(2)) } // Set height of element -export function height ( height ) { - +export function height (height) { return height == null ? this.ry() * 2 - : this.ry( new SVGNumber( height ).divide( 2 ) ) - + : this.ry(new SVGNumber(height).divide(2)) } diff --git a/src/modules/core/event.js b/src/modules/core/event.js index 23459fb..507e91f 100644 --- a/src/modules/core/event.js +++ b/src/modules/core/event.js @@ -4,48 +4,38 @@ import { globals } from '../../utils/window.js' let listenerId = 0 -function getEvents ( node ) { - - const n = makeInstance( node ).getEventHolder() - if ( !n.events ) n.events = {} +function getEvents (node) { + const n = makeInstance(node).getEventHolder() + if (!n.events) n.events = {} return n.events - } -function getEventTarget ( node ) { - - return makeInstance( node ).getEventTarget() - +function getEventTarget (node) { + return makeInstance(node).getEventTarget() } -function clearEvents ( node ) { - - const n = makeInstance( node ).getEventHolder() - if ( n.events ) n.events = {} - +function clearEvents (node) { + const n = makeInstance(node).getEventHolder() + if (n.events) n.events = {} } // Add event binder in the SVG namespace -export function on ( node, events, listener, binding, options ) { - - var l = listener.bind( binding || node ) - var bag = getEvents( node ) - var n = getEventTarget( node ) +export function on (node, events, listener, binding, options) { + var l = listener.bind(binding || node) + var bag = getEvents(node) + var n = getEventTarget(node) // events can be an array of events or a string of events - events = Array.isArray( events ) ? events : events.split( delimiter ) + events = Array.isArray(events) ? events : events.split(delimiter) // add id to listener - if ( !listener._svgjsListenerId ) { - + if (!listener._svgjsListenerId) { listener._svgjsListenerId = ++listenerId - } - events.forEach( function ( event ) { - - var ev = event.split( '.' )[0] - var ns = event.split( '.' )[1] || '*' + events.forEach(function (event) { + var ev = event.split('.')[0] + var ns = event.split('.')[1] || '*' // ensure valid object bag[ev] = bag[ev] || {} @@ -55,126 +45,84 @@ export function on ( node, events, listener, binding, options ) { bag[ev][ns][listener._svgjsListenerId] = l // add listener - n.addEventListener( ev, l, options || false ) - - } ) - + n.addEventListener(ev, l, options || false) + }) } // Add event unbinder in the SVG namespace -export function off ( node, events, listener, options ) { - - var bag = getEvents( node ) - var n = getEventTarget( node ) +export function off (node, events, listener, options) { + var bag = getEvents(node) + var n = getEventTarget(node) // listener can be a function or a number - if ( typeof listener === 'function' ) { - + if (typeof listener === 'function') { listener = listener._svgjsListenerId - if ( !listener ) return - + if (!listener) return } // events can be an array of events or a string or undefined - events = Array.isArray( events ) ? events : ( events || '' ).split( delimiter ) + events = Array.isArray(events) ? events : (events || '').split(delimiter) - events.forEach( function ( event ) { - - var ev = event && event.split( '.' )[0] - var ns = event && event.split( '.' )[1] + events.forEach(function (event) { + var ev = event && event.split('.')[0] + var ns = event && event.split('.')[1] var namespace, l - if ( listener ) { - + if (listener) { // remove listener reference - if ( bag[ev] && bag[ev][ns || '*'] ) { - + if (bag[ev] && bag[ev][ns || '*']) { // removeListener - n.removeEventListener( ev, bag[ev][ns || '*'][listener], options || false ) + n.removeEventListener(ev, bag[ev][ns || '*'][listener], options || false) delete bag[ev][ns || '*'][listener] - } - - } else if ( ev && ns ) { - + } else if (ev && ns) { // remove all listeners for a namespaced event - if ( bag[ev] && bag[ev][ns] ) { - - for ( l in bag[ev][ns] ) { - - off( n, [ ev, ns ].join( '.' ), l ) - + if (bag[ev] && bag[ev][ns]) { + for (l in bag[ev][ns]) { + off(n, [ ev, ns ].join('.'), l) } delete bag[ev][ns] - } - - } else if ( ns ) { - + } else if (ns) { // remove all listeners for a specific namespace - for ( event in bag ) { - - for ( namespace in bag[event] ) { - - if ( ns === namespace ) { - - off( n, [ event, ns ].join( '.' ) ) - + for (event in bag) { + for (namespace in bag[event]) { + if (ns === namespace) { + off(n, [ event, ns ].join('.')) } - } - } - - } else if ( ev ) { - + } else if (ev) { // remove all listeners for the event - if ( bag[ev] ) { - - for ( namespace in bag[ev] ) { - - off( n, [ ev, namespace ].join( '.' ) ) - + if (bag[ev]) { + for (namespace in bag[ev]) { + off(n, [ ev, namespace ].join('.')) } delete bag[ev] - } - } else { - // remove all listeners on a given node - for ( event in bag ) { - - off( n, event ) - + for (event in bag) { + off(n, event) } - clearEvents( node ) - + clearEvents(node) } - - } ) - + }) } -export function dispatch ( node, event, data ) { - - var n = getEventTarget( node ) +export function dispatch (node, event, data) { + var n = getEventTarget(node) // Dispatch event - if ( event instanceof globals.window.Event ) { - - n.dispatchEvent( event ) - + if (event instanceof globals.window.Event) { + n.dispatchEvent(event) } else { - - event = new globals.window.CustomEvent( event, { detail: data, cancelable: true } ) - n.dispatchEvent( event ) - + event = new globals.window.CustomEvent(event, { detail: data, cancelable: true }) + n.dispatchEvent(event) } return event - } diff --git a/src/modules/core/gradiented.js b/src/modules/core/gradiented.js index dd9c46f..6c744e4 100644 --- a/src/modules/core/gradiented.js +++ b/src/modules/core/gradiented.js @@ -1,17 +1,13 @@ import SVGNumber from '../../types/SVGNumber.js' -export function from ( x, y ) { - - return ( this._element || this ).type === 'radialGradient' - ? this.attr( { fx: new SVGNumber( x ), fy: new SVGNumber( y ) } ) - : this.attr( { x1: new SVGNumber( x ), y1: new SVGNumber( y ) } ) - +export function from (x, y) { + return (this._element || this).type === 'radialGradient' + ? this.attr({ fx: new SVGNumber(x), fy: new SVGNumber(y) }) + : this.attr({ x1: new SVGNumber(x), y1: new SVGNumber(y) }) } -export function to ( x, y ) { - - return ( this._element || this ).type === 'radialGradient' - ? this.attr( { cx: new SVGNumber( x ), cy: new SVGNumber( y ) } ) - : this.attr( { x2: new SVGNumber( x ), y2: new SVGNumber( y ) } ) - +export function to (x, y) { + return (this._element || this).type === 'radialGradient' + ? this.attr({ cx: new SVGNumber(x), cy: new SVGNumber(y) }) + : this.attr({ x2: new SVGNumber(x), y2: new SVGNumber(y) }) } diff --git a/src/modules/core/parser.js b/src/modules/core/parser.js index 12c9728..1ff2380 100644 --- a/src/modules/core/parser.js +++ b/src/modules/core/parser.js @@ -2,32 +2,26 @@ import { globals } from '../../utils/window.js' import { makeInstance } from '../../utils/adopter.js' export default function parser () { - // Reuse cached element if possible - if ( !parser.nodes ) { - - let svg = makeInstance().size( 2, 0 ) + if (!parser.nodes) { + let svg = makeInstance().size(2, 0) svg.node.cssText = [ 'opacity: 0', 'position: absolute', 'left: -100%', 'top: -100%', 'overflow: hidden' - ].join( ';' ) + ].join(';') let path = svg.path().node parser.nodes = { svg, path } - } - if ( !parser.nodes.svg.node.parentNode ) { - + if (!parser.nodes.svg.node.parentNode) { let b = globals.document.body || globals.document.documentElement - parser.nodes.svg.addTo( b ) - + parser.nodes.svg.addTo(b) } return parser.nodes - } diff --git a/src/modules/core/pointed.js b/src/modules/core/pointed.js index 813b0e3..95e6819 100644 --- a/src/modules/core/pointed.js +++ b/src/modules/core/pointed.js @@ -3,31 +3,23 @@ import PointArray from '../../types/PointArray.js' export let MorphArray = PointArray // Move by left top corner over x-axis -export function x ( x ) { - - return x == null ? this.bbox().x : this.move( x, this.bbox().y ) - +export function x (x) { + return x == null ? this.bbox().x : this.move(x, this.bbox().y) } // Move by left top corner over y-axis -export function y ( y ) { - - return y == null ? this.bbox().y : this.move( this.bbox().x, y ) - +export function y (y) { + return y == null ? this.bbox().y : this.move(this.bbox().x, y) } // Set width of element -export function width ( width ) { - +export function width (width) { let b = this.bbox() - return width == null ? b.width : this.size( width, b.height ) - + return width == null ? b.width : this.size(width, b.height) } // Set height of element -export function height ( height ) { - +export function height (height) { let b = this.bbox() - return height == null ? b.height : this.size( b.width, height ) - + return height == null ? b.height : this.size(b.width, height) } diff --git a/src/modules/core/poly.js b/src/modules/core/poly.js index 56703a5..f23b70b 100644 --- a/src/modules/core/poly.js +++ b/src/modules/core/poly.js @@ -3,39 +3,29 @@ import PointArray from '../../types/PointArray.js' // Get array export function array () { - - return this._array || ( this._array = new PointArray( this.attr( 'points' ) ) ) - + return this._array || (this._array = new PointArray(this.attr('points'))) } // Plot new path -export function plot ( p ) { - - return ( p == null ) ? this.array() - : this.clear().attr( 'points', typeof p === 'string' ? p - : ( this._array = new PointArray( p ) ) ) - +export function plot (p) { + return (p == null) ? this.array() + : this.clear().attr('points', typeof p === 'string' ? p + : (this._array = new PointArray(p))) } // Clear array cache export function clear () { - delete this._array return this - } // Move by left top corner -export function move ( x, y ) { - - return this.attr( 'points', this.array().move( x, y ) ) - +export function move (x, y) { + return this.attr('points', this.array().move(x, y)) } // Set element size to given width and height -export function size ( width, height ) { - - let p = proportionalSize( this, width, height ) - return this.attr( 'points', this.array().size( p.width, p.height ) ) - +export function size (width, height) { + let p = proportionalSize(this, width, height) + return this.attr('points', this.array().size(p.width, p.height)) } diff --git a/src/modules/core/selector.js b/src/modules/core/selector.js index a60df02..24841c5 100644 --- a/src/modules/core/selector.js +++ b/src/modules/core/selector.js @@ -3,19 +3,13 @@ import { globals } from '../../utils/window.js' import { map } from '../../utils/utils.js' import List from '../../types/List.js' -export default function baseFind ( query, parent ) { - - return new List( map( ( parent || globals.document ).querySelectorAll( query ), function ( node ) { - - return adopt( node ) - - } ) ) - +export default function baseFind (query, parent) { + return new List(map((parent || globals.document).querySelectorAll(query), function (node) { + return adopt(node) + })) } // Scoped find method -export function find ( query ) { - - return baseFind( query, this.node ) - +export function find (query) { + return baseFind(query, this.node) } diff --git a/src/modules/core/textable.js b/src/modules/core/textable.js index b0a0993..55df7c6 100644 --- a/src/modules/core/textable.js +++ b/src/modules/core/textable.js @@ -1,25 +1,19 @@ import { globals } from '../../utils/window.js' // Create plain text node -export function plain ( text ) { - +export function plain (text) { // clear if build mode is disabled - if ( this._build === false ) { - + if (this._build === false) { this.clear() - } // create text node - this.node.appendChild( globals.document.createTextNode( text ) ) + this.node.appendChild(globals.document.createTextNode(text)) return this - } // Get length of text element export function length () { - return this.node.getComputedTextLength() - } diff --git a/src/modules/optional/arrange.js b/src/modules/optional/arrange.js index 51e8605..6ce2eea 100644 --- a/src/modules/optional/arrange.js +++ b/src/modules/optional/arrange.js @@ -3,141 +3,109 @@ import { registerMethods } from '../../utils/methods.js' // Get all siblings, including myself export function siblings () { - return this.parent().children() - } // Get the curent position siblings export function position () { - - return this.parent().index( this ) - + return this.parent().index(this) } // Get the next element (will return null if there is none) export function next () { - return this.siblings()[this.position() + 1] - } // Get the next element (will return null if there is none) export function prev () { - return this.siblings()[this.position() - 1] - } // Send given element one step forward export function forward () { - var i = this.position() + 1 var p = this.parent() // move node one step forward - p.removeElement( this ).add( this, i ) + p.removeElement(this).add(this, i) // make sure defs node is always at the top - if ( typeof p.isRoot === 'function' && p.isRoot() ) { - - p.node.appendChild( p.defs().node ) - + if (typeof p.isRoot === 'function' && p.isRoot()) { + p.node.appendChild(p.defs().node) } return this - } // Send given element one step backward export function backward () { - var i = this.position() - if ( i > 0 ) { - - this.parent().removeElement( this ).add( this, i - 1 ) - + if (i > 0) { + this.parent().removeElement(this).add(this, i - 1) } return this - } // Send given element all the way to the front export function front () { - var p = this.parent() // Move node forward - p.node.appendChild( this.node ) + p.node.appendChild(this.node) // Make sure defs node is always at the top - if ( typeof p.isRoot === 'function' && p.isRoot() ) { - - p.node.appendChild( p.defs().node ) - + if (typeof p.isRoot === 'function' && p.isRoot()) { + p.node.appendChild(p.defs().node) } return this - } // Send given element all the way to the back export function back () { - - if ( this.position() > 0 ) { - - this.parent().removeElement( this ).add( this, 0 ) - + if (this.position() > 0) { + this.parent().removeElement(this).add(this, 0) } return this - } // Inserts a given element before the targeted element -export function before ( element ) { - - element = makeInstance( element ) +export function before (element) { + element = makeInstance(element) element.remove() var i = this.position() - this.parent().add( element, i ) + this.parent().add(element, i) return this - } // Inserts a given element after the targeted element -export function after ( element ) { - - element = makeInstance( element ) +export function after (element) { + element = makeInstance(element) element.remove() var i = this.position() - this.parent().add( element, i + 1 ) + this.parent().add(element, i + 1) return this - } -export function insertBefore ( element ) { - - element = makeInstance( element ) - element.before( this ) - +export function insertBefore (element) { + element = makeInstance(element) + element.before(this) } -export function insertAfter ( element ) { - - element = makeInstance( element ) - element.after( this ) - +export function insertAfter (element) { + element = makeInstance(element) + element.after(this) } -registerMethods( 'Dom', { +registerMethods('Dom', { siblings, position, next, prev, forward, backward, front, back, before, after -} ) +}) diff --git a/src/modules/optional/class.js b/src/modules/optional/class.js index 93ccd0e..b08c82b 100644 --- a/src/modules/optional/class.js +++ b/src/modules/optional/class.js @@ -3,58 +3,42 @@ import { registerMethods } from '../../utils/methods.js' // Return array of classes on the node export function classes () { - - var attr = this.attr( 'class' ) - return attr == null ? [] : attr.trim().split( delimiter ) - + var attr = this.attr('class') + return attr == null ? [] : attr.trim().split(delimiter) } // Return true if class exists on the node, false otherwise -export function hasClass ( name ) { - - return this.classes().indexOf( name ) !== -1 - +export function hasClass (name) { + return this.classes().indexOf(name) !== -1 } // Add class to the node -export function addClass ( name ) { - - if ( !this.hasClass( name ) ) { - +export function addClass (name) { + if (!this.hasClass(name)) { var array = this.classes() - array.push( name ) - this.attr( 'class', array.join( ' ' ) ) - + array.push(name) + this.attr('class', array.join(' ')) } return this - } // Remove class from the node -export function removeClass ( name ) { - - if ( this.hasClass( name ) ) { - - this.attr( 'class', this.classes().filter( function ( c ) { - +export function removeClass (name) { + if (this.hasClass(name)) { + this.attr('class', this.classes().filter(function (c) { return c !== name - - } ).join( ' ' ) ) - + }).join(' ')) } return this - } // Toggle the presence of a class on the node -export function toggleClass ( name ) { - - return this.hasClass( name ) ? this.removeClass( name ) : this.addClass( name ) - +export function toggleClass (name) { + return this.hasClass(name) ? this.removeClass(name) : this.addClass(name) } -registerMethods( 'Dom', { +registerMethods('Dom', { classes, hasClass, addClass, removeClass, toggleClass -} ) +}) diff --git a/src/modules/optional/css.js b/src/modules/optional/css.js index d5378f4..2c97f3e 100644 --- a/src/modules/optional/css.js +++ b/src/modules/optional/css.js @@ -3,98 +3,70 @@ import { isBlank } from '../core/regex.js' import { registerMethods } from '../../utils/methods.js' // Dynamic style generator -export function css ( style, val ) { - +export function css (style, val) { let ret = {} - if ( arguments.length === 0 ) { - + if (arguments.length === 0) { // get full style as object - this.node.style.cssText.split( /\s*;\s*/ ) - .filter( function ( el ) { - + this.node.style.cssText.split(/\s*;\s*/) + .filter(function (el) { return !!el.length - - } ) - .forEach( function ( el ) { - - let t = el.split( /\s*:\s*/ ) + }) + .forEach(function (el) { + let t = el.split(/\s*:\s*/) ret[t[0]] = t[1] - - } ) + }) return ret - } - if ( arguments.length < 2 ) { - + if (arguments.length < 2) { // get style properties in the array - if ( Array.isArray( style ) ) { - - for ( let name of style ) { - - let cased = camelCase( name ) + if (Array.isArray(style)) { + for (let name of style) { + let cased = camelCase(name) ret[cased] = this.node.style[cased] - } return ret - } // get style for property - if ( typeof style === 'string' ) { - - return this.node.style[camelCase( style )] - + if (typeof style === 'string') { + return this.node.style[camelCase(style)] } // set styles in object - if ( typeof style === 'object' ) { - - for ( let name in style ) { - + if (typeof style === 'object') { + for (let name in style) { // set empty string if null/undefined/'' was given - this.node.style[camelCase( name )] - = ( style[name] == null || isBlank.test( style[name] ) ) ? '' : style[name] - + this.node.style[camelCase(name)] + = (style[name] == null || isBlank.test(style[name])) ? '' : style[name] } - } - } // set style for property - if ( arguments.length === 2 ) { - - this.node.style[camelCase( style )] - = ( val == null || isBlank.test( val ) ) ? '' : val - + if (arguments.length === 2) { + this.node.style[camelCase(style)] + = (val == null || isBlank.test(val)) ? '' : val } return this - } // Show element export function show () { - - return this.css( 'display', '' ) - + return this.css('display', '') } // Hide element export function hide () { - - return this.css( 'display', 'none' ) - + return this.css('display', 'none') } // Is element visible? export function visible () { - - return this.css( 'display' ) !== 'none' - + return this.css('display') !== 'none' } -registerMethods( 'Dom', { +registerMethods('Dom', { css, show, hide, visible -} ) +}) diff --git a/src/modules/optional/data.js b/src/modules/optional/data.js index 498e65a..4c163c0 100644 --- a/src/modules/optional/data.js +++ b/src/modules/optional/data.js @@ -1,40 +1,26 @@ import { registerMethods } from '../../utils/methods.js' // Store data values on svg nodes -export function data ( a, v, r ) { - - if ( typeof a === 'object' ) { - - for ( v in a ) { - - this.data( v, a[v] ) - +export function data (a, v, r) { + if (typeof a === 'object') { + for (v in a) { + this.data(v, a[v]) } - - } else if ( arguments.length < 2 ) { - + } else if (arguments.length < 2) { try { - - return JSON.parse( this.attr( 'data-' + a ) ) - - } catch ( e ) { - - return this.attr( 'data-' + a ) - + return JSON.parse(this.attr('data-' + a)) + } catch (e) { + return this.attr('data-' + a) } - } else { - - this.attr( 'data-' + a, + this.attr('data-' + a, v === null ? null : r === true || typeof v === 'string' || typeof v === 'number' ? v - : JSON.stringify( v ) + : JSON.stringify(v) ) - } return this - } -registerMethods( 'Dom', { data } ) +registerMethods('Dom', { data }) diff --git a/src/modules/optional/memory.js b/src/modules/optional/memory.js index 7c599f0..6478367 100644 --- a/src/modules/optional/memory.js +++ b/src/modules/optional/memory.js @@ -1,60 +1,40 @@ import { registerMethods } from '../../utils/methods.js' // Remember arbitrary data -export function remember ( k, v ) { - +export function remember (k, v) { // remember every item in an object individually - if ( typeof arguments[0] === 'object' ) { - - for ( var key in k ) { - - this.remember( key, k[key] ) - + if (typeof arguments[0] === 'object') { + for (var key in k) { + this.remember(key, k[key]) } - - } else if ( arguments.length === 1 ) { - + } else if (arguments.length === 1) { // retrieve memory return this.memory()[k] - } else { - // store memory this.memory()[k] = v - } return this - } // Erase a given memory export function forget () { - - if ( arguments.length === 0 ) { - + if (arguments.length === 0) { this._memory = {} - } else { - - for ( var i = arguments.length - 1; i >= 0; i-- ) { - + for (var i = arguments.length - 1; i >= 0; i--) { delete this.memory()[arguments[i]] - } - } return this - } // This triggers creation of a new hidden class which is not performant // However, this function is not rarely used so it will not happen frequently // Return local memory object export function memory () { - - return ( this._memory = this._memory || {} ) - + return (this._memory = this._memory || {}) } -registerMethods( 'Dom', { remember, forget, memory } ) +registerMethods('Dom', { remember, forget, memory }) diff --git a/src/modules/optional/sugar.js b/src/modules/optional/sugar.js index 4b6e6f3..3bd61fb 100644 --- a/src/modules/optional/sugar.js +++ b/src/modules/optional/sugar.js @@ -10,225 +10,167 @@ import SVGNumber from '../../types/SVGNumber.js' var sugar = { stroke: [ 'color', 'width', 'opacity', 'linecap', 'linejoin', 'miterlimit', 'dasharray', 'dashoffset' ], fill: [ 'color', 'opacity', 'rule' ], - prefix: function ( t, a ) { - + prefix: function (t, a) { return a === 'color' ? t : t + '-' + a - } } // Add sugar for fill and stroke -;[ 'fill', 'stroke' ].forEach( function ( m ) { - +;[ 'fill', 'stroke' ].forEach(function (m) { var extension = {} var i - extension[m] = function ( o ) { - - if ( typeof o === 'undefined' ) { - - return this.attr( m ) - + extension[m] = function (o) { + if (typeof o === 'undefined') { + return this.attr(m) } - if ( typeof o === 'string' || Color.isRgb( o ) || ( o instanceof Element ) ) { - - this.attr( m, o ) - + if (typeof o === 'string' || Color.isRgb(o) || (o instanceof Element)) { + this.attr(m, o) } else { - // set all attributes from sugar.fill and sugar.stroke list - for ( i = sugar[m].length - 1; i >= 0; i-- ) { - - if ( o[sugar[m][i]] != null ) { - - this.attr( sugar.prefix( m, sugar[m][i] ), o[sugar[m][i]] ) - + for (i = sugar[m].length - 1; i >= 0; i--) { + if (o[sugar[m][i]] != null) { + this.attr(sugar.prefix(m, sugar[m][i]), o[sugar[m][i]]) } - } - } return this - } - registerMethods( [ 'Shape', 'Runner' ], extension ) + registerMethods([ 'Shape', 'Runner' ], extension) +}) -} ) - -registerMethods( [ 'Element', 'Runner' ], { +registerMethods([ 'Element', 'Runner' ], { // Let the user set the matrix directly - matrix: function ( mat, b, c, d, e, f ) { - + matrix: function (mat, b, c, d, e, f) { // Act as a getter - if ( mat == null ) { - - return new Matrix( this ) - + if (mat == null) { + return new Matrix(this) } // Act as a setter, the user can pass a matrix or a set of numbers - return this.attr( 'transform', new Matrix( mat, b, c, d, e, f ) ) - + return this.attr('transform', new Matrix(mat, b, c, d, e, f)) }, // Map rotation to transform - rotate: function ( angle, cx, cy ) { - - return this.transform( { rotate: angle, ox: cx, oy: cy }, true ) - + rotate: function (angle, cx, cy) { + return this.transform({ rotate: angle, ox: cx, oy: cy }, true) }, // Map skew to transform - skew: function ( x, y, cx, cy ) { - + skew: function (x, y, cx, cy) { return arguments.length === 1 || arguments.length === 3 - ? this.transform( { skew: x, ox: y, oy: cx }, true ) - : this.transform( { skew: [ x, y ], ox: cx, oy: cy }, true ) - + ? this.transform({ skew: x, ox: y, oy: cx }, true) + : this.transform({ skew: [ x, y ], ox: cx, oy: cy }, true) }, - shear: function ( lam, cx, cy ) { - - return this.transform( { shear: lam, ox: cx, oy: cy }, true ) - + shear: function (lam, cx, cy) { + return this.transform({ shear: lam, ox: cx, oy: cy }, true) }, // Map scale to transform - scale: function ( x, y, cx, cy ) { - + scale: function (x, y, cx, cy) { return arguments.length === 1 || arguments.length === 3 - ? this.transform( { scale: x, ox: y, oy: cx }, true ) - : this.transform( { scale: [ x, y ], ox: cx, oy: cy }, true ) - + ? this.transform({ scale: x, ox: y, oy: cx }, true) + : this.transform({ scale: [ x, y ], ox: cx, oy: cy }, true) }, // Map translate to transform - translate: function ( x, y ) { - - return this.transform( { translate: [ x, y ] }, true ) - + translate: function (x, y) { + return this.transform({ translate: [ x, y ] }, true) }, // Map relative translations to transform - relative: function ( x, y ) { - - return this.transform( { relative: [ x, y ] }, true ) - + relative: function (x, y) { + return this.transform({ relative: [ x, y ] }, true) }, // Map flip to transform - flip: function ( direction, around ) { - + flip: function (direction, around) { var directionString = typeof direction === 'string' ? direction - : isFinite( direction ) ? 'both' + : isFinite(direction) ? 'both' : 'both' - var origin = ( direction === 'both' && isFinite( around ) ) ? [ around, around ] - : ( direction === 'x' ) ? [ around, 0 ] - : ( direction === 'y' ) ? [ 0, around ] - : isFinite( direction ) ? [ direction, direction ] + var origin = (direction === 'both' && isFinite(around)) ? [ around, around ] + : (direction === 'x') ? [ around, 0 ] + : (direction === 'y') ? [ 0, around ] + : isFinite(direction) ? [ direction, direction ] : [ 0, 0 ] - this.transform( { flip: directionString, origin: origin }, true ) - + this.transform({ flip: directionString, origin: origin }, true) }, // Opacity - opacity: function ( value ) { - - return this.attr( 'opacity', value ) - + opacity: function (value) { + return this.attr('opacity', value) }, // Relative move over x and y axes - dmove: function ( x, y ) { - - return this.dx( x ).dy( y ) - + dmove: function (x, y) { + return this.dx(x).dy(y) } -} ) +}) -registerMethods( 'Element', { +registerMethods('Element', { // Relative move over x axis - dx: function ( x ) { - - return this.x( new SVGNumber( x ).plus( this.x() ) ) - + dx: function (x) { + return this.x(new SVGNumber(x).plus(this.x())) }, // Relative move over y axis - dy: function ( y ) { - - return this.y( new SVGNumber( y ).plus( this.y() ) ) - + dy: function (y) { + return this.y(new SVGNumber(y).plus(this.y())) } -} ) +}) -registerMethods( 'radius', { +registerMethods('radius', { // Add x and y radius - radius: function ( x, y ) { - - var type = ( this._element || this ).type + radius: function (x, y) { + var type = (this._element || this).type return type === 'radialGradient' || type === 'radialGradient' - ? this.attr( 'r', new SVGNumber( x ) ) - : this.rx( x ).ry( y == null ? x : y ) - + ? this.attr('r', new SVGNumber(x)) + : this.rx(x).ry(y == null ? x : y) } -} ) +}) -registerMethods( 'Path', { +registerMethods('Path', { // Get path length length: function () { - return this.node.getTotalLength() - }, // Get point at length - pointAt: function ( length ) { - - return new Point( this.node.getPointAtLength( length ) ) - + pointAt: function (length) { + return new Point(this.node.getPointAtLength(length)) } -} ) +}) -registerMethods( [ 'Element', 'Runner' ], { +registerMethods([ 'Element', 'Runner' ], { // Set font - font: function ( a, v ) { - - if ( typeof a === 'object' ) { - - for ( v in a ) this.font( v, a[v] ) - + font: function (a, v) { + if (typeof a === 'object') { + for (v in a) this.font(v, a[v]) } return a === 'leading' - ? this.leading( v ) + ? this.leading(v) : a === 'anchor' - ? this.attr( 'text-anchor', v ) + ? this.attr('text-anchor', v) : a === 'size' || a === 'family' || a === 'weight' || a === 'stretch' || a === 'variant' || a === 'style' - ? this.attr( 'font-' + a, v ) - : this.attr( a, v ) - + ? this.attr('font-' + a, v) + : this.attr(a, v) } -} ) - -registerMethods( 'Text', { - ax ( x ) { - - return this.attr( 'x', x ) +}) +registerMethods('Text', { + ax (x) { + return this.attr('x', x) }, - ay ( y ) { - - return this.attr( 'y', y ) - + ay (y) { + return this.attr('y', y) }, - amove ( x, y ) { - - return this.ax( x ).ay( y ) - + amove (x, y) { + return this.ax(x).ay(y) } -} ) +}) // Add events to elements const methods = [ 'click', @@ -244,27 +186,19 @@ const methods = [ 'click', 'touchmove', 'touchleave', 'touchend', - 'touchcancel' ].reduce( function ( last, event ) { - + 'touchcancel' ].reduce(function (last, event) { // add event to Element - const fn = function ( f ) { - - if ( f === null ) { - - off( this, event ) - + const fn = function (f) { + if (f === null) { + off(this, event) } else { - - on( this, event, f ) - + on(this, event, f) } return this - } last[event] = fn return last +}, {}) -}, {} ) - -registerMethods( 'Element', methods ) +registerMethods('Element', methods) diff --git a/src/modules/optional/transform.js b/src/modules/optional/transform.js index 717fbf3..0d0c7e3 100644 --- a/src/modules/optional/transform.js +++ b/src/modules/optional/transform.js @@ -5,92 +5,70 @@ import Matrix from '../../types/Matrix.js' // Reset all transformations export function untransform () { - - return this.attr( 'transform', null ) - + return this.attr('transform', null) } // merge the whole transformation chain into one matrix and returns it export function matrixify () { - - var matrix = ( this.attr( 'transform' ) || '' ) + var matrix = (this.attr('transform') || '') // split transformations - .split( transforms ).slice( 0, -1 ).map( function ( str ) { - + .split(transforms).slice(0, -1).map(function (str) { // generate key => value pairs - var kv = str.trim().split( '(' ) + var kv = str.trim().split('(') return [ kv[0], - kv[1].split( delimiter ) - .map( function ( str ) { - - return parseFloat( str ) - - } ) + kv[1].split(delimiter) + .map(function (str) { + return parseFloat(str) + }) ] - - } ) + }) .reverse() // merge every transformation into one matrix - .reduce( function ( matrix, transform ) { - - if ( transform[0] === 'matrix' ) { - - return matrix.lmultiply( Matrix.fromArray( transform[1] ) ) - + .reduce(function (matrix, transform) { + if (transform[0] === 'matrix') { + return matrix.lmultiply(Matrix.fromArray(transform[1])) } - return matrix[transform[0]].apply( matrix, transform[1] ) - - }, new Matrix() ) + return matrix[transform[0]].apply(matrix, transform[1]) + }, new Matrix()) return matrix - } // add an element to another parent without changing the visual representation on the screen -export function toParent ( parent ) { - - if ( this === parent ) return this +export function toParent (parent) { + if (this === parent) return this var ctm = this.screenCTM() var pCtm = parent.screenCTM().inverse() - this.addTo( parent ).untransform().transform( pCtm.multiply( ctm ) ) + this.addTo(parent).untransform().transform(pCtm.multiply(ctm)) return this - } // same as above with parent equals root-svg export function toRoot () { - - return this.toParent( this.root() ) - + return this.toParent(this.root()) } // Add transformations -export function transform ( o, relative ) { - +export function transform (o, relative) { // Act as a getter if no object was passed - if ( o == null || typeof o === 'string' ) { - - var decomposed = new Matrix( this ).decompose() + if (o == null || typeof o === 'string') { + var decomposed = new Matrix(this).decompose() return decomposed[o] || decomposed - } - if ( !Matrix.isMatrixLike( o ) ) { - + if (!Matrix.isMatrixLike(o)) { // Set the origin according to the defined transform - o = { ...o, origin: getOrigin( o, this ) } - + o = { ...o, origin: getOrigin(o, this) } } // The user can pass a boolean, an Element or an Matrix or nothing - var cleanRelative = relative === true ? this : ( relative || false ) - var result = new Matrix( cleanRelative ).transform( o ) - return this.attr( 'transform', result ) - + var cleanRelative = relative === true ? this : (relative || false) + var result = new Matrix(cleanRelative).transform(o) + return this.attr('transform', result) } -registerMethods( 'Element', { +registerMethods('Element', { untransform, matrixify, toParent, toRoot, transform -} ) +}) diff --git a/src/svg.js b/src/svg.js index 7b79af9..4026598 100644 --- a/src/svg.js +++ b/src/svg.js @@ -3,13 +3,11 @@ import * as regex from './modules/core/regex.js' import { makeInstance } from './utils/adopter' // The main wrapping element -export default function SVG ( element ) { - - return makeInstance( element ) - +export default function SVG (element) { + return makeInstance(element) } -Object.assign( SVG, svgMembers ) +Object.assign(SVG, svgMembers) SVG.utils = SVG SVG.regex = regex diff --git a/src/types/ArrayPolyfill.js b/src/types/ArrayPolyfill.js index 0ee29a5..4d2309f 100644 --- a/src/types/ArrayPolyfill.js +++ b/src/types/ArrayPolyfill.js @@ -1,10 +1,8 @@ /* eslint no-new-func: "off" */ -export const subClassArray = ( function () { - +export const subClassArray = (function () { try { - // try es6 subclassing - return Function( 'name', 'baseClass', '_constructor', [ + return Function('name', 'baseClass', '_constructor', [ 'baseClass = baseClass || Array', 'return {', ' [name]: class extends baseClass {', @@ -14,35 +12,25 @@ export const subClassArray = ( function () { ' }', ' }', '}[name]' - ].join( '\n' ) ) - - } catch ( e ) { - + ].join('\n')) + } catch (e) { // Use es5 approach - return ( name, baseClass = Array, _constructor ) => { - + return (name, baseClass = Array, _constructor) => { const Arr = function () { - - baseClass.apply( this, arguments ) - _constructor && _constructor.apply( this, arguments ) - + baseClass.apply(this, arguments) + _constructor && _constructor.apply(this, arguments) } - Arr.prototype = Object.create( baseClass.prototype ) + Arr.prototype = Object.create(baseClass.prototype) Arr.prototype.constructor = Arr - Arr.prototype.map = function ( fn ) { - + Arr.prototype.map = function (fn) { const arr = new Arr() - arr.push.apply( arr, Array.prototype.map.call( this, fn ) ) + arr.push.apply(arr, Array.prototype.map.call(this, fn)) return arr - } return Arr - } - } - -} )() +})() diff --git a/src/types/Box.js b/src/types/Box.js index 2fcb923..c90c7e0 100644 --- a/src/types/Box.js +++ b/src/types/Box.js @@ -4,44 +4,32 @@ import { globals } from '../utils/window.js' import Point from './Point.js' import parser from '../modules/core/parser.js' -function isNulledBox ( box ) { - +function isNulledBox (box) { return !box.w && !box.h && !box.x && !box.y - } -function domContains ( node ) { - - return ( globals.document.documentElement.contains || function ( node ) { - +function domContains (node) { + return (globals.document.documentElement.contains || function (node) { // This is IE - it does not support contains() for top-level SVGs - while ( node.parentNode ) { - + while (node.parentNode) { node = node.parentNode - } return node === document - - } ).call( globals.document.documentElement, node ) - + }).call(globals.document.documentElement, node) } export default class Box { - - constructor ( ...args ) { - - this.init( ...args ) - + constructor (...args) { + this.init(...args) } - init ( source ) { - + init (source) { var base = [ 0, 0, 0, 0 ] - source = typeof source === 'string' ? source.split( delimiter ).map( parseFloat ) - : Array.isArray( source ) ? source + source = typeof source === 'string' ? source.split(delimiter).map(parseFloat) + : Array.isArray(source) ? source : typeof source === 'object' ? [ source.left != null ? source.left : source.x, source.top != null ? source.top : source.y, source.width, source.height ] - : arguments.length === 4 ? [].slice.call( arguments ) + : arguments.length === 4 ? [].slice.call(arguments) : base this.x = source[0] || 0 @@ -56,139 +44,105 @@ export default class Box { this.cy = this.y + this.h / 2 return this - } // Merge rect box with another, return a new instance - merge ( box ) { - - let x = Math.min( this.x, box.x ) - let y = Math.min( this.y, box.y ) - let width = Math.max( this.x + this.width, box.x + box.width ) - x - let height = Math.max( this.y + this.height, box.y + box.height ) - y - - return new Box( x, y, width, height ) + merge (box) { + let x = Math.min(this.x, box.x) + let y = Math.min(this.y, box.y) + let width = Math.max(this.x + this.width, box.x + box.width) - x + let height = Math.max(this.y + this.height, box.y + box.height) - y + return new Box(x, y, width, height) } - transform ( m ) { - + transform (m) { let xMin = Infinity let xMax = -Infinity let yMin = Infinity let yMax = -Infinity let pts = [ - new Point( this.x, this.y ), - new Point( this.x2, this.y ), - new Point( this.x, this.y2 ), - new Point( this.x2, this.y2 ) + new Point(this.x, this.y), + new Point(this.x2, this.y), + new Point(this.x, this.y2), + new Point(this.x2, this.y2) ] - pts.forEach( function ( p ) { - - p = p.transform( m ) - xMin = Math.min( xMin, p.x ) - xMax = Math.max( xMax, p.x ) - yMin = Math.min( yMin, p.y ) - yMax = Math.max( yMax, p.y ) - - } ) + pts.forEach(function (p) { + p = p.transform(m) + xMin = Math.min(xMin, p.x) + xMax = Math.max(xMax, p.x) + yMin = Math.min(yMin, p.y) + yMax = Math.max(yMax, p.y) + }) return new Box( xMin, yMin, xMax - xMin, yMax - yMin ) - } addOffset () { - // offset by window scroll position, because getBoundingClientRect changes when window is scrolled this.x += globals.window.pageXOffset this.y += globals.window.pageYOffset return this - } toString () { - return this.x + ' ' + this.y + ' ' + this.width + ' ' + this.height - } toArray () { - return [ this.x, this.y, this.width, this.height ] - } isNulled () { - - return isNulledBox( this ) - + return isNulledBox(this) } - } -function getBox ( cb ) { - +function getBox (cb) { let box try { + box = cb(this.node) - box = cb( this.node ) - - if ( isNulledBox( box ) && !domContains( this.node ) ) { - - throw new Error( 'Element not in the dom' ) - + if (isNulledBox(box) && !domContains(this.node)) { + throw new Error('Element not in the dom') } - - } catch ( e ) { - + } catch (e) { try { - - let clone = this.clone().addTo( parser().svg ).show() - box = cb( clone.node ) + let clone = this.clone().addTo(parser().svg).show() + box = cb(clone.node) clone.remove() - - } catch ( e ) { - - throw new Error( 'Getting a bounding box of element "' + this.node.nodeName + '" is not possible' ) - + } catch (e) { + throw new Error('Getting a bounding box of element "' + this.node.nodeName + '" is not possible') } - } return box - } export function bbox () { - - return new Box( getBox.call( this, ( node ) => node.getBBox() ) ) - + return new Box(getBox.call(this, (node) => node.getBBox())) } -export function rbox ( el ) { - - let box = new Box( getBox.call( this, ( node ) => node.getBoundingClientRect() ) ) - if ( el ) return box.transform( el.screenCTM().inverse() ) +export function rbox (el) { + let box = new Box(getBox.call(this, (node) => node.getBoundingClientRect())) + if (el) return box.transform(el.screenCTM().inverse()) return box.addOffset() - } -registerMethods( { +registerMethods({ viewbox: { - viewbox ( x, y, width, height ) { - + viewbox (x, y, width, height) { // act as getter - if ( x == null ) return new Box( this.attr( 'viewBox' ) ) + if (x == null) return new Box(this.attr('viewBox')) // act as setter - return this.attr( 'viewBox', new Box( x, y, width, height ) ) - + return this.attr('viewBox', new Box(x, y, width, height)) } } -} ) +}) diff --git a/src/types/EventTarget.js b/src/types/EventTarget.js index 3d755bf..5a005fd 100644 --- a/src/types/EventTarget.js +++ b/src/types/EventTarget.js @@ -2,79 +2,57 @@ import { dispatch, off, on } from '../modules/core/event.js' import Base from './Base.js' export default class EventTarget extends Base { - - constructor ( { events = {} } = {} ) { - + constructor ({ events = {} } = {}) { super() this.events = events - } addEventListener () {} - dispatch ( event, data ) { - - return dispatch( this, event, data ) - + dispatch (event, data) { + return dispatch(this, event, data) } - dispatchEvent ( event ) { - + dispatchEvent (event) { const bag = this.getEventHolder().events - if ( !bag ) return true + if (!bag) return true const events = bag[event.type] - for ( let i in events ) { - - for ( let j in events[i] ) { - - events[i][j]( event ) - + for (let i in events) { + for (let j in events[i]) { + events[i][j](event) } - } return !event.defaultPrevented - } // Fire given event - fire ( event, data ) { - - this.dispatch( event, data ) + fire (event, data) { + this.dispatch(event, data) return this - } getEventHolder () { - return this - } getEventTarget () { - return this - } // Unbind event from listener - off ( event, listener ) { - - off( this, event, listener ) + off (event, listener) { + off(this, event, listener) return this - } // Bind given event to listener - on ( event, listener, binding, options ) { - - on( this, event, listener, binding, options ) + on (event, listener, binding, options) { + on(this, event, listener, binding, options) return this - } removeEventListener () {} - } diff --git a/src/types/List.js b/src/types/List.js index a2d2226..ccdf11d 100644 --- a/src/types/List.js +++ b/src/types/List.js @@ -1,62 +1,42 @@ import { extend } from '../utils/adopter.js' import { subClassArray } from './ArrayPolyfill.js' -const List = subClassArray( 'List', Array, function ( arr = [] ) { - +const List = subClassArray('List', Array, function (arr = []) { // This catches the case, that native map tries to create an array with new Array(1) - if ( typeof arr === 'number' ) return this + if (typeof arr === 'number') return this this.length = 0 - this.push( ...arr ) - -} ) + this.push(...arr) +}) export default List -extend( List, { - each ( fnOrMethodName, ...args ) { - - if ( typeof fnOrMethodName === 'function' ) { - - this.forEach( ( el ) => { - - fnOrMethodName.call( el, el ) - - } ) - +extend(List, { + each (fnOrMethodName, ...args) { + if (typeof fnOrMethodName === 'function') { + this.forEach((el) => { + fnOrMethodName.call(el, el) + }) } else { - - return this.map( el => { - - return el[fnOrMethodName]( ...args ) - - } ) - + return this.map(el => { + return el[fnOrMethodName](...args) + }) } return this - }, toArray () { - - return Array.prototype.concat.apply( [], this ) - + return Array.prototype.concat.apply([], this) } -} ) - -List.extend = function ( methods ) { - - methods = methods.reduce( ( obj, name ) => { - - obj[name] = function ( ...attrs ) { - - return this.each( name, ...attrs ) +}) +List.extend = function (methods) { + methods = methods.reduce((obj, name) => { + obj[name] = function (...attrs) { + return this.each(name, ...attrs) } return obj + }, {}) - }, {} ) - - extend( List, methods ) - + extend(List, methods) } diff --git a/src/types/Matrix.js b/src/types/Matrix.js index a9a311e..102192b 100644 --- a/src/types/Matrix.js +++ b/src/types/Matrix.js @@ -3,32 +3,26 @@ import { radians } from '../utils/utils.js' import Element from '../elements/Element.js' import Point from './Point.js' -function closeEnough ( a, b, threshold ) { - - return Math.abs( b - a ) < ( threshold || 1e-6 ) - +function closeEnough (a, b, threshold) { + return Math.abs(b - a) < (threshold || 1e-6) } export default class Matrix { - - constructor ( ...args ) { - - this.init( ...args ) - + constructor (...args) { + this.init(...args) } // Initialize - init ( source ) { - - var base = Matrix.fromArray( [ 1, 0, 0, 1, 0, 0 ] ) + init (source) { + var base = Matrix.fromArray([ 1, 0, 0, 1, 0, 0 ]) // ensure source as object source = source instanceof Element ? source.matrixify() - : typeof source === 'string' ? Matrix.fromArray( source.split( delimiter ).map( parseFloat ) ) - : Array.isArray( source ) ? Matrix.fromArray( source ) - : ( typeof source === 'object' && Matrix.isMatrixLike( source ) ) ? source - : ( typeof source === 'object' ) ? new Matrix().transform( source ) - : arguments.length === 6 ? Matrix.fromArray( [].slice.call( arguments ) ) + : typeof source === 'string' ? Matrix.fromArray(source.split(delimiter).map(parseFloat)) + : Array.isArray(source) ? Matrix.fromArray(source) + : (typeof source === 'object' && Matrix.isMatrixLike(source)) ? source + : (typeof source === 'object') ? new Matrix().transform(source) + : arguments.length === 6 ? Matrix.fromArray([].slice.call(arguments)) : base // Merge the source matrix with the base matrix @@ -40,68 +34,56 @@ export default class Matrix { this.f = source.f != null ? source.f : base.f return this - } // Clones this matrix clone () { - - return new Matrix( this ) - + return new Matrix(this) } // Transform a matrix into another matrix by manipulating the space - transform ( o ) { - + transform (o) { // Check if o is a matrix and then left multiply it directly - if ( Matrix.isMatrixLike( o ) ) { - - var matrix = new Matrix( o ) - return matrix.multiplyO( this ) - + if (Matrix.isMatrixLike(o)) { + var matrix = new Matrix(o) + return matrix.multiplyO(this) } // Get the proposed transformations and the current transformations - var t = Matrix.formatTransforms( o ) + var t = Matrix.formatTransforms(o) var current = this - let { x: ox, y: oy } = new Point( t.ox, t.oy ).transform( current ) + let { x: ox, y: oy } = new Point(t.ox, t.oy).transform(current) // Construct the resulting matrix var transformer = new Matrix() - .translateO( t.rx, t.ry ) - .lmultiplyO( current ) - .translateO( -ox, -oy ) - .scaleO( t.scaleX, t.scaleY ) - .skewO( t.skewX, t.skewY ) - .shearO( t.shear ) - .rotateO( t.theta ) - .translateO( ox, oy ) + .translateO(t.rx, t.ry) + .lmultiplyO(current) + .translateO(-ox, -oy) + .scaleO(t.scaleX, t.scaleY) + .skewO(t.skewX, t.skewY) + .shearO(t.shear) + .rotateO(t.theta) + .translateO(ox, oy) // If we want the origin at a particular place, we force it there - if ( isFinite( t.px ) || isFinite( t.py ) ) { - - const origin = new Point( ox, oy ).transform( transformer ) + if (isFinite(t.px) || isFinite(t.py)) { + const origin = new Point(ox, oy).transform(transformer) // TODO: Replace t.px with isFinite(t.px) const dx = t.px ? t.px - origin.x : 0 const dy = t.py ? t.py - origin.y : 0 - transformer.translateO( dx, dy ) - + transformer.translateO(dx, dy) } // Translate now after positioning - transformer.translateO( t.tx, t.ty ) + transformer.translateO(t.tx, t.ty) return transformer - } // Applies a matrix defined by its affine parameters - compose ( o ) { - - if ( o.origin ) { - + compose (o) { + if (o.origin) { o.originX = o.origin[0] o.originY = o.origin[1] - } // Get the parameters var ox = o.originX || 0 @@ -115,20 +97,18 @@ export default class Matrix { // Apply the standard matrix var result = new Matrix() - .translateO( -ox, -oy ) - .scaleO( sx, sy ) - .shearO( lam ) - .rotateO( theta ) - .translateO( tx, ty ) - .lmultiplyO( this ) - .translateO( ox, oy ) + .translateO(-ox, -oy) + .scaleO(sx, sy) + .shearO(lam) + .rotateO(theta) + .translateO(tx, ty) + .lmultiplyO(this) + .translateO(ox, oy) return result - } // Decomposes this matrix into its affine parameters - decompose ( cx = 0, cy = 0 ) { - + decompose (cx = 0, cy = 0) { // Get the parameters from the matrix var a = this.a var b = this.b @@ -143,20 +123,20 @@ export default class Matrix { // Since we only shear in x, we can use the x basis to get the x scale // and the rotation of the resulting matrix - var sx = ccw * Math.sqrt( a * a + b * b ) - var thetaRad = Math.atan2( ccw * b, ccw * a ) + var sx = ccw * Math.sqrt(a * a + b * b) + var thetaRad = Math.atan2(ccw * b, ccw * a) var theta = 180 / Math.PI * thetaRad - var ct = Math.cos( thetaRad ) - var st = Math.sin( thetaRad ) + var ct = Math.cos(thetaRad) + var st = Math.sin(thetaRad) // We can then solve the y basis vector simultaneously to get the other // two affine parameters directly from these parameters - var lam = ( a * c + b * d ) / determinant - var sy = ( ( c * sx ) / ( lam * a - b ) ) || ( ( d * sx ) / ( lam * b + a ) ) + var lam = (a * c + b * d) / determinant + var sy = ((c * sx) / (lam * a - b)) || ((d * sx) / (lam * b + a)) // Use the translations - let tx = e - cx + cx * ct * sx + cy * ( lam * ct * sx - st * sy ) - let ty = f - cy + cx * st * sx + cy * ( lam * st * sx + ct * sy ) + let tx = e - cx + cx * ct * sx + cy * (lam * ct * sx - st * sy) + let ty = f - cy + cx * st * sx + cy * (lam * st * sx + ct * sy) // Construct the decomposition and return it return { @@ -178,48 +158,38 @@ export default class Matrix { e: this.e, f: this.f } - } // Left multiplies by the given matrix - multiply ( matrix ) { - - return this.clone().multiplyO( matrix ) - + multiply (matrix) { + return this.clone().multiplyO(matrix) } - multiplyO ( matrix ) { - + multiplyO (matrix) { // Get the matrices var l = this var r = matrix instanceof Matrix ? matrix - : new Matrix( matrix ) - - return Matrix.matrixMultiply( l, r, this ) + : new Matrix(matrix) + return Matrix.matrixMultiply(l, r, this) } - lmultiply ( matrix ) { - - return this.clone().lmultiplyO( matrix ) - + lmultiply (matrix) { + return this.clone().lmultiplyO(matrix) } - lmultiplyO ( matrix ) { - + lmultiplyO (matrix) { var r = this var l = matrix instanceof Matrix ? matrix - : new Matrix( matrix ) - - return Matrix.matrixMultiply( l, r, this ) + : new Matrix(matrix) + return Matrix.matrixMultiply(l, r, this) } // Inverses matrix inverseO () { - // Get the current parameters out of the matrix var a = this.a var b = this.b @@ -230,7 +200,7 @@ export default class Matrix { // Invert the 2x2 matrix in the top left var det = a * d - b * c - if ( !det ) throw new Error( 'Cannot invert ' + this ) + if (!det) throw new Error('Cannot invert ' + this) // Calculate the top 2x2 matrix var na = d / det @@ -239,8 +209,8 @@ export default class Matrix { var nd = a / det // Apply the inverted matrix to the top right - var ne = -( na * e + nc * f ) - var nf = -( nb * e + nd * f ) + var ne = -(na * e + nc * f) + var nf = -(nb * e + nd * f) // Construct the inverted matrix this.a = na @@ -251,46 +221,34 @@ export default class Matrix { this.f = nf return this - } inverse () { - return this.clone().inverseO() - } // Translate matrix - translate ( x, y ) { - - return this.clone().translateO( x, y ) - + translate (x, y) { + return this.clone().translateO(x, y) } - translateO ( x, y ) { - + translateO (x, y) { this.e += x || 0 this.f += y || 0 return this - } // Scale matrix - scale ( x, y, cx, cy ) { - - return this.clone().scaleO( ...arguments ) - + scale (x, y, cx, cy) { + return this.clone().scaleO(...arguments) } - scaleO ( x, y = x, cx = 0, cy = 0 ) { - + scaleO (x, y = x, cx = 0, cy = 0) { // Support uniform scaling - if ( arguments.length === 3 ) { - + if (arguments.length === 3) { cy = cx cx = y y = x - } let { a, b, c, d, e, f } = this @@ -303,23 +261,19 @@ export default class Matrix { this.f = f * y - cy * y + cy return this - } // Rotate matrix - rotate ( r, cx, cy ) { - - return this.clone().rotateO( r, cx, cy ) - + rotate (r, cx, cy) { + return this.clone().rotateO(r, cx, cy) } - rotateO ( r, cx = 0, cy = 0 ) { - + rotateO (r, cx = 0, cy = 0) { // Convert degrees to radians - r = radians( r ) + r = radians(r) - let cos = Math.cos( r ) - let sin = Math.sin( r ) + let cos = Math.cos(r) + let sin = Math.sin(r) let { a, b, c, d, e, f } = this @@ -331,33 +285,25 @@ export default class Matrix { this.f = f * cos + e * sin - cx * sin - cy * cos + cy return this - } // Flip matrix on x or y, at a given offset - flip ( axis, around ) { - - return this.clone().flipO( axis, around ) - + flip (axis, around) { + return this.clone().flipO(axis, around) } - flipO ( axis, around ) { - - return axis === 'x' ? this.scaleO( -1, 1, around, 0 ) - : axis === 'y' ? this.scaleO( 1, -1, 0, around ) - : this.scaleO( -1, -1, axis, around || axis ) // Define an x, y flip point - + flipO (axis, around) { + return axis === 'x' ? this.scaleO(-1, 1, around, 0) + : axis === 'y' ? this.scaleO(1, -1, 0, around) + : this.scaleO(-1, -1, axis, around || axis) // Define an x, y flip point } // Shear matrix - shear ( a, cx, cy ) { - - return this.clone().shearO( a, cx, cy ) - + shear (a, cx, cy) { + return this.clone().shearO(a, cx, cy) } - shearO ( lx, cx = 0, cy = 0 ) { - + shearO (lx, cx = 0, cy = 0) { let { a, b, c, d, e, f } = this this.a = a + b * lx @@ -365,33 +311,27 @@ export default class Matrix { this.e = e + f * lx - cy * lx return this - } // Skew Matrix - skew ( x, y, cx, cy ) { - - return this.clone().skewO( ...arguments ) - + skew (x, y, cx, cy) { + return this.clone().skewO(...arguments) } - skewO ( x, y = x, cx = 0, cy = 0 ) { - + skewO (x, y = x, cx = 0, cy = 0) { // support uniformal skew - if ( arguments.length === 3 ) { - + if (arguments.length === 3) { cy = cx cx = y y = x - } // Convert degrees to radians - x = radians( x ) - y = radians( y ) + x = radians(x) + y = radians(y) - let lx = Math.tan( x ) - let ly = Math.tan( y ) + let lx = Math.tan(x) + let ly = Math.tan(y) let { a, b, c, d, e, f } = this @@ -403,75 +343,55 @@ export default class Matrix { this.f = f + e * ly - cx * ly return this - } // SkewX - skewX ( x, cx, cy ) { - - return this.skew( x, 0, cx, cy ) - + skewX (x, cx, cy) { + return this.skew(x, 0, cx, cy) } - skewXO ( x, cx, cy ) { - - return this.skewO( x, 0, cx, cy ) - + skewXO (x, cx, cy) { + return this.skewO(x, 0, cx, cy) } // SkewY - skewY ( y, cx, cy ) { - - return this.skew( 0, y, cx, cy ) - + skewY (y, cx, cy) { + return this.skew(0, y, cx, cy) } - skewYO ( y, cx, cy ) { - - return this.skewO( 0, y, cx, cy ) - + skewYO (y, cx, cy) { + return this.skewO(0, y, cx, cy) } // Transform around a center point - aroundO ( cx, cy, matrix ) { - + aroundO (cx, cy, matrix) { var dx = cx || 0 var dy = cy || 0 - return this.translateO( -dx, -dy ).lmultiplyO( matrix ).translateO( dx, dy ) - + return this.translateO(-dx, -dy).lmultiplyO(matrix).translateO(dx, dy) } - around ( cx, cy, matrix ) { - - return this.clone().aroundO( cx, cy, matrix ) - + around (cx, cy, matrix) { + return this.clone().aroundO(cx, cy, matrix) } // Check if two matrices are equal - equals ( other ) { - - var comp = new Matrix( other ) - return closeEnough( this.a, comp.a ) && closeEnough( this.b, comp.b ) - && closeEnough( this.c, comp.c ) && closeEnough( this.d, comp.d ) - && closeEnough( this.e, comp.e ) && closeEnough( this.f, comp.f ) - + equals (other) { + var comp = new Matrix(other) + return closeEnough(this.a, comp.a) && closeEnough(this.b, comp.b) + && closeEnough(this.c, comp.c) && closeEnough(this.d, comp.d) + && closeEnough(this.e, comp.e) && closeEnough(this.f, comp.f) } // Convert matrix to string toString () { - return 'matrix(' + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ')' - } toArray () { - return [ this.a, this.b, this.c, this.d, this.e, this.f ] - } valueOf () { - return { a: this.a, b: this.b, @@ -480,17 +400,13 @@ export default class Matrix { e: this.e, f: this.f } - } - static fromArray ( a ) { - + static fromArray (a) { return { a: a[0], b: a[1], c: a[2], d: a[3], e: a[4], f: a[5] } - } - static isMatrixLike ( o ) { - + static isMatrixLike (o) { return ( o.a != null || o.b != null @@ -499,43 +415,41 @@ export default class Matrix { || o.e != null || o.f != null ) - } - static formatTransforms ( o ) { - + static formatTransforms (o) { // Get all of the parameters required to form the matrix var flipBoth = o.flip === 'both' || o.flip === true - var flipX = o.flip && ( flipBoth || o.flip === 'x' ) ? -1 : 1 - var flipY = o.flip && ( flipBoth || o.flip === 'y' ) ? -1 : 1 + var flipX = o.flip && (flipBoth || o.flip === 'x') ? -1 : 1 + var flipY = o.flip && (flipBoth || o.flip === 'y') ? -1 : 1 var skewX = o.skew && o.skew.length ? o.skew[0] - : isFinite( o.skew ) ? o.skew - : isFinite( o.skewX ) ? o.skewX + : isFinite(o.skew) ? o.skew + : isFinite(o.skewX) ? o.skewX : 0 var skewY = o.skew && o.skew.length ? o.skew[1] - : isFinite( o.skew ) ? o.skew - : isFinite( o.skewY ) ? o.skewY + : isFinite(o.skew) ? o.skew + : isFinite(o.skewY) ? o.skewY : 0 var scaleX = o.scale && o.scale.length ? o.scale[0] * flipX - : isFinite( o.scale ) ? o.scale * flipX - : isFinite( o.scaleX ) ? o.scaleX * flipX + : isFinite(o.scale) ? o.scale * flipX + : isFinite(o.scaleX) ? o.scaleX * flipX : flipX var scaleY = o.scale && o.scale.length ? o.scale[1] * flipY - : isFinite( o.scale ) ? o.scale * flipY - : isFinite( o.scaleY ) ? o.scaleY * flipY + : isFinite(o.scale) ? o.scale * flipY + : isFinite(o.scaleY) ? o.scaleY * flipY : flipY var shear = o.shear || 0 var theta = o.rotate || o.theta || 0 - var origin = new Point( o.origin || o.around || o.ox || o.originX, o.oy || o.originY ) + var origin = new Point(o.origin || o.around || o.ox || o.originX, o.oy || o.originY) var ox = origin.x var oy = origin.y - var position = new Point( o.position || o.px || o.positionX, o.py || o.positionY ) + var position = new Point(o.position || o.px || o.positionX, o.py || o.positionY) var px = position.x var py = position.y - var translate = new Point( o.translate || o.tx || o.translateX, o.ty || o.translateY ) + var translate = new Point(o.translate || o.tx || o.translateX, o.ty || o.translateY) var tx = translate.x var ty = translate.y - var relative = new Point( o.relative || o.rx || o.relativeX, o.ry || o.relativeY ) + var relative = new Point(o.relative || o.rx || o.relativeX, o.ry || o.relativeY) var rx = relative.x var ry = relative.y @@ -543,12 +457,10 @@ export default class Matrix { return { scaleX, scaleY, skewX, skewY, shear, theta, rx, ry, tx, ty, ox, oy, px, py } - } // left matrix, right matrix, target matrix which is overwritten - static matrixMultiply ( l, r, o ) { - + static matrixMultiply (l, r, o) { // Work out the product directly var a = l.a * r.a + l.c * r.b var b = l.b * r.a + l.d * r.b @@ -566,31 +478,23 @@ export default class Matrix { o.f = f return o - } - } export function ctm () { - - return new Matrix( this.node.getCTM() ) - + return new Matrix(this.node.getCTM()) } export function screenCTM () { - /* https://bugzilla.mozilla.org/show_bug.cgi?id=1344537 This is needed because FF does not return the transformation matrix for the inner coordinate system when getScreenCTM() is called on nested svgs. However all other Browsers do that */ - if ( typeof this.isRoot === 'function' && !this.isRoot() ) { - - var rect = this.rect( 1, 1 ) + if (typeof this.isRoot === 'function' && !this.isRoot()) { + var rect = this.rect(1, 1) var m = rect.node.getScreenCTM() rect.remove() - return new Matrix( m ) - + return new Matrix(m) } - return new Matrix( this.node.getScreenCTM() ) - + return new Matrix(this.node.getScreenCTM()) } diff --git a/src/types/Morphable.js b/src/types/Morphable.js index 87fa800..240215b 100644 --- a/src/types/Morphable.js +++ b/src/types/Morphable.js @@ -11,200 +11,135 @@ import SVGArray from './SVGArray.js' import SVGNumber from './SVGNumber.js' export default class Morphable { - - constructor ( stepper ) { - - this._stepper = stepper || new Ease( '-' ) + constructor (stepper) { + this._stepper = stepper || new Ease('-') this._from = null this._to = null this._type = null this._context = null this._morphObj = null - } - from ( val ) { - - if ( val == null ) { - + from (val) { + if (val == null) { return this._from - } - this._from = this._set( val ) + this._from = this._set(val) return this - } - to ( val ) { - - if ( val == null ) { - + to (val) { + if (val == null) { return this._to - } - this._to = this._set( val ) + this._to = this._set(val) return this - } - type ( type ) { - + type (type) { // getter - if ( type == null ) { - + if (type == null) { return this._type - } // setter this._type = type return this - } - _set ( value ) { - - if ( !this._type ) { - + _set (value) { + if (!this._type) { var type = typeof value - if ( type === 'number' ) { - - this.type( SVGNumber ) - - } else if ( type === 'string' ) { - - if ( Color.isColor( value ) ) { - - this.type( Color ) - - } else if ( delimiter.test( value ) ) { - - this.type( pathLetters.test( value ) + if (type === 'number') { + this.type(SVGNumber) + } else if (type === 'string') { + if (Color.isColor(value)) { + this.type(Color) + } else if (delimiter.test(value)) { + this.type(pathLetters.test(value) ? PathArray : SVGArray ) - - } else if ( numberAndUnit.test( value ) ) { - - this.type( SVGNumber ) - + } else if (numberAndUnit.test(value)) { + this.type(SVGNumber) } else { - - this.type( NonMorphable ) - + this.type(NonMorphable) } - - } else if ( morphableTypes.indexOf( value.constructor ) > -1 ) { - - this.type( value.constructor ) - - } else if ( Array.isArray( value ) ) { - - this.type( SVGArray ) - - } else if ( type === 'object' ) { - - this.type( ObjectBag ) - + } else if (morphableTypes.indexOf(value.constructor) > -1) { + this.type(value.constructor) + } else if (Array.isArray(value)) { + this.type(SVGArray) + } else if (type === 'object') { + this.type(ObjectBag) } else { - - this.type( NonMorphable ) - + this.type(NonMorphable) } - } - var result = ( new this._type( value ) ).toArray() + var result = (new this._type(value)).toArray() this._morphObj = this._morphObj || new this._type() this._context = this._context - || Array.apply( null, Array( result.length ) ).map( Object ) + || Array.apply(null, Array(result.length)).map(Object) return result - } - stepper ( stepper ) { - - if ( stepper == null ) return this._stepper + stepper (stepper) { + if (stepper == null) return this._stepper this._stepper = stepper return this - } done () { - var complete = this._context - .map( this._stepper.done ) - .reduce( function ( last, curr ) { - + .map(this._stepper.done) + .reduce(function (last, curr) { return last && curr - - }, true ) + }, true) return complete - } - at ( pos ) { - + at (pos) { var _this = this return this._morphObj.fromArray( - this._from.map( function ( i, index ) { - - return _this._stepper.step( i, _this._to[index], pos, _this._context[index], _this._context ) - - } ) + this._from.map(function (i, index) { + return _this._stepper.step(i, _this._to[index], pos, _this._context[index], _this._context) + }) ) - } - } export class NonMorphable { - - constructor ( ...args ) { - - this.init( ...args ) - + constructor (...args) { + this.init(...args) } - init ( val ) { - - val = Array.isArray( val ) ? val[0] : val + init (val) { + val = Array.isArray(val) ? val[0] : val this.value = val return this - } valueOf () { - return this.value - } toArray () { - return [ this.value ] - } - } export class TransformBag { - - constructor ( ...args ) { - - this.init( ...args ) - + constructor (...args) { + this.init(...args) } - init ( obj ) { - - if ( Array.isArray( obj ) ) { - + init (obj) { + if (Array.isArray(obj)) { obj = { scaleX: obj[0], scaleY: obj[1], @@ -215,16 +150,13 @@ export class TransformBag { originX: obj[6], originY: obj[7] } - } - Object.assign( this, TransformBag.defaults, obj ) + Object.assign(this, TransformBag.defaults, obj) return this - } toArray () { - var v = this return [ @@ -237,9 +169,7 @@ export class TransformBag { v.originX, v.originY ] - } - } TransformBag.defaults = { @@ -254,56 +184,40 @@ TransformBag.defaults = { } export class ObjectBag { - - constructor ( ...args ) { - - this.init( ...args ) - + constructor (...args) { + this.init(...args) } - init ( objOrArr ) { - + init (objOrArr) { this.values = [] - if ( Array.isArray( objOrArr ) ) { - + if (Array.isArray(objOrArr)) { this.values = objOrArr return - } - var entries = Object.entries( objOrArr || {} ).sort( ( a, b ) => { - + var entries = Object.entries(objOrArr || {}).sort((a, b) => { return a[0] - b[0] + }) - } ) - - this.values = entries.reduce( ( last, curr ) => last.concat( curr ), [] ) + this.values = entries.reduce((last, curr) => last.concat(curr), []) return this - } valueOf () { - var obj = {} var arr = this.values - for ( var i = 0, len = arr.length; i < len; i += 2 ) { - + for (var i = 0, len = arr.length; i < len; i += 2) { obj[arr[i]] = arr[i + 1] - } return obj - } toArray () { - return this.values - } - } const morphableTypes = [ @@ -312,29 +226,21 @@ const morphableTypes = [ ObjectBag ] -export function registerMorphableType ( type = [] ) { - - morphableTypes.push( ...[].concat( type ) ) - +export function registerMorphableType (type = []) { + morphableTypes.push(...[].concat(type)) } export function makeMorphable () { - - extend( morphableTypes, { - to ( val ) { - + extend(morphableTypes, { + to (val) { return new Morphable() - .type( this.constructor ) - .from( this.valueOf() ) - .to( val ) - + .type(this.constructor) + .from(this.valueOf()) + .to(val) }, - fromArray ( arr ) { - - this.init( arr ) + fromArray (arr) { + this.init(arr) return this - } - } ) - + }) } diff --git a/src/types/PathArray.js b/src/types/PathArray.js index 739218d..764d05c 100644 --- a/src/types/PathArray.js +++ b/src/types/PathArray.js @@ -12,182 +12,131 @@ import Point from './Point.js' import SVGArray from './SVGArray.js' import parser from '../modules/core/parser.js' -const PathArray = subClassArray( 'PathArray', SVGArray ) +const PathArray = subClassArray('PathArray', SVGArray) export default PathArray -export function pathRegReplace ( a, b, c, d ) { - - return c + d.replace( dots, ' .' ) - +export function pathRegReplace (a, b, c, d) { + return c + d.replace(dots, ' .') } -function arrayToString ( a ) { - - for ( var i = 0, il = a.length, s = ''; i < il; i++ ) { - +function arrayToString (a) { + for (var i = 0, il = a.length, s = ''; i < il; i++) { s += a[i][0] - if ( a[i][1] != null ) { - + if (a[i][1] != null) { s += a[i][1] - if ( a[i][2] != null ) { - + if (a[i][2] != null) { s += ' ' s += a[i][2] - if ( a[i][3] != null ) { - + if (a[i][3] != null) { s += ' ' s += a[i][3] s += ' ' s += a[i][4] - if ( a[i][5] != null ) { - + if (a[i][5] != null) { s += ' ' s += a[i][5] s += ' ' s += a[i][6] - if ( a[i][7] != null ) { - + if (a[i][7] != null) { s += ' ' s += a[i][7] - } - } - } - } - } - } return s + ' ' - } const pathHandlers = { - M: function ( c, p, p0 ) { - + M: function (c, p, p0) { p.x = p0.x = c[0] p.y = p0.y = c[1] return [ 'M', p.x, p.y ] - }, - L: function ( c, p ) { - + L: function (c, p) { p.x = c[0] p.y = c[1] return [ 'L', c[0], c[1] ] - }, - H: function ( c, p ) { - + H: function (c, p) { p.x = c[0] return [ 'H', c[0] ] - }, - V: function ( c, p ) { - + V: function (c, p) { p.y = c[0] return [ 'V', c[0] ] - }, - C: function ( c, p ) { - + C: function (c, p) { p.x = c[4] p.y = c[5] return [ 'C', c[0], c[1], c[2], c[3], c[4], c[5] ] - }, - S: function ( c, p ) { - + S: function (c, p) { p.x = c[2] p.y = c[3] return [ 'S', c[0], c[1], c[2], c[3] ] - }, - Q: function ( c, p ) { - + Q: function (c, p) { p.x = c[2] p.y = c[3] return [ 'Q', c[0], c[1], c[2], c[3] ] - }, - T: function ( c, p ) { - + T: function (c, p) { p.x = c[0] p.y = c[1] return [ 'T', c[0], c[1] ] - }, - Z: function ( c, p, p0 ) { - + Z: function (c, p, p0) { p.x = p0.x p.y = p0.y return [ 'Z' ] - }, - A: function ( c, p ) { - + A: function (c, p) { p.x = c[5] p.y = c[6] return [ 'A', c[0], c[1], c[2], c[3], c[4], c[5], c[6] ] - } } -let mlhvqtcsaz = 'mlhvqtcsaz'.split( '' ) - -for ( var i = 0, il = mlhvqtcsaz.length; i < il; ++i ) { - - pathHandlers[mlhvqtcsaz[i]] = ( function ( i ) { - - return function ( c, p, p0 ) { - - if ( i === 'H' ) c[0] = c[0] + p.x - else if ( i === 'V' ) c[0] = c[0] + p.y - else if ( i === 'A' ) { +let mlhvqtcsaz = 'mlhvqtcsaz'.split('') +for (var i = 0, il = mlhvqtcsaz.length; i < il; ++i) { + pathHandlers[mlhvqtcsaz[i]] = (function (i) { + return function (c, p, p0) { + if (i === 'H') c[0] = c[0] + p.x + else if (i === 'V') c[0] = c[0] + p.y + else if (i === 'A') { c[5] = c[5] + p.x c[6] = c[6] + p.y - } else { - - for ( var j = 0, jl = c.length; j < jl; ++j ) { - - c[j] = c[j] + ( j % 2 ? p.y : p.x ) - + for (var j = 0, jl = c.length; j < jl; ++j) { + c[j] = c[j] + (j % 2 ? p.y : p.x) } - } - return pathHandlers[i]( c, p, p0 ) - + return pathHandlers[i](c, p, p0) } - - } )( mlhvqtcsaz[i].toUpperCase() ) - + })(mlhvqtcsaz[i].toUpperCase()) } -extend( PathArray, { +extend(PathArray, { // Convert array to string toString () { - - return arrayToString( this ) - + return arrayToString(this) }, // Move path string - move ( x, y ) { - + move (x, y) { // get bounding box of current situation var box = this.bbox() @@ -195,154 +144,110 @@ extend( PathArray, { x -= box.x y -= box.y - if ( !isNaN( x ) && !isNaN( y ) ) { - + if (!isNaN(x) && !isNaN(y)) { // move every point - for ( var l, i = this.length - 1; i >= 0; i-- ) { - + for (var l, i = this.length - 1; i >= 0; i--) { l = this[i][0] - if ( l === 'M' || l === 'L' || l === 'T' ) { - + if (l === 'M' || l === 'L' || l === 'T') { this[i][1] += x this[i][2] += y - - } else if ( l === 'H' ) { - + } else if (l === 'H') { this[i][1] += x - - } else if ( l === 'V' ) { - + } else if (l === 'V') { this[i][1] += y - - } else if ( l === 'C' || l === 'S' || l === 'Q' ) { - + } else if (l === 'C' || l === 'S' || l === 'Q') { this[i][1] += x this[i][2] += y this[i][3] += x this[i][4] += y - if ( l === 'C' ) { - + if (l === 'C') { this[i][5] += x this[i][6] += y - } - - } else if ( l === 'A' ) { - + } else if (l === 'A') { this[i][6] += x this[i][7] += y - } - } - } return this - }, // Resize path string - size ( width, height ) { - + size (width, height) { // get bounding box of current situation var box = this.bbox() var i, l // recalculate position of all points according to new size - for ( i = this.length - 1; i >= 0; i-- ) { - + for (i = this.length - 1; i >= 0; i--) { l = this[i][0] - if ( l === 'M' || l === 'L' || l === 'T' ) { - - this[i][1] = ( ( this[i][1] - box.x ) * width ) / box.width + box.x - this[i][2] = ( ( this[i][2] - box.y ) * height ) / box.height + box.y - - } else if ( l === 'H' ) { - - this[i][1] = ( ( this[i][1] - box.x ) * width ) / box.width + box.x - - } else if ( l === 'V' ) { - - this[i][1] = ( ( this[i][1] - box.y ) * height ) / box.height + box.y - - } else if ( l === 'C' || l === 'S' || l === 'Q' ) { - - this[i][1] = ( ( this[i][1] - box.x ) * width ) / box.width + box.x - this[i][2] = ( ( this[i][2] - box.y ) * height ) / box.height + box.y - this[i][3] = ( ( this[i][3] - box.x ) * width ) / box.width + box.x - this[i][4] = ( ( this[i][4] - box.y ) * height ) / box.height + box.y - - if ( l === 'C' ) { - - this[i][5] = ( ( this[i][5] - box.x ) * width ) / box.width + box.x - this[i][6] = ( ( this[i][6] - box.y ) * height ) / box.height + box.y - + if (l === 'M' || l === 'L' || l === 'T') { + this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x + this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y + } else if (l === 'H') { + this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x + } else if (l === 'V') { + this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y + } else if (l === 'C' || l === 'S' || l === 'Q') { + this[i][1] = ((this[i][1] - box.x) * width) / box.width + box.x + this[i][2] = ((this[i][2] - box.y) * height) / box.height + box.y + this[i][3] = ((this[i][3] - box.x) * width) / box.width + box.x + this[i][4] = ((this[i][4] - box.y) * height) / box.height + box.y + + if (l === 'C') { + this[i][5] = ((this[i][5] - box.x) * width) / box.width + box.x + this[i][6] = ((this[i][6] - box.y) * height) / box.height + box.y } - - } else if ( l === 'A' ) { - + } else if (l === 'A') { // resize radii - this[i][1] = ( this[i][1] * width ) / box.width - this[i][2] = ( this[i][2] * height ) / box.height + this[i][1] = (this[i][1] * width) / box.width + this[i][2] = (this[i][2] * height) / box.height // move position values - this[i][6] = ( ( this[i][6] - box.x ) * width ) / box.width + box.x - this[i][7] = ( ( this[i][7] - box.y ) * height ) / box.height + box.y - + this[i][6] = ((this[i][6] - box.x) * width) / box.width + box.x + this[i][7] = ((this[i][7] - box.y) * height) / box.height + box.y } - } return this - }, // Test if the passed path array use the same path data commands as this path array - equalCommands ( pathArray ) { - + equalCommands (pathArray) { var i, il, equalCommands - pathArray = new PathArray( pathArray ) + pathArray = new PathArray(pathArray) equalCommands = this.length === pathArray.length - for ( i = 0, il = this.length; equalCommands && i < il; i++ ) { - + for (i = 0, il = this.length; equalCommands && i < il; i++) { equalCommands = this[i][0] === pathArray[i][0] - } return equalCommands - }, // Make path array morphable - morph ( pathArray ) { - - pathArray = new PathArray( pathArray ) - - if ( this.equalCommands( pathArray ) ) { + morph (pathArray) { + pathArray = new PathArray(pathArray) + if (this.equalCommands(pathArray)) { this.destination = pathArray - } else { - this.destination = null - } return this - }, // Get morphed path array at given position - at ( pos ) { - + at (pos) { // make sure a destination is defined - if ( !this.destination ) return this + if (!this.destination) return this var sourceArray = this var destinationArray = this.destination.value @@ -352,61 +257,47 @@ extend( PathArray, { // Animate has specified in the SVG spec // See: https://www.w3.org/TR/SVG11/paths.html#PathElement - for ( i = 0, il = sourceArray.length; i < il; i++ ) { - + for (i = 0, il = sourceArray.length; i < il; i++) { array[i] = [ sourceArray[i][0] ] - for ( j = 1, jl = sourceArray[i].length; j < jl; j++ ) { - - array[i][j] = sourceArray[i][j] + ( destinationArray[i][j] - sourceArray[i][j] ) * pos - + for (j = 1, jl = sourceArray[i].length; j < jl; j++) { + array[i][j] = sourceArray[i][j] + (destinationArray[i][j] - sourceArray[i][j]) * pos } // For the two flags of the elliptical arc command, the SVG spec say: // Flags and booleans are interpolated as fractions between zero and one, with any non-zero value considered to be a value of one/true // Elliptical arc command as an array followed by corresponding indexes: // ['A', rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y] // 0 1 2 3 4 5 6 7 - if ( array[i][0] === 'A' ) { - - array[i][4] = +( array[i][4] !== 0 ) - array[i][5] = +( array[i][5] !== 0 ) - + if (array[i][0] === 'A') { + array[i][4] = +(array[i][4] !== 0) + array[i][5] = +(array[i][5] !== 0) } - } // Directly modify the value of a path array, this is done this way for performance pathArray.value = array return pathArray - }, // Absolutize and parse path to array - parse ( array = [ [ 'M', 0, 0 ] ] ) { - + parse (array = [ [ 'M', 0, 0 ] ]) { // if it's already a patharray, no need to parse it - if ( array instanceof PathArray ) return array + if (array instanceof PathArray) return array // prepare for parsing var s var paramCnt = { 'M': 2, 'L': 2, 'H': 1, 'V': 1, 'C': 6, 'S': 4, 'Q': 4, 'T': 2, 'A': 7, 'Z': 0 } - if ( typeof array === 'string' ) { - + if (typeof array === 'string') { array = array - .replace( numbersWithDots, pathRegReplace ) // convert 45.123.123 to 45.123 .123 - .replace( pathLetters, ' $& ' ) // put some room between letters and numbers - .replace( hyphen, '$1 -' ) // add space before hyphen + .replace(numbersWithDots, pathRegReplace) // convert 45.123.123 to 45.123 .123 + .replace(pathLetters, ' $& ') // put some room between letters and numbers + .replace(hyphen, '$1 -') // add space before hyphen .trim() // trim - .split( delimiter ) // split into array - + .split(delimiter) // split into array } else { - - array = array.reduce( function ( prev, curr ) { - - return [].concat.call( prev, curr ) - - }, [] ) - + array = array.reduce(function (prev, curr) { + return [].concat.call(prev, curr) + }, []) } // array now is an array containing all parts of a path e.g. ['M', '0', '0', 'L', '30', '30' ...] @@ -417,41 +308,30 @@ extend( PathArray, { var len = array.length do { - // Test if we have a path letter - if ( isPathLetter.test( array[index] ) ) { - + if (isPathLetter.test(array[index])) { s = array[index] ++index // If last letter was a move command and we got no new, it defaults to [L]ine - - } else if ( s === 'M' ) { - + } else if (s === 'M') { s = 'L' - - } else if ( s === 'm' ) { - + } else if (s === 'm') { s = 'l' - } - result.push( pathHandlers[s].call( null, - array.slice( index, ( index = index + paramCnt[s.toUpperCase()] ) ).map( parseFloat ), + result.push(pathHandlers[s].call(null, + array.slice(index, (index = index + paramCnt[s.toUpperCase()])).map(parseFloat), p, p0 ) ) - - } while ( len > index ) + } while (len > index) return result - }, // Get bounding box of path bbox () { - - parser().path.setAttribute( 'd', this.toString() ) + parser().path.setAttribute('d', this.toString()) return parser.nodes.path.getBBox() - } -} ) +}) diff --git a/src/types/Point.js b/src/types/Point.js index 16ae44d..f1c85a1 100644 --- a/src/types/Point.js +++ b/src/types/Point.js @@ -1,19 +1,15 @@ export default class Point { - // Initialize - constructor ( ...args ) { - - this.init( ...args ) - + constructor (...args) { + this.init(...args) } - init ( x, y ) { - + init (x, y) { let source let base = { x: 0, y: 0 } // ensure source as object - source = Array.isArray( x ) ? { x: x[0], y: x[1] } + source = Array.isArray(x) ? { x: x[0], y: x[1] } : typeof x === 'object' ? { x: x.x, y: x.y } : { x: x, y: y } @@ -22,38 +18,28 @@ export default class Point { this.y = source.y == null ? base.y : source.y return this - } // Clone point clone () { - - return new Point( this ) - + return new Point(this) } // transform point with matrix - transform ( m ) { - + transform (m) { // Perform the matrix multiplication var x = m.a * this.x + m.c * this.y + m.e var y = m.b * this.x + m.d * this.y + m.f // Return the required point - return new Point( x, y ) - + return new Point(x, y) } toArray () { - return [ this.x, this.y ] - } - } -export function point ( x, y ) { - - return new Point( x, y ).transform( this.screenCTM().inverse() ) - +export function point (x, y) { + return new Point(x, y).transform(this.screenCTM().inverse()) } diff --git a/src/types/PointArray.js b/src/types/PointArray.js index 581b7dc..9e7406d 100644 --- a/src/types/PointArray.js +++ b/src/types/PointArray.js @@ -3,97 +3,76 @@ import { extend } from '../utils/adopter.js' import { subClassArray } from './ArrayPolyfill.js' import SVGArray from './SVGArray.js' -const PointArray = subClassArray( 'PointArray', SVGArray ) +const PointArray = subClassArray('PointArray', SVGArray) export default PointArray -extend( PointArray, { +extend(PointArray, { // Convert array to string toString () { - // convert to a poly point string - for ( var i = 0, il = this.length, array = []; i < il; i++ ) { - - array.push( this[i].join( ',' ) ) - + for (var i = 0, il = this.length, array = []; i < il; i++) { + array.push(this[i].join(',')) } - return array.join( ' ' ) - + return array.join(' ') }, // Convert array to line object toLine () { - return { x1: this[0][0], y1: this[0][1], x2: this[1][0], y2: this[1][1] } - }, // Get morphed array at given position - at ( pos ) { - + at (pos) { // make sure a destination is defined - if ( !this.destination ) return this + if (!this.destination) return this // generate morphed point string - for ( var i = 0, il = this.length, array = []; i < il; i++ ) { - - array.push( [ - this[i][0] + ( this.destination[i][0] - this[i][0] ) * pos, - this[i][1] + ( this.destination[i][1] - this[i][1] ) * pos - ] ) - + for (var i = 0, il = this.length, array = []; i < il; i++) { + array.push([ + this[i][0] + (this.destination[i][0] - this[i][0]) * pos, + this[i][1] + (this.destination[i][1] - this[i][1]) * pos + ]) } - return new PointArray( array ) - + return new PointArray(array) }, // Parse point string and flat array - parse ( array = [ [ 0, 0 ] ] ) { - + parse (array = [ [ 0, 0 ] ]) { var points = [] // if it is an array - if ( array instanceof Array ) { - + if (array instanceof Array) { // and it is not flat, there is no need to parse it - if ( array[0] instanceof Array ) { - + if (array[0] instanceof Array) { return array - } - } else { // Else, it is considered as a string - // parse points - array = array.trim().split( delimiter ).map( parseFloat ) - + array = array.trim().split(delimiter).map(parseFloat) } // validate points - https://svgwg.org/svg2-draft/shapes.html#DataTypePoints // Odd number of coordinates is an error. In such cases, drop the last odd coordinate. - if ( array.length % 2 !== 0 ) array.pop() + if (array.length % 2 !== 0) array.pop() // wrap points in two-tuples and parse points as floats - for ( var i = 0, len = array.length; i < len; i = i + 2 ) { - - points.push( [ array[i], array[i + 1] ] ) - + for (var i = 0, len = array.length; i < len; i = i + 2) { + points.push([ array[i], array[i + 1] ]) } return points - }, // Move point string - move ( x, y ) { - + move (x, y) { var box = this.bbox() // get relative offset @@ -101,54 +80,41 @@ extend( PointArray, { y -= box.y // move every point - if ( !isNaN( x ) && !isNaN( y ) ) { - - for ( var i = this.length - 1; i >= 0; i-- ) { - + if (!isNaN(x) && !isNaN(y)) { + for (var i = this.length - 1; i >= 0; i--) { this[i] = [ this[i][0] + x, this[i][1] + y ] - } - } return this - }, // Resize poly string - size ( width, height ) { - + size (width, height) { var i var box = this.bbox() // recalculate position of all points according to new size - for ( i = this.length - 1; i >= 0; i-- ) { - - if ( box.width ) this[i][0] = ( ( this[i][0] - box.x ) * width ) / box.width + box.x - if ( box.height ) this[i][1] = ( ( this[i][1] - box.y ) * height ) / box.height + box.y - + for (i = this.length - 1; i >= 0; i--) { + if (box.width) this[i][0] = ((this[i][0] - box.x) * width) / box.width + box.x + if (box.height) this[i][1] = ((this[i][1] - box.y) * height) / box.height + box.y } return this - }, // Get bounding box of points bbox () { - var maxX = -Infinity var maxY = -Infinity var minX = Infinity var minY = Infinity - this.forEach( function ( el ) { - - maxX = Math.max( el[0], maxX ) - maxY = Math.max( el[1], maxY ) - minX = Math.min( el[0], minX ) - minY = Math.min( el[1], minY ) - - } ) + this.forEach(function (el) { + maxX = Math.max(el[0], maxX) + maxY = Math.max(el[1], maxY) + minX = Math.min(el[0], minX) + minY = Math.min(el[1], minY) + }) return { x: minX, y: minY, width: maxX - minX, height: maxY - minY } - } -} ) +}) diff --git a/src/types/SVGArray.js b/src/types/SVGArray.js index 7d59af1..7f27ec4 100644 --- a/src/types/SVGArray.js +++ b/src/types/SVGArray.js @@ -2,65 +2,49 @@ import { delimiter } from '../modules/core/regex.js' import { extend } from '../utils/adopter.js' import { subClassArray } from './ArrayPolyfill.js' -const SVGArray = subClassArray( 'SVGArray', Array, function ( arr ) { - - this.init( arr ) - -} ) +const SVGArray = subClassArray('SVGArray', Array, function (arr) { + this.init(arr) +}) export default SVGArray -extend( SVGArray, { - init ( arr ) { - +extend(SVGArray, { + init (arr) { // This catches the case, that native map tries to create an array with new Array(1) - if ( typeof arr === 'number' ) return this + if (typeof arr === 'number') return this this.length = 0 - this.push( ...this.parse( arr ) ) + this.push(...this.parse(arr)) return this - }, toArray () { - - return Array.prototype.concat.apply( [], this ) - + return Array.prototype.concat.apply([], this) }, toString () { - - return this.join( ' ' ) - + return this.join(' ') }, // Flattens the array if needed valueOf () { - const ret = [] - ret.push( ...this ) + ret.push(...this) return ret - }, // Parse whitespace separated string - parse ( array = [] ) { - + parse (array = []) { // If already is an array, no need to parse it - if ( array instanceof Array ) return array - - return array.trim().split( delimiter ).map( parseFloat ) + if (array instanceof Array) return array + return array.trim().split(delimiter).map(parseFloat) }, clone () { - - return new this.constructor( this ) - + return new this.constructor(this) }, toSet () { - - return new Set( this ) - + return new Set(this) } -} ) +}) diff --git a/src/types/SVGNumber.js b/src/types/SVGNumber.js index a35ed66..a152667 100644 --- a/src/types/SVGNumber.js +++ b/src/types/SVGNumber.js @@ -2,126 +2,90 @@ import { numberAndUnit } from '../modules/core/regex.js' // Module for unit convertions export default class SVGNumber { - // Initialize - constructor ( ...args ) { - - this.init( ...args ) - + constructor (...args) { + this.init(...args) } - init ( value, unit ) { - - unit = Array.isArray( value ) ? value[1] : unit - value = Array.isArray( value ) ? value[0] : value + init (value, unit) { + unit = Array.isArray(value) ? value[1] : unit + value = Array.isArray(value) ? value[0] : value // initialize defaults this.value = 0 this.unit = unit || '' // parse value - if ( typeof value === 'number' ) { - + if (typeof value === 'number') { // ensure a valid numeric value - this.value = isNaN( value ) ? 0 : !isFinite( value ) ? ( value < 0 ? -3.4e+38 : +3.4e+38 ) : value - - } else if ( typeof value === 'string' ) { - - unit = value.match( numberAndUnit ) - - if ( unit ) { + this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value + } else if (typeof value === 'string') { + unit = value.match(numberAndUnit) + if (unit) { // make value numeric - this.value = parseFloat( unit[1] ) + this.value = parseFloat(unit[1]) // normalize - if ( unit[5] === '%' ) { - + if (unit[5] === '%') { this.value /= 100 - - } else if ( unit[5] === 's' ) { - + } else if (unit[5] === 's') { this.value *= 1000 - } // store unit this.unit = unit[5] - } - } else { - - if ( value instanceof SVGNumber ) { - + if (value instanceof SVGNumber) { this.value = value.valueOf() this.unit = value.unit - } - } return this - } toString () { - - return ( this.unit === '%' ? ~~( this.value * 1e8 ) / 1e6 + return (this.unit === '%' ? ~~(this.value * 1e8) / 1e6 : this.unit === 's' ? this.value / 1e3 : this.value ) + this.unit - } toJSON () { - return this.toString() - } toArray () { - return [ this.value, this.unit ] - } valueOf () { - return this.value - } // Add number - plus ( number ) { - - number = new SVGNumber( number ) - return new SVGNumber( this + number, this.unit || number.unit ) - + plus (number) { + number = new SVGNumber(number) + return new SVGNumber(this + number, this.unit || number.unit) } // Subtract number - minus ( number ) { - - number = new SVGNumber( number ) - return new SVGNumber( this - number, this.unit || number.unit ) - + minus (number) { + number = new SVGNumber(number) + return new SVGNumber(this - number, this.unit || number.unit) } // Multiply number - times ( number ) { - - number = new SVGNumber( number ) - return new SVGNumber( this * number, this.unit || number.unit ) - + times (number) { + number = new SVGNumber(number) + return new SVGNumber(this * number, this.unit || number.unit) } // Divide number - divide ( number ) { - - number = new SVGNumber( number ) - return new SVGNumber( this / number, this.unit || number.unit ) - + divide (number) { + number = new SVGNumber(number) + return new SVGNumber(this / number, this.unit || number.unit) } - } diff --git a/src/utils/adopter.js b/src/utils/adopter.js index 6e526e3..ec6b2e5 100644 --- a/src/utils/adopter.js +++ b/src/utils/adopter.js @@ -5,190 +5,136 @@ import { globals } from '../utils/window.js' import Base from '../types/Base.js' const elements = {} -export const root = Symbol( 'root' ) +export const root = Symbol('root') // Method for element creation -export function makeNode ( name ) { - +export function makeNode (name) { // create element - return globals.document.createElementNS( ns, name ) - + return globals.document.createElementNS(ns, name) } -export function makeInstance ( element ) { - - if ( element instanceof Base ) return element - - if ( typeof element === 'object' ) { - - return adopt( element ) +export function makeInstance (element) { + if (element instanceof Base) return element + if (typeof element === 'object') { + return adopt(element) } - if ( element == null ) { - + if (element == null) { return new elements[root]() - } - if ( typeof element === 'string' && element.charAt( 0 ) !== '<' ) { - - return adopt( globals.document.querySelector( element ) ) - + if (typeof element === 'string' && element.charAt(0) !== '<') { + return adopt(globals.document.querySelector(element)) } - var node = makeNode( 'svg' ) + var node = makeNode('svg') node.innerHTML = element // We can use firstChild here because we know, // that the first char is < and thus an element - element = adopt( node.firstChild ) + element = adopt(node.firstChild) return element - } -export function nodeOrNew ( name, node ) { - - return node instanceof globals.window.Node ? node : makeNode( name ) - +export function nodeOrNew (name, node) { + return node instanceof globals.window.Node ? node : makeNode(name) } // Adopt existing svg elements -export function adopt ( node ) { - +export function adopt (node) { // check for presence of node - if ( !node ) return null + if (!node) return null // make sure a node isn't already adopted - if ( node.instance instanceof Base ) return node.instance - - if ( !( node instanceof globals.window.SVGElement ) ) { - - return new elements.HtmlNode( node ) + if (node.instance instanceof Base) return node.instance + if (!(node instanceof globals.window.SVGElement)) { + return new elements.HtmlNode(node) } // initialize variables var element // adopt with element-specific settings - if ( node.nodeName === 'svg' ) { - - element = new elements[root]( node ) - - } else if ( node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient' ) { - - element = new elements.Gradient( node ) - - } else if ( elements[capitalize( node.nodeName )] ) { - - element = new elements[capitalize( node.nodeName )]( node ) - + if (node.nodeName === 'svg') { + element = new elements[root](node) + } else if (node.nodeName === 'linearGradient' || node.nodeName === 'radialGradient') { + element = new elements.Gradient(node) + } else if (elements[capitalize(node.nodeName)]) { + element = new elements[capitalize(node.nodeName)](node) } else { - - element = new elements.Bare( node ) - + element = new elements.Bare(node) } return element - } -export function register ( element, name = element.name, asRoot = false ) { - +export function register (element, name = element.name, asRoot = false) { elements[name] = element - if ( asRoot ) elements[root] = element + if (asRoot) elements[root] = element - addMethodNames( Object.keys( element.prototype ) ) + addMethodNames(Object.keys(element.prototype)) return element - } -export function getClass ( name ) { - +export function getClass (name) { return elements[name] - } // Element id sequence let did = 1000 // Get next named element id -export function eid ( name ) { - - return 'Svgjs' + capitalize( name ) + ( did++ ) - +export function eid (name) { + return 'Svgjs' + capitalize(name) + (did++) } // Deep new id assignment -export function assignNewId ( node ) { - +export function assignNewId (node) { // do the same for SVG child nodes as well - for ( var i = node.children.length - 1; i >= 0; i-- ) { - - assignNewId( node.children[i] ) - + for (var i = node.children.length - 1; i >= 0; i--) { + assignNewId(node.children[i]) } - if ( node.id ) { - - return adopt( node ).id( eid( node.nodeName ) ) - + if (node.id) { + return adopt(node).id(eid(node.nodeName)) } - return adopt( node ) - + return adopt(node) } // Method for extending objects -export function extend ( modules, methods, attrCheck ) { - +export function extend (modules, methods, attrCheck) { var key, i - modules = Array.isArray( modules ) ? modules : [ modules ] - - for ( i = modules.length - 1; i >= 0; i-- ) { - - for ( key in methods ) { + modules = Array.isArray(modules) ? modules : [ modules ] + for (i = modules.length - 1; i >= 0; i--) { + for (key in methods) { let method = methods[key] - if ( attrCheck ) { - - method = wrapWithAttrCheck( methods[key] ) - + if (attrCheck) { + method = wrapWithAttrCheck(methods[key]) } modules[i].prototype[key] = method - } - } - } -export function extendWithAttrCheck ( ...args ) { - - extend( ...args, true ) - +export function extendWithAttrCheck (...args) { + extend(...args, true) } -export function wrapWithAttrCheck ( fn ) { - - return function ( ...args ) { - +export function wrapWithAttrCheck (fn) { + return function (...args) { let o = args[args.length - 1] - if ( o && o.constructor === Object && !( o instanceof Array ) ) { - - return fn.apply( this, args.slice( 0, -1 ) ).attr( o ) - + if (o && o.constructor === Object && !(o instanceof Array)) { + return fn.apply(this, args.slice(0, -1)).attr(o) } else { - - return fn.apply( this, args ) - + return fn.apply(this, args) } - } - } diff --git a/src/utils/methods.js b/src/utils/methods.js index 4973d13..527e7b7 100644 --- a/src/utils/methods.js +++ b/src/utils/methods.js @@ -2,61 +2,41 @@ const methods = {} const constructors = {} const names = [] -export function registerMethods ( name, m ) { - - if ( Array.isArray( name ) ) { - - for ( let _name of name ) { - - registerMethods( _name, m ) - +export function registerMethods (name, m) { + if (Array.isArray(name)) { + for (let _name of name) { + registerMethods(_name, m) } return - } - if ( typeof name === 'object' ) { - - for ( let [ _name, _m ] of Object.entries( name ) ) { - - registerMethods( _name, _m ) - + if (typeof name === 'object') { + for (let [ _name, _m ] of Object.entries(name)) { + registerMethods(_name, _m) } return - } - addMethodNames( Object.keys( m ) ) - methods[name] = Object.assign( methods[name] || {}, m ) - + addMethodNames(Object.keys(m)) + methods[name] = Object.assign(methods[name] || {}, m) } -export function getMethodsFor ( name ) { - +export function getMethodsFor (name) { return methods[name] || {} - } export function getMethodNames () { - - return [ ...new Set( names ) ] - + return [ ...new Set(names) ] } -export function addMethodNames ( _names ) { - - names.push( ..._names ) - +export function addMethodNames (_names) { + names.push(..._names) } -export function registerConstructor ( name, setup ) { - +export function registerConstructor (name, setup) { constructors[name] = setup - } -export function getConstructor ( name ) { - +export function getConstructor (name) { return constructors[name] ? { setup: constructors[name], name } : {} - } diff --git a/src/utils/utils.js b/src/utils/utils.js index 01cd49f..3bac0de 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -1,143 +1,105 @@ // Map function -export function map ( array, block ) { - +export function map (array, block) { var i var il = array.length var result = [] - for ( i = 0; i < il; i++ ) { - - result.push( block( array[i] ) ) - + for (i = 0; i < il; i++) { + result.push(block(array[i])) } return result - } // Filter function -export function filter ( array, block ) { - +export function filter (array, block) { var i var il = array.length var result = [] - for ( i = 0; i < il; i++ ) { - - if ( block( array[i] ) ) { - - result.push( array[i] ) - + for (i = 0; i < il; i++) { + if (block(array[i])) { + result.push(array[i]) } - } return result - } // Degrees to radians -export function radians ( d ) { - +export function radians (d) { return d % 360 * Math.PI / 180 - } // Radians to degrees -export function degrees ( r ) { - +export function degrees (r) { return r * 180 / Math.PI % 360 - } // Convert dash-separated-string to camelCase -export function camelCase ( s ) { - - return s.toLowerCase().replace( /-(.)/g, function ( m, g ) { - +export function camelCase (s) { + return s.toLowerCase().replace(/-(.)/g, function (m, g) { return g.toUpperCase() - - } ) - + }) } // Convert camel cased string to string seperated -export function unCamelCase ( s ) { - - return s.replace( /([A-Z])/g, function ( m, g ) { - +export function unCamelCase (s) { + return s.replace(/([A-Z])/g, function (m, g) { return '-' + g.toLowerCase() - - } ) - + }) } // Capitalize first letter of a string -export function capitalize ( s ) { - - return s.charAt( 0 ).toUpperCase() + s.slice( 1 ) - +export function capitalize (s) { + return s.charAt(0).toUpperCase() + s.slice(1) } // Calculate proportional width and height values when necessary -export function proportionalSize ( element, width, height ) { - - if ( width == null || height == null ) { - +export function proportionalSize (element, width, height) { + if (width == null || height == null) { var box = element.bbox() - if ( width == null ) { - + if (width == null) { width = box.width / box.height * height - - } else if ( height == null ) { - + } else if (height == null) { height = box.height / box.width * width - } - } return { width: width, height: height } - } -export function getOrigin ( o, element ) { - +export function getOrigin (o, element) { // Allow origin or around as the names let origin = o.origin // o.around == null ? o.origin : o.around let ox, oy // Allow the user to pass a string to rotate around a given point - if ( typeof origin === 'string' || origin == null ) { - + if (typeof origin === 'string' || origin == null) { // Get the bounding box of the element with no transformations applied - const string = ( origin || 'center' ).toLowerCase().trim() + const string = (origin || 'center').toLowerCase().trim() const { height, width, x, y } = element.bbox() // Calculate the transformed x and y coordinates - let bx = string.includes( 'left' ) ? x - : string.includes( 'right' ) ? x + width + let bx = string.includes('left') ? x + : string.includes('right') ? x + width : x + width / 2 - let by = string.includes( 'top' ) ? y - : string.includes( 'bottom' ) ? y + height + let by = string.includes('top') ? y + : string.includes('bottom') ? y + height : y + height / 2 // Set the bounds eg : "bottom-left", "Top right", "middle" etc... ox = o.ox != null ? o.ox : bx oy = o.oy != null ? o.oy : by - } else { - ox = origin[0] oy = origin[1] - } // Return the origin as it is if it wasn't a string return [ ox, oy ] - } diff --git a/src/utils/window.js b/src/utils/window.js index 55f0bb6..9e51339 100644 --- a/src/utils/window.js +++ b/src/utils/window.js @@ -3,9 +3,7 @@ export const globals = { document: typeof document === 'undefined' ? null : document } -export function registerWindow ( win = null, doc = null ) { - +export function registerWindow (win = null, doc = null) { globals.window = win globals.document = doc - } -- cgit v1.2.3 From 0a357dd3063bcb18ccf7de446f206e8598bea9a1 Mon Sep 17 00:00:00 2001 From: Saivan Date: Mon, 26 Nov 2018 00:18:19 +1300 Subject: Finished off the color spaces, we are all green! We now have tested and working color spaces, isn't that nice! Changes ======= - All color spaces are working --- spec/spec/color.js | 134 ++++++++++++++++++--- src/types/Color.js | 335 +++++++++++++++++++++-------------------------------- 2 files changed, 250 insertions(+), 219 deletions(-) (limited to 'src') diff --git a/spec/spec/color.js b/spec/spec/color.js index 9710d69..d9d60b6 100644 --- a/spec/spec/color.js +++ b/spec/spec/color.js @@ -8,14 +8,30 @@ describe('Color', function() { describe ('construct: constructs a color in different formats', () => { - it ('constructs a color from an object in the correct color space') + it ('constructs a color from an object in the correct color space', () => { + + // Try in rgb + let color = new SVG.Color({ r: 255, g: 0, b: 128 }) + expect(color.r).toBe(255) + expect(color.g).toBe(0) + expect(color.b).toBe(128) + expect(color.space).toBe('rgb') + + // Try in cmyk + let color2 = new SVG.Color({ c: 20, y: 15, m: 10, k: 5 }) + expect(color2.c).toBe(20) + expect(color2.m).toBe(10) + expect(color2.y).toBe(15) + expect(color2.k).toBe(5) + expect(color2.space).toBe('cmyk') + }) it ('constructs a color from an array', () => { let color = new SVG.Color([ 30, 24, 50 ]) expect( color.r ).toBe( 30 ) expect( color.g ).toBe( 24 ) expect( color.b ).toBe( 50 ) - + expect( color.space ).toBe('rgb') }) it('correclty parses an rgb string', () => { @@ -64,29 +80,117 @@ describe('Color', function() { describe('color spaces: The color spaces supported by our library', () => { describe('lab()', () => { - it ('can convert rgb to lab') - it ('can convert from lab to rgb') + it ('can convert rgb to lab', () => { + let color = new SVG.Color( 255, 0, 128 ) + let lab = color.lab() + expect( lab.l ).toBeCloseTo( 54.88, 1 ) + expect( lab.a ).toBeCloseTo( 84.55, 1 ) + expect( lab.b ).toBeCloseTo( 4.065, 1 ) + expect( lab.space ).toBe('lab') + }) + + it ('can convert from lab to rgb', () => { + let lab = new SVG.Color( 54.88, 84.55, 4.065, 'lab' ) + let rgb = lab.rgb() + expect( rgb.r ).toBeCloseTo( 255, 0 ) + expect( rgb.g ).toBeCloseTo( 0, 0 ) + expect( rgb.b ).toBeCloseTo( 128, 0 ) + expect( rgb.space ).toBe('rgb') + }) + + it ('is invertable', () => { + let { r, g, b } = new SVG.Color( 255, 0, 128 ).lab().rgb() + expect ( r ).toBeCloseTo( 255, 0 ) + expect ( g ).toBeCloseTo( 0, 0 ) + expect ( b ).toBeCloseTo( 128, 0 ) + }) }) describe('lch()', () => { - it ('can convert rgb to lch') - it ('can convert from lch to rgb') + it ('can convert rgb to lch', () => { + let color = new SVG.Color( 255, 0, 128 ) + let lch = color.lch() + expect( lch.l ).toBeCloseTo( 54.88, 1 ) + expect( lch.c ).toBeCloseTo( 84.65, 1 ) + expect( lch.h ).toBeCloseTo( 2.75, 1 ) + expect( lch.space ).toBe('lch') + }) + + it ('can convert from lch to rgb', () => { + let lch = new SVG.Color( 54.88, 84.65, 2.75, 'lch' ) + let rgb = lch.rgb() + expect( rgb.r ).toBeCloseTo( 255, 0 ) + expect( rgb.g ).toBeCloseTo( 0, 0 ) + expect( rgb.b ).toBeCloseTo( 128, 0 ) + expect( rgb.space ).toBe('rgb') + }) + + it ('is invertable', () => { + let { r, g, b } = new SVG.Color( 255, 0, 128 ).lch().rgb() + expect ( r ).toBeCloseTo( 255, 0 ) + expect ( g ).toBeCloseTo( 0, 0 ) + expect ( b ).toBeCloseTo( 128, 0 ) + }) }) describe('hsl()', () => { - it ('can convert from rgb to hsl') - it ('can convert from hsl to rgb') - }) - describe('xyz()', () => { - it ('can convert from rgb to xyz') - it ('can convert from xyz to rgb') + it ('can convert from rgb to hsl', () => { + let color = new SVG.Color( 255, 0, 128 ) + let hsl = color.hsl() + expect( hsl.h ).toBeCloseTo( 329.88, 1 ) + expect( hsl.s ).toBeCloseTo( 100, 1 ) + expect( hsl.l ).toBeCloseTo( 50, 1 ) + expect( hsl.space ).toBe('hsl') + }) + + it ('can convert from hsl to rgb', () => { + let hsl = new SVG.Color( 329.88, 100, 50, 'hsl' ) + let rgb = hsl.rgb() + expect( rgb.r ).toBeCloseTo( 255, 0 ) + expect( rgb.g ).toBeCloseTo( 0, 0 ) + expect( rgb.b ).toBeCloseTo( 128, 0 ) + expect( rgb.space ).toBe('rgb') + }) + + it ('is invertable', () => { + let { r, g, b } = new SVG.Color( 255, 0, 128 ).hsl().rgb() + expect ( r ).toBeCloseTo( 255, 0 ) + expect ( g ).toBeCloseTo( 0, 0 ) + expect ( b ).toBeCloseTo( 128, 0 ) + }) }) - describe('cymk()', () => { - it ('can convert from rgb to cymk') - it ('can convert from cymk to rgb') + describe('cmyk()', () => { + + it ('can convert from rgb to cmyk', () => { + let color = new SVG.Color( 255, 0, 128 ) + let cmyk = color.cmyk() + expect( cmyk.c ).toBeCloseTo( 0, 1 ) + expect( cmyk.m ).toBeCloseTo( 1, 1 ) + expect( cmyk.y ).toBeCloseTo( 0.49, 1 ) + expect( cmyk.k ).toBeCloseTo( 0, 1 ) + expect( cmyk.space ).toBe('cmyk') + }) + + it ('can convert from cmyk to rgb', () => { + let color = new SVG.Color( 0, 1, 0.49, 0, 'cmyk' ) + let rgb = color.rgb() + expect( rgb.r ).toBeCloseTo( 255, -1 ) + expect( rgb.g ).toBeCloseTo( 0, -1 ) + expect( rgb.b ).toBeCloseTo( 128, -1 ) + expect( rgb.space ).toBe('rgb') + }) + + it ('is invertable', () => { + let { r, g, b } = new SVG.Color( 255, 0, 128 ).cmyk().rgb() + expect ( r ).toBeCloseTo( 255, 0 ) + expect ( g ).toBeCloseTo( 0, 0 ) + expect ( b ).toBeCloseTo( 128, 0 ) + }) + }) + }) }) diff --git a/src/types/Color.js b/src/types/Color.js index e5104b8..8a44de1 100644 --- a/src/types/Color.js +++ b/src/types/Color.js @@ -1,100 +1,91 @@ import { hex, isHex, isRgb, rgb, whitespace } from '../modules/core/regex.js' -function sixDigitHex ( hex ) { +function sixDigitHex (hex) { return hex.length === 4 ? [ '#', - hex.substring( 1, 2 ), hex.substring( 1, 2 ), - hex.substring( 2, 3 ), hex.substring( 2, 3 ), - hex.substring( 3, 4 ), hex.substring( 3, 4 ) - ].join( '' ) + hex.substring(1, 2), hex.substring(1, 2), + hex.substring(2, 3), hex.substring(2, 3), + hex.substring(3, 4), hex.substring(3, 4) + ].join('') : hex } -function componentHex ( component ) { - const integer = Math.round( component ) - const hex = integer.toString( 16 ) +function componentHex (component) { + const integer = Math.round(component) + const hex = integer.toString(16) return hex.length === 1 ? '0' + hex : hex } -function is ( object, space ) { - for ( const key of space ) { - if ( object[key] == null ) { +function is (object, space) { + for (const key of space) { + if (object[key] == null) { return false } } return true } -function getParameters ( a ) { - const params = is( a, 'rgb' ) ? { _a: a.r, _b: a.g, _c: a.b, space: 'rgb' } - : is( a, 'xyz' ) ? { _a: a.x, _b: a.y, _c: a.z, space: 'xyz' } - : is( a, 'hsl' ) ? { _a: a.h, _b: a.s, _c: a.l, space: 'hsl' } - : is( a, 'lab' ) ? { _a: a.l, _b: a.a, _c: a.b, space: 'lab' } - : is( a, 'lch' ) ? { _a: a.l, _b: a.c, _c: a.h, space: 'lch' } - : is( a, 'cmyk' ) ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' } +function getParameters (a) { + const params = is(a, 'rgb') ? { _a: a.r, _b: a.g, _c: a.b, space: 'rgb' } + : is(a, 'xyz') ? { _a: a.x, _b: a.y, _c: a.z, space: 'xyz' } + : is(a, 'hsl') ? { _a: a.h, _b: a.s, _c: a.l, space: 'hsl' } + : is(a, 'lab') ? { _a: a.l, _b: a.a, _c: a.b, space: 'lab' } + : is(a, 'lch') ? { _a: a.l, _b: a.c, _c: a.h, space: 'lch' } + : is(a, 'cmyk') ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' } : { _a: 0, _b: 0, _c: 0, space: 'rgb' } return params } -function cieSpace ( space ) { - if ( space === 'lab' || space === 'xyz' || space === 'lch' ) { +function cieSpace (space) { + if (space === 'lab' || space === 'xyz' || space === 'lch') { return true } else { return false } } -function hueToRgb ( p, q, t ) { - if ( t < 0 ) t += 1 - if ( t > 1 ) t -= 1 - if ( t < 1 / 6 ) return p + ( q - p ) * 6 * t - if ( t < 1 / 2 ) return q - if ( t < 2 / 3 ) return p + ( q - p ) * ( 2 / 3 - t ) * 6 +function hueToRgb (p, q, t) { + if (t < 0) t += 1 + if (t > 1) t -= 1 + if (t < 1 / 6) return p + (q - p) * 6 * t + if (t < 1 / 2) return q + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6 return p } export default class Color { + constructor (...inputs) { + this.init(...inputs) + } - constructor ( a = 0, b = 0, c = 0, d = 0, space = 'rgb' ) { - + init (a = 0, b = 0, c = 0, d = 0, space = 'rgb') { // If the user gave us an array, make the color from it - if ( typeof a === 'number' ) { - + if (typeof a === 'number') { // Allow for the case that we don't need d... space = typeof d === 'string' ? d : space d = typeof d === 'string' ? undefined : d // Assign the values straight to the color - Object.assign( this, { _a: a, _b: b, _c: c, _d: d, space } ) - - } else if ( a instanceof Array ) { - + Object.assign(this, { _a: a, _b: b, _c: c, _d: d, space }) + } else if (a instanceof Array) { this.space = b || 'rgb' - Object.assign( this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] } ) - - } else if ( a instanceof Object ) { - + Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] }) + } else if (a instanceof Object) { // Set the object up and assign its values directly - const values = getParameters( a ) - Object.assign( this, values ) - - } else if ( typeof a === 'string' ) { - - if ( isRgb.test( a ) ) { - - const noWhitespace = a.replace( whitespace, '' ) - const [ _a, _b, _c ] = rgb.exec( noWhitespace ) - .slice( 1, 4 ).map( v => parseInt( v ) ) - Object.assign( this, { _a, _b, _c, space: 'rgb' } ) - - } else if ( isHex.test( a ) ) { - - const hexParse = v => parseInt( v, 16 ) - const [ , _a, _b, _c ] = hex.exec( sixDigitHex( a ) ).map( hexParse ) - Object.assign( this, { _a, _b, _c, space: 'rgb' } ) - - } else throw Error( `Unsupported string format, can't construct Color` ) + const values = getParameters(a) + Object.assign(this, values) + } else if (typeof a === 'string') { + if (isRgb.test(a)) { + const noWhitespace = a.replace(whitespace, '') + const [ _a, _b, _c ] = rgb.exec(noWhitespace) + .slice(1, 4).map(v => parseInt(v)) + Object.assign(this, { _a, _b, _c, space: 'rgb' }) + } else if (isHex.test(a)) { + const hexParse = v => parseInt(v, 16) + const [ , _a, _b, _c ] = hex.exec(sixDigitHex(a)).map(hexParse) + Object.assign(this, { _a, _b, _c, space: 'rgb' }) + } else throw Error(`Unsupported string format, can't construct Color`) } // Now add the components as a convenience @@ -104,15 +95,13 @@ export default class Color { : this.space === 'hsl' ? { h: _a, s: _b, l: _c } : this.space === 'lab' ? { l: _a, a: _b, b: _c } : this.space === 'lch' ? { l: _a, c: _b, h: _c } - : this.space === 'cmyk' ? { c: _a, y: _b, m: _c, k: _d } + : this.space === 'cmyk' ? { c: _a, m: _b, y: _c, k: _d } : {} - Object.assign( this, components ) + Object.assign(this, components) } - opacity ( opacity = 1 ) { - + opacity (opacity = 1) { this.opacity = opacity - } /* @@ -121,7 +110,7 @@ export default class Color { brightness () { const { _a: r, _b: g, _c: b } = this.rgb() - const value = ( r / 255 * 0.30 ) + ( g / 255 * 0.59 ) + ( b / 255 * 0.11 ) + const value = (r / 255 * 0.30) + (g / 255 * 0.59) + (b / 255 * 0.11) return value } @@ -130,37 +119,33 @@ export default class Color { */ rgb () { - - if ( this.space === 'rgb' ) { + if (this.space === 'rgb') { return this - - } else if ( cieSpace( this.space ) ) { - + } else if (cieSpace(this.space)) { // Convert to the xyz color space let { x, y, z } = this - if ( this.space === 'lab' || this.space === 'lch' ) { - + if (this.space === 'lab' || this.space === 'lch') { // Get the values in the lab space let { l, a, b } = this - if ( this.space === 'lch' ) { + if (this.space === 'lch') { let { c, h } = this const dToR = Math.PI / 180 - a = c * Math.cos( dToR * h ) - b = c * Math.sin( dToR * h ) + a = c * Math.cos(dToR * h) + b = c * Math.sin(dToR * h) } // Undo the nonlinear function - const yL = ( l + 16 ) / 116 - const xL = a / 500 + y - const zL = y - b / 200 + const yL = (l + 16) / 116 + const xL = a / 500 + yL + const zL = yL - b / 200 // Get the xyz values const ct = 16 / 116 const mx = 0.008856 const nm = 7.787 - x = 0.95047 * ( ( xL ** 3 > mx ) ? xL ** 3 : ( xL - ct ) / nm ) - y = 1.00000 * ( ( yL ** 3 > mx ) ? yL ** 3 : ( yL - ct ) / nm ) - z = 1.08883 * ( ( zL ** 3 > mx ) ? zL ** 3 : ( zL - ct ) / nm ) + x = 0.95047 * ((xL ** 3 > mx) ? xL ** 3 : (xL - ct) / nm) + y = 1.00000 * ((yL ** 3 > mx) ? yL ** 3 : (yL - ct) / nm) + z = 1.08883 * ((zL ** 3 > mx) ? zL ** 3 : (zL - ct) / nm) } // Convert xyz to unbounded rgb values @@ -171,72 +156,68 @@ export default class Color { // Convert the values to true rgb values let pow = Math.pow let bd = 0.0031308 - const r = ( rU > bd ) ? ( 1.055 * pow( rU, 1 / 2.4 ) - 0.055 ) : 12.92 * rU - const g = ( gU > bd ) ? ( 1.055 * pow( gU, 1 / 2.4 ) - 0.055 ) : 12.92 * gU - const b = ( bU > bd ) ? ( 1.055 * pow( bU, 1 / 2.4 ) - 0.055 ) : 12.92 * bU + const r = (rU > bd) ? (1.055 * pow(rU, 1 / 2.4) - 0.055) : 12.92 * rU + const g = (gU > bd) ? (1.055 * pow(gU, 1 / 2.4) - 0.055) : 12.92 * gU + const b = (bU > bd) ? (1.055 * pow(bU, 1 / 2.4) - 0.055) : 12.92 * bU // Make and return the color - const color = new Color( r, g, b ) + const color = new Color(255 * r, 255 * g, 255 * b) return color - - } else if ( this.space === 'hsl' ) { - - // stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion + } else if (this.space === 'hsl') { + // https://bgrins.github.io/TinyColor/docs/tinycolor.html // Get the current hsl values - const { h, s, l } = this + let { h, s, l } = this + h /= 360 + s /= 100 + l /= 100 // If we are grey, then just make the color directly - if ( s === 0 ) { - let color = new Color( l, l, l ) + if (s === 0) { + let color = new Color(l, l, l) return color } // TODO I have no idea what this does :D If you figure it out, tell me! - const q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s + const q = l < 0.5 ? l * (1 + s) : l + s - l * s const p = 2 * l - q // Get the rgb values - const r = hueToRgb( p, q, h + 1 / 3 ) - const g = hueToRgb( p, q, h ) - const b = hueToRgb( p, q, h - 1 / 3 ) + const r = 255 * hueToRgb(p, q, h + 1 / 3) + const g = 255 * hueToRgb(p, q, h) + const b = 255 * hueToRgb(p, q, h - 1 / 3) // Make a new color - const color = new Color( r, g, b ) + const color = new Color(r, g, b) return color - - } else if ( this.space === 'cmyk' ) { - + } else if (this.space === 'cmyk') { // https://gist.github.com/felipesabino/5066336 // Get the normalised cmyk values - const { _a, _b, _c, _d } = this - const [ c, m, y, k ] = [ _a, _b, _c, _d ].map( v => v / 100 ) + const { c, m, y, k } = this // Get the rgb values - const r = 1 - Math.min( 1, c * ( 1 - k ) + k ) - const g = 1 - Math.min( 1, m * ( 1 - k ) + k ) - const b = 1 - Math.min( 1, y * ( 1 - k ) + k ) + const r = 255 * (1 - Math.min(1, c * (1 - k) + k)) + const g = 255 * (1 - Math.min(1, m * (1 - k) + k)) + const b = 255 * (1 - Math.min(1, y * (1 - k) + k)) // Form the color and return it - const color = new Color( r, g, b ) + const color = new Color(r, g, b) return color - } else { return this } } lab () { - // Get the xyz color const { x, y, z } = this.xyz() // Get the lab components - const l = ( 116 * y ) - 16 - const a = 500 * ( x - y ) - const b = 200 * ( y - z ) + const l = (116 * y) - 16 + const a = 500 * (x - y) + const b = 200 * (y - z) // Construct and return a new color - const color = new Color( l, a, b, 'lab' ) + const color = new Color(l, a, b, 'lab') return color } @@ -244,25 +225,25 @@ export default class Color { // Normalise the red, green and blue values const { _a: r255, _b: g255, _c: b255 } = this.rgb() - const [ r, g, b ] = [ r255, g255, b255 ].map( v => v / 255 ) + const [ r, g, b ] = [ r255, g255, b255 ].map(v => v / 255) // Convert to the lab rgb space - const rL = ( r > 0.04045 ) ? Math.pow( ( r + 0.055 ) / 1.055, 2.4 ) : r / 12.92 - const gL = ( g > 0.04045 ) ? Math.pow( ( g + 0.055 ) / 1.055, 2.4 ) : g / 12.92 - const bL = ( b > 0.04045 ) ? Math.pow( ( b + 0.055 ) / 1.055, 2.4 ) : b / 12.92 + const rL = (r > 0.04045) ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92 + const gL = (g > 0.04045) ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92 + const bL = (b > 0.04045) ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92 // Convert to the xyz color space without bounding the values - const xU = ( rL * 0.4124 + gL * 0.3576 + bL * 0.1805 ) / 0.95047 - const yU = ( rL * 0.2126 + gL * 0.7152 + bL * 0.0722 ) / 1.00000 - const zU = ( rL * 0.0193 + gL * 0.1192 + bL * 0.9505 ) / 1.08883 + const xU = (rL * 0.4124 + gL * 0.3576 + bL * 0.1805) / 0.95047 + const yU = (rL * 0.2126 + gL * 0.7152 + bL * 0.0722) / 1.00000 + const zU = (rL * 0.0193 + gL * 0.1192 + bL * 0.9505) / 1.08883 // Get the proper xyz values by applying the bounding - const x = ( xU > 0.008856 ) ? Math.pow( xU, 1 / 3 ) : ( 7.787 * xU ) + 16 / 116 - const y = ( yU > 0.008856 ) ? Math.pow( yU, 1 / 3 ) : ( 7.787 * yU ) + 16 / 116 - const z = ( zU > 0.008856 ) ? Math.pow( zU, 1 / 3 ) : ( 7.787 * zU ) + 16 / 116 + const x = (xU > 0.008856) ? Math.pow(xU, 1 / 3) : (7.787 * xU) + 16 / 116 + const y = (yU > 0.008856) ? Math.pow(yU, 1 / 3) : (7.787 * yU) + 16 / 116 + const z = (zU > 0.008856) ? Math.pow(zU, 1 / 3) : (7.787 * zU) + 16 / 116 // Make and return the color - const color = new Color( x, y, z, 'xyz' ) + const color = new Color(x, y, z, 'xyz') return color } @@ -272,15 +253,15 @@ export default class Color { const { l, a, b } = this.lab() // Get the chromaticity and the hue using polar coordinates - const c = Math.sqrt( a ** 2 + b ** 2 ) - let h = 180 * Math.atan2( b, a ) / Math.PI - if ( h < 0 ) { + const c = Math.sqrt(a ** 2 + b ** 2) + let h = 180 * Math.atan2(b, a) / Math.PI + if (h < 0) { h *= -1 h = 360 - h } // Make a new color and return it - const color = new Color( l, c, h, 'lch' ) + const color = new Color(l, c, h, 'lch') return color } @@ -288,12 +269,12 @@ export default class Color { // Get the rgb values const { _a, _b, _c } = this.rgb() - const [ r, g, b ] = [ _a, _b, _c ].map( v => v / 255 ) + const [ r, g, b ] = [ _a, _b, _c ].map(v => v / 255) // Find the maximum and minimum values to get the lightness - const max = Math.max( r, g, b ) - const min = Math.min( r, g, b ) - const l = ( max + min ) / 2 + const max = Math.max(r, g, b) + const min = Math.min(r, g, b) + const l = (max + min) / 2 // If the r, g, v values are identical then we are grey const isGrey = max === min @@ -301,16 +282,16 @@ export default class Color { // Calculate the hue and saturation const delta = max - min const s = isGrey ? 0 - : l > 0.5 ? delta / ( 2 - max - min ) - : delta / ( max + min ) + : l > 0.5 ? delta / (2 - max - min) + : delta / (max + min) const h = isGrey ? 0 - : max === r ? ( ( g - b ) / delta + ( g < b ? 6 : 0 ) ) / 6 - : max === g ? ( ( b - r ) / delta + 2 ) / 6 - : max === b ? ( ( r - g ) / delta + 4 ) / 6 + : max === r ? ((g - b) / delta + (g < b ? 6 : 0)) / 6 + : max === g ? ((b - r) / delta + 2) / 6 + : max === b ? ((r - g) / delta + 4) / 6 : 0 // Construct and return the new color - const color = new Color( h, s, l, 'hsl' ) + const color = new Color(360 * h, 100 * s, 100 * l, 'hsl') return color } @@ -318,62 +299,26 @@ export default class Color { // Get the rgb values for the current color const { _a, _b, _c } = this.rgb() - const [ r, g, b ] = [ _a, _b, _c ].map( v => v / 255 ) + const [ r, g, b ] = [ _a, _b, _c ].map(v => v / 255) // Get the cmyk values in an unbounded format - const k = 100 * Math.min( 1 - r, 1 - g, 1 - b ) - const c = 100 * ( 1 - r - k ) / ( 1 - k ) - const m = 100 * ( 1 - g - k ) / ( 1 - k ) - const y = 100 * ( 1 - b - k ) / ( 1 - k ) + const k = Math.min(1 - r, 1 - g, 1 - b) + const c = (1 - r - k) / (1 - k) + const m = (1 - g - k) / (1 - k) + const y = (1 - b - k) / (1 - k) // Construct the new color - const color = new Color( c, m, y, k, 'cmyk' ) + const color = new Color(c, m, y, k, 'cmyk') return color } - /* - Modifying the color - */ - - brighten ( amount = 0.1 ) { - - } - - darken ( amount = 0.1 ) { - - } - - /* - Mixing methods - */ - - to ( otherColor, space ) { - - // Force both colors to the color of this space (or let the user decide) - space = space || this.space - - // Get the starting and ending colors - // let start = this[ space ]() - // let end = otherColor[ space ]() - - // Return a function that blends between the two colors - return function ( t ) { - - } - - } - - avearge ( otherColor, space ) { - - } - /* Input and Output methods */ hex () { let { _a, _b, _c } = this.rgb() - let [ r, g, b ] = [ _a, _b, _c ].map( componentHex ) + let [ r, g, b ] = [ _a, _b, _c ].map(componentHex) return `#${r}${g}${b}` } @@ -384,8 +329,8 @@ export default class Color { toRgb () { let { r, g, b } = this.rgb() let { max, min, round } = Math - let format = v => max( 0, min( round( v ), 255 ) ) - let [ rV, gV, bV ] = [ r, g, b ].map( format ) + let format = v => max(0, min(round(v), 255)) + let [ rV, gV, bV ] = [ r, g, b ].map(format) let string = `rgb(${rV},${gV},${bV})` return string } @@ -395,19 +340,11 @@ export default class Color { return [ _a, _b, _c, _d, space ] } - static fromArray ( array ) { - - let newColor = new Color( ...array ) - return newColor - - } - /* Generating random colors */ - static random ( mode = 'vibrant' ) { - + static random (mode = 'vibrant') { 'sine' 'pastel' 'vibrant' @@ -415,37 +352,27 @@ export default class Color { 'rgb' 'lab' 'grey' - } /* Constructing colors */ - static temperature ( kelvin ) {} - // Test if given value is a color string - static test ( color ) { - + static test (color) { color += '' - return isHex.test( color ) || isRgb.test( color ) - + return isHex.test(color) || isRgb.test(color) } // Test if given value is a rgb object - static isRgb ( color ) { - + static isRgb (color) { return color && typeof color.r === 'number' && typeof color.g === 'number' && typeof color.b === 'number' - } // Test if given value is a color - static isColor ( color ) { - - return this.isRgb( color ) || this.test( color ) - + static isColor (color) { + return this.isRgb(color) || this.test(color) } - } -- cgit v1.2.3 From 059058fbac867a270ceef34970f5ac04f58ec913 Mon Sep 17 00:00:00 2001 From: Ulrich-Matthias Schäfer Date: Sun, 25 Nov 2018 13:04:42 +0100 Subject: fix Morphable so that it works with color spaces. It prefers the `to` space over the `from` space - _d is initialized to 0 so toArray does not give you undefined - fix tests --- dist/svg.js | 17 +++++++++++------ spec/spec/morphing.js | 2 +- src/types/Color.js | 4 ++-- src/types/Morphable.js | 9 ++++++++- 4 files changed, 22 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/dist/svg.js b/dist/svg.js index 2b7a05e..bb7841f 100644 --- a/dist/svg.js +++ b/dist/svg.js @@ -6,7 +6,7 @@ * @copyright Wout Fierens * @license MIT * -* BUILT: Mon Nov 26 2018 00:15:11 GMT+1300 (New Zealand Daylight Time) +* BUILT: Sun Nov 25 2018 13:00:14 GMT+0100 (GMT+01:00) */; var SVG = (function () { 'use strict'; @@ -1091,11 +1091,10 @@ var SVG = (function () { var d = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; var space = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'rgb'; - // If the user gave us an array, make the color from it if (typeof a === 'number') { // Allow for the case that we don't need d... space = typeof d === 'string' ? d : space; - d = typeof d === 'string' ? undefined : d; // Assign the values straight to the color + d = typeof d === 'string' ? 0 : d; // Assign the values straight to the color Object.assign(this, { _a: a, @@ -1103,7 +1102,7 @@ var SVG = (function () { _c: c, _d: d, space: space - }); + }); // If the user gave us an array, make the color from it } else if (a instanceof Array) { this.space = b || 'rgb'; Object.assign(this, { @@ -1195,7 +1194,7 @@ var SVG = (function () { this.opacity = _opacity; } /* - */ + */ }, { key: "brightness", @@ -4914,7 +4913,13 @@ var SVG = (function () { } } - var result = new this._type(value).toArray(); + var result = new this._type(value); + + if (this._type === Color) { + result = this._to ? result[this._to[4]]() : this._from ? result[this._from[4]]() : result; + } + + result = result.toArray(); this._morphObj = this._morphObj || new this._type(); this._context = this._context || Array.apply(null, Array(result.length)).map(Object); return result; diff --git a/spec/spec/morphing.js b/spec/spec/morphing.js index 7fc0c06..50d0ccb 100644 --- a/spec/spec/morphing.js +++ b/spec/spec/morphing.js @@ -44,7 +44,7 @@ describe('Morphing', function () { expect(morpher instanceof SVG.Morphable).toBe(true) expect(morpher.type()).toBe(SVG.Color) expect(morpher.at(0.5) instanceof SVG.Color).toBe(true) - expect(morpher.at(0.5).toHex()).toBe('#808080') + expect(morpher.at(0.5).hex()).toBe('#808080') }) it(`Creates a morphable out of an SVG.Box`, function () { diff --git a/src/types/Color.js b/src/types/Color.js index 8a44de1..3975aef 100644 --- a/src/types/Color.js +++ b/src/types/Color.js @@ -60,14 +60,14 @@ export default class Color { } init (a = 0, b = 0, c = 0, d = 0, space = 'rgb') { - // If the user gave us an array, make the color from it if (typeof a === 'number') { // Allow for the case that we don't need d... space = typeof d === 'string' ? d : space - d = typeof d === 'string' ? undefined : d + d = typeof d === 'string' ? 0 : d // Assign the values straight to the color Object.assign(this, { _a: a, _b: b, _c: c, _d: d, space }) + // If the user gave us an array, make the color from it } else if (a instanceof Array) { this.space = b || 'rgb' Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] }) diff --git a/src/types/Morphable.js b/src/types/Morphable.js index 240215b..e7af8c1 100644 --- a/src/types/Morphable.js +++ b/src/types/Morphable.js @@ -80,7 +80,14 @@ export default class Morphable { } } - var result = (new this._type(value)).toArray() + var result = (new this._type(value)) + if (this._type === Color) { + result = this._to ? result[this._to[4]]() + : this._from ? result[this._from[4]]() + : result + } + result = result.toArray() + this._morphObj = this._morphObj || new this._type() this._context = this._context || Array.apply(null, Array(result.length)).map(Object) -- cgit v1.2.3 From ba63b0157f04d2aa11ff4f2e9ba5bbe3271b9086 Mon Sep 17 00:00:00 2001 From: Ulrich-Matthias Schäfer Date: Mon, 26 Nov 2018 14:02:02 +0100 Subject: Make color-animation work in all spaces (conversion bugs still there) - Make sure _d is always defined - Clean up object before init - Check space in array - Use passed space instead of space in object if available --- dist/svg.js | 28 ++++++++++++++++++++++------ src/elements/Dom.js | 2 +- src/modules/optional/sugar.js | 2 +- src/svg.js | 2 +- src/types/Color.js | 30 ++++++++++++++++++++---------- 5 files changed, 45 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/dist/svg.js b/dist/svg.js index bb7841f..35335ed 100644 --- a/dist/svg.js +++ b/dist/svg.js @@ -6,7 +6,7 @@ * @copyright Wout Fierens * @license MIT * -* BUILT: Sun Nov 25 2018 13:00:14 GMT+0100 (GMT+01:00) +* BUILT: Mon Nov 26 2018 14:01:22 GMT+0100 (GMT+01:00) */; var SVG = (function () { 'use strict'; @@ -1015,7 +1015,7 @@ var SVG = (function () { return true; } - function getParameters(a) { + function getParameters(a, b) { var params = is(a, 'rgb') ? { _a: a.r, _b: a.g, @@ -1025,21 +1025,25 @@ var SVG = (function () { _a: a.x, _b: a.y, _c: a.z, + _d: 0, space: 'xyz' } : is(a, 'hsl') ? { _a: a.h, _b: a.s, _c: a.l, + _d: 0, space: 'hsl' } : is(a, 'lab') ? { _a: a.l, _b: a.a, _c: a.b, + _d: 0, space: 'lab' } : is(a, 'lch') ? { _a: a.l, _b: a.c, _c: a.h, + _d: 0, space: 'lch' } : is(a, 'cmyk') ? { _a: a.c, @@ -1053,6 +1057,7 @@ var SVG = (function () { _c: 0, space: 'rgb' }; + params.space = b || params.space; return params; } @@ -1091,6 +1096,13 @@ var SVG = (function () { var d = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; var space = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'rgb'; + // Reset all values in case the init function is rerun with new color space + if (this.space) { + for (var component in this.space) { + delete this[this.space[component]]; + } + } + if (typeof a === 'number') { // Allow for the case that we don't need d... space = typeof d === 'string' ? d : space; @@ -1104,16 +1116,16 @@ var SVG = (function () { space: space }); // If the user gave us an array, make the color from it } else if (a instanceof Array) { - this.space = b || 'rgb'; + this.space = b || a[4] || 'rgb'; Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], - _d: a[3] + _d: a[3] || 0 }); } else if (a instanceof Object) { // Set the object up and assign its values directly - var values = getParameters(a); + var values = getParameters(a, b); Object.assign(this, values); } else if (typeof a === 'string') { if (isRgb.test(a)) { @@ -1131,6 +1143,7 @@ var SVG = (function () { _a: _a2, _b: _b2, _c: _c2, + _d: 0, space: 'rgb' }); } else if (isHex.test(a)) { @@ -1148,6 +1161,7 @@ var SVG = (function () { _a: _a3, _b: _b3, _c: _c3, + _d: 0, space: 'rgb' }); } else throw Error("Unsupported string format, can't construct Color"); @@ -1273,6 +1287,8 @@ var SVG = (function () { _l /= 100; // If we are grey, then just make the color directly if (s === 0) { + _l *= 255; + var _color2 = new Color(_l, _l, _l); return _color2; @@ -3226,7 +3242,7 @@ var SVG = (function () { return this.attr(m); } - if (typeof o === 'string' || Color.isRgb(o) || o instanceof Element) { + if (typeof o === 'string' || o instanceof Color || Color.isRgb(o) || o instanceof Element) { this.attr(m, o); } else { // set all attributes from sugar.fill and sugar.stroke list diff --git a/src/elements/Dom.js b/src/elements/Dom.js index 566008c..bccfbb8 100644 --- a/src/elements/Dom.js +++ b/src/elements/Dom.js @@ -6,7 +6,7 @@ import { makeInstance, register } from '../utils/adopter.js' -import { find } from '../modules/core/selector' +import { find } from '../modules/core/selector.js' import { globals } from '../utils/window.js' import { map } from '../utils/utils.js' import { ns } from '../modules/core/namespaces.js' diff --git a/src/modules/optional/sugar.js b/src/modules/optional/sugar.js index 3bd61fb..18f3e78 100644 --- a/src/modules/optional/sugar.js +++ b/src/modules/optional/sugar.js @@ -24,7 +24,7 @@ var sugar = { if (typeof o === 'undefined') { return this.attr(m) } - if (typeof o === 'string' || Color.isRgb(o) || (o instanceof Element)) { + if (typeof o === 'string' || o instanceof Color || Color.isRgb(o) || (o instanceof Element)) { this.attr(m, o) } else { // set all attributes from sugar.fill and sugar.stroke list diff --git a/src/svg.js b/src/svg.js index 4026598..a9903fe 100644 --- a/src/svg.js +++ b/src/svg.js @@ -1,6 +1,6 @@ import * as svgMembers from './main.js' import * as regex from './modules/core/regex.js' -import { makeInstance } from './utils/adopter' +import { makeInstance } from './utils/adopter.js' // The main wrapping element export default function SVG (element) { diff --git a/src/types/Color.js b/src/types/Color.js index 3975aef..3cd7dd0 100644 --- a/src/types/Color.js +++ b/src/types/Color.js @@ -26,14 +26,16 @@ function is (object, space) { return true } -function getParameters (a) { +function getParameters (a, b) { const params = is(a, 'rgb') ? { _a: a.r, _b: a.g, _c: a.b, space: 'rgb' } - : is(a, 'xyz') ? { _a: a.x, _b: a.y, _c: a.z, space: 'xyz' } - : is(a, 'hsl') ? { _a: a.h, _b: a.s, _c: a.l, space: 'hsl' } - : is(a, 'lab') ? { _a: a.l, _b: a.a, _c: a.b, space: 'lab' } - : is(a, 'lch') ? { _a: a.l, _b: a.c, _c: a.h, space: 'lch' } + : is(a, 'xyz') ? { _a: a.x, _b: a.y, _c: a.z, _d: 0, space: 'xyz' } + : is(a, 'hsl') ? { _a: a.h, _b: a.s, _c: a.l, _d: 0, space: 'hsl' } + : is(a, 'lab') ? { _a: a.l, _b: a.a, _c: a.b, _d: 0, space: 'lab' } + : is(a, 'lch') ? { _a: a.l, _b: a.c, _c: a.h, _d: 0, space: 'lch' } : is(a, 'cmyk') ? { _a: a.c, _b: a.m, _c: a.y, _d: a.k, space: 'cmyk' } : { _a: 0, _b: 0, _c: 0, space: 'rgb' } + + params.space = b || params.space return params } @@ -60,6 +62,13 @@ export default class Color { } init (a = 0, b = 0, c = 0, d = 0, space = 'rgb') { + // Reset all values in case the init function is rerun with new color space + if (this.space) { + for (let component in this.space) { + delete this[this.space[component]] + } + } + if (typeof a === 'number') { // Allow for the case that we don't need d... space = typeof d === 'string' ? d : space @@ -69,22 +78,22 @@ export default class Color { Object.assign(this, { _a: a, _b: b, _c: c, _d: d, space }) // If the user gave us an array, make the color from it } else if (a instanceof Array) { - this.space = b || 'rgb' - Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] }) + this.space = b || a[4] || 'rgb' + Object.assign(this, { _a: a[0], _b: a[1], _c: a[2], _d: a[3] || 0 }) } else if (a instanceof Object) { // Set the object up and assign its values directly - const values = getParameters(a) + const values = getParameters(a, b) Object.assign(this, values) } else if (typeof a === 'string') { if (isRgb.test(a)) { const noWhitespace = a.replace(whitespace, '') const [ _a, _b, _c ] = rgb.exec(noWhitespace) .slice(1, 4).map(v => parseInt(v)) - Object.assign(this, { _a, _b, _c, space: 'rgb' }) + Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' }) } else if (isHex.test(a)) { const hexParse = v => parseInt(v, 16) const [ , _a, _b, _c ] = hex.exec(sixDigitHex(a)).map(hexParse) - Object.assign(this, { _a, _b, _c, space: 'rgb' }) + Object.assign(this, { _a, _b, _c, _d: 0, space: 'rgb' }) } else throw Error(`Unsupported string format, can't construct Color`) } @@ -173,6 +182,7 @@ export default class Color { // If we are grey, then just make the color directly if (s === 0) { + l *= 255 let color = new Color(l, l, l) return color } -- cgit v1.2.3 From d64b964d21e1399b198e44555be68a12378053e7 Mon Sep 17 00:00:00 2001 From: Ulrich-Matthias Schäfer Date: Mon, 26 Nov 2018 14:15:55 +0100 Subject: Fix bug when converting black to cymk space --- dist/svg.js | 8 +++++++- src/types/Color.js | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/dist/svg.js b/dist/svg.js index 35335ed..1252dc0 100644 --- a/dist/svg.js +++ b/dist/svg.js @@ -6,7 +6,7 @@ * @copyright Wout Fierens * @license MIT * -* BUILT: Mon Nov 26 2018 14:01:22 GMT+0100 (GMT+01:00) +* BUILT: Mon Nov 26 2018 14:15:16 GMT+0100 (GMT+01:00) */; var SVG = (function () { 'use strict'; @@ -1452,6 +1452,12 @@ var SVG = (function () { var k = Math.min(1 - r, 1 - g, 1 - b); + + if (k === 1) { + // Catch the black case + return new Color(0, 0, 0, 1, 'cmyk'); + } + var c = (1 - r - k) / (1 - k); var m = (1 - g - k) / (1 - k); var y = (1 - b - k) / (1 - k); // Construct the new color diff --git a/src/types/Color.js b/src/types/Color.js index 3cd7dd0..0004251 100644 --- a/src/types/Color.js +++ b/src/types/Color.js @@ -313,6 +313,12 @@ export default class Color { // Get the cmyk values in an unbounded format const k = Math.min(1 - r, 1 - g, 1 - b) + + if (k === 1) { + // Catch the black case + return new Color(0, 0, 0, 1, 'cmyk') + } + const c = (1 - r - k) / (1 - k) const m = (1 - g - k) / (1 - k) const y = (1 - b - k) / (1 - k) -- cgit v1.2.3 From d549b00dc9d593e121236c64ab7c8f986a0800ac Mon Sep 17 00:00:00 2001 From: Saivan Date: Sun, 2 Dec 2018 00:38:23 +1100 Subject: Implemented random colors and added back the playgrounds This commit adds back the playgrounds and the npm demo. We also implemented a few methods to generate pretty random colors. Changes ======= - Added back the playgrounds and the npm demos - Implemented a few random color generators --- dist/svg.js | 82 +- package-lock.json | 5526 +++++++++++++++++++++----------- package.json | 9 +- playgrounds/colors/index.html | 26 + playgrounds/colors/main.js | 29 + playgrounds/colors/style.css | 70 + playgrounds/matrix/index.html | 47 + playgrounds/matrix/matrix.html | 47 - playgrounds/matrix/style.css | 70 + playgrounds/playground.css | 70 - playgrounds/transforms/index.html | 27 + playgrounds/transforms/style.css | 70 + playgrounds/transforms/transforms.html | 27 - playgrounds/transforms/transforms.js | 1 - playgrounds/webpack.config.js | 33 + src/types/Color.js | 73 +- 16 files changed, 4215 insertions(+), 1992 deletions(-) create mode 100644 playgrounds/colors/index.html create mode 100644 playgrounds/colors/main.js create mode 100644 playgrounds/colors/style.css create mode 100644 playgrounds/matrix/index.html delete mode 100644 playgrounds/matrix/matrix.html create mode 100644 playgrounds/matrix/style.css delete mode 100644 playgrounds/playground.css create mode 100644 playgrounds/transforms/index.html create mode 100644 playgrounds/transforms/style.css delete mode 100644 playgrounds/transforms/transforms.html create mode 100644 playgrounds/webpack.config.js (limited to 'src') diff --git a/dist/svg.js b/dist/svg.js index 2b7a05e..5847884 100644 --- a/dist/svg.js +++ b/dist/svg.js @@ -6,7 +6,7 @@ * @copyright Wout Fierens * @license MIT * -* BUILT: Mon Nov 26 2018 00:15:11 GMT+1300 (New Zealand Daylight Time) +* BUILT: Sun Dec 02 2018 00:17:26 GMT+1100 (Australian Eastern Daylight Time) */; var SVG = (function () { 'use strict'; @@ -980,7 +980,8 @@ var SVG = (function () { function componentHex(component) { var integer = Math.round(component); - var hex$$1 = integer.toString(16); + var bounded = Math.max(0, Math.min(255, integer)); + var hex$$1 = bounded.toString(16); return hex$$1.length === 1 ? '0' + hex$$1 : hex$$1; } @@ -1511,13 +1512,76 @@ var SVG = (function () { }], [{ key: "random", value: function random() { - 'sine'; - 'pastel'; - 'vibrant'; - 'dark'; - 'rgb'; - 'lab'; - 'grey'; + var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'vibrant'; + var t = arguments.length > 1 ? arguments[1] : undefined; + // Get the math modules + var random = Math.random, + round = Math.round, + sin = Math.sin, + pi = Math.PI; // Run the correct generator + + if (mode === 'vibrant') { + var l = (81 - 57) * random() + 57; + var c = (83 - 45) * random() + 45; + var h = 360 * random(); + var color = new Color(l, c, h, 'lch'); + return color; + } else if (mode === 'sine') { + t = t == null ? random() : t; + var r = round(80 * sin(2 * pi * t / 0.5 + 0.01) + 150); + var g = round(50 * sin(2 * pi * t / 0.5 + 4.6) + 200); + var b = round(100 * sin(2 * pi * t / 0.5 + 2.3) + 150); + + var _color4 = new Color(r, g, b); + + return _color4; + } else if (mode === 'pastel') { + var _l2 = (94 - 86) * random() + 86; + + var _c5 = (26 - 9) * random() + 9; + + var _h2 = 360 * random(); + + var _color5 = new Color(_l2, _c5, _h2, 'lch'); + + return _color5; + } else if (mode === 'dark') { + var _l3 = 10 + 10 * random(); + + var _c6 = (125 - 75) * random() + 86; + + var _h3 = 360 * random(); + + var _color6 = new Color(_l3, _c6, _h3, 'lch'); + + return _color6; + } else if (mode === 'rgb') { + var _r3 = 255 * random(); + + var _g3 = 255 * random(); + + var _b7 = 255 * random(); + + var _color7 = new Color(_r3, _g3, _b7); + + return _color7; + } else if (mode === 'lab') { + var _l4 = 100 * random(); + + var a = 256 * random() - 128; + + var _b8 = 256 * random() - 128; + + var _color8 = new Color(_l4, a, _b8, 'lab'); + + return _color8; + } else if (mode === 'grey') { + var grey = 255 * random(); + + var _color9 = new Color(grey, grey, grey); + + return _color9; + } } /* Constructing colors diff --git a/package-lock.json b/package-lock.json index c5f923e..094b679 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,75 +14,38 @@ } }, "@babel/core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz", - "integrity": "sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.6.tgz", + "integrity": "sha512-Hz6PJT6e44iUNpAn8AoyAs6B3bl60g7MJQaI0rZEar6ECzh6+srYO1xlIdssio34mPaUtAb1y+XlkkSJzok3yw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.2", - "@babel/helpers": "^7.1.2", - "@babel/parser": "^7.1.2", + "@babel/generator": "^7.1.6", + "@babel/helpers": "^7.1.5", + "@babel/parser": "^7.1.6", "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.1.2", + "@babel/traverse": "^7.1.6", + "@babel/types": "^7.1.6", "convert-source-map": "^1.1.0", - "debug": "^3.1.0", - "json5": "^0.5.0", + "debug": "^4.1.0", + "json5": "^2.1.0", "lodash": "^4.17.10", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "@babel/generator": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.3.tgz", - "integrity": "sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz", + "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==", "dev": true, "requires": { - "@babel/types": "^7.1.3", + "@babel/types": "^7.1.6", "jsesc": "^2.5.1", "lodash": "^4.17.10", "source-map": "^0.5.0", "trim-right": "^1.0.1" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "@babel/helper-annotate-as-pure": { @@ -124,14 +87,6 @@ "@babel/helper-function-name": "^7.1.0", "@babel/types": "^7.0.0", "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "@babel/helper-explode-assignable-expression": { @@ -203,14 +158,6 @@ "@babel/template": "^7.1.0", "@babel/types": "^7.0.0", "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "@babel/helper-optimise-call-expression": { @@ -235,14 +182,6 @@ "dev": true, "requires": { "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "@babel/helper-remap-async-to-generator": { @@ -302,14 +241,14 @@ } }, "@babel/helpers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz", - "integrity": "sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.5.tgz", + "integrity": "sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg==", "dev": true, "requires": { "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.1.2" + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.1.5" } }, "@babel/highlight": { @@ -321,55 +260,12 @@ "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "@babel/parser": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz", - "integrity": "sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", + "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", "dev": true }, "@babel/plugin-external-helpers": { @@ -499,21 +395,13 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz", - "integrity": "sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.1.5.tgz", + "integrity": "sha512-jlYcDrz+5ayWC7mxgpn1Wj8zj0mmjCT2w0mPIMSwO926eXBRxpEgoN/uQVRBfjtr8ayjcmS+xk2G1jaP8JjMJQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "@babel/plugin-transform-classes": { @@ -530,14 +418,6 @@ "@babel/helper-replace-supers": "^7.1.0", "@babel/helper-split-export-declaration": "^7.0.0", "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", - "dev": true - } } }, "@babel/plugin-transform-computed-properties": { @@ -706,14 +586,6 @@ "@babel/helper-plugin-utils": "^7.0.0", "resolve": "^1.8.1", "semver": "^5.5.1" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "@babel/plugin-transform-shorthand-properties": { @@ -775,9 +647,9 @@ } }, "@babel/preset-env": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.0.tgz", - "integrity": "sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.6.tgz", + "integrity": "sha512-YIBfpJNQMBkb6MCkjz/A9J76SNCSuGVamOVBgoUkLzpJD/z8ghHi9I42LQ4pulVX68N/MmImz6ZTixt7Azgexw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -793,7 +665,7 @@ "@babel/plugin-transform-arrow-functions": "^7.0.0", "@babel/plugin-transform-async-to-generator": "^7.1.0", "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.1.5", "@babel/plugin-transform-classes": "^7.1.0", "@babel/plugin-transform-computed-properties": "^7.0.0", "@babel/plugin-transform-destructuring": "^7.0.0", @@ -821,31 +693,15 @@ "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "@babel/runtime": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", - "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.5.tgz", + "integrity": "sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA==", "dev": true, "requires": { "regenerator-runtime": "^0.12.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", - "dev": true - } } }, "@babel/template": { @@ -860,68 +716,31 @@ } }, "@babel/traverse": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.4.tgz", - "integrity": "sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.3", + "@babel/generator": "^7.1.6", "@babel/helper-function-name": "^7.1.0", "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.1.3", - "@babel/types": "^7.1.3", - "debug": "^3.1.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.10" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "@babel/types": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz", - "integrity": "sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz", + "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==", "dev": true, "requires": { "esutils": "^2.0.2", "lodash": "^4.17.10", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "@types/estree": { @@ -931,9 +750,193 @@ "dev": true }, "@types/node": { - "version": "10.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.2.tgz", - "integrity": "sha512-53ElVDSnZeFUUFIYzI8WLQ25IhWzb6vbddNp8UHlXQyU0ET2RhV5zg0NfubzU7iNMh5bBXb0htCzfvrSVNgzaQ==", + "version": "10.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.11.tgz", + "integrity": "sha512-3iIOhNiPGTdcUNVCv9e5G7GotfvJJe2pc9w2UgDXlUwnxSZ3RgcUocIU+xYm+rTU54jIKih998QE4dMOyMN1NQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", "dev": true }, "abbrev": { @@ -953,15 +956,32 @@ } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", + "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", "dev": true }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + } + } + }, "acorn-jsx": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.0.tgz", - "integrity": "sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", "dev": true }, "after": { @@ -971,31 +991,29 @@ "dev": true }, "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz", + "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "dependencies": { - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, + "ajv-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", + "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -1010,53 +1028,41 @@ "dev": true, "requires": { "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, + "ansi-colors": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", + "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==", + "dev": true + }, "ansi-escapes": { "version": "3.1.0", "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -1081,38 +1087,6 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "argparse": { @@ -1148,6 +1122,18 @@ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", "dev": true }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1175,16 +1161,56 @@ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assign-symbols": { @@ -1236,7 +1262,7 @@ }, "source-map": { "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "optional": true, @@ -1248,13 +1274,19 @@ }, "ast-types": { "version": "0.7.8", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -1277,9 +1309,21 @@ "dev": true }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "babel-eslint": { @@ -1323,6 +1367,14 @@ "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } } }, "backo2": { @@ -1410,12 +1462,17 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -1429,6 +1486,12 @@ "callsite": "1.0.0" } }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, "binary-extensions": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", @@ -1443,38 +1506,6 @@ "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "blob": { @@ -1484,9 +1515,15 @@ "dev": true }, "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body-parser": { @@ -1507,6 +1544,15 @@ "type-is": "~1.6.16" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -1515,9 +1561,29 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, "boxen": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-2.0.0.tgz", @@ -1533,77 +1599,11 @@ "widest-line": "^2.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "camelcase": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -1658,6 +1658,12 @@ "through2": "^2.0.0" } }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, "brotli": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", @@ -1694,6 +1700,43 @@ } } }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "browserify-optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", @@ -1705,15 +1748,68 @@ "browser-resolve": "^1.8.1" } }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + }, + "dependencies": { + "pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", + "dev": true + } + } + }, "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.5.tgz", + "integrity": "sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" + "caniuse-lite": "^1.0.30000912", + "electron-to-chromium": "^1.3.86", + "node-releases": "^1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-alloc": { @@ -1745,9 +1841,21 @@ "dev": true }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, "builtin-modules": { @@ -1756,12 +1864,52 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "cacache": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", + "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1796,7 +1944,7 @@ }, "callsites": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, @@ -1808,7 +1956,7 @@ }, "camelcase-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { @@ -1817,11 +1965,28 @@ } }, "caniuse-lite": { - "version": "1.0.30000899", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000899.tgz", - "integrity": "sha512-enC3zKfUCJxxwvUIsBkbHd54CtJw1KtIWvrK0JZxWD/fEN2knHaai45lndJ4xXAkyRAPyk60J3yagkKDWhfeMA==", + "version": "1.0.30000912", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000912.tgz", + "integrity": "sha512-M3zAtV36U+xw5mMROlTXpAHClmPAor6GPKAMD5Yi7glCB5sbMPFtnQ3rGpk4XqPdUrrTIaVYSJZxREZWNy8QJg==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -1847,38 +2012,6 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0", "upath": "^1.0.5" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } } }, "chownr": { @@ -1887,12 +2020,31 @@ "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1937,18 +2089,23 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1981,9 +2138,9 @@ "dev": true }, "colors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true }, "combine-lists": { @@ -1993,20 +2150,12 @@ "dev": true, "requires": { "lodash": "^4.5.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -2016,8 +2165,13 @@ "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, - "optional": true + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true }, "component-bind": { "version": "1.0.0", @@ -2037,6 +2191,47 @@ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, + "compressible": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "dev": true, + "requires": { + "mime-db": ">= 1.36.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2053,38 +2248,6 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "connect": { @@ -2097,6 +2260,38 @@ "finalhandler": "1.1.0", "parseurl": "~1.3.2", "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" } }, "console-control-strings": { @@ -2105,12 +2300,24 @@ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -2118,10 +2325,13 @@ "dev": true }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "cookie": { "version": "0.3.1", @@ -2129,6 +2339,26 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2165,47 +2395,75 @@ "log-driver": "^1.2.7", "minimist": "^1.2.0", "request": "^2.85.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "lru-cache": "^4.0.1", + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "currently-unhandled": { @@ -2223,6 +2481,12 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2230,14 +2494,6 @@ "dev": true, "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "date-format": { @@ -2246,13 +2502,29 @@ "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", "dev": true }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -2276,6 +2548,15 @@ "mimic-response": "^1.0.0" } }, + "deep-assign": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz", + "integrity": "sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI=", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -2294,6 +2575,33 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2336,18 +2644,25 @@ } }, "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "dev": true, "requires": { - "globby": "^5.0.0", + "globby": "^6.1.0", "is-path-cwd": "^1.0.0", "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", "rimraf": "^2.2.8" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "delayed-stream": { @@ -2368,12 +2683,34 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, "dfa": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.1.0.tgz", @@ -2389,6 +2726,42 @@ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -2410,24 +2783,51 @@ "void-elements": "^2.0.0" } }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "readable-stream": "^2.0.2" } }, - "ecstatic": { - "version": "3.3.0", + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecstatic": { + "version": "3.3.0", "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.0.tgz", "integrity": "sha512-EblWYTd+wPIAMQ0U4oYJZ7QBypT9ZUIwpqli0bKDjeIIQnXDBK2dXtZ9yzRCOlkW1HkO8gn7/FxLK1yPIW17pw==", "dev": true, @@ -2445,9 +2845,30 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.82.tgz", - "integrity": "sha512-NI4nB2IWGcU4JVT1AE8kBb/dFor4zjLHMLsOROPahppeHrR0FG5uslxMmkp/thO1MvPjM2xhlKoY29/I60s0ew==", + "version": "1.3.86", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.86.tgz", + "integrity": "sha512-BcmXOu37FCPxrrh0wyKgKi5dAjIu2ohxN5ptapkLPKRC3IBK2NeIwh9n1x/8HzSRQiEKamJkDce1ZgOGgEX9iw==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, "encodeurl": { @@ -2456,6 +2877,15 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "engine.io": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", @@ -2478,12 +2908,18 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "engine.io-client": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", "dev": true, "requires": { @@ -2508,6 +2944,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -2524,12 +2966,32 @@ "has-binary2": "~1.0.2" } }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2564,6 +3026,12 @@ "source-map": "~0.2.0" }, "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, "estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", @@ -2572,7 +3040,7 @@ }, "source-map": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", "dev": true, "optional": true, @@ -2583,9 +3051,9 @@ } }, "eslint": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.8.0.tgz", - "integrity": "sha512-Zok6Bru3y2JprqTNm14mgQ15YQu/SMDkWdnmHfFg770DIUlmMFd/gqqzCHekxzjHZJxXv3tmTpH0C1icaYJsRQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.9.0.tgz", + "integrity": "sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -2628,54 +3096,6 @@ "text-table": "^0.2.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "eslint-scope": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", @@ -2685,58 +3105,6 @@ "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -2754,6 +3122,23 @@ "requires": { "debug": "^2.6.9", "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-module-utils": { @@ -2764,16 +3149,33 @@ "requires": { "debug": "^2.6.8", "pkg-dir": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "eslint-plugin-es": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz", - "integrity": "sha512-9XcVyZiQRVeFjqHw8qHNDAZcQLqaHlOGGpeYqzYh8S4JYCWTCO3yzyen8yVmA5PratfzTRWDwCOFphtDEG+w/w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.0.tgz", + "integrity": "sha512-XfFmgFdIUDgvaRAlaXUkxrRg5JSADoRC8IkKLc/cISeR3yHVMefFHQZpcyXXEUUPHfy5DwviBcrfqlyqEwlQVw==", "dev": true, "requires": { "eslint-utils": "^1.3.0", - "regexpp": "^2.0.0" + "regexpp": "^2.0.1" } }, "eslint-plugin-import": { @@ -2794,9 +3196,18 @@ "resolve": "^1.6.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "doctrine": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { @@ -2804,56 +3215,11 @@ "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -2876,12 +3242,6 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.4.tgz", "integrity": "sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g==", "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true } } }, @@ -2934,20 +3294,12 @@ "acorn": "^6.0.2", "acorn-jsx": "^5.0.0", "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", - "dev": true - } } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { @@ -2986,12 +3338,43 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, "eventemitter3": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -3005,6 +3388,29 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } } }, "expand-braces": { @@ -3018,12 +3424,6 @@ "braces": "^0.1.2" }, "dependencies": { - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", @@ -3038,28 +3438,6 @@ "requires": { "expand-range": "^0.1.0" } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "^0.1.1", - "repeat-string": "^0.2.2" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true } } }, @@ -3078,6 +3456,15 @@ "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -3095,76 +3482,131 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "fill-range": "^2.1.0" + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" }, "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "isarray": "1.0.0" + "ms": "2.0.0" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true } } }, - "expand-template": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", - "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==", - "dev": true - }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extend-shallow": { @@ -3280,12 +3722,26 @@ "foreach": "^2.0.5", "isarray": "0.0.1", "object-keys": "^1.0.6" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } } }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { @@ -3300,6 +3756,21 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -3369,6 +3840,21 @@ "unpipe": "~1.0.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -3377,6 +3863,77 @@ } } }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -3388,24 +3945,34 @@ } }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, "follow-redirects": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", - "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", "dev": true, "requires": { - "debug": "^3.1.0" + "debug": "=3.1.0" }, "dependencies": { "debug": { @@ -3416,6 +3983,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -3444,6 +4017,15 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -3456,6 +4038,23 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -3465,9 +4064,25 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, "fs-access": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { @@ -3480,6 +4095,18 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4041,8 +4668,57 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, "get-stream": { "version": "3.0.0", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -4062,14 +4738,6 @@ "dev": true, "requires": { "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "github-from-package": { @@ -4079,9 +4747,9 @@ "dev": true }, "gl-matrix": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.6.1.tgz", - "integrity": "sha512-fK37p7vkpw5H4WSypfa6TUV8nlB8+Fd1pZj15sMtvRPnfzArvTI4U4E25x2Hmp+UxZX11ve0aGaHarRieP+gSw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", + "integrity": "sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==", "dev": true }, "glob": { @@ -4108,6 +4776,15 @@ "is-glob": "^2.0.0" }, "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", @@ -4126,45 +4803,45 @@ } }, "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.0" } } } }, + "global-modules-path": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", + "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", + "dev": true + }, "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", "dev": true }, "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "version": "6.1.0", + "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { "array-union": "^1.0.1", - "arrify": "^1.0.0", "glob": "^7.0.3", "object-assign": "^4.0.1", "pify": "^2.0.0", @@ -4189,13 +4866,37 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", "dev": true, "requires": { - "async": "^2.5.0", + "duplexer": "^0.1.1", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "http://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" @@ -4210,12 +4911,6 @@ "lodash": "^4.17.10" } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4230,6 +4925,16 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4263,9 +4968,9 @@ "dev": true }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-unicode": { @@ -4306,16 +5011,71 @@ } } }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "hosted-git-info": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", - "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, "http-errors": { @@ -4330,6 +5090,12 @@ "statuses": ">= 1.4.0 < 2" } }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, "http-proxy": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", @@ -4341,6 +5107,18 @@ "requires-port": "^1.0.0" } }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + } + }, "http-server": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.11.1.tgz", @@ -4355,16 +5133,25 @@ "optimist": "0.6.x", "portfinder": "^1.0.13", "union": "~0.4.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4374,6 +5161,18 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -4381,14 +5180,14 @@ "dev": true }, "iltorb": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-2.4.0.tgz", - "integrity": "sha512-Px3k32eqlAwpS0OwiQDRUrlPNeY1JKyZvH636cRRxxhkqc5ukmfXZStNHNfRzpa3tb9EK3Nq0pIX9cXUdr+q3w==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-2.4.1.tgz", + "integrity": "sha512-huyAN7dSNe2b7VAl5AyvaeZ8XTcDTSF1b8JVYDggl+SBfHsORq3qMZeesZW7zoEy21s15SiERAITWT5cwxu1Uw==", "dev": true, "requires": { "detect-libc": "^1.0.3", "npmlog": "^4.1.2", - "prebuild-install": "^5.0.0", + "prebuild-install": "^5.2.1", "which-pm-runs": "^1.0.0" } }, @@ -4398,6 +5197,76 @@ "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "dev": true }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4442,9 +5311,9 @@ "dev": true }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -4458,78 +5327,43 @@ "run-async": "^2.2.0", "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "ansi-regex": "^4.0.0" } } } }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -4539,6 +5373,30 @@ "loose-envify": "^1.0.0" } }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -4582,7 +5440,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { @@ -4665,12 +5523,18 @@ } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "is-extglob": "^2.1.1" } }, "is-module": { @@ -4701,7 +5565,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -4786,10 +5650,16 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isbinaryfile": { @@ -4841,6 +5711,12 @@ "wordwrap": "^1.0.0" }, "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -4854,6 +5730,12 @@ "path-is-absolute": "^1.0.0" } }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -4893,32 +5775,37 @@ "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", - "esprima": "^2.6.0" + "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-schema": { @@ -4928,9 +5815,9 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -4945,12 +5832,21 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4961,14 +5857,6 @@ "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "karma": { @@ -5006,22 +5894,16 @@ "useragent": "2.2.1" }, "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", "dev": true }, "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true }, "source-map": { @@ -5053,30 +5935,6 @@ "lodash": "^4.17.0", "minimatch": "^3.0.0", "source-map": "^0.5.1" - }, - "dependencies": { - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } } }, "karma-firefox-launcher": { @@ -5091,12 +5949,27 @@ "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", "dev": true }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", @@ -5123,18 +5996,29 @@ "parse-json": "^2.2.0", "pify": "^2.0.0", "strip-bom": "^3.0.0" + } + }, + "loader-runner": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", + "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" }, "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true } } @@ -5202,15 +6086,15 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5230,13 +6114,45 @@ "signal-exit": "^3.0.0" } }, + "lru-cache": { + "version": "2.2.4", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + }, "magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "vlq": "^0.2.2" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" } }, "map-cache": { @@ -5266,15 +6182,47 @@ "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", "dev": true }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, "meow": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { @@ -5288,8 +6236,70 @@ "read-pkg-up": "^1.0.1", "redent": "^1.0.0", "trim-newlines": "^1.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, "merge-source-map": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", @@ -5306,40 +6316,14 @@ "dev": true, "requires": { "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -5361,6 +6345,16 @@ "to-regex": "^3.0.2" } }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -5394,6 +6388,18 @@ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -5405,10 +6411,40 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", @@ -5432,7 +6468,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -5441,16 +6477,46 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, "mute-stream": { @@ -5503,6 +6569,12 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -5510,37 +6582,66 @@ "dev": true }, "node-abi": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.5.tgz", - "integrity": "sha512-aa/UC6Nr3+tqhHGRsAuw/edz7/q9nnetBrKWxj6rpTtm+0X9T1qU7lIEHMS3yN9JwAbRiKUbRRFy1PLz/y3aaA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.5.0.tgz", + "integrity": "sha512-9g2twBGSP6wIR5PW7tXvAWnEWKJDH/VskdXp168xsw9VVxpEGov8K4jsP4/VeoC7b2ZAyzckvMCuQuQlw44lXg==", "dev": true, "requires": { "semver": "^5.4.1" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" }, "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true } } }, "node-releases": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.1.tgz", - "integrity": "sha512-/kOv7jA26OBwkBPx6B9xR/FzJzs2OkMtcWjS8uPQRMHE7IELdSfN0QKZvmiWnf5P1QJ8oYq/e9qe0aCZISB1pQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.5.tgz", + "integrity": "sha512-Ky7q0BO1BBkG/rQz6PkEZ59rwo+aSfhczHP1wwq8IowoVdN/FpiP7qp0XW0P2+BVCWe5fQUBozdbVd54q1RbCQ==", "dev": true, "requires": { "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "noop-logger": { @@ -5612,6 +6713,12 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5684,17 +6791,6 @@ "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } } }, "object.pick": { @@ -5706,6 +6802,12 @@ "isobject": "^3.0.1" } }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -5715,6 +6817,12 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5739,6 +6847,15 @@ "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", "dev": true }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -5751,7 +6868,7 @@ "dependencies": { "minimist": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, @@ -5777,24 +6894,79 @@ "wordwrap": "~1.0.0" } }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, + "os-locale": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", + "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -5813,6 +6985,12 @@ "p-limit": "^1.1.0" } }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", @@ -5821,10 +6999,34 @@ }, "pako": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "resolved": "http://registry.npmjs.org/pako/-/pako-0.2.9.tgz", "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", "dev": true }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -5893,6 +7095,12 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -5910,7 +7118,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -5927,28 +7135,37 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - } + "pify": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "performance-now": { @@ -5959,7 +7176,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, @@ -5994,14 +7211,31 @@ "dev": true }, "portfinder": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz", - "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", "dev": true, "requires": { "async": "^1.5.2", "debug": "^2.2.0", "mkdirp": "0.5.x" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "posix-character-classes": { @@ -6011,13 +7245,13 @@ "dev": true }, "prebuild-install": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.1.tgz", - "integrity": "sha512-9DAccsInWHB48TBQi2eJkLPE049JuAI6FjIH0oIrij4bpDVEbX6JvlWRAcAAlUqBHhjgq0jNqA3m3bBXWm9v6w==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.2.tgz", + "integrity": "sha512-4e8VJnP3zJdZv/uP0eNWmr2r9urp4NECw7Mt1OSAi3rcLrbBRxGiAkfUFtre2MhQ5wfREAjRV+K1gubvs/GPsA==", "dev": true, "requires": { "detect-libc": "^1.0.3", - "expand-template": "^1.0.2", + "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", @@ -6032,17 +7266,6 @@ "tar-fs": "^1.13.0", "tunnel-agent": "^0.6.0", "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - } } }, "prelude-ls": { @@ -6063,6 +7286,12 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -6075,6 +7304,28 @@ "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", "dev": true }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -6087,6 +7338,20 @@ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", "dev": true }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -6095,23 +7360,23 @@ "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" - }, - "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - } + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qjobs": { @@ -6126,6 +7391,24 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true + }, "quote-stream": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", @@ -6138,9 +7421,9 @@ } }, "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -6156,6 +7439,25 @@ } } }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -6198,63 +7500,50 @@ } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "locate-path": "^2.0.0" } } } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -6266,44 +7555,6 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "redent": { @@ -6332,9 +7583,9 @@ } }, "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", "dev": true }, "regenerator-transform": { @@ -6402,7 +7653,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -6415,9 +7666,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -6461,139 +7712,23 @@ "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true - }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, - "requires": { - "mime-db": "~1.37.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "require-uncached": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -6616,6 +7751,23 @@ "path-parse": "^1.0.5" } }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", @@ -6668,10 +7820,20 @@ "glob": "^7.0.5" } }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "rollup": { - "version": "0.67.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.67.0.tgz", - "integrity": "sha512-p34buXxArhwv9ieTdHvdhdo65Cbig68s/Z8llbZuiX5e+3zCqnBF02Ck9IH0tECrmvvrJVMws32Ry84hTnS1Tw==", + "version": "0.67.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.67.3.tgz", + "integrity": "sha512-TyNQCz97rKuVVbsKUTXfwIjV7UljWyTVd7cTMuE+aqlQ7WJslkYF5QaYGjMLR2BlQtUOO5CAxSVnpQ55iYp5jg==", "dev": true, "requires": { "@types/estree": "0.0.39", @@ -6698,17 +7860,6 @@ "magic-string": "^0.25.1", "resolve": "^1.8.1", "rollup-pluginutils": "^2.3.3" - }, - "dependencies": { - "magic-string": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", - "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.1" - } - } } }, "rollup-plugin-filesize": { @@ -6731,31 +7882,6 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", "dev": true - }, - "deep-assign": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz", - "integrity": "sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI=", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "gzip-size": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", - "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true } } }, @@ -6788,30 +7914,6 @@ "jest-worker": "^23.2.0", "serialize-javascript": "^1.5.0", "uglify-js": "^3.4.9" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - } - } } }, "rollup-plugin-uglify-es": { @@ -6890,6 +7992,15 @@ "is-posix-bracket": "^0.1.0" } }, + "expand-range": { + "version": "1.8.2", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -6899,6 +8010,19 @@ "is-extglob": "^1.0.0" } }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", @@ -6914,6 +8038,24 @@ "is-extglob": "^1.0.0" } }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -6955,6 +8097,15 @@ "is-promise": "^2.1.0" } }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, "rxjs": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", @@ -6972,7 +8123,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -6991,18 +8142,138 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, "serialize-javascript": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", "dev": true }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -7032,12 +8303,28 @@ } } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, "shallow-copy": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", @@ -7083,20 +8370,14 @@ } }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", + "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - } } }, "snapdragon": { @@ -7115,6 +8396,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -7132,6 +8422,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -7228,6 +8524,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -7267,12 +8569,18 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "socket.io-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", "dev": true, "requires": { @@ -7295,9 +8603,65 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } } } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -7342,15 +8706,15 @@ "dev": true }, "sourcemap-codec": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.3.tgz", - "integrity": "sha512-vFrY/x/NdsD7Yc8mpTJXuao9S8lq08Z/kOITHz6b7YbfI9xL8Spe5EvSQUHOI7SbpY8bRPr0U3kKSsPuqEGSfA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -7358,9 +8722,9 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { @@ -7374,11 +8738,74 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", "dev": true }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "spdy-transport": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", + "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -7395,9 +8822,9 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -7409,14 +8836,15 @@ "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" } }, "static-eval": { @@ -7471,15 +8899,6 @@ "through2": "~2.0.3" }, "dependencies": { - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, "escodegen": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", @@ -7499,25 +8918,13 @@ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "magic-string": { + "version": "0.22.5", + "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "vlq": "^0.2.2" } }, "source-map": { @@ -7526,15 +8933,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -7544,6 +8942,45 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, "streamroller": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", @@ -7564,65 +9001,43 @@ "requires": { "ms": "^2.1.1" } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } } } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -7636,14 +9051,6 @@ "dev": true, "requires": { "get-stdin": "^4.0.1" - }, - "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - } } }, "strip-json-comments": { @@ -7652,6 +9059,15 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "svgdom": { "version": "0.0.15", "resolved": "https://registry.npmjs.org/svgdom/-/svgdom-0.0.15.tgz", @@ -7665,50 +9081,23 @@ } }, "table": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz", - "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz", + "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==", "dev": true, "requires": { - "ajv": "^6.5.3", - "lodash": "^4.17.10", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "2.0.0", "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true + }, "tar-fs": { "version": "1.16.3", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", @@ -7721,15 +9110,6 @@ "tar-stream": "^1.1.2" }, "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "pump": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", @@ -7755,47 +9135,6 @@ "readable-stream": "^2.3.0", "to-buffer": "^1.1.1", "xtend": "^4.0.0" - }, - "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "term-size": { @@ -7808,9 +9147,9 @@ } }, "terser": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.3.tgz", - "integrity": "sha512-uyL5hwDICjnv49JANhZvQYLikt/HADWNbUFsKQpZ/i+JSOkL2T4V7WUpW7S/5QGZceVq2x0HRVhEQQuW2ZpX6g==", + "version": "3.10.13", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.13.tgz", + "integrity": "sha512-AgdHqw2leuADuHiP4Kkk1i40m10RMGguPaiCw6MVD6jtDR7N94zohGqAS2lkDXIS7eIkGit3ief3eQGh/Md+GQ==", "dev": true, "requires": { "commander": "~2.17.1", @@ -7818,12 +9157,30 @@ "source-map-support": "~0.5.6" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, + } + } + }, + "terser-webpack-plugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", + "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7840,50 +9197,33 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" } }, "tiny-inflate": { @@ -7907,6 +9247,12 @@ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -7961,6 +9307,24 @@ "repeat-string": "^1.6.1" } }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -7979,12 +9343,26 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -8016,7 +9394,6 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, - "optional": true, "requires": { "commander": "~2.17.1", "source-map": "~0.6.1" @@ -8026,8 +9403,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true + "dev": true } } }, @@ -8103,7 +9479,7 @@ "dependencies": { "qs": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/qs/-/qs-2.3.3.tgz", "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", "dev": true } @@ -8144,6 +9520,24 @@ } } }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -8187,12 +9581,6 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true } } }, @@ -8209,14 +9597,6 @@ "dev": true, "requires": { "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } } }, "urix": { @@ -8225,21 +9605,46 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, "url-join": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", "dev": true }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "url-parse": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" } }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "useragent": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", @@ -8248,14 +9653,15 @@ "requires": { "lru-cache": "2.2.x", "tmp": "0.0.x" - }, - "dependencies": { - "lru-cache": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", - "dev": true - } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" } }, "util-deprecate": { @@ -8270,16 +9676,34 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -8289,14 +9713,6 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } } }, "vlq": { @@ -8305,12 +9721,338 @@ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", "dev": true }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.26.1.tgz", + "integrity": "sha512-i2oOvEvuvLLSuSCkdVrknaxAhtUZ9g+nLSoHCWV0gDzqGX2DXaCrMmMUpbRsTSSLrUqAI56PoEiyMUZIZ1msug==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-cli": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", + "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "global-modules-path": "^2.3.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.2" + } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz", + "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "3.4.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -8320,6 +10062,12 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "which-pm-runs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", @@ -8342,47 +10090,70 @@ "dev": true, "requires": { "string-width": "^2.1.1" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^2.0.0" } } } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -8415,18 +10186,119 @@ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + } + } + }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", diff --git a/package.json b/package.json index 619b1f2..8be4f30 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,8 @@ "test": "npx karma start .config/karma.conf.js --single-run", "test:dots": "npx karma start .config/karma.conf.js --single-run --reporters dots", "test:quick": "npx karma start .config/karma.quick.js", - "server": "npx http-server ./ -d" + "server": "npx http-server ./ -d", + "demo": "run () { cd playgrounds; ../node_modules/.bin/webpack-dev-server --env=$1; }; run" }, "devDependencies": { "@babel/core": "^7.1.2", @@ -93,7 +94,11 @@ "rollup-plugin-node-resolve": "^3.4.0", "rollup-plugin-uglify": "^6.0.0", "rollup-plugin-uglify-es": "0.0.1", - "svgdom": "latest" + "svgdom": "latest", + "webpack": "^4.26.1", + "webpack-cli": "^3.1.2", + "webpack-dev-server": "^3.1.10", + "yargs": "^12.0.5" }, "dependencies": {}, "optionalDependencies": {} diff --git a/playgrounds/colors/index.html b/playgrounds/colors/index.html new file mode 100644 index 0000000..301dd3a --- /dev/null +++ b/playgrounds/colors/index.html @@ -0,0 +1,26 @@ + + + + + + + SVG Playground + + + + + +

Color Playground

+ +

+ Lets test the different types of random colors we can make +

+ + + + + + + + + diff --git a/playgrounds/colors/main.js b/playgrounds/colors/main.js new file mode 100644 index 0000000..fda3ce2 --- /dev/null +++ b/playgrounds/colors/main.js @@ -0,0 +1,29 @@ + + +let canvas = SVG('#canvas').group() + .translate( -150, 230 ) + +// Make a bunch of rectangles +function rectangles ( method='Vibrant') { + + // Make a group + let group = canvas.group() + group.text(method).attr('font-size', 50).move( -230, 20 ) + + // Add the squares + for ( let i = 0; i < 20; i++ ) { + let color = SVG.Color.random( method.toLowerCase() ).hex() + let rect = group.rect(100, 100) + .x( 20 + 100 * i ) + .fill( color ) + } + return group +} + +rectangles( 'Vibrant' ).translate( 0, 100 ) +rectangles( 'Sine' ).translate( 0, 220 ) +rectangles( 'Pastel' ).translate( 0, 340 ) +rectangles( 'Dark' ).translate( 0, 460 ) +rectangles( 'RGB' ).translate( 0, 580 ) +rectangles( 'LAB' ).translate( 0, 700 ) +rectangles( 'Grey' ).translate( 0, 820 ) diff --git a/playgrounds/colors/style.css b/playgrounds/colors/style.css new file mode 100644 index 0000000..f327905 --- /dev/null +++ b/playgrounds/colors/style.css @@ -0,0 +1,70 @@ + +* { + box-sizing: border-box; +} + +html { + background-color : #fefefe; +} + +body { + margin: 0; + width: 100vw; + height: 99vh; + grid-gap: 30px; + display: inline-grid; + align-items: center; + grid-template-columns: 10vw 40vw auto 10vw; + grid-template-rows: 0 10vw auto 0; +} + +h1 { + text-align: right; + border-right: solid 3px #f06; + padding-right: 12px; + color: #f06; + font-size: 52px; + font-family: Helvetica; + grid-row: 2; + grid-column: 2; + line-height: 1.8em; +} + +p { + padding-right: 50px; + color: #444; + font-size: 18px; + font-family: Helvetica; + grid-row: 2; + grid-column: 3; +} + +svg { + height: 100%; + width: 100%; + grid-row: 3; + grid-column: 2/4; + background-color: #f5f6f7; + border-radius: 20px; + border: #f065 1px solid; +} + +.pink { + fill: #FF0066; +} + +.green { + fill: #00ff99; +} + +.dark-pink { + fill: #660029; +} + +.light-pink { + fill: #FF99C2; +} + +.off-white { + fill: #FFCCE0; +} diff --git a/playgrounds/matrix/index.html b/playgrounds/matrix/index.html new file mode 100644 index 0000000..cd34b7d --- /dev/null +++ b/playgrounds/matrix/index.html @@ -0,0 +1,47 @@ + + + + + + + SVG Playground + + + + + +

SVG Transformations

+ +

+ This playground tests the compose/decompose functionality in + svg matrix, as well as the draggable code and the transformations. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/playgrounds/matrix/matrix.html b/playgrounds/matrix/matrix.html deleted file mode 100644 index cd34b7d..0000000 --- a/playgrounds/matrix/matrix.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - SVG Playground - - - - - -

SVG Transformations

- -

- This playground tests the compose/decompose functionality in - svg matrix, as well as the draggable code and the transformations. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/playgrounds/matrix/style.css b/playgrounds/matrix/style.css new file mode 100644 index 0000000..f327905 --- /dev/null +++ b/playgrounds/matrix/style.css @@ -0,0 +1,70 @@ + +* { + box-sizing: border-box; +} + +html { + background-color : #fefefe; +} + +body { + margin: 0; + width: 100vw; + height: 99vh; + grid-gap: 30px; + display: inline-grid; + align-items: center; + grid-template-columns: 10vw 40vw auto 10vw; + grid-template-rows: 0 10vw auto 0; +} + +h1 { + text-align: right; + border-right: solid 3px #f06; + padding-right: 12px; + color: #f06; + font-size: 52px; + font-family: Helvetica; + grid-row: 2; + grid-column: 2; + line-height: 1.8em; +} + +p { + padding-right: 50px; + color: #444; + font-size: 18px; + font-family: Helvetica; + grid-row: 2; + grid-column: 3; +} + +svg { + height: 100%; + width: 100%; + grid-row: 3; + grid-column: 2/4; + background-color: #f5f6f7; + border-radius: 20px; + border: #f065 1px solid; +} + +.pink { + fill: #FF0066; +} + +.green { + fill: #00ff99; +} + +.dark-pink { + fill: #660029; +} + +.light-pink { + fill: #FF99C2; +} + +.off-white { + fill: #FFCCE0; +} diff --git a/playgrounds/playground.css b/playgrounds/playground.css deleted file mode 100644 index f327905..0000000 --- a/playgrounds/playground.css +++ /dev/null @@ -1,70 +0,0 @@ - -* { - box-sizing: border-box; -} - -html { - background-color : #fefefe; -} - -body { - margin: 0; - width: 100vw; - height: 99vh; - grid-gap: 30px; - display: inline-grid; - align-items: center; - grid-template-columns: 10vw 40vw auto 10vw; - grid-template-rows: 0 10vw auto 0; -} - -h1 { - text-align: right; - border-right: solid 3px #f06; - padding-right: 12px; - color: #f06; - font-size: 52px; - font-family: Helvetica; - grid-row: 2; - grid-column: 2; - line-height: 1.8em; -} - -p { - padding-right: 50px; - color: #444; - font-size: 18px; - font-family: Helvetica; - grid-row: 2; - grid-column: 3; -} - -svg { - height: 100%; - width: 100%; - grid-row: 3; - grid-column: 2/4; - background-color: #f5f6f7; - border-radius: 20px; - border: #f065 1px solid; -} - -.pink { - fill: #FF0066; -} - -.green { - fill: #00ff99; -} - -.dark-pink { - fill: #660029; -} - -.light-pink { - fill: #FF99C2; -} - -.off-white { - fill: #FFCCE0; -} diff --git a/playgrounds/transforms/index.html b/playgrounds/transforms/index.html new file mode 100644 index 0000000..a165dd9 --- /dev/null +++ b/playgrounds/transforms/index.html @@ -0,0 +1,27 @@ + + + + + + + SVG Playground + + + + + +

Transformations

+ +

+ Here you can try out our transformation code, try moving around the pink + box in your console with its variable name: mover +

+ + + + + + + + + diff --git a/playgrounds/transforms/style.css b/playgrounds/transforms/style.css new file mode 100644 index 0000000..f327905 --- /dev/null +++ b/playgrounds/transforms/style.css @@ -0,0 +1,70 @@ + +* { + box-sizing: border-box; +} + +html { + background-color : #fefefe; +} + +body { + margin: 0; + width: 100vw; + height: 99vh; + grid-gap: 30px; + display: inline-grid; + align-items: center; + grid-template-columns: 10vw 40vw auto 10vw; + grid-template-rows: 0 10vw auto 0; +} + +h1 { + text-align: right; + border-right: solid 3px #f06; + padding-right: 12px; + color: #f06; + font-size: 52px; + font-family: Helvetica; + grid-row: 2; + grid-column: 2; + line-height: 1.8em; +} + +p { + padding-right: 50px; + color: #444; + font-size: 18px; + font-family: Helvetica; + grid-row: 2; + grid-column: 3; +} + +svg { + height: 100%; + width: 100%; + grid-row: 3; + grid-column: 2/4; + background-color: #f5f6f7; + border-radius: 20px; + border: #f065 1px solid; +} + +.pink { + fill: #FF0066; +} + +.green { + fill: #00ff99; +} + +.dark-pink { + fill: #660029; +} + +.light-pink { + fill: #FF99C2; +} + +.off-white { + fill: #FFCCE0; +} diff --git a/playgrounds/transforms/transforms.html b/playgrounds/transforms/transforms.html deleted file mode 100644 index a165dd9..0000000 --- a/playgrounds/transforms/transforms.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - SVG Playground - - - - - -

Transformations

- -

- Here you can try out our transformation code, try moving around the pink - box in your console with its variable name: mover -

- - - - - - - - - diff --git a/playgrounds/transforms/transforms.js b/playgrounds/transforms/transforms.js index 1918cd7..7b9722c 100644 --- a/playgrounds/transforms/transforms.js +++ b/playgrounds/transforms/transforms.js @@ -13,7 +13,6 @@ let a = canvas.rect(200, 400).move(200, 400) .addClass('pink') .transform({ px: 100, py: 500, origin: 'top-left' }) -debugger a.animate() .rotate({ rotate: 500, origin: 'top-right' }) diff --git a/playgrounds/webpack.config.js b/playgrounds/webpack.config.js new file mode 100644 index 0000000..87a304a --- /dev/null +++ b/playgrounds/webpack.config.js @@ -0,0 +1,33 @@ +var path = require('path') +module.exports = function (env) { + + let currentTest = path.resolve(__dirname, env) + return { + + mode: 'development', + devtool: 'eval-source-map', + devServer: { + contentBase: [ currentTest, __dirname ], + }, + + devServer: { + contentBase: [currentTest, '..'], + }, + + entry: { + app: path.resolve(currentTest, "main.js"), + }, + + output: { + path: currentTest, + filename: 'bundle.js', + }, + + resolve: { + modules: [ + path.resolve(__dirname, "node_modules"), + "node_modules" + ] + } + } +} diff --git a/src/types/Color.js b/src/types/Color.js index 8a44de1..1f23592 100644 --- a/src/types/Color.js +++ b/src/types/Color.js @@ -13,7 +13,8 @@ function sixDigitHex (hex) { function componentHex (component) { const integer = Math.round(component) - const hex = integer.toString(16) + const bounded = Math.max(0, Math.min(255, integer)) + const hex = bounded.toString(16) return hex.length === 1 ? '0' + hex : hex } @@ -344,14 +345,68 @@ export default class Color { Generating random colors */ - static random (mode = 'vibrant') { - 'sine' - 'pastel' - 'vibrant' - 'dark' - 'rgb' - 'lab' - 'grey' + static random (mode = 'vibrant', t, u) { + + // Get the math modules + const { random, round, sin, PI: pi } = Math + + // Run the correct generator + if (mode === 'vibrant') { + + const l = (81 - 57) * random() + 57 + const c = (83 - 45) * random() + 45 + const h = 360 * random() + const color = new Color(l, c, h, 'lch') + return color + + } else if (mode === 'sine') { + + t = t == null ? random() : t + const r = round(80 * sin(2 * pi * t / 0.5 + 0.01) + 150) + const g = round(50 * sin(2 * pi * t / 0.5 + 4.6) + 200) + const b = round(100 * sin(2 * pi * t / 0.5 + 2.3) + 150) + const color = new Color(r, g, b) + return color + + } else if (mode === 'pastel') { + + const l = (94 - 86) * random() + 86 + const c = (26 - 9) * random() + 9 + const h = 360 * random() + const color = new Color(l, c, h, 'lch') + return color + + } else if (mode === 'dark') { + + const l = 10 + 10 * random() + const c = (125 - 75) * random() + 86 + const h = 360 * random() + const color = new Color(l, c, h, 'lch') + return color + + } else if (mode === 'rgb') { + + const r = 255 * random() + const g = 255 * random() + const b = 255 * random() + const color = new Color(r, g, b) + return color + + } else if (mode === 'lab') { + + const l = 100 * random() + const a = 256 * random() - 128 + const b = 256 * random() - 128 + const color = new Color(l, a, b, 'lab') + return color + + } else if (mode === 'grey') { + + const grey = 255 * random() + const color = new Color(grey, grey, grey) + return color + + } } /* -- cgit v1.2.3 From b5fc96a3637756e1c432464c18907f010311766e Mon Sep 17 00:00:00 2001 From: Ulrich-Matthias Schäfer Date: Sat, 1 Dec 2018 14:53:05 +0100 Subject: clamp values in toHex, tests, replace for of with for in --- spec/spec/color.js | 72 ++++++++++++++++++++++++++++++------------------------ src/types/Color.js | 19 ++++++++------ 2 files changed, 51 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/spec/spec/color.js b/spec/spec/color.js index 973e323..1f0dfbd 100644 --- a/spec/spec/color.js +++ b/spec/spec/color.js @@ -116,17 +116,19 @@ describe('Color', function() { }) it('handles black', () => { - let {r, g, b} = new SVG.Color(0, 0, 0).lab().rgb() - expect( r ).toBeCloseTo(0, 0) - expect( g ).toBeCloseTo(0, 0) - expect( b ).toBeCloseTo(0, 0) + let color = new SVG.Color(0, 0, 0).lab().rgb() + expect( color.r ).toBeCloseTo(0, 0) + expect( color.g ).toBeCloseTo(0, 0) + expect( color.b ).toBeCloseTo(0, 0) + expect( color.toHex() ).toBe('#000000') }) it('handles white', () => { - let {r, g, b} = new SVG.Color(255, 255, 255).lab().rgb() - expect( r ).toBeCloseTo(255, 0) - expect( g ).toBeCloseTo(255, 0) - expect( b ).toBeCloseTo(255, 0) + let color = new SVG.Color(255, 255, 255).lab().rgb() + expect( color.r ).toBeCloseTo(255, 0) + expect( color.g ).toBeCloseTo(255, 0) + expect( color.b ).toBeCloseTo(255, 0) + expect( color.toHex() ).toBe('#ffffff') }) }) @@ -157,17 +159,19 @@ describe('Color', function() { }) it('handles black', () => { - let {r, g, b} = new SVG.Color(0, 0, 0).lch().rgb() - expect( r ).toBeCloseTo(0, 0) - expect( g ).toBeCloseTo(0, 0) - expect( b ).toBeCloseTo(0, 0) + let color = new SVG.Color(0, 0, 0).lch().rgb() + expect( color.r ).toBeCloseTo(0, 0) + expect( color.g ).toBeCloseTo(0, 0) + expect( color.b ).toBeCloseTo(0, 0) + expect( color.toHex() ).toBe('#000000') }) it('handles white', () => { - let {r, g, b} = new SVG.Color(255, 255, 255).lch().rgb() - expect( r ).toBeCloseTo(255, 0) - expect( g ).toBeCloseTo(255, 0) - expect( b ).toBeCloseTo(255, 0) + let color = new SVG.Color(255, 255, 255).lch().rgb() + expect( color.r ).toBeCloseTo(255, 0) + expect( color.g ).toBeCloseTo(255, 0) + expect( color.b ).toBeCloseTo(255, 0) + expect( color.toHex() ).toBe('#ffffff') }) }) @@ -199,17 +203,19 @@ describe('Color', function() { }) it('handles black', () => { - let {r, g, b} = new SVG.Color(0, 0, 0).hsl().rgb() - expect( r ).toBeCloseTo(0, 0) - expect( g ).toBeCloseTo(0, 0) - expect( b ).toBeCloseTo(0, 0) + let color = new SVG.Color(0, 0, 0).hsl().rgb() + expect( color.r ).toBeCloseTo(0, 0) + expect( color.g ).toBeCloseTo(0, 0) + expect( color.b ).toBeCloseTo(0, 0) + expect( color.toHex() ).toBe('#000000') }) it('handles white', () => { - let {r, g, b} = new SVG.Color(255, 255, 255).hsl().rgb() - expect( r ).toBeCloseTo(255, 0) - expect( g ).toBeCloseTo(255, 0) - expect( b ).toBeCloseTo(255, 0) + let color = new SVG.Color(255, 255, 255).hsl().rgb() + expect( color.r ).toBeCloseTo(255, 0) + expect( color.g ).toBeCloseTo(255, 0) + expect( color.b ).toBeCloseTo(255, 0) + expect( color.toHex() ).toBe('#ffffff') }) }) @@ -242,17 +248,19 @@ describe('Color', function() { }) it('handles black', () => { - let {r, g, b} = new SVG.Color(0, 0, 0).cmyk().rgb() - expect( r ).toBeCloseTo(0, 0) - expect( g ).toBeCloseTo(0, 0) - expect( b ).toBeCloseTo(0, 0) + let color = new SVG.Color(0, 0, 0).cmyk().rgb() + expect( color.r ).toBeCloseTo(0, 0) + expect( color.g ).toBeCloseTo(0, 0) + expect( color.b ).toBeCloseTo(0, 0) + expect( color.toHex() ).toBe('#000000') }) it('handles white', () => { - let {r, g, b} = new SVG.Color(255, 255, 255).cmyk().rgb() - expect( r ).toBeCloseTo(255, 0) - expect( g ).toBeCloseTo(255, 0) - expect( b ).toBeCloseTo(255, 0) + let color = new SVG.Color(255, 255, 255).cmyk().rgb() + expect( color.r ).toBeCloseTo(255, 0) + expect( color.g ).toBeCloseTo(255, 0) + expect( color.b ).toBeCloseTo(255, 0) + expect( color.toHex() ).toBe('#ffffff') }) }) diff --git a/src/types/Color.js b/src/types/Color.js index b745bfd..ea9f674 100644 --- a/src/types/Color.js +++ b/src/types/Color.js @@ -18,8 +18,8 @@ function componentHex (component) { } function is (object, space) { - for (const key of space) { - if (object[key] == null) { + for (let i = space.length; i--;) { + if (object[space[i]] == null) { return false } } @@ -318,9 +318,15 @@ export default class Color { Input and Output methods */ - toHex () { + _clamped () { let { _a, _b, _c } = this.rgb() - let [ r, g, b ] = [ _a, _b, _c ].map(componentHex) + let { max, min, round } = Math + let format = v => max(0, min(round(v), 255)) + return [ _a, _b, _c ].map(format) + } + + toHex () { + let [ r, g, b ] = this._clamped().map(componentHex) return `#${r}${g}${b}` } @@ -329,10 +335,7 @@ export default class Color { } toRgb () { - let { r, g, b } = this.rgb() - let { max, min, round } = Math - let format = v => max(0, min(round(v), 255)) - let [ rV, gV, bV ] = [ r, g, b ].map(format) + let [ rV, gV, bV ] = this._clamped() let string = `rgb(${rV},${gV},${bV})` return string } -- cgit v1.2.3