diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index e1acb01e..f124efd1 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,2 +1,4 @@ eclipse.preferences.version=1 encoding//extensions/fablabchemnitz/create_links.py=utf-8 +encoding//extensions/fablabchemnitz/next_gen.py=utf-8 +encoding//extensions/fablabchemnitz/svgo-inkscape/svgo.inkscape.py=utf-8 diff --git a/extensions/fablabchemnitz/animate_order/animate_order.html b/extensions/fablabchemnitz/animate_order/animate_order.html new file mode 100644 index 00000000..9f71ad11 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/animate_order.html @@ -0,0 +1,18 @@ + + + + + + Animate Order - Kopfteil-Laser.svg + + + + +
+ + + + + diff --git a/extensions/fablabchemnitz/animate_order/animate_order.inx b/extensions/fablabchemnitz/animate_order/animate_order.inx new file mode 100644 index 00000000..1cd48838 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/animate_order.inx @@ -0,0 +1,64 @@ + + + Animate Order + fablabchemnitz.de.animate_order + + + + + + 5.0 + 60 + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../000_about_fablabchemnitz.svg + + + + all + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz/animate_order/animate_order.py b/extensions/fablabchemnitz/animate_order/animate_order.py new file mode 100644 index 00000000..4eaa2aa3 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/animate_order.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 + +import inkex +import subprocess +import shutil +import os +import sys + +""" +Extension for InkScape 1.X +Features + - Create SVG preview file and show it in browser. Helps to quickly evaluate line order for cutting processes + +Author: Mario Voigt / FabLab Chemnitz +Mail: mario.voigt@stadtfabrikanten.org +Date: 21.04.2021 +Last patch: 21.04.2021 +License: GNU GPL v3 + +Used version of Vivus JS library: https://github.com/maxwellito/vivus/releases/tag/v0.4.6 - MIT License + +Browser config: +Firefox via about:config -> privacy.file_unique_origin = false + +ToDo: + - adjust width and height (give options) + - embed config buttons inside html to adjust time/type/... (more flexible than clicking from Inkscape) + - calculate the total length of all paths and auto-adjust the speed to have good visibility +""" + +class AnimateOrder (inkex.EffectExtension): + + def add_arguments(self, pars): + pars.add_argument("--tab") + pars.add_argument("--time", type=float, default = 5.0, help="Duration (seconds)") + pars.add_argument("--fps", type=int, default = 60.0, help="Frames per second (fps)") + pars.add_argument("--sequence_type", help="Sequence type") + pars.add_argument("--reverse", type = inkex.Boolean, default = False, help="Reverse order") + pars.add_argument("--browser", help="Select your desired browser (must be installed and must exist in %PATH% variable).") + + def effect(self): + #write current SVG to extensions' directory. Target name must be "drawing.svg" because it is embedded in animate_order.html statically + inFile = "drawing.svg" + extension_dir = os.path.dirname(os.path.realpath(__file__)) + shutil.copy2(self.options.input_file, os.path.join(extension_dir, inFile)) + + target_html = os.path.join(extension_dir, "animate_order.html") + + title = "Animate Order - " + self.document.getroot().get("{http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd}docname") + if title is None: + title = "Animate Order - Vivus JS" + vivus_include = "./vivus-0.4.6/dist/vivus.js" + + duration = self.options.time * self.options.fps # we guess we have 20 ... 60 fps. depends on performance of the machine + frames_per_second = self.options.fps + type = self.options.sequence_type + reverse = str(self.options.reverse).lower() + + with open(target_html, "w") as text_file: + print( '' , file=text_file) + print( ' ' , file=text_file) + print( ' ' , file=text_file) + print( ' ' , file=text_file) + print( ' ' , file=text_file) + print(f' {title}' , file=text_file) + print( ' ' , file=text_file) + print( ' ' , file=text_file) + print( ' ' , file=text_file) + print( ' ' , file=text_file) + print( '
' , file=text_file) + print(f' ' , file=text_file) + print(f' ' , file=text_file) + print( ' ' , file=text_file) + print( ' ' , file=text_file) + print( '' , file=text_file) + + #now open firefox + args = [self.options.browser, target_html] + proc = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = proc.communicate() + if proc.returncode != 0: + inkex.utils.debug("%d %s %s" % (proc.returncode, stdout, stderr)) + +if __name__ == '__main__': + AnimateOrder().run() \ No newline at end of file diff --git a/extensions/fablabchemnitz/animate_order/drawing.svg b/extensions/fablabchemnitz/animate_order/drawing.svg new file mode 100644 index 00000000..82a5f1d1 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/drawing.svg @@ -0,0 +1,13947 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.eslintrc.json b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.eslintrc.json new file mode 100644 index 00000000..b6a0b41d --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.eslintrc.json @@ -0,0 +1,37 @@ +{ + "env": { + "es6": false, + "amd": false, + "browser": true, + "jasmine": true, + "node": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module" + }, + "globals": { + "Pathformer": true, + "Vivus": true, + "window": true, + "document": true, + "define": true, + "jasmine": true, + "it": true, + "expect": true, + "describe": true, + "beforeEach": true, + "afterEach": true, + "spyOn": true + }, + "rules": { + "no-cond-assign": 2, + "no-console": 0, + "no-const-assign": 2, + "no-class-assign": 2, + "no-this-before-super": 2, + "no-unused-vars": 1, + "no-empty": 0, + "object-shorthand": [2, "always"] + } +} diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.github/ISSUE_TEMPLATE.md b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..cfe60cfb --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,16 @@ +### Please define your problem or issue as clear as possible. + +For a problem, please fill the following: + +**Vivus version**: + +**Browser**: + +**Steps to reproduce it**: + +**JSFiddle link (or similar platform)**: +*No personal website will be allowed, only sandboxed platform where the code is isolated, clear and can be hacked. I don't want to debug uglified code between 42 libraries.* + +*[note]* +Please have a minimum of politeness. There's unfortunately only me as contributor/maintainor which help on my free time, I'm not the Amazon customer service or your Mom. I don't ask to send me flowers and tell me how amazing Vivus is (that won't make me help you quicker). But please try to do as much as you can before opening an issue: check that no closed issue mention a similar problem, that your script is executed correctly (conflicts, race conditions...).. Thanks :) +*[/note]* diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.gitignore b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.gitignore new file mode 100644 index 00000000..bdaa75e9 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.gitignore @@ -0,0 +1,6 @@ +coverage/ +node_modules/ +.DS_Store +.idea +yarn.lock +dist/vivus.min.js.map diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.npmignore b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.npmignore new file mode 100644 index 00000000..b5210b50 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.npmignore @@ -0,0 +1,5 @@ +test +assets +node_modules +coverage +.DS_Store diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.travis.yml b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.travis.yml new file mode 100644 index 00000000..a4726d41 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - 'stable' +script: npm run lint && npm run test +before_install: + - export CHROME_BIN=chromium-browser + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/CONTRIBUTING.md b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/CONTRIBUTING.md new file mode 100644 index 00000000..26aa7c50 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Contributing + +First of all, thanks for contributing, thinking about contributing, or even arriving here by mistake. + +Issues are reserved to mention a problem, a bug or discuss about implementing a feature. If you have any question or support request, please use [Gitter](https://gitter.im/maxwellito/vivus). For every issue, please try to give as much information as you can : version, steps to recreate it, examples (via jsFiddle or something like that). + +About pull requests, please try to contact the maintainer beforehand. He's a kinda human Grumpy Cat trying to avoid features which can be useful for only 1% of users. The warning is only because it would be sad to see contributors spending time a feature that wouldn't be merged. Otherwise, I would recommend you to add a section in the `hacks.md` file. But if it's a bug fix, the chances to be merged are higher. If necessary please think about updating the tests. \ No newline at end of file diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/LICENSE b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/LICENSE new file mode 100644 index 00000000..cb16e265 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) maxwellito + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/delayed.png b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/delayed.png new file mode 100644 index 00000000..39f34125 Binary files /dev/null and b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/delayed.png differ diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/oneByOne.png b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/oneByOne.png new file mode 100644 index 00000000..d2f22456 Binary files /dev/null and b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/oneByOne.png differ diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/script_custom.png b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/script_custom.png new file mode 100644 index 00000000..520e37b7 Binary files /dev/null and b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/script_custom.png differ diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/script_default.png b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/script_default.png new file mode 100644 index 00000000..bd03697e Binary files /dev/null and b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/script_default.png differ diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/sync.png b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/sync.png new file mode 100644 index 00000000..f792903d Binary files /dev/null and b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/sync.png differ diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/timelines.svg b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/timelines.svg new file mode 100644 index 00000000..44f1bd06 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/assets/timelines.svg @@ -0,0 +1,95 @@ + + + + + + + + time + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/bower.json b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/bower.json new file mode 100644 index 00000000..0e71b32f --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/bower.json @@ -0,0 +1,16 @@ +{ + "name": "vivus", + "description": "JavaScript library to make drawing animation on SVG", + "main": "dist/vivus.js", + "licence": "MIT", + "ignore": [ + "assets/", + "src/", + "test/", + ".gitignore", + ".jshintrc", + "gulpfile.js", + "index.html", + "package.json" + ] +} \ No newline at end of file diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/dist/vivus.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/dist/vivus.js new file mode 100644 index 00000000..57dbff04 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/dist/vivus.js @@ -0,0 +1,1222 @@ +/** + * vivus - JavaScript library to make drawing animation on SVG + * @version v0.4.6 + * @link https://github.com/maxwellito/vivus + * @license MIT + */ + +(function () { + + 'use strict'; + +/** + * Pathformer + * Beta version + * + * Take any SVG version 1.1 and transform + * child elements to 'path' elements + * + * This code is purely forked from + * https://github.com/Waest/SVGPathConverter + */ + +/** + * Class constructor + * + * @param {DOM|String} element Dom element of the SVG or id of it + */ +function Pathformer(element) { + // Test params + if (typeof element === 'undefined') { + throw new Error('Pathformer [constructor]: "element" parameter is required'); + } + + // Set the element + if (element.constructor === String) { + element = document.getElementById(element); + if (!element) { + throw new Error('Pathformer [constructor]: "element" parameter is not related to an existing ID'); + } + } + if (element instanceof window.SVGElement || + element instanceof window.SVGGElement || + /^svg$/i.test(element.nodeName)) { + this.el = element; + } else { + throw new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement'); + } + + // Start + this.scan(element); +} + +/** + * List of tags which can be transformed + * to path elements + * + * @type {Array} + */ +Pathformer.prototype.TYPES = ['line', 'ellipse', 'circle', 'polygon', 'polyline', 'rect']; + +/** + * List of attribute names which contain + * data. This array list them to check if + * they contain bad values, like percentage. + * + * @type {Array} + */ +Pathformer.prototype.ATTR_WATCH = ['cx', 'cy', 'points', 'r', 'rx', 'ry', 'x', 'x1', 'x2', 'y', 'y1', 'y2']; + +/** + * Finds the elements compatible for transform + * and apply the liked method + * + * @param {object} options Object from the constructor + */ +Pathformer.prototype.scan = function (svg) { + var fn, element, pathData, pathDom, + elements = svg.querySelectorAll(this.TYPES.join(',')); + + for (var i = 0; i < elements.length; i++) { + element = elements[i]; + fn = this[element.tagName.toLowerCase() + 'ToPath']; + pathData = fn(this.parseAttr(element.attributes)); + pathDom = this.pathMaker(element, pathData); + element.parentNode.replaceChild(pathDom, element); + } +}; + + +/** + * Read `line` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element Line element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.lineToPath = function (element) { + var newElement = {}, + x1 = element.x1 || 0, + y1 = element.y1 || 0, + x2 = element.x2 || 0, + y2 = element.y2 || 0; + + newElement.d = 'M' + x1 + ',' + y1 + 'L' + x2 + ',' + y2; + return newElement; +}; + +/** + * Read `rect` element to extract and transform + * data, to make it ready for a `path` object. + * The radius-border is not taken in charge yet. + * (your help is more than welcomed) + * + * @param {DOMelement} element Rect element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.rectToPath = function (element) { + var newElement = {}, + x = parseFloat(element.x) || 0, + y = parseFloat(element.y) || 0, + width = parseFloat(element.width) || 0, + height = parseFloat(element.height) || 0; + + if (element.rx || element.ry) { + var rx = parseInt(element.rx, 10) || -1, + ry = parseInt(element.ry, 10) || -1; + rx = Math.min(Math.max(rx < 0 ? ry : rx, 0), width/2); + ry = Math.min(Math.max(ry < 0 ? rx : ry, 0), height/2); + + newElement.d = 'M ' + (x + rx) + ',' + y + ' ' + + 'L ' + (x + width - rx) + ',' + y + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + (x + width) + ',' + (y + ry) + ' ' + + 'L ' + (x + width) + ',' + (y + height - ry) + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + (x + width - rx) + ',' + (y + height) + ' ' + + 'L ' + (x + rx) + ',' + (y + height) + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + x + ',' + (y + height - ry) + ' ' + + 'L ' + x + ',' + (y + ry) + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + (x + rx) + ',' + y; + } + else { + newElement.d = 'M' + x + ' ' + y + ' ' + + 'L' + (x + width) + ' ' + y + ' ' + + 'L' + (x + width) + ' ' + (y + height) + ' ' + + 'L' + x + ' ' + (y + height) + ' Z'; + } + return newElement; +}; + +/** + * Read `polyline` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element Polyline element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.polylineToPath = function (element) { + var newElement = {}, + points = element.points.trim().split(' '), + i, path; + + // Reformatting if points are defined without commas + if (element.points.indexOf(',') === -1) { + var formattedPoints = []; + for (i = 0; i < points.length; i+=2) { + formattedPoints.push(points[i] + ',' + points[i+1]); + } + points = formattedPoints; + } + + // Generate the path.d value + path = 'M' + points[0]; + for(i = 1; i < points.length; i++) { + if (points[i].indexOf(',') !== -1) { + path += 'L' + points[i]; + } + } + newElement.d = path; + return newElement; +}; + +/** + * Read `polygon` element to extract and transform + * data, to make it ready for a `path` object. + * This method rely on polylineToPath, because the + * logic is similar. The path created is just closed, + * so it needs an 'Z' at the end. + * + * @param {DOMelement} element Polygon element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.polygonToPath = function (element) { + var newElement = Pathformer.prototype.polylineToPath(element); + + newElement.d += 'Z'; + return newElement; +}; + +/** + * Read `ellipse` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element ellipse element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.ellipseToPath = function (element) { + var newElement = {}, + rx = parseFloat(element.rx) || 0, + ry = parseFloat(element.ry) || 0, + cx = parseFloat(element.cx) || 0, + cy = parseFloat(element.cy) || 0, + startX = cx - rx, + startY = cy, + endX = parseFloat(cx) + parseFloat(rx), + endY = cy; + + newElement.d = 'M' + startX + ',' + startY + + 'A' + rx + ',' + ry + ' 0,1,1 ' + endX + ',' + endY + + 'A' + rx + ',' + ry + ' 0,1,1 ' + startX + ',' + endY; + return newElement; +}; + +/** + * Read `circle` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element Circle element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.circleToPath = function (element) { + var newElement = {}, + r = parseFloat(element.r) || 0, + cx = parseFloat(element.cx) || 0, + cy = parseFloat(element.cy) || 0, + startX = cx - r, + startY = cy, + endX = parseFloat(cx) + parseFloat(r), + endY = cy; + + newElement.d = 'M' + startX + ',' + startY + + 'A' + r + ',' + r + ' 0,1,1 ' + endX + ',' + endY + + 'A' + r + ',' + r + ' 0,1,1 ' + startX + ',' + endY; + return newElement; +}; + +/** + * Create `path` elements form original element + * and prepared objects + * + * @param {DOMelement} element Original element to transform + * @param {object} pathData Path data (from `toPath` methods) + * @return {DOMelement} Path element + */ +Pathformer.prototype.pathMaker = function (element, pathData) { + var i, attr, pathTag = document.createElementNS('http://www.w3.org/2000/svg','path'); + for(i = 0; i < element.attributes.length; i++) { + attr = element.attributes[i]; + if (this.ATTR_WATCH.indexOf(attr.name) === -1) { + pathTag.setAttribute(attr.name, attr.value); + } + } + for(i in pathData) { + pathTag.setAttribute(i, pathData[i]); + } + return pathTag; +}; + +/** + * Parse attributes of a DOM element to + * get an object of attribute => value + * + * @param {NamedNodeMap} attributes Attributes object from DOM element to parse + * @return {object} Object of attributes + */ +Pathformer.prototype.parseAttr = function (element) { + var attr, output = {}; + for (var i = 0; i < element.length; i++) { + attr = element[i]; + // Check if no data attribute contains '%', or the transformation is impossible + if (this.ATTR_WATCH.indexOf(attr.name) !== -1 && attr.value.indexOf('%') !== -1) { + throw new Error('Pathformer [parseAttr]: a SVG shape got values in percentage. This cannot be transformed into \'path\' tags. Please use \'viewBox\'.'); + } + output[attr.name] = attr.value; + } + return output; +}; + + 'use strict'; + +var setupEnv, requestAnimFrame, cancelAnimFrame, parsePositiveInt; + +/** + * Vivus + * Beta version + * + * Take any SVG and make the animation + * to give give the impression of live drawing + * + * This in more than just inspired from codrops + * At that point, it's a pure fork. + */ + +/** + * Class constructor + * option structure + * type: 'delayed'|'sync'|'oneByOne'|'script' (to know if the items must be drawn synchronously or not, default: delayed) + * duration: (in frames) + * start: 'inViewport'|'manual'|'autostart' (start automatically the animation, default: inViewport) + * delay: (delay between the drawing of first and last path) + * dashGap whitespace extra margin between dashes + * pathTimingFunction timing animation function for each path element of the SVG + * animTimingFunction timing animation function for the complete SVG + * forceRender force the browser to re-render all updated path items + * selfDestroy removes all extra styling on the SVG, and leaves it as original + * + * The attribute 'type' is by default on 'delayed'. + * - 'delayed' + * all paths are draw at the same time but with a + * little delay between them before start + * - 'sync' + * all path are start and finish at the same time + * - 'oneByOne' + * only one path is draw at the time + * the end of the first one will trigger the draw + * of the next one + * + * All these values can be overwritten individually + * for each path item in the SVG + * The value of frames will always take the advantage of + * the duration value. + * If you fail somewhere, an error will be thrown. + * Good luck. + * + * @constructor + * @this {Vivus} + * @param {DOM|String} element Dom element of the SVG or id of it + * @param {Object} options Options about the animation + * @param {Function} callback Callback for the end of the animation + */ +function Vivus(element, options, callback) { + setupEnv(); + + // Setup + this.isReady = false; + this.setElement(element, options); + this.setOptions(options); + this.setCallback(callback); + + if (this.isReady) { + this.init(); + } +} + +/** + * Timing functions + ************************************** + * + * Default functions to help developers. + * It always take a number as parameter (between 0 to 1) then + * return a number (between 0 and 1) + */ +Vivus.LINEAR = function(x) { + return x; +}; +Vivus.EASE = function(x) { + return -Math.cos(x * Math.PI) / 2 + 0.5; +}; +Vivus.EASE_OUT = function(x) { + return 1 - Math.pow(1 - x, 3); +}; +Vivus.EASE_IN = function(x) { + return Math.pow(x, 3); +}; +Vivus.EASE_OUT_BOUNCE = function(x) { + var base = -Math.cos(x * (0.5 * Math.PI)) + 1, + rate = Math.pow(base, 1.5), + rateR = Math.pow(1 - x, 2), + progress = -Math.abs(Math.cos(rate * (2.5 * Math.PI))) + 1; + return 1 - rateR + progress * rateR; +}; + +/** + * Setters + ************************************** + */ + +/** + * Check and set the element in the instance + * The method will not return anything, but will throw an + * error if the parameter is invalid + * + * @param {DOM|String} element SVG Dom element or id of it + */ +Vivus.prototype.setElement = function(element, options) { + var onLoad, self; + + // Basic check + if (typeof element === 'undefined') { + throw new Error('Vivus [constructor]: "element" parameter is required'); + } + + // Set the element + if (element.constructor === String) { + element = document.getElementById(element); + if (!element) { + throw new Error( + 'Vivus [constructor]: "element" parameter is not related to an existing ID' + ); + } + } + this.parentEl = element; + + // Load the SVG with XMLHttpRequest and extract the SVG + if (options && options.file) { + self = this; + onLoad = function() { + var domSandbox = document.createElement('div'); + domSandbox.innerHTML = this.responseText; + + var svgTag = domSandbox.querySelector('svg'); + if (!svgTag) { + throw new Error( + 'Vivus [load]: Cannot find the SVG in the loaded file : ' + + options.file + ); + } + + self.el = svgTag; + self.el.setAttribute('width', '100%'); + self.el.setAttribute('height', '100%'); + self.parentEl.appendChild(self.el); + self.isReady = true; + self.init(); + self = null; + }; + + var oReq = new window.XMLHttpRequest(); + oReq.addEventListener('load', onLoad); + oReq.open('GET', options.file); + oReq.send(); + return; + } + + switch (element.constructor) { + case window.SVGSVGElement: + case window.SVGElement: + case window.SVGGElement: + this.el = element; + this.isReady = true; + break; + + case window.HTMLObjectElement: + self = this; + onLoad = function(e) { + if (self.isReady) { + return; + } + self.el = + element.contentDocument && + element.contentDocument.querySelector('svg'); + if (!self.el && e) { + throw new Error( + 'Vivus [constructor]: object loaded does not contain any SVG' + ); + } else if (self.el) { + if (element.getAttribute('built-by-vivus')) { + self.parentEl.insertBefore(self.el, element); + self.parentEl.removeChild(element); + self.el.setAttribute('width', '100%'); + self.el.setAttribute('height', '100%'); + } + self.isReady = true; + self.init(); + self = null; + } + }; + + if (!onLoad()) { + element.addEventListener('load', onLoad); + } + break; + + default: + throw new Error( + 'Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)' + ); + } +}; + +/** + * Set up user option to the instance + * The method will not return anything, but will throw an + * error if the parameter is invalid + * + * @param {object} options Object from the constructor + */ +Vivus.prototype.setOptions = function(options) { + var allowedTypes = [ + 'delayed', + 'sync', + 'async', + 'nsync', + 'oneByOne', + 'scenario', + 'scenario-sync' + ]; + var allowedStarts = ['inViewport', 'manual', 'autostart']; + + // Basic check + if (options !== undefined && options.constructor !== Object) { + throw new Error( + 'Vivus [constructor]: "options" parameter must be an object' + ); + } else { + options = options || {}; + } + + // Set the animation type + if (options.type && allowedTypes.indexOf(options.type) === -1) { + throw new Error( + 'Vivus [constructor]: ' + + options.type + + ' is not an existing animation `type`' + ); + } else { + this.type = options.type || allowedTypes[0]; + } + + // Set the start type + if (options.start && allowedStarts.indexOf(options.start) === -1) { + throw new Error( + 'Vivus [constructor]: ' + + options.start + + ' is not an existing `start` option' + ); + } else { + this.start = options.start || allowedStarts[0]; + } + + this.isIE = + window.navigator.userAgent.indexOf('MSIE') !== -1 || + window.navigator.userAgent.indexOf('Trident/') !== -1 || + window.navigator.userAgent.indexOf('Edge/') !== -1; + this.duration = parsePositiveInt(options.duration, 120); + this.delay = parsePositiveInt(options.delay, null); + this.dashGap = parsePositiveInt(options.dashGap, 1); + this.forceRender = options.hasOwnProperty('forceRender') + ? !!options.forceRender + : this.isIE; + this.reverseStack = !!options.reverseStack; + this.selfDestroy = !!options.selfDestroy; + this.onReady = options.onReady; + this.map = []; + this.frameLength = this.currentFrame = this.delayUnit = this.speed = this.handle = null; + + this.ignoreInvisible = options.hasOwnProperty('ignoreInvisible') + ? !!options.ignoreInvisible + : false; + + this.animTimingFunction = options.animTimingFunction || Vivus.LINEAR; + this.pathTimingFunction = options.pathTimingFunction || Vivus.LINEAR; + + if (this.delay >= this.duration) { + throw new Error('Vivus [constructor]: delay must be shorter than duration'); + } +}; + +/** + * Set up callback to the instance + * The method will not return enything, but will throw an + * error if the parameter is invalid + * + * @param {Function} callback Callback for the animation end + */ +Vivus.prototype.setCallback = function(callback) { + // Basic check + if (!!callback && callback.constructor !== Function) { + throw new Error( + 'Vivus [constructor]: "callback" parameter must be a function' + ); + } + this.callback = callback || function() {}; +}; + +/** + * Core + ************************************** + */ + +/** + * Map the svg, path by path. + * The method return nothing, it just fill the + * `map` array. Each item in this array represent + * a path element from the SVG, with informations for + * the animation. + * + * ``` + * [ + * { + * el: the path element + * length: length of the path line + * startAt: time start of the path animation (in frames) + * duration: path animation duration (in frames) + * }, + * ... + * ] + * ``` + * + */ +Vivus.prototype.mapping = function() { + var i, paths, path, pAttrs, pathObj, totalLength, lengthMeter, timePoint, scale, hasNonScale; + timePoint = totalLength = lengthMeter = 0; + paths = this.el.querySelectorAll('path'); + hasNonScale = false; + + for (i = 0; i < paths.length; i++) { + path = paths[i]; + if (this.isInvisible(path)) { + continue; + } + + pathObj = { + el: path, + length: 0, + startAt: 0, + duration: 0, + isResizeSensitive: false + }; + + // If vector effect is non-scaling-stroke, the total length won't match the rendered length + // so we need to calculate the scale and apply it + if (path.getAttribute('vector-effect') === 'non-scaling-stroke') { + var rect = path.getBoundingClientRect(); + var box = path.getBBox(); + scale = Math.max(rect.width / box.width, rect.height / box.height); + pathObj.isResizeSensitive = true; + hasNonScale = true; + } else { + scale = 1; + } + pathObj.length = Math.ceil(path.getTotalLength() * scale); + + // Test if the path length is correct + if (isNaN(pathObj.length)) { + if (window.console && console.warn) { + console.warn( + 'Vivus [mapping]: cannot retrieve a path element length', + path + ); + } + continue; + } + this.map.push(pathObj); + path.style.strokeDasharray = + pathObj.length + ' ' + (pathObj.length + this.dashGap * 2); + path.style.strokeDashoffset = pathObj.length + this.dashGap; + pathObj.length += this.dashGap; + totalLength += pathObj.length; + + this.renderPath(i); + } + + // Show a warning for non-scaling elements + if (hasNonScale) { + console.warn('Vivus: this SVG contains non-scaling-strokes. You should call instance.recalc() when the SVG is resized or you will encounter unwanted behaviour. See https://github.com/maxwellito/vivus#non-scaling for more info.'); + } + + totalLength = totalLength === 0 ? 1 : totalLength; + this.delay = this.delay === null ? this.duration / 3 : this.delay; + this.delayUnit = this.delay / (paths.length > 1 ? paths.length - 1 : 1); + + // Reverse stack if asked + if (this.reverseStack) { + this.map.reverse(); + } + + for (i = 0; i < this.map.length; i++) { + pathObj = this.map[i]; + + switch (this.type) { + case 'delayed': + pathObj.startAt = this.delayUnit * i; + pathObj.duration = this.duration - this.delay; + break; + + case 'oneByOne': + pathObj.startAt = (lengthMeter / totalLength) * this.duration; + pathObj.duration = (pathObj.length / totalLength) * this.duration; + break; + + case 'sync': + case 'async': + case 'nsync': + pathObj.startAt = 0; + pathObj.duration = this.duration; + break; + + case 'scenario-sync': + path = pathObj.el; + pAttrs = this.parseAttr(path); + pathObj.startAt = + timePoint + + (parsePositiveInt(pAttrs['data-delay'], this.delayUnit) || 0); + pathObj.duration = parsePositiveInt( + pAttrs['data-duration'], + this.duration + ); + timePoint = + pAttrs['data-async'] !== undefined + ? pathObj.startAt + : pathObj.startAt + pathObj.duration; + this.frameLength = Math.max( + this.frameLength, + pathObj.startAt + pathObj.duration + ); + break; + + case 'scenario': + path = pathObj.el; + pAttrs = this.parseAttr(path); + pathObj.startAt = + parsePositiveInt(pAttrs['data-start'], this.delayUnit) || 0; + pathObj.duration = parsePositiveInt( + pAttrs['data-duration'], + this.duration + ); + this.frameLength = Math.max( + this.frameLength, + pathObj.startAt + pathObj.duration + ); + break; + } + lengthMeter += pathObj.length; + this.frameLength = this.frameLength || this.duration; + } +}; + +/** + * Public method to re-evaluate line length for non-scaling lines + * path elements. + */ +Vivus.prototype.recalc = function () { + if (this.mustRecalcScale) { + return; + } + this.mustRecalcScale = requestAnimFrame(function () { + this.performLineRecalc(); + }.bind(this)); +} + +/** + * Private method to re-evaluate line length on non-scaling + * path elements. Then call for a trace to update the SVG. + */ +Vivus.prototype.performLineRecalc = function () { + var pathObj, path, rect, box, scale; + for (var i = 0; i < this.map.length; i++) { + pathObj = this.map[i]; + if (pathObj.isResizeSensitive) { + path = pathObj.el; + rect = path.getBoundingClientRect(); + box = path.getBBox(); + scale = Math.max(rect.width / box.width, rect.height / box.height); + pathObj.length = Math.ceil(path.getTotalLength() * scale); + path.style.strokeDasharray = pathObj.length + ' ' + (pathObj.length + this.dashGap * 2); + } + } + this.trace(); + this.mustRecalcScale = null; +} + +/** + * Interval method to draw the SVG from current + * position of the animation. It update the value of + * `currentFrame` and re-trace the SVG. + * + * It use this.handle to store the requestAnimationFrame + * and clear it one the animation is stopped. So this + * attribute can be used to know if the animation is + * playing. + * + * Once the animation at the end, this method will + * trigger the Vivus callback. + * + */ +Vivus.prototype.draw = function() { + var self = this; + this.currentFrame += this.speed; + + if (this.currentFrame <= 0) { + this.stop(); + this.reset(); + } else if (this.currentFrame >= this.frameLength) { + this.stop(); + this.currentFrame = this.frameLength; + this.trace(); + if (this.selfDestroy) { + this.destroy(); + } + } else { + this.trace(); + this.handle = requestAnimFrame(function() { + self.draw(); + }); + return; + } + + this.callback(this); + if (this.instanceCallback) { + this.instanceCallback(this); + this.instanceCallback = null; + } +}; + +/** + * Draw the SVG at the current instant from the + * `currentFrame` value. Here is where most of the magic is. + * The trick is to use the `strokeDashoffset` style property. + * + * For optimisation reasons, a new property called `progress` + * is added in each item of `map`. This one contain the current + * progress of the path element. Only if the new value is different + * the new value will be applied to the DOM element. This + * method save a lot of resources to re-render the SVG. And could + * be improved if the animation couldn't be played forward. + * + */ +Vivus.prototype.trace = function() { + var i, progress, path, currentFrame; + currentFrame = + this.animTimingFunction(this.currentFrame / this.frameLength) * + this.frameLength; + for (i = 0; i < this.map.length; i++) { + path = this.map[i]; + progress = (currentFrame - path.startAt) / path.duration; + progress = this.pathTimingFunction(Math.max(0, Math.min(1, progress))); + if (path.progress !== progress) { + path.progress = progress; + path.el.style.strokeDashoffset = Math.floor(path.length * (1 - progress)); + this.renderPath(i); + } + } +}; + +/** + * Method forcing the browser to re-render a path element + * from it's index in the map. Depending on the `forceRender` + * value. + * The trick is to replace the path element by it's clone. + * This practice is not recommended because it's asking more + * ressources, too much DOM manupulation.. + * but it's the only way to let the magic happen on IE. + * By default, this fallback is only applied on IE. + * + * @param {Number} index Path index + */ +Vivus.prototype.renderPath = function(index) { + if (this.forceRender && this.map && this.map[index]) { + var pathObj = this.map[index], + newPath = pathObj.el.cloneNode(true); + pathObj.el.parentNode.replaceChild(newPath, pathObj.el); + pathObj.el = newPath; + } +}; + +/** + * When the SVG object is loaded and ready, + * this method will continue the initialisation. + * + * This this mainly due to the case of passing an + * object tag in the constructor. It will wait + * the end of the loading to initialise. + * + */ +Vivus.prototype.init = function() { + // Set object variables + this.frameLength = 0; + this.currentFrame = 0; + this.map = []; + + // Start + new Pathformer(this.el); + this.mapping(); + this.starter(); + + if (this.onReady) { + this.onReady(this); + } +}; + +/** + * Trigger to start of the animation. + * Depending on the `start` value, a different script + * will be applied. + * + * If the `start` value is not valid, an error will be thrown. + * Even if technically, this is impossible. + * + */ +Vivus.prototype.starter = function() { + switch (this.start) { + case 'manual': + return; + + case 'autostart': + this.play(); + break; + + case 'inViewport': + var self = this, + listener = function() { + if (self.isInViewport(self.parentEl, 1)) { + self.play(); + window.removeEventListener('scroll', listener); + } + }; + window.addEventListener('scroll', listener); + listener(); + break; + } +}; + +/** + * Controls + ************************************** + */ + +/** + * Get the current status of the animation between + * three different states: 'start', 'progress', 'end'. + * @return {string} Instance status + */ +Vivus.prototype.getStatus = function() { + return this.currentFrame === 0 + ? 'start' + : this.currentFrame === this.frameLength + ? 'end' + : 'progress'; +}; + +/** + * Reset the instance to the initial state : undraw + * Be careful, it just reset the animation, if you're + * playing the animation, this won't stop it. But just + * make it start from start. + * + */ +Vivus.prototype.reset = function() { + return this.setFrameProgress(0); +}; + +/** + * Set the instance to the final state : drawn + * Be careful, it just set the animation, if you're + * playing the animation on rewind, this won't stop it. + * But just make it start from the end. + * + */ +Vivus.prototype.finish = function() { + return this.setFrameProgress(1); +}; + +/** + * Set the level of progress of the drawing. + * + * @param {number} progress Level of progress to set + */ +Vivus.prototype.setFrameProgress = function(progress) { + progress = Math.min(1, Math.max(0, progress)); + this.currentFrame = Math.round(this.frameLength * progress); + this.trace(); + return this; +}; + +/** + * Play the animation at the desired speed. + * Speed must be a valid number (no zero). + * By default, the speed value is 1. + * But a negative value is accepted to go forward. + * + * And works with float too. + * But don't forget we are in JavaScript, se be nice + * with him and give him a 1/2^x value. + * + * @param {number} speed Animation speed [optional] + */ +Vivus.prototype.play = function(speed, callback) { + this.instanceCallback = null; + + if (speed && typeof speed === 'function') { + this.instanceCallback = speed; // first parameter is actually the callback function + speed = null; + } else if (speed && typeof speed !== 'number') { + throw new Error('Vivus [play]: invalid speed'); + } + // if the first parameter wasn't the callback, check if the seconds was + if (callback && typeof callback === 'function' && !this.instanceCallback) { + this.instanceCallback = callback; + } + + this.speed = speed || 1; + if (!this.handle) { + this.draw(); + } + return this; +}; + +/** + * Stop the current animation, if on progress. + * Should not trigger any error. + * + */ +Vivus.prototype.stop = function() { + if (this.handle) { + cancelAnimFrame(this.handle); + this.handle = null; + } + return this; +}; + +/** + * Destroy the instance. + * Remove all bad styling attributes on all + * path tags + * + */ +Vivus.prototype.destroy = function() { + this.stop(); + var i, path; + for (i = 0; i < this.map.length; i++) { + path = this.map[i]; + path.el.style.strokeDashoffset = null; + path.el.style.strokeDasharray = null; + this.renderPath(i); + } +}; + +/** + * Utils methods + * include methods from Codrops + ************************************** + */ + +/** + * Method to best guess if a path should added into + * the animation or not. + * + * 1. Use the `data-vivus-ignore` attribute if set + * 2. Check if the instance must ignore invisible paths + * 3. Check if the path is visible + * + * For now the visibility checking is unstable. + * It will be used for a beta phase. + * + * Other improvments are planned. Like detecting + * is the path got a stroke or a valid opacity. + */ +Vivus.prototype.isInvisible = function(el) { + var rect, + ignoreAttr = el.getAttribute('data-ignore'); + + if (ignoreAttr !== null) { + return ignoreAttr !== 'false'; + } + + if (this.ignoreInvisible) { + rect = el.getBoundingClientRect(); + return !rect.width && !rect.height; + } else { + return false; + } +}; + +/** + * Parse attributes of a DOM element to + * get an object of {attributeName => attributeValue} + * + * @param {object} element DOM element to parse + * @return {object} Object of attributes + */ +Vivus.prototype.parseAttr = function(element) { + var attr, + output = {}; + if (element && element.attributes) { + for (var i = 0; i < element.attributes.length; i++) { + attr = element.attributes[i]; + output[attr.name] = attr.value; + } + } + return output; +}; + +/** + * Reply if an element is in the page viewport + * + * @param {object} el Element to observe + * @param {number} h Percentage of height + * @return {boolean} + */ +Vivus.prototype.isInViewport = function(el, h) { + var scrolled = this.scrollY(), + viewed = scrolled + this.getViewportH(), + elBCR = el.getBoundingClientRect(), + elHeight = elBCR.height, + elTop = scrolled + elBCR.top, + elBottom = elTop + elHeight; + + // if 0, the element is considered in the viewport as soon as it enters. + // if 1, the element is considered in the viewport only when it's fully inside + // value in percentage (1 >= h >= 0) + h = h || 0; + + return elTop + elHeight * h <= viewed && elBottom >= scrolled; +}; + +/** + * Get the viewport height in pixels + * + * @return {integer} Viewport height + */ +Vivus.prototype.getViewportH = function() { + var client = this.docElem.clientHeight, + inner = window.innerHeight; + + if (client < inner) { + return inner; + } else { + return client; + } +}; + +/** + * Get the page Y offset + * + * @return {integer} Page Y offset + */ +Vivus.prototype.scrollY = function() { + return window.pageYOffset || this.docElem.scrollTop; +}; + +setupEnv = function() { + if (Vivus.prototype.docElem) { + return; + } + + /** + * Alias for document element + * + * @type {DOMelement} + */ + Vivus.prototype.docElem = window.document.documentElement; + + /** + * Alias for `requestAnimationFrame` or + * `setTimeout` function for deprecated browsers. + * + */ + requestAnimFrame = (function() { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(/* function */ callback) { + return window.setTimeout(callback, 1000 / 60); + } + ); + })(); + + /** + * Alias for `cancelAnimationFrame` or + * `cancelTimeout` function for deprecated browsers. + * + */ + cancelAnimFrame = (function() { + return ( + window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(id) { + return window.clearTimeout(id); + } + ); + })(); +}; + +/** + * Parse string to integer. + * If the number is not positive or null + * the method will return the default value + * or 0 if undefined + * + * @param {string} value String to parse + * @param {*} defaultValue Value to return if the result parsed is invalid + * @return {number} + * + */ +parsePositiveInt = function(value, defaultValue) { + var output = parseInt(value, 10); + return output >= 0 ? output : defaultValue; +}; + + + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function() { + return Vivus; + }); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = Vivus; + } else { + // Browser globals + window.Vivus = Vivus; + } + +}()); + diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/dist/vivus.min.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/dist/vivus.min.js new file mode 100644 index 00000000..e6d6596a --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/dist/vivus.min.js @@ -0,0 +1 @@ +!function(){"use strict";function n(t){if(void 0===t)throw new Error('Pathformer [constructor]: "element" parameter is required');if(t.constructor===String&&!(t=document.getElementById(t)))throw new Error('Pathformer [constructor]: "element" parameter is not related to an existing ID');if(!(t instanceof window.SVGElement||t instanceof window.SVGGElement||/^svg$/i.test(t.nodeName)))throw new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement');this.el=t,this.scan(t)}var r,e,t,p;function i(t,e,n){r(),this.isReady=!1,this.setElement(t,e),this.setOptions(e),this.setCallback(n),this.isReady&&this.init()}n.prototype.TYPES=["line","ellipse","circle","polygon","polyline","rect"],n.prototype.ATTR_WATCH=["cx","cy","points","r","rx","ry","x","x1","x2","y","y1","y2"],n.prototype.scan=function(t){for(var e,n,r,i=t.querySelectorAll(this.TYPES.join(",")),a=0;a=this.duration)throw new Error("Vivus [constructor]: delay must be shorter than duration")},i.prototype.setCallback=function(t){if(t&&t.constructor!==Function)throw new Error('Vivus [constructor]: "callback" parameter must be a function');this.callback=t||function(){}},i.prototype.mapping=function(){var t,e,n,r,i,a,o,s,h,l;for(s=a=o=0,e=this.el.querySelectorAll("path"),l=!1,t=0;t=this.frameLength))return this.trace(),void(this.handle=e(function(){t.draw()}));this.stop(),this.currentFrame=this.frameLength,this.trace(),this.selfDestroy&&this.destroy()}this.callback(this),this.instanceCallback&&(this.instanceCallback(this),this.instanceCallback=null)},i.prototype.trace=function(){var t,e,n,r;for(r=this.animTimingFunction(this.currentFrame/this.frameLength)*this.frameLength,t=0;t + + + + + + vivus.js - svg animation + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+

vivus, bringing your SVGs to life

+

Vivus is a lightweight JavaScript class (with no dependencies) that allows you to animate SVGs, giving them the appearence of being drawn. There are a variety of different animations available, as well as the option to create a custom script to draw your SVG in whatever way you like.

+ + +
+ + +
+
+ +

Animation types

+
+
+ + + + + + + + + + + + + + +
+

Delayed

+

Every path element is drawn at the same time with a small delay at the start. This is currently the default animation.

+ +
+
+ +
+ + + + + + + + + + + + + + +
+

Sync

+

Each line is drawn synchronously. They all start and finish at the same time, hence the name `sync`.

+ +
+
+ +
+ + + + + + + + + + + + + + +
+

OneByOne

+

Each path element is drawn one after the other. This animation gives the best impression of live drawing.

+ +
+
+
+
+
+
+ + +
+
+ +

Timing function

+

To give more freedom, it's possible to override the animation of each path and/or the entire SVG. It works a bit like the CSS animation timing function. But instead of using a cubic-bezier function, it use a simple JavaScript function. It must accept a number as parameter (between 0 to 1), then return a number (also between 0 and 1). It's a hook.

+

Here an example test to play around with the different properties available.

+ +
+ + + + + + + + + + +
+

Type + + + + + +

+

Path timing function + + + + + + + +

+

Anim timing function + + + + + + + +

+
+
+
+
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Scenarize

+

This feature allows you to script the animation of your SVG. To do this, the custom values will be set directly in the DOM of the SVG.

+

Here is an example using scenario-sync.
I would recommend you look at the source code and the readme file for more information.

+ + +
+
+ +
+
+
+ + +
+
+

Play with it on Vivus instant.

+

More information and documentation on GitHub.

+
+
+ + +
+

Thanks for watching.

+

Made with love a keyboard

+
+ + + + + + diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/package-lock.json b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/package-lock.json new file mode 100644 index 00000000..58ddfac5 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/package-lock.json @@ -0,0 +1,4325 @@ +{ + "name": "vivus", + "version": "0.4.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-jsx": { + "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": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "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" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "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" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "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": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "async-each": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz", + "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "atob": { + "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 + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "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 + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "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", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "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 + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", + "dev": true + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "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 + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "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" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.0.0.tgz", + "integrity": "sha512-M6UqVvZVgFYqZL1SfHsRGIQSz3ZL+qgbsV5Lp1Vj61LZVYuEwcMXYay7DRDtYs2HQQBK5hQtQ0fD9aEJ89V0LA==", + "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": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "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", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "eslint": { + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.3.tgz", + "integrity": "sha512-vMGi0PjCHSokZxE0NLp2VneGw5sio7SSiDNgIUn2tC0XkWJRNOIoHIg3CliLVfXnJsiHxGAYrkw0PieAu8+KYQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.12.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "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 + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "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 + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "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 + } + } + }, + "extend": { + "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": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "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 + } + } + }, + "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 + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "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", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "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" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "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-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-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" + } + } + } + }, + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "dev": true + }, + "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 + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "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 + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "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 + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", + "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", + "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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 + }, + "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" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "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", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "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", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "jasmine-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.3.0.tgz", + "integrity": "sha512-3/xSmG/d35hf80BEN66Y6g9Ca5l/Isdeg/j6zvbTYlTzeKinzmaTM4p9am5kYqOmE05D7s1t8FGjzdSnbUbceA==", + "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 + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "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 + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "karma": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.0.1.tgz", + "integrity": "sha512-ind+4s03BqIXas7ZmraV3/kc5+mnqwCd+VDX1FndS6jxbt03kQKX2vXrWxNLuCjVYmhMwOZosAEKMM0a2q7w7A==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^2.3.2", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.11", + "log4js": "^4.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.2.tgz", + "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==", + "dev": true, + "requires": { + "dateformat": "^1.0.6", + "istanbul": "^0.4.0", + "lodash": "^4.17.0", + "minimatch": "^3.0.0", + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "log4js": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.0.2.tgz", + "integrity": "sha512-KE7HjiieVDPPdveA3bJZSuu0n8chMkFl8mIoisBFxwEJ9FmXe4YzNuiqSwYUiR1K8q8/5/8Yd6AClENY1RA9ww==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^3.1.0", + "flatted": "^2.0.0", + "rfdc": "^1.1.2", + "streamroller": "^1.0.1" + }, + "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" + } + } + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "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" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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 + } + } + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true + }, + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, + "requires": { + "mime-db": "~1.38.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "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 + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", + "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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 + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "parent-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", + "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", + "dev": true, + "requires": { + "callsites": "^3.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" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "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-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" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "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 + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "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 + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "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": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rfdc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "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 + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "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 + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "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 + } + } + }, + "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 + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "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": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "streamroller": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.3.tgz", + "integrity": "sha512-P7z9NwP51EltdZ81otaGAN3ob+/F88USJE546joNq7bqRNTe6jc74fTBDyynxP4qpIfKlt/CesEYicuMzI0yJg==", + "dev": true, + "requires": { + "async": "^2.6.1", + "date-format": "^2.0.0", + "debug": "^3.1.0", + "fs-extra": "^7.0.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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "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" + } + }, + "table": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", + "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "dev": true, + "requires": { + "ajv": "^6.9.1", + "lodash": "^4.17.11", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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 + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "uglify-js": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.2.tgz", + "integrity": "sha512-imog1WIsi9Yb56yRt5TfYVxGmnWs3WSGU73ieSOlMVFwhJCA9W8fqFFMMj4kgDqiS/80LGdsYnWL7O9UcjEBlg==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "validate-npm-package-license": { + "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" + } + }, + "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 + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^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", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/package.json b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/package.json new file mode 100644 index 00000000..46d7d789 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/package.json @@ -0,0 +1,35 @@ +{ + "name": "vivus", + "version": "0.4.6", + "description": "JavaScript library to make drawing animation on SVG", + "main": "dist/vivus.js", + "scripts": { + "test": "karma start test/karma.conf.js", + "serve": "python -m SimpleHTTPServer 8844", + "lint": "./node_modules/eslint/bin/eslint.js src test", + "build": "npm run build-raw && npm run build-min", + "build-raw": "node src/_build.js > dist/vivus.js", + "build-min": "uglifyjs dist/vivus.js -o dist/vivus.min.js -c -m --source-map" + }, + "repository": { + "type": "git", + "url": "https://github.com/maxwellito/vivus.git" + }, + "author": "maxwellito", + "license": "MIT", + "bugs": { + "url": "https://github.com/maxwellito/vivus/issues" + }, + "homepage": "https://github.com/maxwellito/vivus", + "engine": { + "node": ">=0.10.22" + }, + "devDependencies": { + "eslint": "^5.15.3", + "karma": "^4.0.1", + "karma-chrome-launcher": "^2.2.0", + "karma-coverage": "^1.1.2", + "karma-jasmine": "^2.0.1", + "uglify-js": "^3.5.2" + } +} diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/readme.md b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/readme.md new file mode 100644 index 00000000..06d57ba7 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/readme.md @@ -0,0 +1,352 @@ +# vivus.js + +Demo available on http://maxwellito.github.io/vivus + +Play with it on [Vivus Instant](https://maxwellito.github.io/vivus-instant/) + +Vivus is a lightweight JavaScript class (with no dependencies) that allows you to animate SVGs, giving them the appearance of being drawn. There are a variety of different animations available, as well as the option to create a custom script to draw your SVG in whatever way you like. + +Available via: + +- [NPM](https://www.npmjs.com/package/vivus): `npm install vivus` +- [Bower](http://bower.io/): `bower install vivus` +- [jsDelivr CDN](http://www.jsdelivr.com/#!vivus): `//cdn.jsdelivr.net/npm/vivus@latest/dist/vivus.min.js` +- [CDNJS CDN](https://cdnjs.com/libraries/vivus) +- [WebJars](http://www.webjars.org/) + +Join the conversation on [Gitter](https://gitter.im/maxwellito/vivus) + +Try Vivus with your SVG on [Vivus Instant](https://maxwellito.github.io/vivus-instant/). If you plan to use the library to animate a single SVG without callback or controls, this will allow you to download your animated SVG, powered by CSS, JavaScript free. + +## Animations + +On the following images, the pink color represents the `duration` value, and the blue one is for `delay` value. + +### Delayed + +![Timeline for delayed animation](https://raw.github.com/maxwellito/vivus/master/assets/delayed.png) + +Every path element is drawn at the same time with a small delay at the start. This is currently the default animation. + +### Sync + +![Timeline for sync animation](https://raw.github.com/maxwellito/vivus/master/assets/sync.png) + +Each line is drawn synchronously. They all start and finish at the same time, hence the name `sync`. + +### OneByOne + +![Timeline for oneByOne animation](https://raw.github.com/maxwellito/vivus/master/assets/oneByOne.png) + +Each path element is drawn one after the other. This animation gives the best impression of live drawing. The duration for each line depends on their length to make a constant drawing speed. + +## Principles + +To get this effect, the script uses the CSS property `strokeDashoffset`. This property manages the stroke offset on every line of the SVG. Now, all we have to do is add some JavaScript to update this value progressively and the magic begins. + +However, there's a problem with this. The `strokeDashoffset` property is only available on the path elements. This is an issue because in an SVG there are a lot of elements such as `circle`, `rect`, `line` and `polyline` which will break the animation. So to fix this, there is another class available in the repo called `pathformer`. It's made for transforming all objects of your SVG into `path` elements to be able to use `strokeDashoffset` and animate your SVGs. + +_The animation always draws elements in the same order as they are defined in the SVG tag._ + +There are few conditions that your SVG must meet: + +- All elements must have a stroke property and cannot be filled. This is because the animation only looks to progressively draw strokes and will not check for filled colours. For example: fill: "none"; stroke: "#FFF"; + +- You should avoid creating any hidden path elements in your SVG. Vivus considers them all eligible to be animated, so it is advised to remove them before playing with it. If they are not removed the animation might not achieve the desired effect, with blank areas and gaps appearing. + +- `text` elements aren't allowed, they cannot be transformed into `path` elements. See [#22](https://github.com/maxwellito/vivus/issues/22) for more details. + +The code is inspired from other repositories. The drawer is inspired from the excellent [Codrops](http://tympanus.net/codrops/) about the post [SVG Drawing Animation](http://tympanus.net/codrops/2013/12/30/svg-drawing-animation/) (if you don't know this website, get ready to have your mind blown). Then for the pathformer, there is a lot of work from [SVGPathConverter](https://github.com/Waest/SVGPathConverter) by [Waest](https://github.com/Waest). + +## Usage + +As I said, no dependencies here. All you need to do is include the scripts. + +**Inline SVG** + +```html + + + + + + + +``` + +**Dynamic load** + +```html + + + +``` + +or + +```html +
+ + +``` + +By default the `object` created will take the size of the parent element, this one must have a height and width or your SVG might not appear. + +If you need to edit this object, it is accessible in the `onReady` callback: + +```js +new Vivus('my-div-id', { + file: 'link/to/my.svg', + onReady: function (myVivus) { + // `el` property is the SVG element + myVivus.el.setAttribute('height', 'auto'); + } +}); +``` + +Check out the [hacks page](https://github.com/maxwellito/vivus/blob/master/hacks.md) for more tricks. + +### Constructor + +The Vivus constructor asks for 3 parameters: + +- ID (or object) of DOM element to interact with.
It can be an inline SVG or a wrapper element to append an object tag from the option `file` +- Option object (described in the following | +- Callback to call at the end of the animation (optional) + +### Option list + +| Name | Type | Description | +| -------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `type` | string | Defines what kind of animation will be used: `delayed`, `sync`, `oneByOne`, `script`, `scenario` or `scenario-sync`. [Default: `delayed`] | +| `file` | string | Link to the SVG to animate. If set, Vivus will create an object tag and append it to the DOM element given to the constructor. Be careful, use the `onReady` callback before playing with the Vivus instance. | +| `start` | string | Defines how to trigger the animation (`inViewport` once the SVG is in the viewport, `manual` gives you the freedom to call draw method to start, `autostart` makes it start right now). [Default: `inViewport`] | +| `duration` | integer | Animation duration, in frames. [Default: `200`] | +| `delay` | integer | Time between the drawing of first and last path, in frames (only for `delayed` animations). | +| `onReady` | function | Function called when the instance is ready to play. | +| `pathTimingFunction` | function | Timing animation function for each path element of the SVG. Check the [timing function part](#timing-function). | +| `animTimingFunction` | function | Timing animation function for the complete SVG. Check the [timing function part](#timing-function). | +| `dashGap` | integer | Whitespace extra margin between dashes. Increase it in case of glitches at the initial state of the animation. [Default: `2`] | +| `forceRender` | boolean | Force the browser to re-render all updated path items. By default, the value is `true` on IE only. (check the 'troubleshoot' section for more details). | +| `reverseStack` | boolean | Reverse the order of execution. The default behaviour is to render from the first 'path' in the SVG to the last one. This option allow you to reverse the order. [Default: `false`] | +| `selfDestroy` | boolean | Removes all extra styling on the SVG, and leaves it as original. | + +### Methods + +| Name | Description | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `play(speed, callback)` | Plays the animation with the speed given in parameter. This value can be negative to go backward, between 0 and 1 to go slowly, >1 to go faster, or <0 to go in reverse from current state. [Default: `1`]. Callback executed after the animation is finished (optional) | +| `stop()` | Stops the animation. | +| `reset()` | Reinitialises the SVG to the original state: undrawn. | +| `finish()` | Set the SVG to the final state: drawn. | +| `setFrameProgress(progress)` | Set the progress of the animation. Progress must be a number between 0 and 1. | +| `getStatus()` | Get the status of the animation between `start`, `progress`, `end` | +| `destroy()` | Reset the SVG but make the instance out of order. | + +These methods return the object so you can chain the actions. + +```js +const myVivus = new Vivus('my-svg-id'); +myVivus.stop().reset().play(2); +``` + +#### Play method callback + +Instead of using the global constructor callback when you create the Vivus object, you can add callbacks to be +executed for specific `play` method calls. + +```js +const myVivus = new Vivus('my-svg-id'); +myVivus.play(1, function () { + // called after the animation completes +}); + +// alternativly if you leave the speed param blank and use the default, you +// can pass the callback as the first parameter like so. +myVivus.play(function () { + // called after the animation completes +}); +``` + +## Timing function + +To give more freedom, it's possible to override the animation of each path and/or the entire SVG. It works a bit like the CSS animation timing function. But instead of using a cubic-bezier function, it use a simple JavaScript function. It must accept a number as parameter (between 0 to 1), then return a number (also between 0 and 1). It's a hook. + +If you don't want to create your own, timing methods are available via the constructor object: `EASE`, `EASE_IN`, `EASE_OUT` and `EASE_OUT_BOUNCE`. Then set it in the option object to enjoy them. + +```js +// Here, the ease animation will be use for the global drawing. +new Vivus( + 'my-svg-id', + { + type: 'delayed', + duration: 200, + animTimingFunction: Vivus.EASE + }, + myCallback +); +``` + +**WARNING**: `animTimingFunction` is called at every frame of the animation, and `pathTimingFunction` is also called at every frame for each path of your SVG. So be careful about them. Keep it simple, or it can affect the performance. + +## Extra attributes + +The attribute `data-ignore` allows you to ignore path tags from the vivus animation. + +```html + + + + + +``` + +In this case, the second path won't be part of the animation. + +## Scenarize + +This feature allows you to script the animation of your SVG. For this, the custom values will be set directly in the DOM of the SVG. + +### `scenario` + +This type is easier to understand, but longer to implement. You just have to define the start and duration of each element with `data-start` and `data-duration` attributes. If it is missing, it will use the default value given to the constructor. +The best part of this type is the flexibility it provides. You don't have to respect the order/stack of the SVG and you can start with the last element, then continue with the first to finish with all the rest at the same time. + +You will then have to define custom rules for each element in your SVG via extra attributes in your SVG DOM : + +- `data-start` (integer) + time when the animation must start, in frames +- `data-duration` (integer) + animation duration of this path, in frames + +```html + + + + + + +``` + +### `scenario-sync` + +It's not the sexiest code ever, but it's quite flexible. In addition to this, the behaviour is fairly different. +By using this animation type, the default behaviour is the same as `oneByOne`. However, you can define some properties on a specific path item such as the duration, the delay to start (from the end of the previous path) and if it should be played synchronously. + +- `data-delay` (integer) + time between the end of the animation of the previous path and the start of the current path, in frames +- `data-duration` (integer) + duration of this path animation, in frames +- `data-async` (no value required) + make the drawing of this path asynchronous. It means the next path will start at the same time. + If a path does not have an attribute for duration or delay then the default values, set in the options, will be used. + +Example: here is a simple SVG containing 5 elements. With the following options `{duration: 20, delay: 0}`, we should get this timeline + +![Timeline for script animation by default](https://raw.github.com/maxwellito/vivus/master/assets/script_default.png) + +This looks like 'oneByOne' animation, synchronous mode. But to make it a bit custom, here is what I can do: + +```html + + + + + + + +``` + +This scenario should give us + +![Timeline for this custom script animation](https://raw.github.com/maxwellito/vivus/master/assets/script_custom.png) + +I'm sorry if it does not look very sexy, and it's not really easy to use. I'm happy to make any changes, as long as the idea sounds interesting. Post an issue and I'll be very happy to talk about it! + +## Non Scaling + +Some SVG elements might use non scaling properties such as `vector-effect="non-scaling-stroke"`, which requires some additional custom logic. On instance construction Vivus will map all the child elements in the SVG and calculate their line length. If the element is resized during the animation, the calculated stroke style properties become invalid and the SVG will display incorrectly. + +To keep animation consistency, the method `recalc` should be called when the SVG is resized. It will re-calculate the line length on affected child elements on the next frame calculation. + +Code example: + +```js +// Create your Vivus instance +const vivusObject = new Vivus('my-div', { + duration: 200, + file: 'link/to/my.svg', +}); + +// Create your observer and set up a callback on resize +const resizeObserver = new ResizeObserver((entries) => { + // Recalculate the line lengths + vivusObject.recalc(); +}); + +resizeObserver.observe(vivusObject.el); +``` + +Vivus will provide a warning in the console when it detects stroke scaling. + +## Development + +To make it simpler a gulp file is set up to automise minifying, JShint and tests. +If you have never used Gulp before this is a good opportunity. To use it, you need to install NodeJS first then run `sudo npm install -g gulp`. + +To start, you will need to install the repo dependencies: + +```bash +$ npm install +``` + +Then you can use NPM scripts to run the following tasks: + +- `build` make the build (generate `dist/vivus.js` and `dist/vivus.min.js`) +- `lint` run ESlint on the source files +- `test` run Karma + +## Troubleshoot + +### Internet Explorer + +Some SVG weren't working at all. The only solution found was to clone and replace each updated path element. Of course this solution requires more resources and a lot of DOM manipulation, but it will give a smooth animation like other browsers. This fallback is only applied on Internet Explorer (all versions), and can be disabled via the option `forceRender`. + +Replacing each updated path by a clone was the only way to force IE to re-render the SVG. On some SVGs this trick is not necessary, but IE can be a bit tricky with this. If you're worried about performance, I would recommend checking if your SVG works correctly by disabling the `forceRender` option. If it works correctly on IE, then keep it like this. + +By default, `forceRender` is `true` on Internet Explorer only. + +### Firefox + +For Firefox users, you might encounter some glitches depending on your SVG and browser version. On versions before 36, there is a problem retrieving path length via `getTotalLength` method. Returning 174321516544 instead of 209 (I'm not exaggerating, this comes from a real case), messing up the entire animation treatment. Unfortunately, there's nothing that this library can do, this is due to Firefox. I hope to find a workaround, but at the moment I can only recommend that you test your animation on previous versions of Firefox. + +## Debug + +For an easier debug have a look to the attribute `map` of your Vivus object. This contains the mapping of your animation. If you're using a modern browser, I recommend `console.table` to get a nice output of the array which will make your debug easier. + +```javascript +const logo = new Vivus('myLogo', { type: 'scenario-sync' }); + +// The property 'map' contain all the SVG mapping +console.table(logo.map); +``` + +## Special thanks! + +Thanks to all contributors! Also users who pushed me to improve the library by publishing it on NPM, or browser compatibility or features. Also thanks for fixing my awful english :) + +- [@jolic](https://github.com/jolic) for dynamic SVG loading, ignore invisible paths, infinite and beyond... +- [@BenMcGeachy](https://github.com/BenMcGeachy) for making the documentation understandable +- [@TranscendOfSypherus](https://github.com/TranscendOfSypherus) for fixing the PathFormer +- [@flyingfisch](https://github.com/flyingfisch) for general helping with issues +- [@morgangiraud](https://github.com/morgangiraud) on the ignore invisible paths +- [@Nerdissimo](https://github.com/Nerdissimo) for inserting SVG without `object` wrapper +- [@jsimnz](https://github.com/jsimnz) for adding callbacks to play method + +and many others... diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/_build.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/_build.js new file mode 100644 index 00000000..eed30c70 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/_build.js @@ -0,0 +1,36 @@ +var fs = require('fs'); +var pkg = require('../package.json'); +var vivus = fs.readFileSync('src/vivus.js', { encoding: 'utf8' }); +var pathformer = fs.readFileSync('src/pathformer.js', { encoding: 'utf8' }); + +var output = `/** + * ${pkg.name} - ${pkg.description} + * @version v${pkg.version} + * @link ${pkg.homepage} + * @license ${pkg.license} + */ + +(function () { + + ${pathformer} + ${vivus} + + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], function() { + return Vivus; + }); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = Vivus; + } else { + // Browser globals + window.Vivus = Vivus; + } + +}()); +`; + +console.log(output); diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/pathformer.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/pathformer.js new file mode 100755 index 00000000..06747130 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/pathformer.js @@ -0,0 +1,276 @@ +'use strict'; + +/** + * Pathformer + * Beta version + * + * Take any SVG version 1.1 and transform + * child elements to 'path' elements + * + * This code is purely forked from + * https://github.com/Waest/SVGPathConverter + */ + +/** + * Class constructor + * + * @param {DOM|String} element Dom element of the SVG or id of it + */ +function Pathformer(element) { + // Test params + if (typeof element === 'undefined') { + throw new Error('Pathformer [constructor]: "element" parameter is required'); + } + + // Set the element + if (element.constructor === String) { + element = document.getElementById(element); + if (!element) { + throw new Error('Pathformer [constructor]: "element" parameter is not related to an existing ID'); + } + } + if (element instanceof window.SVGElement || + element instanceof window.SVGGElement || + /^svg$/i.test(element.nodeName)) { + this.el = element; + } else { + throw new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement'); + } + + // Start + this.scan(element); +} + +/** + * List of tags which can be transformed + * to path elements + * + * @type {Array} + */ +Pathformer.prototype.TYPES = ['line', 'ellipse', 'circle', 'polygon', 'polyline', 'rect']; + +/** + * List of attribute names which contain + * data. This array list them to check if + * they contain bad values, like percentage. + * + * @type {Array} + */ +Pathformer.prototype.ATTR_WATCH = ['cx', 'cy', 'points', 'r', 'rx', 'ry', 'x', 'x1', 'x2', 'y', 'y1', 'y2']; + +/** + * Finds the elements compatible for transform + * and apply the liked method + * + * @param {object} options Object from the constructor + */ +Pathformer.prototype.scan = function (svg) { + var fn, element, pathData, pathDom, + elements = svg.querySelectorAll(this.TYPES.join(',')); + + for (var i = 0; i < elements.length; i++) { + element = elements[i]; + fn = this[element.tagName.toLowerCase() + 'ToPath']; + pathData = fn(this.parseAttr(element.attributes)); + pathDom = this.pathMaker(element, pathData); + element.parentNode.replaceChild(pathDom, element); + } +}; + + +/** + * Read `line` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element Line element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.lineToPath = function (element) { + var newElement = {}, + x1 = element.x1 || 0, + y1 = element.y1 || 0, + x2 = element.x2 || 0, + y2 = element.y2 || 0; + + newElement.d = 'M' + x1 + ',' + y1 + 'L' + x2 + ',' + y2; + return newElement; +}; + +/** + * Read `rect` element to extract and transform + * data, to make it ready for a `path` object. + * The radius-border is not taken in charge yet. + * (your help is more than welcomed) + * + * @param {DOMelement} element Rect element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.rectToPath = function (element) { + var newElement = {}, + x = parseFloat(element.x) || 0, + y = parseFloat(element.y) || 0, + width = parseFloat(element.width) || 0, + height = parseFloat(element.height) || 0; + + if (element.rx || element.ry) { + var rx = parseInt(element.rx, 10) || -1, + ry = parseInt(element.ry, 10) || -1; + rx = Math.min(Math.max(rx < 0 ? ry : rx, 0), width/2); + ry = Math.min(Math.max(ry < 0 ? rx : ry, 0), height/2); + + newElement.d = 'M ' + (x + rx) + ',' + y + ' ' + + 'L ' + (x + width - rx) + ',' + y + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + (x + width) + ',' + (y + ry) + ' ' + + 'L ' + (x + width) + ',' + (y + height - ry) + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + (x + width - rx) + ',' + (y + height) + ' ' + + 'L ' + (x + rx) + ',' + (y + height) + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + x + ',' + (y + height - ry) + ' ' + + 'L ' + x + ',' + (y + ry) + ' ' + + 'A ' + rx + ',' + ry + ',0,0,1,' + (x + rx) + ',' + y; + } + else { + newElement.d = 'M' + x + ' ' + y + ' ' + + 'L' + (x + width) + ' ' + y + ' ' + + 'L' + (x + width) + ' ' + (y + height) + ' ' + + 'L' + x + ' ' + (y + height) + ' Z'; + } + return newElement; +}; + +/** + * Read `polyline` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element Polyline element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.polylineToPath = function (element) { + var newElement = {}, + points = element.points.trim().split(' '), + i, path; + + // Reformatting if points are defined without commas + if (element.points.indexOf(',') === -1) { + var formattedPoints = []; + for (i = 0; i < points.length; i+=2) { + formattedPoints.push(points[i] + ',' + points[i+1]); + } + points = formattedPoints; + } + + // Generate the path.d value + path = 'M' + points[0]; + for(i = 1; i < points.length; i++) { + if (points[i].indexOf(',') !== -1) { + path += 'L' + points[i]; + } + } + newElement.d = path; + return newElement; +}; + +/** + * Read `polygon` element to extract and transform + * data, to make it ready for a `path` object. + * This method rely on polylineToPath, because the + * logic is similar. The path created is just closed, + * so it needs an 'Z' at the end. + * + * @param {DOMelement} element Polygon element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.polygonToPath = function (element) { + var newElement = Pathformer.prototype.polylineToPath(element); + + newElement.d += 'Z'; + return newElement; +}; + +/** + * Read `ellipse` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element ellipse element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.ellipseToPath = function (element) { + var newElement = {}, + rx = parseFloat(element.rx) || 0, + ry = parseFloat(element.ry) || 0, + cx = parseFloat(element.cx) || 0, + cy = parseFloat(element.cy) || 0, + startX = cx - rx, + startY = cy, + endX = parseFloat(cx) + parseFloat(rx), + endY = cy; + + newElement.d = 'M' + startX + ',' + startY + + 'A' + rx + ',' + ry + ' 0,1,1 ' + endX + ',' + endY + + 'A' + rx + ',' + ry + ' 0,1,1 ' + startX + ',' + endY; + return newElement; +}; + +/** + * Read `circle` element to extract and transform + * data, to make it ready for a `path` object. + * + * @param {DOMelement} element Circle element to transform + * @return {object} Data for a `path` element + */ +Pathformer.prototype.circleToPath = function (element) { + var newElement = {}, + r = parseFloat(element.r) || 0, + cx = parseFloat(element.cx) || 0, + cy = parseFloat(element.cy) || 0, + startX = cx - r, + startY = cy, + endX = parseFloat(cx) + parseFloat(r), + endY = cy; + + newElement.d = 'M' + startX + ',' + startY + + 'A' + r + ',' + r + ' 0,1,1 ' + endX + ',' + endY + + 'A' + r + ',' + r + ' 0,1,1 ' + startX + ',' + endY; + return newElement; +}; + +/** + * Create `path` elements form original element + * and prepared objects + * + * @param {DOMelement} element Original element to transform + * @param {object} pathData Path data (from `toPath` methods) + * @return {DOMelement} Path element + */ +Pathformer.prototype.pathMaker = function (element, pathData) { + var i, attr, pathTag = document.createElementNS('http://www.w3.org/2000/svg','path'); + for(i = 0; i < element.attributes.length; i++) { + attr = element.attributes[i]; + if (this.ATTR_WATCH.indexOf(attr.name) === -1) { + pathTag.setAttribute(attr.name, attr.value); + } + } + for(i in pathData) { + pathTag.setAttribute(i, pathData[i]); + } + return pathTag; +}; + +/** + * Parse attributes of a DOM element to + * get an object of attribute => value + * + * @param {NamedNodeMap} attributes Attributes object from DOM element to parse + * @return {object} Object of attributes + */ +Pathformer.prototype.parseAttr = function (element) { + var attr, output = {}; + for (var i = 0; i < element.length; i++) { + attr = element[i]; + // Check if no data attribute contains '%', or the transformation is impossible + if (this.ATTR_WATCH.indexOf(attr.name) !== -1 && attr.value.indexOf('%') !== -1) { + throw new Error('Pathformer [parseAttr]: a SVG shape got values in percentage. This cannot be transformed into \'path\' tags. Please use \'viewBox\'.'); + } + output[attr.name] = attr.value; + } + return output; +}; diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/vivus.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/vivus.js new file mode 100755 index 00000000..b6e6767d --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/src/vivus.js @@ -0,0 +1,917 @@ +'use strict'; + +var setupEnv, requestAnimFrame, cancelAnimFrame, parsePositiveInt; + +/** + * Vivus + * Beta version + * + * Take any SVG and make the animation + * to give give the impression of live drawing + * + * This in more than just inspired from codrops + * At that point, it's a pure fork. + */ + +/** + * Class constructor + * option structure + * type: 'delayed'|'sync'|'oneByOne'|'script' (to know if the items must be drawn synchronously or not, default: delayed) + * duration: (in frames) + * start: 'inViewport'|'manual'|'autostart' (start automatically the animation, default: inViewport) + * delay: (delay between the drawing of first and last path) + * dashGap whitespace extra margin between dashes + * pathTimingFunction timing animation function for each path element of the SVG + * animTimingFunction timing animation function for the complete SVG + * forceRender force the browser to re-render all updated path items + * selfDestroy removes all extra styling on the SVG, and leaves it as original + * + * The attribute 'type' is by default on 'delayed'. + * - 'delayed' + * all paths are draw at the same time but with a + * little delay between them before start + * - 'sync' + * all path are start and finish at the same time + * - 'oneByOne' + * only one path is draw at the time + * the end of the first one will trigger the draw + * of the next one + * + * All these values can be overwritten individually + * for each path item in the SVG + * The value of frames will always take the advantage of + * the duration value. + * If you fail somewhere, an error will be thrown. + * Good luck. + * + * @constructor + * @this {Vivus} + * @param {DOM|String} element Dom element of the SVG or id of it + * @param {Object} options Options about the animation + * @param {Function} callback Callback for the end of the animation + */ +function Vivus(element, options, callback) { + setupEnv(); + + // Setup + this.isReady = false; + this.setElement(element, options); + this.setOptions(options); + this.setCallback(callback); + + if (this.isReady) { + this.init(); + } +} + +/** + * Timing functions + ************************************** + * + * Default functions to help developers. + * It always take a number as parameter (between 0 to 1) then + * return a number (between 0 and 1) + */ +Vivus.LINEAR = function(x) { + return x; +}; +Vivus.EASE = function(x) { + return -Math.cos(x * Math.PI) / 2 + 0.5; +}; +Vivus.EASE_OUT = function(x) { + return 1 - Math.pow(1 - x, 3); +}; +Vivus.EASE_IN = function(x) { + return Math.pow(x, 3); +}; +Vivus.EASE_OUT_BOUNCE = function(x) { + var base = -Math.cos(x * (0.5 * Math.PI)) + 1, + rate = Math.pow(base, 1.5), + rateR = Math.pow(1 - x, 2), + progress = -Math.abs(Math.cos(rate * (2.5 * Math.PI))) + 1; + return 1 - rateR + progress * rateR; +}; + +/** + * Setters + ************************************** + */ + +/** + * Check and set the element in the instance + * The method will not return anything, but will throw an + * error if the parameter is invalid + * + * @param {DOM|String} element SVG Dom element or id of it + */ +Vivus.prototype.setElement = function(element, options) { + var onLoad, self; + + // Basic check + if (typeof element === 'undefined') { + throw new Error('Vivus [constructor]: "element" parameter is required'); + } + + // Set the element + if (element.constructor === String) { + element = document.getElementById(element); + if (!element) { + throw new Error( + 'Vivus [constructor]: "element" parameter is not related to an existing ID' + ); + } + } + this.parentEl = element; + + // Load the SVG with XMLHttpRequest and extract the SVG + if (options && options.file) { + self = this; + onLoad = function() { + var domSandbox = document.createElement('div'); + domSandbox.innerHTML = this.responseText; + + var svgTag = domSandbox.querySelector('svg'); + if (!svgTag) { + throw new Error( + 'Vivus [load]: Cannot find the SVG in the loaded file : ' + + options.file + ); + } + + self.el = svgTag; + self.el.setAttribute('width', '100%'); + self.el.setAttribute('height', '100%'); + self.parentEl.appendChild(self.el); + self.isReady = true; + self.init(); + self = null; + }; + + var oReq = new window.XMLHttpRequest(); + oReq.addEventListener('load', onLoad); + oReq.open('GET', options.file); + oReq.send(); + return; + } + + switch (element.constructor) { + case window.SVGSVGElement: + case window.SVGElement: + case window.SVGGElement: + this.el = element; + this.isReady = true; + break; + + case window.HTMLObjectElement: + self = this; + onLoad = function(e) { + if (self.isReady) { + return; + } + self.el = + element.contentDocument && + element.contentDocument.querySelector('svg'); + if (!self.el && e) { + throw new Error( + 'Vivus [constructor]: object loaded does not contain any SVG' + ); + } else if (self.el) { + if (element.getAttribute('built-by-vivus')) { + self.parentEl.insertBefore(self.el, element); + self.parentEl.removeChild(element); + self.el.setAttribute('width', '100%'); + self.el.setAttribute('height', '100%'); + } + self.isReady = true; + self.init(); + self = null; + } + }; + + if (!onLoad()) { + element.addEventListener('load', onLoad); + } + break; + + default: + throw new Error( + 'Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)' + ); + } +}; + +/** + * Set up user option to the instance + * The method will not return anything, but will throw an + * error if the parameter is invalid + * + * @param {object} options Object from the constructor + */ +Vivus.prototype.setOptions = function(options) { + var allowedTypes = [ + 'delayed', + 'sync', + 'async', + 'nsync', + 'oneByOne', + 'scenario', + 'scenario-sync' + ]; + var allowedStarts = ['inViewport', 'manual', 'autostart']; + + // Basic check + if (options !== undefined && options.constructor !== Object) { + throw new Error( + 'Vivus [constructor]: "options" parameter must be an object' + ); + } else { + options = options || {}; + } + + // Set the animation type + if (options.type && allowedTypes.indexOf(options.type) === -1) { + throw new Error( + 'Vivus [constructor]: ' + + options.type + + ' is not an existing animation `type`' + ); + } else { + this.type = options.type || allowedTypes[0]; + } + + // Set the start type + if (options.start && allowedStarts.indexOf(options.start) === -1) { + throw new Error( + 'Vivus [constructor]: ' + + options.start + + ' is not an existing `start` option' + ); + } else { + this.start = options.start || allowedStarts[0]; + } + + this.isIE = + window.navigator.userAgent.indexOf('MSIE') !== -1 || + window.navigator.userAgent.indexOf('Trident/') !== -1 || + window.navigator.userAgent.indexOf('Edge/') !== -1; + this.duration = parsePositiveInt(options.duration, 120); + this.delay = parsePositiveInt(options.delay, null); + this.dashGap = parsePositiveInt(options.dashGap, 1); + this.forceRender = options.hasOwnProperty('forceRender') + ? !!options.forceRender + : this.isIE; + this.reverseStack = !!options.reverseStack; + this.selfDestroy = !!options.selfDestroy; + this.onReady = options.onReady; + this.map = []; + this.frameLength = this.currentFrame = this.delayUnit = this.speed = this.handle = null; + + this.ignoreInvisible = options.hasOwnProperty('ignoreInvisible') + ? !!options.ignoreInvisible + : false; + + this.animTimingFunction = options.animTimingFunction || Vivus.LINEAR; + this.pathTimingFunction = options.pathTimingFunction || Vivus.LINEAR; + + if (this.delay >= this.duration) { + throw new Error('Vivus [constructor]: delay must be shorter than duration'); + } +}; + +/** + * Set up callback to the instance + * The method will not return enything, but will throw an + * error if the parameter is invalid + * + * @param {Function} callback Callback for the animation end + */ +Vivus.prototype.setCallback = function(callback) { + // Basic check + if (!!callback && callback.constructor !== Function) { + throw new Error( + 'Vivus [constructor]: "callback" parameter must be a function' + ); + } + this.callback = callback || function() {}; +}; + +/** + * Core + ************************************** + */ + +/** + * Map the svg, path by path. + * The method return nothing, it just fill the + * `map` array. Each item in this array represent + * a path element from the SVG, with informations for + * the animation. + * + * ``` + * [ + * { + * el: the path element + * length: length of the path line + * startAt: time start of the path animation (in frames) + * duration: path animation duration (in frames) + * }, + * ... + * ] + * ``` + * + */ +Vivus.prototype.mapping = function() { + var i, paths, path, pAttrs, pathObj, totalLength, lengthMeter, timePoint, scale, hasNonScale; + timePoint = totalLength = lengthMeter = 0; + paths = this.el.querySelectorAll('path'); + hasNonScale = false; + + for (i = 0; i < paths.length; i++) { + path = paths[i]; + if (this.isInvisible(path)) { + continue; + } + + pathObj = { + el: path, + length: 0, + startAt: 0, + duration: 0, + isResizeSensitive: false + }; + + // If vector effect is non-scaling-stroke, the total length won't match the rendered length + // so we need to calculate the scale and apply it + if (path.getAttribute('vector-effect') === 'non-scaling-stroke') { + var rect = path.getBoundingClientRect(); + var box = path.getBBox(); + scale = Math.max(rect.width / box.width, rect.height / box.height); + pathObj.isResizeSensitive = true; + hasNonScale = true; + } else { + scale = 1; + } + pathObj.length = Math.ceil(path.getTotalLength() * scale); + + // Test if the path length is correct + if (isNaN(pathObj.length)) { + if (window.console && console.warn) { + console.warn( + 'Vivus [mapping]: cannot retrieve a path element length', + path + ); + } + continue; + } + this.map.push(pathObj); + path.style.strokeDasharray = + pathObj.length + ' ' + (pathObj.length + this.dashGap * 2); + path.style.strokeDashoffset = pathObj.length + this.dashGap; + pathObj.length += this.dashGap; + totalLength += pathObj.length; + + this.renderPath(i); + } + + // Show a warning for non-scaling elements + if (hasNonScale) { + console.warn('Vivus: this SVG contains non-scaling-strokes. You should call instance.recalc() when the SVG is resized or you will encounter unwanted behaviour. See https://github.com/maxwellito/vivus#non-scaling for more info.'); + } + + totalLength = totalLength === 0 ? 1 : totalLength; + this.delay = this.delay === null ? this.duration / 3 : this.delay; + this.delayUnit = this.delay / (paths.length > 1 ? paths.length - 1 : 1); + + // Reverse stack if asked + if (this.reverseStack) { + this.map.reverse(); + } + + for (i = 0; i < this.map.length; i++) { + pathObj = this.map[i]; + + switch (this.type) { + case 'delayed': + pathObj.startAt = this.delayUnit * i; + pathObj.duration = this.duration - this.delay; + break; + + case 'oneByOne': + pathObj.startAt = (lengthMeter / totalLength) * this.duration; + pathObj.duration = (pathObj.length / totalLength) * this.duration; + break; + + case 'sync': + case 'async': + case 'nsync': + pathObj.startAt = 0; + pathObj.duration = this.duration; + break; + + case 'scenario-sync': + path = pathObj.el; + pAttrs = this.parseAttr(path); + pathObj.startAt = + timePoint + + (parsePositiveInt(pAttrs['data-delay'], this.delayUnit) || 0); + pathObj.duration = parsePositiveInt( + pAttrs['data-duration'], + this.duration + ); + timePoint = + pAttrs['data-async'] !== undefined + ? pathObj.startAt + : pathObj.startAt + pathObj.duration; + this.frameLength = Math.max( + this.frameLength, + pathObj.startAt + pathObj.duration + ); + break; + + case 'scenario': + path = pathObj.el; + pAttrs = this.parseAttr(path); + pathObj.startAt = + parsePositiveInt(pAttrs['data-start'], this.delayUnit) || 0; + pathObj.duration = parsePositiveInt( + pAttrs['data-duration'], + this.duration + ); + this.frameLength = Math.max( + this.frameLength, + pathObj.startAt + pathObj.duration + ); + break; + } + lengthMeter += pathObj.length; + this.frameLength = this.frameLength || this.duration; + } +}; + +/** + * Public method to re-evaluate line length for non-scaling lines + * path elements. + */ +Vivus.prototype.recalc = function () { + if (this.mustRecalcScale) { + return; + } + this.mustRecalcScale = requestAnimFrame(function () { + this.performLineRecalc(); + }.bind(this)); +} + +/** + * Private method to re-evaluate line length on non-scaling + * path elements. Then call for a trace to update the SVG. + */ +Vivus.prototype.performLineRecalc = function () { + var pathObj, path, rect, box, scale; + for (var i = 0; i < this.map.length; i++) { + pathObj = this.map[i]; + if (pathObj.isResizeSensitive) { + path = pathObj.el; + rect = path.getBoundingClientRect(); + box = path.getBBox(); + scale = Math.max(rect.width / box.width, rect.height / box.height); + pathObj.length = Math.ceil(path.getTotalLength() * scale); + path.style.strokeDasharray = pathObj.length + ' ' + (pathObj.length + this.dashGap * 2); + } + } + this.trace(); + this.mustRecalcScale = null; +} + +/** + * Interval method to draw the SVG from current + * position of the animation. It update the value of + * `currentFrame` and re-trace the SVG. + * + * It use this.handle to store the requestAnimationFrame + * and clear it one the animation is stopped. So this + * attribute can be used to know if the animation is + * playing. + * + * Once the animation at the end, this method will + * trigger the Vivus callback. + * + */ +Vivus.prototype.draw = function() { + var self = this; + this.currentFrame += this.speed; + + if (this.currentFrame <= 0) { + this.stop(); + this.reset(); + } else if (this.currentFrame >= this.frameLength) { + this.stop(); + this.currentFrame = this.frameLength; + this.trace(); + if (this.selfDestroy) { + this.destroy(); + } + } else { + this.trace(); + this.handle = requestAnimFrame(function() { + self.draw(); + }); + return; + } + + this.callback(this); + if (this.instanceCallback) { + this.instanceCallback(this); + this.instanceCallback = null; + } +}; + +/** + * Draw the SVG at the current instant from the + * `currentFrame` value. Here is where most of the magic is. + * The trick is to use the `strokeDashoffset` style property. + * + * For optimisation reasons, a new property called `progress` + * is added in each item of `map`. This one contain the current + * progress of the path element. Only if the new value is different + * the new value will be applied to the DOM element. This + * method save a lot of resources to re-render the SVG. And could + * be improved if the animation couldn't be played forward. + * + */ +Vivus.prototype.trace = function() { + var i, progress, path, currentFrame; + currentFrame = + this.animTimingFunction(this.currentFrame / this.frameLength) * + this.frameLength; + for (i = 0; i < this.map.length; i++) { + path = this.map[i]; + progress = (currentFrame - path.startAt) / path.duration; + progress = this.pathTimingFunction(Math.max(0, Math.min(1, progress))); + if (path.progress !== progress) { + path.progress = progress; + path.el.style.strokeDashoffset = Math.floor(path.length * (1 - progress)); + this.renderPath(i); + } + } +}; + +/** + * Method forcing the browser to re-render a path element + * from it's index in the map. Depending on the `forceRender` + * value. + * The trick is to replace the path element by it's clone. + * This practice is not recommended because it's asking more + * ressources, too much DOM manupulation.. + * but it's the only way to let the magic happen on IE. + * By default, this fallback is only applied on IE. + * + * @param {Number} index Path index + */ +Vivus.prototype.renderPath = function(index) { + if (this.forceRender && this.map && this.map[index]) { + var pathObj = this.map[index], + newPath = pathObj.el.cloneNode(true); + pathObj.el.parentNode.replaceChild(newPath, pathObj.el); + pathObj.el = newPath; + } +}; + +/** + * When the SVG object is loaded and ready, + * this method will continue the initialisation. + * + * This this mainly due to the case of passing an + * object tag in the constructor. It will wait + * the end of the loading to initialise. + * + */ +Vivus.prototype.init = function() { + // Set object variables + this.frameLength = 0; + this.currentFrame = 0; + this.map = []; + + // Start + new Pathformer(this.el); + this.mapping(); + this.starter(); + + if (this.onReady) { + this.onReady(this); + } +}; + +/** + * Trigger to start of the animation. + * Depending on the `start` value, a different script + * will be applied. + * + * If the `start` value is not valid, an error will be thrown. + * Even if technically, this is impossible. + * + */ +Vivus.prototype.starter = function() { + switch (this.start) { + case 'manual': + return; + + case 'autostart': + this.play(); + break; + + case 'inViewport': + var self = this, + listener = function() { + if (self.isInViewport(self.parentEl, 1)) { + self.play(); + window.removeEventListener('scroll', listener); + } + }; + window.addEventListener('scroll', listener); + listener(); + break; + } +}; + +/** + * Controls + ************************************** + */ + +/** + * Get the current status of the animation between + * three different states: 'start', 'progress', 'end'. + * @return {string} Instance status + */ +Vivus.prototype.getStatus = function() { + return this.currentFrame === 0 + ? 'start' + : this.currentFrame === this.frameLength + ? 'end' + : 'progress'; +}; + +/** + * Reset the instance to the initial state : undraw + * Be careful, it just reset the animation, if you're + * playing the animation, this won't stop it. But just + * make it start from start. + * + */ +Vivus.prototype.reset = function() { + return this.setFrameProgress(0); +}; + +/** + * Set the instance to the final state : drawn + * Be careful, it just set the animation, if you're + * playing the animation on rewind, this won't stop it. + * But just make it start from the end. + * + */ +Vivus.prototype.finish = function() { + return this.setFrameProgress(1); +}; + +/** + * Set the level of progress of the drawing. + * + * @param {number} progress Level of progress to set + */ +Vivus.prototype.setFrameProgress = function(progress) { + progress = Math.min(1, Math.max(0, progress)); + this.currentFrame = Math.round(this.frameLength * progress); + this.trace(); + return this; +}; + +/** + * Play the animation at the desired speed. + * Speed must be a valid number (no zero). + * By default, the speed value is 1. + * But a negative value is accepted to go forward. + * + * And works with float too. + * But don't forget we are in JavaScript, se be nice + * with him and give him a 1/2^x value. + * + * @param {number} speed Animation speed [optional] + */ +Vivus.prototype.play = function(speed, callback) { + this.instanceCallback = null; + + if (speed && typeof speed === 'function') { + this.instanceCallback = speed; // first parameter is actually the callback function + speed = null; + } else if (speed && typeof speed !== 'number') { + throw new Error('Vivus [play]: invalid speed'); + } + // if the first parameter wasn't the callback, check if the seconds was + if (callback && typeof callback === 'function' && !this.instanceCallback) { + this.instanceCallback = callback; + } + + this.speed = speed || 1; + if (!this.handle) { + this.draw(); + } + return this; +}; + +/** + * Stop the current animation, if on progress. + * Should not trigger any error. + * + */ +Vivus.prototype.stop = function() { + if (this.handle) { + cancelAnimFrame(this.handle); + this.handle = null; + } + return this; +}; + +/** + * Destroy the instance. + * Remove all bad styling attributes on all + * path tags + * + */ +Vivus.prototype.destroy = function() { + this.stop(); + var i, path; + for (i = 0; i < this.map.length; i++) { + path = this.map[i]; + path.el.style.strokeDashoffset = null; + path.el.style.strokeDasharray = null; + this.renderPath(i); + } +}; + +/** + * Utils methods + * include methods from Codrops + ************************************** + */ + +/** + * Method to best guess if a path should added into + * the animation or not. + * + * 1. Use the `data-vivus-ignore` attribute if set + * 2. Check if the instance must ignore invisible paths + * 3. Check if the path is visible + * + * For now the visibility checking is unstable. + * It will be used for a beta phase. + * + * Other improvments are planned. Like detecting + * is the path got a stroke or a valid opacity. + */ +Vivus.prototype.isInvisible = function(el) { + var rect, + ignoreAttr = el.getAttribute('data-ignore'); + + if (ignoreAttr !== null) { + return ignoreAttr !== 'false'; + } + + if (this.ignoreInvisible) { + rect = el.getBoundingClientRect(); + return !rect.width && !rect.height; + } else { + return false; + } +}; + +/** + * Parse attributes of a DOM element to + * get an object of {attributeName => attributeValue} + * + * @param {object} element DOM element to parse + * @return {object} Object of attributes + */ +Vivus.prototype.parseAttr = function(element) { + var attr, + output = {}; + if (element && element.attributes) { + for (var i = 0; i < element.attributes.length; i++) { + attr = element.attributes[i]; + output[attr.name] = attr.value; + } + } + return output; +}; + +/** + * Reply if an element is in the page viewport + * + * @param {object} el Element to observe + * @param {number} h Percentage of height + * @return {boolean} + */ +Vivus.prototype.isInViewport = function(el, h) { + var scrolled = this.scrollY(), + viewed = scrolled + this.getViewportH(), + elBCR = el.getBoundingClientRect(), + elHeight = elBCR.height, + elTop = scrolled + elBCR.top, + elBottom = elTop + elHeight; + + // if 0, the element is considered in the viewport as soon as it enters. + // if 1, the element is considered in the viewport only when it's fully inside + // value in percentage (1 >= h >= 0) + h = h || 0; + + return elTop + elHeight * h <= viewed && elBottom >= scrolled; +}; + +/** + * Get the viewport height in pixels + * + * @return {integer} Viewport height + */ +Vivus.prototype.getViewportH = function() { + var client = this.docElem.clientHeight, + inner = window.innerHeight; + + if (client < inner) { + return inner; + } else { + return client; + } +}; + +/** + * Get the page Y offset + * + * @return {integer} Page Y offset + */ +Vivus.prototype.scrollY = function() { + return window.pageYOffset || this.docElem.scrollTop; +}; + +setupEnv = function() { + if (Vivus.prototype.docElem) { + return; + } + + /** + * Alias for document element + * + * @type {DOMelement} + */ + Vivus.prototype.docElem = window.document.documentElement; + + /** + * Alias for `requestAnimationFrame` or + * `setTimeout` function for deprecated browsers. + * + */ + requestAnimFrame = (function() { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(/* function */ callback) { + return window.setTimeout(callback, 1000 / 60); + } + ); + })(); + + /** + * Alias for `cancelAnimationFrame` or + * `cancelTimeout` function for deprecated browsers. + * + */ + cancelAnimFrame = (function() { + return ( + window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(id) { + return window.clearTimeout(id); + } + ); + })(); +}; + +/** + * Parse string to integer. + * If the number is not positive or null + * the method will return the default value + * or 0 if undefined + * + * @param {string} value String to parse + * @param {*} defaultValue Value to return if the result parsed is invalid + * @return {number} + * + */ +parsePositiveInt = function(value, defaultValue) { + var output = parseInt(value, 10); + return output >= 0 ? output : defaultValue; +}; diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/karma.conf.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/karma.conf.js new file mode 100644 index 00000000..20f69533 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/karma.conf.js @@ -0,0 +1,75 @@ +// Karma configuration +// Generated on Fri Jul 18 2014 10:58:08 GMT+0100 (BST) + +module.exports = function(config) { + var options = { + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '..', + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['jasmine'], + + // list of files / patterns to load in the browser + files: [ + 'test/unit.setup.js', + 'src/pathformer.js', + 'src/vivus.js', + 'test/unit/**.js' + ], + + // list of files to exclude + exclude: [], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + '../src/pathformer.js': ['coverage'], + '../src/vivus.js': ['coverage'] + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress', 'coverage'], + + // optionally, configure the reporter + coverageReporter: { + type: 'html', + dir: '../coverage/' + }, + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome'], + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: true + }; + + if (process.env.TRAVIS) { + options.customLaunchers = { + Chrome_travis_ci: { + base: 'Chrome', + flags: ['--no-sandbox'] + } + }; + options.browsers = ['Chrome_travis_ci']; + } + + config.set(options); +}; diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/hi-there.svg b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/hi-there.svg new file mode 100644 index 00000000..cfe0dd22 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/hi-there.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/index.html b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/index.html new file mode 100644 index 00000000..d62a21f1 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/index.html @@ -0,0 +1,425 @@ + + + + + + + vivus.js - manual tests page + + + + + +
+

Vivus manual (cheap) tests.

+

+ Just scroll along the page and if a glitch appear or the visual + appearance is not like the description, it's not good. +

+ +
+ +
+
+
+

+ This should display the obturateur SVG like on the demo page. The + strokes must be orange. The element must remain an + object tag. +

+ +
+
+ +
+
+
+ +
+
+
+
+
+
+

+ This should display the polaroid SVG like on the demo page. The + strokes must have the same color as this text. +

+
+
+
+ +
+
+
+

+ This should display the 'Hi there' SVG like ready to start. Be sure + no glitch appear (no small path or dots). Click on the following + button to start. +

+ +
+
+
+
+
+
+ +
+
+
+
+
+
+

+ This should display a synth ready to start. Be sure no glitch appear + (no small path or dots). The animation should use a custom path + timing function (ease_in: slow at start then finish fast.). Click on + the following button to start. +

+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+ + + + + + + + + + + +
+

+ Non scaling path
In any case of a resize, the animation of each + line must be complete. +

+ + +
+
+ + + + + + diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/obturateur.svg b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/obturateur.svg new file mode 100644 index 00000000..6baf6538 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/obturateur.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/polaroid.svg b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/polaroid.svg new file mode 100644 index 00000000..af9f781b --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/polaroid.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/synth.svg b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/synth.svg new file mode 100644 index 00000000..93b2c104 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/manual/synth.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit.setup.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit.setup.js new file mode 100644 index 00000000..4badb160 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit.setup.js @@ -0,0 +1,14 @@ +/* Here is a cheap and bad implementation + * of requestAnimationFrame and + * cancelAnimationFrame mock. + * But it's more than enough + * for our tests. + */ +window.requestAnimFrameStack = []; +window.requestAnimationFrame = function (callback) { + window.requestAnimFrameStack.push(callback); + return true; +}; +window.cancelAnimationFrame = function () { + window.requestAnimFrameStack = []; +}; diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit/pathformer.spec.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit/pathformer.spec.js new file mode 100644 index 00000000..109f4b10 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit/pathformer.spec.js @@ -0,0 +1,322 @@ +'use strict'; + +/** + * Unit tests for Pathformer + * + */ +describe('Pathformer', function () { + + var svgTag, + svgTagId = 'my-svg', + svgGroupTag, + svgGroupTagId = 'my-svg-group'; + + beforeEach(function () { + // Remove tag if existing + svgTag = document.getElementById(svgTagId); + if (svgTag) { + svgTag.remove(); + } + + // Create the SVG + svgTag = document.createElementNS('http://www.w3.org/2000/svg','svg'); + svgTag.id = svgTagId; + svgTag.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + svgGroupTag = svgTag.querySelector('#'+svgGroupTagId); + + // Insert it to the body + document.body.appendChild(svgTag); + }); + + describe('[param tests]', function () { + + // Tests about the SVG element + it('should throw an error if the SVG is given in parameter', function () { + expect(function () { + new Pathformer(); + }).toThrow(new Error('Pathformer [constructor]: "element" parameter is required')); + }); + + it('should work with only the SVG id', function () { + expect(function () { + new Pathformer(svgTagId); + }).not.toThrow(); + }); + + it('should work with only the SVG object', function () { + expect(function () { + new Pathformer(svgTag); + }).not.toThrow(); + }); + + it('should work with only the SVG group object', function () { + expect(function () { + new Pathformer(svgGroupTag); + }).not.toThrow(); + }); + + it('should throw an error if the SVG ID given is invalid', function () { + expect(function () { + new Pathformer('my-unexisting-svg'); + }).toThrow(new Error('Pathformer [constructor]: "element" parameter is not related to an existing ID')); + }); + + it('should throw an error if the ID given is not related to a SVG element', function () { + var divTag = document.createElement('div'); + divTag.id = 'my-div'; + document.body.appendChild(divTag); + expect(function () { + new Pathformer('my-div'); + }).toThrow(new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement')); + }); + + it('should throw an error if the element is not a correct type (DOM object or string)', function () { + expect(function () { new Pathformer({}); }).toThrow(new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement')); + expect(function () { new Pathformer(42); }).toThrow(new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement')); + expect(function () { new Pathformer(false); }).toThrow(new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement')); + expect(function () { new Pathformer(new Date()); }).toThrow(new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement')); + expect(function () { new Pathformer(function () {}); }).toThrow(new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement')); + expect(function () { new Pathformer(document.createElement('div')); }).toThrow(new Error('Pathformer [constructor]: "element" parameter must be a string or a SVGelement')); + }); + }); + + describe('[translation]', function () { + + // Line object + describe('line', function () { + it('should return an object with a `d` attribute', function () { + var output = Pathformer.prototype.lineToPath({}); + expect(output.d).toBeDefined(); + }); + + it('should return an object with an unclosed shape', function () { + var output = Pathformer.prototype.lineToPath({}); + expect(output.d.substr(-1)).not.toEqual('Z'); + }); + + it('should set default positino attributes to zero', function () { + var output = Pathformer.prototype.lineToPath({ + x1: '21', x2: '32', y1: '11' + }); + expect(output.d.indexOf('0')).not.toEqual(-1); + expect(output.d.indexOf('undefined')).toEqual(-1); + }); + }); + + // Rect object + describe('rect', function () { + it('should return an object with a `d` attribute', function () { + var output = Pathformer.prototype.rectToPath({}); + expect(output.d).toBeDefined(); + }); + + it('should return an object with a closed shape', function () { + var output = Pathformer.prototype.rectToPath({}); + expect(output.d.substr(-1)).toEqual('Z'); + }); + + it('should set default positino attributes to zero', function () { + var output = Pathformer.prototype.rectToPath({ + x: '21', height: '32', width: '11' + }); + expect(output.d.indexOf('0')).not.toEqual(-1); + expect(output.d.indexOf('undefined')).toEqual(-1); + }); + + it('should apply rounded corners', function () { + var result = 'M 50,10 ' + + 'L 50,10 A 40,20,0,0,1,90,30 ' + + 'L 90,50 A 40,20,0,0,1,50,70 ' + + 'L 50,70 A 40,20,0,0,1,10,50 ' + + 'L 10,30 A 40,20,0,0,1,50,10'; + + var output = Pathformer.prototype.rectToPath({ + x:10, y:10, width:80, height:60, rx:100, ry:20 + }); + + expect(output.d).toEqual(result); + }); + + it('should apply rounded corners even when a value is missing', function () { + var result = 'M 30,10 ' + + 'L 70,10 A 20,20,0,0,1,90,30 ' + + 'L 90,50 A 20,20,0,0,1,70,70 ' + + 'L 30,70 A 20,20,0,0,1,10,50 ' + + 'L 10,30 A 20,20,0,0,1,30,10'; + + var output = Pathformer.prototype.rectToPath({ + x:10, y:10, width:80, height:60, ry:20 + }); + + expect(output.d).toEqual(result); + }); + }); + + // Polyline object + describe('polyline', function () { + var polyline; + beforeEach(function () { + polyline = { + points: '2,3 4,5 6,7' + }; + }); + + it('should return an object with a `d` attribute', function () { + var output = Pathformer.prototype.polylineToPath(polyline); + expect(output.d).toBeDefined(); + }); + + it('should return an object with an unclosed shape', function () { + var output = Pathformer.prototype.polylineToPath(polyline); + expect(output.d.substr(-1)).not.toEqual('Z'); + }); + + it('should ignore incorrect points', function () { + var output; + polyline.points += ' 43'; + output = Pathformer.prototype.polylineToPath(polyline); + expect(output.d.indexOf('43')).toEqual(-1); + }); + + it('should accept points defined with and without commas', function () { + var outputWithPoint = Pathformer.prototype.polylineToPath(polyline); + var outputWithoutPoint = Pathformer.prototype.polylineToPath({points: '2 3 4 5 6 7'}); + expect(outputWithPoint).toEqual(outputWithoutPoint); + }); + }); + + // Polygon object + describe('polygon', function () { + var polygon; + beforeEach(function () { + polygon = { + points: '2,3 4,5 6,7' + }; + }); + + it('should return an object with a `d` attribute', function () { + var output = Pathformer.prototype.polygonToPath(polygon); + expect(output.d).toBeDefined(); + }); + + it('should return an object with a closed shape', function () { + var output = Pathformer.prototype.polygonToPath(polygon); + expect(output.d.substr(-1)).toEqual('Z'); + }); + }); + + // Ellipse object + describe('ellipse', function () { + + var ellipse; + beforeEach(function () { + ellipse = { + cx: 2, + cy: 3, + rx: 3 + }; + }); + + it('should return an object with a `d` attribute', function () { + var output = Pathformer.prototype.ellipseToPath(ellipse); + expect(output.d).toBeDefined(); + }); + + it('should return an object with an unclosed shape', function () { + var output = Pathformer.prototype.ellipseToPath(ellipse); + expect(output.d.substr(-1)).not.toEqual('Z'); + }); + + it('should set default positino attributes to zero', function () { + delete ellipse.cy; + var output = Pathformer.prototype.ellipseToPath(ellipse); + expect(output.d.indexOf('0')).not.toEqual(-1); + expect(output.d.indexOf('undefined')).toEqual(-1); + }); + }); + + // Circle object + describe('circle', function () { + + var circle; + beforeEach(function () { + circle = { + cx: 2, + cy: 3, + rx: 3, + r: 1 + }; + }); + + it('should return an object with a `d` attribute', function () { + var output = Pathformer.prototype.circleToPath(circle); + expect(output.d).toBeDefined(); + }); + + it('should return an object with an unclosed shape', function () { + var output = Pathformer.prototype.circleToPath(circle); + expect(output.d.substr(-1)).not.toEqual('Z'); + }); + + it('should set default positino attributes to zero', function () { + delete circle.cy; + var output = Pathformer.prototype.circleToPath(circle); + expect(output.d.indexOf('0')).not.toEqual(-1); + expect(output.d.indexOf('undefined')).toEqual(-1); + }); + }); + }); + + describe('[utils]', function () { + + describe('attribute parser', function () { + it('should return an empty object if attributes length are undefined', function () { + var output = Pathformer.prototype.parseAttr({}); + expect(output).toEqual({}); + }); + }); + + describe('engine', function () { + it('shouldn\'t throw an error if the SVG got a tag not taken in charge', function () { + svgTag.innerHTML = ''; + + expect(function () { + new Pathformer(svgTagId); + }).not.toThrow(); + }); + + it('should remove useless attributes during transformation', function () { + new Pathformer(svgTagId); + expect(svgTag.childNodes[0].getAttribute('cx')).toBe(null); + }); + }); + + describe('validity', function () { + it('should throw error if the SVG contain shape with percentage value', function () { + // Create the SVG + var svgTagPrc = document.createElementNS('http://www.w3.org/2000/svg','svg'); + svgTagPrc.innerHTML = ''; + expect(function () { + new Pathformer(svgTagPrc); + }).toThrow(new Error('Pathformer [parseAttr]: a SVG shape got values in percentage. This cannot be transformed into \'path\' tags. Please use \'viewBox\'.')); + }); + + it('shouldn\'t throw error if the SVG contain shape with percentage value on a non-data attribute', function () { + // Create the SVG + var svgTagPrc = document.createElementNS('http://www.w3.org/2000/svg','svg'); + svgTagPrc.innerHTML = ''; + expect(function () { + new Pathformer(svgTagPrc); + }).not.toThrow(); + }); + }); + }); +}); diff --git a/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit/vivus.spec.js b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit/vivus.spec.js new file mode 100644 index 00000000..af9e74b1 --- /dev/null +++ b/extensions/fablabchemnitz/animate_order/vivus-0.4.6/test/unit/vivus.spec.js @@ -0,0 +1,669 @@ +'use strict'; + +/** + * Unit tests for Vivus + * + */ +describe('Vivus', function () { + + var ObjectElementMock, + triggerFrames, + myVivus, + objTag, + wrapTag, + svgTag, + svgTagId = 'my-svg', + svgGroupTagId = 'my-svg-group'; + + // Mock ObjectElement and it's constructor via createElement + ObjectElementMock = function () { + this.loadCb = []; + this.attr = {}; + this.addEventListener = function (evtName, cb) { + if (evtName === 'load') { + this.loadCb.push(cb); + } + }; + this.loaded = function () { + for (var i = 0; i < this.loadCb.length; i++) { + this.loadCb[i]({target: this}); + } + }; + this.getBoundingClientRect = function () { + return { + height: 11, + top: 364 + }; + }; + this.insertBefore = function () {}; + this.removeChild = function () {}; + this.setAttribute = function (key, val) { + this.attr[key] = val; + }; + this.getAttribute = function (key) { + return this.attr[key]; + }; + }; + window.HTMLObjectElement = ObjectElementMock; + + triggerFrames = function (counter) { + counter = counter || -1; + while (window.requestAnimFrameStack.length && counter !== 0) { + window.requestAnimFrameStack.shift()(); + counter--; + } + }; + + + beforeEach(function () { + // Create the SVG + svgTag = document.createElementNS('http://www.w3.org/2000/svg','svg'); + svgTag.id = svgTagId; + svgTag.innerHTML = '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + wrapTag = document.createElement('div'); + wrapTag.appendChild(svgTag); + + document.body.appendChild(wrapTag); + + // Reset the request anim frame stack + window.requestAnimFrameStack = []; + }); + + afterEach(function () { + // Remove tag + svgTag.remove(); + wrapTag.remove(); + }); + + describe('[basic tests]', function () { + + it('should the class be defined under Vivus name', function () { + expect(Vivus).toBeDefined(); + }); + + it('should have timing functions set', function () { + expect(Vivus.LINEAR).toBeDefined(); + expect(Vivus.EASE).toBeDefined(); + expect(Vivus.EASE_IN).toBeDefined(); + expect(Vivus.EASE_OUT).toBeDefined(); + expect(Vivus.EASE_OUT_BOUNCE).toBeDefined(); + }); + + it('should have timing functions returning correct value on limits', function () { + expect(Vivus.LINEAR(0)).toEqual(0); + expect(Vivus.LINEAR(1)).toEqual(1); + expect(Vivus.EASE(0)).toEqual(0); + expect(Vivus.EASE(1)).toEqual(1); + expect(Vivus.EASE_IN(0)).toEqual(0); + expect(Vivus.EASE_IN(1)).toEqual(1); + expect(Vivus.EASE_OUT(0)).toEqual(0); + expect(Vivus.EASE_OUT(1)).toEqual(1); + expect(Vivus.EASE_OUT_BOUNCE(0)).toEqual(0); + expect(Vivus.EASE_OUT_BOUNCE(1)).toEqual(1); + }); + }); + + describe('[param tests]', function () { + + // Tests about the SVG element + it('should throw an error if the SVG is given in parameter', function () { + expect(function () { + new Vivus(); + }).toThrow(new Error('Vivus [constructor]: "element" parameter is required')); + }); + + it('should work with only the SVG id', function () { + expect(function () { + new Vivus(svgTagId); + }).not.toThrow(); + }); + + it('should work with only the SVG object', function () { + expect(function () { + new Vivus(svgTag); + }).not.toThrow(); + }); + + it('should work with the SVG group object', function () { + expect(function () { + new Vivus(svgGroupTagId); + }).not.toThrow(); + }); + + it('should throw an error if the SVG ID given is invalid', function () { + expect(function () { + new Vivus('my-unexisting-svg'); + }).toThrow(new Error('Vivus [constructor]: "element" parameter is not related to an existing ID')); + }); + + it('should throw an error if the ID given is not related to a SVG element', function () { + var divTag = document.createElement('div'); + divTag.id = 'my-div'; + document.body.appendChild(divTag); + expect(function () { + new Vivus('my-div'); + }).toThrow(new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')); + }); + + it('should accept any DOM element if `file` option is set', function () { + var divTag = document.createElement('div'); + spyOn(window, 'XMLHttpRequest'); + try { + new Vivus(divTag, {file: 'opensource.svg'}); + } + catch(err) {} + + expect(window.XMLHttpRequest).toHaveBeenCalled(); + }); + + it('should throw an error if the element is not a correct type (DOM object or string)', function () { + expect(function () { new Vivus({}); }).toThrow(new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')); + expect(function () { new Vivus(42); }).toThrow(new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')); + expect(function () { new Vivus(false); }).toThrow(new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')); + expect(function () { new Vivus(new Date()); }).toThrow(new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')); + expect(function () { new Vivus(function () {}); }).toThrow(new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')); + expect(function () { new Vivus(document.createElement('div')); }).toThrow(new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')); + }); + + it('should accept object element', function () { + // Create a mock Object getElementById + objTag = new ObjectElementMock(); + objTag.contentDocument = wrapTag; + + expect(function () { + new Vivus(objTag); + }).not.toThrow(); + }); + + it('the vivus state should be ready if the SVG is already loaded', function () { + objTag = new ObjectElementMock(); + objTag.contentDocument = wrapTag; + objTag.loaded(); + var myVivus = new Vivus(objTag); + expect(myVivus.isReady).toEqual(true); + }); + + it('the vivus instance should have `el` and `parentEl` different if the element is an object', function () { + objTag = new ObjectElementMock(); + objTag.contentDocument = wrapTag; + objTag.loaded(); + var myVivus = new Vivus(objTag); + expect(myVivus.parentEl).not.toEqual(myVivus.el); + }); + + it('should call `onReady` callback once the SVG is loaded', function () { + objTag = new ObjectElementMock(); + objTag.contentDocument = document.createElement('div'); + var myVivus = new Vivus(objTag); + objTag.contentDocument = wrapTag; + objTag.loaded(); + expect(myVivus.isReady).toEqual(true); + }); + + it('should throw an error if the SVG file does not exists', function () { + objTag = new ObjectElementMock(); + objTag.contentDocument = document.createElement('div'); + new Vivus(objTag); + expect(function () { + objTag.loaded(); + }).toThrow(); + }); + + // Options + it('should work without options', function () { + expect(function () { + new Vivus(svgTag); + }).not.toThrow(); + }); + + it('should throw an error if options is not an object', function () { + expect(function () { new Vivus(svgTag, []); }).toThrow(new Error('Vivus [constructor]: "options" parameter must be an object')); + expect(function () { new Vivus(svgTag, 42); }).toThrow(new Error('Vivus [constructor]: "options" parameter must be an object')); + expect(function () { new Vivus(svgTag, false); }).toThrow(new Error('Vivus [constructor]: "options" parameter must be an object')); + expect(function () { new Vivus(svgTag, new Date()); }).toThrow(new Error('Vivus [constructor]: "options" parameter must be an object')); + expect(function () { new Vivus(svgTag, 'manual'); }).toThrow(new Error('Vivus [constructor]: "options" parameter must be an object')); + expect(function () { new Vivus(svgTag, function () {}); }).toThrow(new Error('Vivus [constructor]: "options" parameter must be an object')); + }); + + // Options + it('should work with empty option object', function () { + expect(function () { + new Vivus(svgTag, {}); + }).not.toThrow(); + }); + + it('should throw an error if the `type` value given in options does not exists', function () { + expect(function () { + new Vivus(svgTag, {type: 'by-unicorn'}); + }).toThrow(new Error('Vivus [constructor]: by-unicorn is not an existing animation `type`')); + }); + + it('should throw an error if the `start` value given in options is not a string', function () { + expect(function () { + new Vivus(svgTag, {start: 'when-unicorn-ready'}); + }).toThrow(new Error('Vivus [constructor]: when-unicorn-ready is not an existing `start` option')); + }); + + it('should throw an error if the `delay` value is bigger (or equal) than `duration`', function () { + expect(function () { + new Vivus(svgTag, {duration: 200, delay: 199}); + }).not.toThrow(); + expect(function () { + new Vivus(svgTag, {duration: 200, delay: 200}); + }).toThrow(new Error('Vivus [constructor]: delay must be shorter than duration')); + expect(function () { + new Vivus(svgTag, {duration: 200, delay: 201}); + }).toThrow(new Error('Vivus [constructor]: delay must be shorter than duration')); + }); + + it('should override `duration` if invalid', function () { + myVivus = new Vivus(svgTag, {duration: -12}); + expect(myVivus.duration > 0).toBe(true); + }); + + it('should override `delay` if invalid, with a null value', function () { + myVivus = new Vivus(svgTag, {delay: -12}); + expect(!myVivus.delay).toBe(false); + }); + + it('should set up default values', function () { + myVivus = new Vivus(svgTag, {}); + expect(myVivus.type).toBeDefined(); + expect(myVivus.start).toBeDefined(); + expect(myVivus.duration).toBeDefined(); + }); + + it('the vivus instance should have `el` and `parentEl` equal if the element is a SVG object', function () { + myVivus = new Vivus(svgTag, {}); + expect(myVivus.el).toEqual(myVivus.parentEl); + }); + + // Callback + it('should throw an error if callback is non a function', function () { + expect(function () { + new Vivus(svgTag, {}, 42); + }).toThrow(new Error('Vivus [constructor]: "callback" parameter must be a function')); + }); + + it('should use scale to determine path length when vector effect is non-scaling-stroke', function () { + var scalingSvgTag = document.createElementNS('http://www.w3.org/2000/svg','svg'); + var scalingWrapTag = document.createElement('div'); + + scalingSvgTag.setAttribute('viewBox', '0 0 500 200'); + scalingWrapTag.style.width = '1000px'; + + scalingSvgTag.id = 'scaling-stroke-test'; + + scalingSvgTag.innerHTML = '' + + ''; + + scalingWrapTag.appendChild(scalingSvgTag); + + document.body.appendChild(scalingWrapTag); + + myVivus = new Vivus(scalingSvgTag); + + expect(myVivus.map.length).toEqual(2); + expect(myVivus.map[0].length).toEqual(280); + expect(myVivus.map[1].length).toEqual(141); + }); + }); + + describe('[engine]', function () { + + // Mapping + describe('Mapping:', function () { + + it('should not trigger any error if the SVG is empty', function () { + expect(function () { + var svgTag = document.createElementNS('http://www.w3.org/2000/svg','svg'); + myVivus = new Vivus(svgTag, {}); + }).not.toThrow(); + }); + + it('should create a mapping of the SVG', function () { + myVivus = new Vivus(svgTag, {}); + expect(myVivus.map && myVivus.map.length).toEqual(6); + }); + + it('should map with correct values for start and duration', function () { + var i, typeIndex, types = ['delayed', 'sync', 'oneByOne', 'scenario', 'scenario-sync']; + for (typeIndex in types) { + myVivus = new Vivus(svgTag, {type: types[typeIndex], duration: 200}); + for (i in myVivus.map) { + expect(myVivus.map[i].startAt >= 0).toBe(true); + expect(myVivus.map[i].duration >= 0).toBe(true); + } + } + }); + + // Tests for 'getTotalLength' method in case of awkward results + describe('SVG parsing issue', function () { + + var getTotalLengthBkp = SVGPathElement.prototype.getTotalLength, + warnBkp = console.warn; + + beforeEach(function () { + SVGPathElement.prototype.getTotalLength = function () { + return NaN; + }; + }); + + afterEach(function () { + SVGPathElement.prototype.getTotalLength = getTotalLengthBkp; + console.warn = warnBkp; + }); + + it('should call console.warn if a path length is NaN', function () { + var warnSpy = jasmine.createSpy('spy'); + console.warn = warnSpy; + myVivus = new Vivus(svgTag); + expect(warnSpy.calls.count()).toEqual(6); + expect(myVivus.map.length).toEqual(0); + }); + + it('shouldn\'t call console.warn if not defined a path length is NaN', function () { + console.warn = null; + myVivus = new Vivus(svgTag); + expect(myVivus.map.length).toEqual(0); + }); + }); + }); + + describe('Visibility checking:', function () { + + it('should not accept a path which is not displayed', function () { + // Hide a path + svgTag.childNodes[1].style.display = 'none'; + myVivus = new Vivus(svgTag, {ignoreInvisible: true}); + expect(myVivus.map.length).toEqual(5); + }); + + it('should not accept a path which with an ignore tag', function () { + svgTag.childNodes[1].setAttribute('data-ignore', 'true'); + myVivus = new Vivus(svgTag); + expect(myVivus.map.length).toEqual(5); + }); + + it('should not accept a path which is not displayed', function () { + svgTag.childNodes[1].setAttribute('data-ignore', 'false'); + myVivus = new Vivus(svgTag); + expect(myVivus.map.length).toEqual(6); + }); + }); + + // Drawing + describe('Drawing:', function () { + + it('should call the callback once the animation is finished', function () { + var done = false; + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'autostart' + }, function () { + done = true; + }); + + triggerFrames(); + expect(done).toBe(true); + }); + + it('should call the callback once the reverse animation is finished', function () { + var done = false; + myVivus = new Vivus(svgTag, { + type: 'oneByOne', + duration: 6 + }, function () { + done = true; + }); + + myVivus.finish().play(-1); + triggerFrames(); + expect(done).toBe(true); + }); + + it('should call the method callback as the second param once the animation is finished', function () { + var done = false; + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual', + }); + + myVivus.play(1, function() { + done = true; + }); + triggerFrames(); + expect(done).toBe(true); + }); + + it('should call the method callback as the first param once the animation is finished', function () { + var done = false; + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual', + }); + + myVivus.play(function() { + done = true; + }); + triggerFrames(); + expect(done).toBe(true); + }); + + it('should call the method callback once the reverse animation is finished', function () { + var done = false; + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual', + }); + + myVivus.finish().play(-1, function() { + done = true; + }); + triggerFrames(); + expect(done).toBe(true); + }); + + it('should call the method callback provided in the last play call', function () { + var done = false; + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual', + }); + + myVivus.finish().play(-1, function () {}); + myVivus.play(function() { + done = true; + }); + triggerFrames(); + expect(done).toBe(true); + }); + + it('should call destroy method once the animation is finished', function () { + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual', + selfDestroy: true + }); + myVivus.destroy = jasmine.createSpy('spy'); + myVivus.play(); + triggerFrames(); + expect(myVivus.destroy.calls.count()).toEqual(1); + }); + + it('should\' call destroy method if selfDestroy option is not present', function () { + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual' + }); + myVivus.destroy = jasmine.createSpy('spy'); + myVivus.play(); + triggerFrames(); + expect(myVivus.destroy.calls.count()).toEqual(0); + }); + + it('should stop animation if destroy has been called', function () { + var callbackSpy = jasmine.createSpy('spy'); + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'autostart' + }, callbackSpy); + + triggerFrames(1); + myVivus.destroy(); + + triggerFrames(); + expect(callbackSpy.calls.count()).toEqual(0); + }); + + it('should stop the animation once it reaches currentFrame == 0', function () { + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual' + }); + myVivus.stop = jasmine.createSpy('spy'); + myVivus.play(-1); + triggerFrames(); + expect(myVivus.stop.calls.count()).toEqual(1); + }); + + it('should trace reasonably', function () { + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual' + }); + spyOn(myVivus, 'trace').and.callThrough(); + myVivus.play(0.5); + triggerFrames(); + expect(myVivus.trace.calls.count()).toEqual(12); + }); + + it('should start by the last path if reverseStack is enabled', function () { + myVivus = new Vivus(svgTag, { + type: 'oneByOne', + duration: 5, + reverseStack: true + }); + myVivus.setFrameProgress(0.5); + + var paths = svgTag.querySelectorAll('path'); + expect(+paths[0].style.strokeDashoffset).not.toEqual(0); + expect(+paths[paths.length -1].style.strokeDashoffset).toEqual(0); + }); + }); + + describe('Force Render:', function () { + + it('should use renderPath if forceRender option is set to true', function () { + myVivus = new Vivus(svgTag, { duration: 2, start: 'manual', forceRender: true }); + + var originalFirstPath = myVivus.map[0].el; + myVivus.renderPath(0); + expect(myVivus.map[0].el).not.toBe(originalFirstPath); + }); + + it('should not use renderPath if forceRender option is set to false', function () { + myVivus = new Vivus(svgTag, { duration: 2, start: 'manual', forceRender: false }); + + var originalFirstPath = myVivus.map[0].el; + myVivus.renderPath(0); + expect(myVivus.map[0].el).toBe(originalFirstPath); + }); + + it('renderPath should not throw an error if the index doesn\'t exists', function () { + myVivus = new Vivus(svgTag, { duration: 2, start: 'manual', forceRender: true }); + expect(function () { + myVivus.renderPath(42); + }).not.toThrow(); + }); + }); + + }); + + describe('[controls]', function () { + + beforeEach(function () { + myVivus = new Vivus(svgTag, { + type: 'oneByOne', + duration: 2, + start: 'manual' + }); + }); + + it('shouldn\'t play if the parameter in incorrect', function () { + expect(function () {myVivus.play('a');}).toThrow(new Error('Vivus [play]: invalid speed')); + expect(function () {myVivus.play({});}).toThrow(new Error('Vivus [play]: invalid speed')); + expect(function () {myVivus.play([]);}).toThrow(new Error('Vivus [play]: invalid speed')); + expect(function () {myVivus.play('1');}).toThrow(new Error('Vivus [play]: invalid speed')); + }); + + it('should return the correct status', function () { + expect(myVivus.getStatus()).toEqual('start'); + myVivus.setFrameProgress(0.5); + expect(myVivus.getStatus()).toEqual('progress'); + myVivus.finish(); + expect(myVivus.getStatus()).toEqual('end'); + myVivus.reset(); + expect(myVivus.getStatus()).toEqual('start'); + }); + + it('should play with the normal speed by default', function () { + myVivus.play(); + expect(myVivus.speed).toEqual(1); + }); + + it('shouldn\'t run another process of drawing if the animation is in progress', function () { + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual' + }); + spyOn(myVivus, 'trace').and.callThrough(); + + myVivus.play(0.5); + myVivus.play(0.5); + triggerFrames(); + expect(myVivus.trace.calls.count()).toEqual(12); + }); + + it('should stop the animation only when the animation is running', function () { + myVivus = new Vivus(svgTag, { + duration: 6, + start: 'manual' + }); + myVivus.play(); + expect(myVivus.handle).toBeTruthy(); + myVivus.stop(); + expect(myVivus.handle).toBeFalsy(); + myVivus.stop(); + expect(myVivus.handle).toBeFalsy(); + }); + + it('should remove all unecessary styling on every path element', function () { + var i, paths; + myVivus.destroy(); + + paths = svgTag.querySelectorAll('path'); + for (i = 0; i < paths.length; i++) { + expect(!!paths[i].style.strokeDashoffset).toEqual(false); + expect(!!paths[i].style.strokeDasharray).toEqual(false); + } + }); + + /** + * Where are the tests about `util` methods? + * Well.... + * to be honest, I've been struggling a bit for these kind of tests + * which seems difficult to test from Karma. + */ + }); + + +});