diff --git a/.gitignore b/.gitignore index 30cefc8..e9dce2a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,7 @@ node_modules dist typings .api +.vscode/* *.log /coverage +webpack.statistics.html \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 1d389fd..0475915 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,7 @@ sudo: required dist: trusty language: node_js node_js: - - "7" -before_install: - - sudo apt-get install -y chromium-browser - - export CHROME_BIN=chromium-browser - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start + - "10" install: - npm install script: diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e646a55..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "editor.tabSize": 4, - "editor.insertSpaces": true, - "files.eol": "\n", - "files.watcherExclude": { - "**/.git/objects/**": true, - "**/node_modules/**": true, - ".tmp": true - }, - "files.exclude": { - ".tmp": true - }, - "search.exclude": { - ".tmp": true, - "typings": true - }, - "json.schemas": [ - { - "fileMatch": [ - "/pbiviz.json" - ], - "url": "./.api/v1.4.0/schema.pbiviz.json" - }, - { - "fileMatch": [ - "/capabilities.json" - ], - "url": "./.api/v1.4.0/schema.capabilities.json" - }, - { - "fileMatch": [ - "/dependencies.json" - ], - "url": "./.api/v1.4.0/schema.dependencies.json" - } - ] -} diff --git a/changelog.md b/changelog.md index 09e6cf5..48f1d49 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,6 @@ +## 3.0.0 +* powerbi-visuals-tools@3.0.1 based visual + ## 2.1.2 * Additional minimal height calculation now is applied only if rotation option is enabled diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 7bf0e86..0000000 --- a/karma.conf.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -'use strict'; - -const recursivePathToTests = 'test/**/*.ts' - , srcRecursivePath = '.tmp/drop/visual.js' - , srcCssRecursivePath = '.tmp/drop/visual.css' - , srcOriginalRecursivePath = 'src/**/*.ts' - , coverageFolder = 'coverage'; - -module.exports = (config) => { - const browsers = []; - - if (process.env.TRAVIS) { - browsers.push('ChromeTravisCI'); - } else { - browsers.push('Chrome'); - } - - config.set({ - browsers, - customLaunchers: { - ChromeTravisCI: { - base: 'Chrome', - flags: ['--no-sandbox'] - } - }, - colors: true, - frameworks: ['jasmine'], - reporters: [ - 'progress', - 'coverage', - 'karma-remap-istanbul' - ], - singleRun: true, - files: [ - srcCssRecursivePath, - srcRecursivePath, - 'node_modules/jasmine-jquery/lib/jasmine-jquery.js', - 'node_modules/powerbi-visuals-utils-testutils/lib/index.js', - recursivePathToTests, - { - pattern: srcOriginalRecursivePath, - included: false, - served: true - } - ], - preprocessors: { - [recursivePathToTests]: ['typescript'], - [srcRecursivePath]: ['sourcemap', 'coverage'] - }, - typescriptPreprocessor: { - options: { - sourceMap: false, - target: 'ES5', - removeComments: false, - concatenateOutput: false - } - }, - coverageReporter: { - dir: coverageFolder, - reporters: [ - { type: 'html' }, - { type: 'lcov' } - ] - }, - remapIstanbulReporter: { - reports: { - lcovonly: coverageFolder + '/lcov.info', - html: coverageFolder, - 'text-summary': null - } - } - }); -}; diff --git a/karma.conf.ts b/karma.conf.ts new file mode 100644 index 0000000..b462b00 --- /dev/null +++ b/karma.conf.ts @@ -0,0 +1,128 @@ +/* + * Power BI Visualizations + * + * Copyright (c) Microsoft Corporation + * All rights reserved. + * MIT License + * + * 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. + */ + +"use strict"; + +const webpackConfig = require("./test.webpack.config.js"); +const tsconfig = require("./test.tsconfig.json"); +const path = require("path"); + +const testRecursivePath = "test/visualTest.ts"; +const srcOriginalRecursivePath = "src/**/*.ts"; +const srcRecursivePath = ".tmp/drop/**/*.js"; +const coverageFolder = "coverage"; +const globals = "./test/globals.ts"; + +process.env.CHROME_BIN = require("puppeteer").executablePath(); + +import { Config, ConfigOptions } from "karma"; + +module.exports = (config: Config) => { + config.set({ + browserNoActivityTimeout: 100000, + browsers: ["ChromeHeadless"], + colors: true, + frameworks: ["jasmine"], + reporters: [ + "progress", + "coverage", + "coverage-istanbul" + ], + singleRun: true, + plugins: [ + "karma-coverage", + "karma-typescript", + "karma-webpack", + "karma-jasmine", + "karma-sourcemap-loader", + "karma-chrome-launcher", + "karma-coverage-istanbul-reporter" + ], + files: [ + "node_modules/jquery/dist/jquery.min.js", + "node_modules/jasmine-jquery/lib/jasmine-jquery.js", + globals, + srcRecursivePath, + testRecursivePath, + { + pattern: srcOriginalRecursivePath, + included: false, + served: true + } + ], + preprocessors: { + [testRecursivePath]: ["webpack"], + [srcRecursivePath]: ["sourcemap"] + }, + typescriptPreprocessor: { + options: tsconfig.compilerOptions + }, + coverageIstanbulReporter: { + // reports can be any that are listed here: https://github.com/istanbuljs/istanbuljs/tree/aae256fb8b9a3d19414dcf069c592e88712c32c6/packages/istanbul-reports/lib + reports: { + lcovonly: coverageFolder + "lcov.info", + html: coverageFolder, + "text-summary": null + }, + + // base output directory. If you include %browser% in the path it will be replaced with the karma browser name + dir: path.join(__dirname, "coverage"), + + // Combines coverage information from multiple browsers into one report rather than outputting a report + // for each browser. + combineBrowserReports: true, + + // if using webpack and pre-loaders, work around webpack breaking the source path + fixWebpackSourcePaths: true, + + // Omit files with no statements, no functions and no branches from the report + skipFilesWithNoCoverage: true, + + // Most reporters accept additional config options. You can pass these through the `report-config` option + "report-config": { + // all options available at: https://github.com/istanbuljs/istanbuljs/blob/aae256fb8b9a3d19414dcf069c592e88712c32c6/packages/istanbul-reports/lib/html/index.js#L135-L137 + html: { + // outputs the report in ./coverage/html + subdir: "html" + } + } + }, + coverageReporter: { + dir: coverageFolder, + reporters: [ + { type: "html" }, + { type: "lcov" } + ] + }, + mime: { + "text/x-typescript": ["ts", "tsx"] + }, + webpack: webpackConfig, + webpackMiddleware: { + stats: "errors-only" + } + }); +}; diff --git a/package-lock.json b/package-lock.json index f7d5278..1d0850c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,69 +1,83 @@ { "name": "powerbi-visuals-mekkochart", - "version": "2.0.0", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.41.tgz", - "integrity": "sha512-omQT0n9EW38xfMCY7cCW/PAT55igUX9c9cMq6QN4EjxCcelcrocwMJ6H4JP4BGrQ+OHdJAQPM9/Eaa2Yce4Aug==", + "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-beta.41" + "@babel/highlight": "^7.0.0" } }, "@babel/generator": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.41.tgz", - "integrity": "sha512-j1hBM7K53RqAwPzPkS3GK9ggxJUBaUHevkpnt9iKBPHVlTrO3owMMlT8wH/GmOjr0HyBGFlL8cSlygx8RLdD7A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0.tgz", + "integrity": "sha512-/BM2vupkpbZXq22l1ALO7MqXJZH2k8bKVv8Y+pABFnzWdztDB/ZLveP5At21vLz5c2YtSE6p7j2FZEsqafMz5Q==", "dev": true, "requires": { - "@babel/types": "7.0.0-beta.41", - "jsesc": "2.5.1", - "lodash": "4.16.2", - "source-map": "0.5.6", - "trim-right": "1.0.1" + "@babel/types": "^7.0.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "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 + } } }, "@babel/helper-function-name": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.41.tgz", - "integrity": "sha512-oN/ljgS1InIpOp2bDkj8X5gIoiWnYBdhaAb2y/nPSMX4t0C6nIdbd0qYhG8uAKFm6mQBmm1cvNxPzcSB3F19aQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0.tgz", + "integrity": "sha512-Zo+LGvfYp4rMtz84BLF3bavFTdf8y4rJtMPTe2J+rxYmnDOIeH8le++VFI/pRJU+rQhjqiXxE4LMaIau28Tv1Q==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.41", - "@babel/template": "7.0.0-beta.41", - "@babel/types": "7.0.0-beta.41" + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.41.tgz", - "integrity": "sha512-B4Vwv02jCSjCws0jmBwR+c5y3MXs5dDyjEVZ8wlIeOaMvwXNxVrBGl+OaLuuPlxVNDrESNvpGFXxh+rlqf+w5Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { - "@babel/types": "7.0.0-beta.41" + "@babel/types": "^7.0.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.41.tgz", - "integrity": "sha512-eAyEJr4u3FWR5r0+gJWgE2Npu4d7BCXnXP+zw89n02x2DyewW0IHrED2HVlbhBAMWVt083VyGKjoVUMyH945wg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", + "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", "dev": true, "requires": { - "@babel/types": "7.0.0-beta.41" + "@babel/types": "^7.0.0" } }, "@babel/highlight": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.41.tgz", - "integrity": "sha512-5RURdqgHmXdg775Dr6GIFaVatHaPtaVgMF29jvWgkm8LP/B3MjZR/TOhkpbIBChqFzTn7uQKiBR3002pGjKY7Q==", + "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.3.2", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" }, "dependencies": { "ansi-styles": { @@ -72,4762 +86,4651 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "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" + "has-flag": "^3.0.0" } } } }, + "@babel/parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0.tgz", + "integrity": "sha512-RgJhNdRinpO8zibnoHbzTTexNs4c8ROkXFBanNDZTLHjwbdLk8J5cJSKulx/bycWTLYmKVNCkxRtVCoJnqPk+g==", + "dev": true + }, "@babel/template": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.41.tgz", - "integrity": "sha512-EiFgrLPJQ64+Im0+fg9fHcos0eooRG/iuTM6vlF4X9b+j/9Z/VCZejbvgqLYtuseT67GKQHEeEoXM07HK6in2Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0.tgz", + "integrity": "sha512-VLQZik/G5mjYJ6u19U3W2u7eM+rA/NGzH+GtHDFFkLTKLW66OasFrxZ/yK7hkyQcswrmvugFyZpDFRW0DjcjCw==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.41", - "@babel/types": "7.0.0-beta.41", - "babylon": "7.0.0-beta.41", - "lodash": "4.16.2" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/types": "^7.0.0" } }, "@babel/traverse": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.41.tgz", - "integrity": "sha512-EkWyDxYvaGaFjV+7xsGBeTsryqj5+oMo6noN/fhT5j5C4bpPuNwWnl47Ivvg10bk6v1NpfCoI6NHOWj3x+v9Ag==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.41", - "@babel/generator": "7.0.0-beta.41", - "@babel/helper-function-name": "7.0.0-beta.41", - "@babel/helper-split-export-declaration": "7.0.0-beta.41", - "@babel/types": "7.0.0-beta.41", - "babylon": "7.0.0-beta.41", - "debug": "3.1.0", - "globals": "11.3.0", - "invariant": "2.2.4", - "lodash": "4.16.2" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0.tgz", + "integrity": "sha512-ka/lwaonJZTlJyn97C4g5FYjPOx+Oxd3ab05hbDr1Mx9aP1FclJ+SUHyLx3Tx40sGmOVJApDxE6puJhd3ld2kw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/helper-function-name": "^7.0.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/types": "^7.0.0", + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "globals": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, "@babel/types": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.41.tgz", - "integrity": "sha512-q+Jf57E089a98CjAN5x0C5PAn7fqhVrEHTVAeVWHviyauASWgqff3F+t8migYEagnn5PcJ9lmtr5Mgmi3sV8PA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", + "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", "dev": true, "requires": { - "esutils": "2.0.2", - "lodash": "4.16.2", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" } }, - "@types/d3": { - "version": "3.5.36", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.36.tgz", - "integrity": "sha1-CUOrmCU0IfsHua38bcfd02xReLI=", + "@types/bluebird": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.24.tgz", + "integrity": "sha512-YeQoDpq4Lm8ppSBqAnAeF/xy1cYp/dMTif2JFcvmAbETMRlvKHT2iLcWu+WyYiJO3b3Ivokwo7EQca/xfLVJmg==", "dev": true }, - "@types/jasmine": { - "version": "2.5.37", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.37.tgz", - "integrity": "sha1-FfFgQLEQaUHsSu76PNnFU0Kg3Ls=", + "@types/d3": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-5.0.0.tgz", + "integrity": "sha512-BVfPw7ha+UgsG24v6ymerMY4+pJgQ/6p+hJA4loCeaaqV9snGS/G6ReVaQEn8Himn67dWn/Je9WhRbnDO7MzLw==", + "dev": true, + "requires": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-collection": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-voronoi": "*", + "@types/d3-zoom": "*" + } + }, + "@types/d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-YBaAfimGdWE4nDuoGVKsH89/dkz2hWZ0i8qC+xxqmqi+XJ/aXiRF0jPtzXmN7VdkpVjy1xuDmM5/m1FNuB6VWA==", "dev": true }, - "@types/jasmine-jquery": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/@types/jasmine-jquery/-/jasmine-jquery-1.5.28.tgz", - "integrity": "sha1-V7CkTFk0bmtDVdjEIhyW0uBV504=", + "@types/d3-axis": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.10.tgz", + "integrity": "sha512-5YF0wfdQMPKw01VAAupLIlg/T4pn5M3/vL9u0KZjiemnVnnKBEWE24na4X1iW+TfZiYJ8j+BgK2KFYnAAT54Ug==", "dev": true, "requires": { - "@types/jasmine": "2.5.37", - "@types/jquery": "2.0.41" + "@types/d3-selection": "*" } }, - "@types/jquery": { - "version": "2.0.41", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.41.tgz", - "integrity": "sha1-uHugUQEfme2+WG2Plygud4bgGm0=", - "dev": true - }, - "@types/lodash": { - "version": "4.14.50", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.50.tgz", - "integrity": "sha1-IifaTWX6/iSbzNWce5OW4nZ0yPc=", - "dev": true - }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "@types/d3-brush": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.0.8.tgz", + "integrity": "sha512-9Thv09jvolu9T1BE3fHmIeYSgbwSpdxtF6/A5HZEDjSTfgtA0mtaXRk5AiWOo0KjuLsI+/7ggD3ZGN5Ye8KXPQ==", "dev": true, "requires": { - "jsonparse": "0.0.5", - "through": "2.3.8" + "@types/d3-selection": "*" } }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "@types/d3-chord": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.7.tgz", + "integrity": "sha512-WbCN7SxhZMpQQw46oSjAovAmvl3IdjhLuQ4r7AXCzNKyxtXXBWuihSPZ4bVwFQF3+S2z37i9d4hfUBatcSJpog==", "dev": true }, - "accepts": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", - "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=", - "dev": true, - "requires": { - "mime-types": "2.0.14", - "negotiator": "0.4.9" - }, - "dependencies": { - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", - "dev": true - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "dev": true, - "requires": { - "mime-db": "1.12.0" - } - } - } + "@types/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-vR3BT0GwHc5y93Jv6bxn3zoxP/vGu+GdXu/r1ApjbP9dLk9I2g6NiV7iP/QMQSuFZd0It0n/qWrfXHxCWwHIkg==", + "dev": true }, - "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "@types/d3-color": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.1.tgz", + "integrity": "sha512-xwb1tqvYNWllbHuhMFhiXk63Imf+QNq/dJdmbXmr2wQVnwGenCuj3/0IWJ9hdIFQIqzvhT7T37cvx93jtAsDbQ==", "dev": true }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "@types/d3-contour": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-1.2.1.tgz", + "integrity": "sha512-p8iC4KeVFyT3qRTGQRj0Jf5QDdPsDUevBEnma7gEsY1yDolVSLanG2eFAiLV+xj8/5DK7oU7Ey8z0drs3pbsug==", "dev": true, "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } + "@types/d3-array": "*", + "@types/geojson": "*" } }, - "after": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", - "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", + "@types/d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-xyWJQMr832vqhu6fD/YqX+MSFBWnkxasNhcStvlhqygXxj0cKqPft0wuGoH5TIq5ADXgP83qeNVa4R7bEYN3uA==", "dev": true }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "@types/d3-drag": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.1.tgz", + "integrity": "sha512-J9liJ4NNeV0oN40MzPiqwWjqNi3YHCRtHNfNMZ1d3uL9yh1+vDuo346LBEr8yyBm30WHvrHssAkExVZrGCswtA==", "dev": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "@types/d3-selection": "*" } }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "@types/d3-dsv": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.33.tgz", + "integrity": "sha512-jx5YvaVC3Wfh6LobaiWTeU1NkvL2wPmmpmajk618bD+xVz98yNWzmZMvmlPHGK0HXbMeHmW/6oVX48V9AH1bRQ==", "dev": true }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "@types/d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha1-k6MBhovp4VBh89RDQ7GrP4rLbwk=", "dev": true }, - "ansi-align": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", - "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", + "@types/d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-w6ANZv/mUh+6IV3drT22zgPWMRobzuGXhzOZC8JPD+ygce0/Vx6vTci3m3dizkocnQQCOwNbrWWWPYqpWiKzRQ==", "dev": true, "requires": { - "string-width": "1.0.2" + "@types/d3-dsv": "*" } }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "@types/d3-force": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.1.1.tgz", + "integrity": "sha512-ePkELuaFWY4yOuf+Bvx5Xd+ihFiYG4bdnW0BlvigovIm8Sob2t76e9RGO6lybQbv6AlW9Icn9HuZ9fmdzEoJyg==", "dev": true }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "@types/d3-format": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.0.tgz", + "integrity": "sha512-ZiY4j3iJvAdOwzwW24WjlZbUNvqOsnPAMfPBmdXqxj3uKJbrzBlRrdGl5uC89pZpFs9Dc92E81KcwG2uEgkIZA==", "dev": true }, - "anymatch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "@types/d3-geo": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.10.3.tgz", + "integrity": "sha512-hfdaxM2L0wA9mDZrrSf2o+DyhEpnJYCiAN+lHFtpfZOVCQrYBA5g33sGRpUbAvjSMyO5jkHbftMWPEhuCMChSg==", "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11" + "@types/geojson": "*" } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "@types/d3-hierarchy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.4.tgz", + "integrity": "sha512-+d2VLfLPgW66VB7k56T8tC4LobfS6Rrhm+1pmYPMmlCpO5rccJLuwux7YXl/eGVst3Bhb5PJTN5/oaJERpNw8g==", "dev": true }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "@types/d3-interpolate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.2.0.tgz", + "integrity": "sha512-qM9KlUrqbwIhBRtw9OtAEbkis1AxsOJEun2uxaX/vEsBp3vyNBmhPz9boXXEqic9ZRi7fCpUNRwyZvxa0PioIw==", "dev": true, "requires": { - "arr-flatten": "1.0.3" + "@types/d3-color": "*" } }, - "arr-flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", - "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-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "@types/d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-U8dFRG+8WhkLJr2sxZ9Cw/5WeRgBnNqMxGdA1+Z0+ZG6tK0s75OQ4OXnxeyfKuh6E4wQPY8OAKr1+iNDx01BEQ==", "dev": true }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "@types/d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-E6Kyodn9JThgLq20nxSbEce9ow5/ePgm9PX2EO6W1INIL4DayM7cFaiG10DStuamjYAd0X4rntW2q+GRjiIktw==", "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=", + "@types/d3-quadtree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.6.tgz", + "integrity": "sha512-sphVuDdiSIaxLt9kQgebJW98pTktQ/xuN7Ysd8X68Rnjeg/q8+c36/ShlqU52qoKg9nob/JEHH1uQMdxURZidQ==", "dev": true }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "@types/d3-random": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.1.tgz", + "integrity": "sha512-jUPeBq1XKK9/5XasTvy5QAUwFeMsjma2yt/nP02yC2Tijovx7i/W5776U/HZugxc5SSmtpx4Z3g9KFVon0QrjQ==", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "@types/d3-scale": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.0.1.tgz", + "integrity": "sha512-D5ZWv8ToLvqacE7XkdMNHMiiVDULdDxT7FMMGU0YJC3/nVzBmApjyTyxracUWOQyY3KK7YhZ05on8pOcNi0dfQ==", "dev": true, "requires": { - "array-uniq": "1.0.3" + "@types/d3-time": "*" } }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "@types/d3-scale-chromatic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-1.2.0.tgz", + "integrity": "sha512-bhS2SVzUzRtrxp1REhGCfHmj8pyDv9oDmsonYiPvBl8KCxPJTxnfXBF39PzAJrYnRKM41TR0kQzsJvL+NmcDtg==", "dev": true }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "@types/d3-selection": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.3.2.tgz", + "integrity": "sha512-K23sDOi7yMussv7aiqk097IWWbjFYbJpcDppQAcaf6DfmHxAsjr+6N4HJGokETLDuV7y/qJeeIJINPnkWJM5Hg==", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true + "@types/d3-shape": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.2.4.tgz", + "integrity": "sha512-X4Xq2mpChPIMDMAXwLfxHKLbqv+sowkJ94bENeSMqqhQJ5v4oXuoyLo0vnIkydVbuQ52ZwPplk219K0m2HJODg==", + "dev": true, + "requires": { + "@types/d3-path": "*" + } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "@types/d3-time": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.8.tgz", + "integrity": "sha512-/UCphyyw97YAq4zKsuXH33R3UNB4jDSza0fLvMubWr/ONh9IePi1NbgFP222blhiCe724ebJs8U87+aDuAq/jA==", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "@types/d3-time-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz", + "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==", "dev": true }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "@types/d3-timer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.7.tgz", + "integrity": "sha512-830pT+aYZrgbA91AuynP3KldfB1A1s60d0gKiV+L7JcSKSJapUzUffAm8VZod7RQOxF5SzoItV6cvrTzjbmrJQ==", "dev": true }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true + "@types/d3-transition": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.2.tgz", + "integrity": "sha512-sTENKlKkUaKUYjeYIj69VYIi3VKeBinY/pYdy5VkjNmEOIasUtZIyAY04waMU4Rq7u+czKQdcP7Aoaf5wpDGfA==", + "dev": true, + "requires": { + "@types/d3-selection": "*" + } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "@types/d3-voronoi": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.8.tgz", + "integrity": "sha512-zqNhW7QsYQGlfOdrwPNPG3Wk64zUa4epKRurkJ/dVc6oeXrB+iTDt8sRZ0KZKOOXvvfa1dcdB0e45TZeLBiodQ==", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "@types/d3-zoom": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.1.tgz", + "integrity": "sha512-Ofjwz6Pt53tRef9TAwwayN+JThNVYC/vFOepa/H4KtwjhsqkmEseHvc2jpJM7vye5PQ5XHtTSOpdY4Y/6xZWEg==", + "dev": true, + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "@types/geojson": { + "version": "7946.0.4", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.4.tgz", + "integrity": "sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "@types/jasmine": { + "version": "2.5.37", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.37.tgz", + "integrity": "sha1-FfFgQLEQaUHsSu76PNnFU0Kg3Ls=", "dev": true }, - "atob": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", - "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "@types/jasmine-jquery": { + "version": "1.5.28", + "resolved": "https://registry.npmjs.org/@types/jasmine-jquery/-/jasmine-jquery-1.5.28.tgz", + "integrity": "sha1-V7CkTFk0bmtDVdjEIhyW0uBV504=", + "dev": true, + "requires": { + "@types/jasmine": "*", + "@types/jquery": "*" + } + }, + "@types/jquery": { + "version": "2.0.41", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.41.tgz", + "integrity": "sha1-uHugUQEfme2+WG2Plygud4bgGm0=", "dev": true }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "@types/karma": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@types/karma/-/karma-1.7.3.tgz", + "integrity": "sha512-26J5wva11NjLWWitm4JMRc51NtTnSf912tPonmujsPcISitGXz1KcfwQk6SRcyM1ikb09zq3aGwVcj7HYkmW6A==", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000815", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "@types/bluebird": "*", + "@types/node": "*" } }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "@types/lodash": { + "version": "4.14.109", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.109.tgz", + "integrity": "sha512-hop8SdPUEzbcJm6aTsmuwjIYQo1tqLseKCM+s2bBqTU2gErwI4fE+aqUVOlscPSQbKHKgtMMPoC+h4AIGOJYvw==", "dev": true }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "@types/node": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.4.tgz", + "integrity": "sha512-fCHV45gS+m3hH17zgkgADUSi2RR1Vht6wOZ0jyHP8rjiQra9f+mIcgwPQHllmDocYOstIEbKlxbFDYlgrTPYqw==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@types/tapable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.3.tgz", + "integrity": "sha512-MAT0BW2ruO0LhQKjvlipLGCF/Yx0y/cj+tT67tK3QIQDrM2+9R78HgJ54VlrE8AbfjYJJBCQCEPM5ZblPVTuww==", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "source-map": "^0.6.1" } }, - "babel-eslint": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.2.tgz", - "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", + "@types/webpack": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.4.tgz", + "integrity": "sha512-J5dFdbyS4mm7kbxq+y0BtkdSVofTLUdrmrImchEDQFcoU689zaYnmDefwFxGPt1+iAimBwTgWU3KOxPBrT0nYg==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.41", - "@babel/traverse": "7.0.0-beta.41", - "@babel/types": "7.0.0-beta.41", - "babylon": "7.0.0-beta.41", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0" + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "source-map": "^0.6.0" } }, - "babylon": { - "version": "7.0.0-beta.41", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.41.tgz", - "integrity": "sha512-AfQfqR9hbNSpY/9yyGaUAiT1tmyHzaJbHJpqkfn8DGAUkPTG5VwPoulajQu3FUQXTr8NGm4MFaupVzmWkvln4Q==", - "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==", + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "^3.1.0", + "mamacro": "^0.0.3" }, "dependencies": { - "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 - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "ms": "^2.1.1" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 } } }, - "base64-arraybuffer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", - "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=", + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", "dev": true }, - "base64id": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", - "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", "dev": true, - "optional": true, "requires": { - "tweetnacl": "0.14.5" + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } }, - "benchmark": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", - "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", "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=", + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", "dev": true, "requires": { - "callsite": "1.0.0" + "debug": "^3.1.0", + "mamacro": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", "dev": true, "requires": { - "buffers": "0.1.1", - "chainsaw": "0.1.0" + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, - "binary-extensions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", - "dev": true + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", "dev": true, "requires": { - "readable-stream": "2.0.6" + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } } }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", "dev": true }, - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", - "dev": true - }, - "body-parser": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", - "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "content-type": "1.0.2", - "debug": "2.6.7", - "depd": "1.1.0", - "http-errors": "1.6.1", - "iconv-lite": "0.4.15", - "on-finished": "2.3.0", - "qs": "6.4.0", - "raw-body": "2.2.0", - "type-is": "1.6.15" + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "^3.1.0" }, "dependencies": { - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", "dev": true, "requires": { - "hoek": "2.16.3" + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" } }, - "boxen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", - "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", "dev": true, "requires": { - "ansi-align": "1.1.0", - "camelcase": "2.1.1", - "chalk": "1.1.3", - "cli-boxes": "1.0.0", - "filled-array": "1.1.0", - "object-assign": "4.1.1", - "repeating": "2.0.1", - "string-width": "1.0.2", - "widest-line": "1.0.0" + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", "dev": true, "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "^3.2.0", + "mamacro": "^0.0.3" } }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", "dev": true, "requires": { - "caniuse-db": "1.0.30000815", - "electron-to-chromium": "1.3.37" + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "^3.2.0" } }, - "buffer-indexof-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", - "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=", - "dev": true - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, - "bufferstreams": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.1.3.tgz", - "integrity": "sha512-HaJnVuslRF4g2kSDeyl++AaVizoitCpL9PglzCYwy0uHHyvWerfvEb8jWmYbF1z4kiVFolGomnxSGl+GUQp2jg==", + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "readable-stream": "2.0.6" + "mime-types": "~2.1.18", + "negotiator": "0.6.1" } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", "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==", + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "dev": true, "requires": { - "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" + "acorn": "^5.0.0" }, "dependencies": { - "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 - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true } } }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { - "callsites": "0.2.0" + "es6-promisify": "^5.0.0" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "ajax-request": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ajax-request/-/ajax-request-1.2.3.tgz", + "integrity": "sha1-mfy+wdbSeS+F+pSVNTMr0U9fN5A=", + "dev": true, + "requires": { + "file-system": "^2.1.1", + "utils-extend": "^1.0.7" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", "dev": true }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "ansi-wrap": "0.1.0" } }, - "caniuse-db": { - "version": "1.0.30000815", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000815.tgz", - "integrity": "sha1-DiGPoTPQ0HHIhqoEG0NSWMx0aJE=", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "traverse": "0.3.9" + "default-require-extensions": "^2.0.0" } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "sprintf-js": "~1.0.2" } }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "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-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "anymatch": "1.3.0", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", "dev": true }, - "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==", + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "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.6" - } - }, - "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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, - "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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, - "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.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "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 - } + "array-uniq": "^1.0.1" } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "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 + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "safer-buffer": "~2.1.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 + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" + "util": "0.10.3" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } } } }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "dev": true }, - "clone-regexp": { + "assign-symbols": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.0.tgz", - "integrity": "sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw=", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "is-regexp": "1.0.0", - "is-supported-regexp-flag": "1.0.0" + "lodash": "^4.17.10" } }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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 }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "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.1" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-diff": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/color-diff/-/color-diff-0.1.7.tgz", - "integrity": "sha1-bbeM2UgqjkWdQIIer0tQMoPcuOI=", + "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 }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "dev": true }, - "colorguard": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorguard/-/colorguard-1.2.1.tgz", - "integrity": "sha512-qYVKTg626qpDg4/eBnPXidEPXn5+krbYqHVfyyEFBWV5z3IF4p44HKY/eE2t1ohlcrlIkDgHmFJMfQ8qMLnSFw==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "color-diff": "0.1.7", - "log-symbols": "1.0.2", - "object-assign": "4.1.1", - "pipetteur": "2.0.3", - "plur": "2.1.2", - "postcss": "5.2.18", - "postcss-reporter": "1.4.1", - "text-table": "0.2.0", - "yargs": "1.3.3" - }, - "dependencies": { - "yargs": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.3.3.tgz", - "integrity": "sha1-BU3oth8i7v23IHBZ6u+da4P7kxo=", - "dev": true - } - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "4.16.2" - } - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "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.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "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=", + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "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=", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "typedarray": "0.0.6" + "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": { - "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 + "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" + } }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "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": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "kind-of": "^6.0.0" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "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" + } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, - "configstore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", - "dev": true, - "requires": { - "dot-prop": "3.0.0", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "os-tmpdir": "1.0.2", - "osenv": "0.1.4", - "uuid": "2.0.3", - "write-file-atomic": "1.3.4", - "xdg-basedir": "2.0.0" - } + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true }, - "connect": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz", - "integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=", + "base64-img": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/base64-img/-/base64-img-1.0.4.tgz", + "integrity": "sha1-PiLVXWx0okVT2EDSsbwSp9sHjTU=", "dev": true, "requires": { - "debug": "2.6.7", - "finalhandler": "1.0.3", - "parseurl": "1.3.1", - "utils-merge": "1.0.0" + "ajax-request": "^1.2.0", + "file-system": "^2.1.0" } }, - "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, - "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "core-util-is": { + "bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-1.1.0.tgz", - "integrity": "sha1-DeoPmATv37kp+7GxiOJVU+oFPTc=", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, + "optional": true, "requires": { - "graceful-fs": "4.1.11", - "js-yaml": "3.6.1", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "require-from-string": "1.2.1" + "tweetnacl": "^0.14.3" } }, - "coveralls": { - "version": "2.11.15", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.11.15.tgz", - "integrity": "sha1-N9NHQ2nWbBTzP6c6nSXO5uCZ/KA=", + "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": { - "js-yaml": "3.6.1", - "lcov-parse": "0.0.10", - "log-driver": "1.2.5", - "minimist": "1.2.0", - "request": "2.75.0" + "callsite": "1.0.0" } }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", "dev": true, "requires": { - "capture-stack-trace": "1.0.0" + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", "dev": true, "requires": { - "boom": "2.10.1" + "readable-stream": "~2.0.5" } }, - "css-color-names": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.3.tgz", - "integrity": "sha1-3gzvFvTYqoIioyDVttfpu62nufY=", + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", "dev": true }, - "css-rule-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", - "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=", + "bluebird": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "css-tokenize": "1.0.1", - "duplexer2": "0.0.2", - "ldjson-stream": "1.2.1", - "through2": "0.6.5" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + } + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "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": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "has-flag": "^3.0.0" } } } }, - "css-tokenize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", - "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=", + "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": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" + "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" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "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": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "is-extendable": "^0.1.0" } } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { - "array-find-index": "1.0.2" + "resolve": "1.1.7" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "browserify-aes": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "es5-ext": "0.10.40" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "d3": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.5.tgz", - "integrity": "sha1-vhq6aoT7ZlMoOz6+u39XDjvaGH4=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "browserify-rsa": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "ms": "2.0.0" + "bn.js": "^4.1.0", + "randombytes": "^2.0.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-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "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 - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "clone": "1.0.2" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "pako": "~1.0.5" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "del": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.0.tgz", - "integrity": "sha1-mlDwS/NzJeKDtPROmFM2wlJFa9U=", + "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": { - "globby": "4.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "delayed-stream": { + "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/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, - "depd": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", - "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=", + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { - "esutils": "2.0.2" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" } }, - "doiuse": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-2.6.0.tgz", - "integrity": "sha1-GJLRC2Gpo1at2/K2FJM+gfi7ODQ=", + "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": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000815", - "css-rule-stream": "1.1.0", - "duplexer2": "0.0.2", - "jsonfilter": "1.1.2", - "ldjson-stream": "1.2.1", - "lodash": "4.16.2", - "multimatch": "2.1.0", - "postcss": "5.2.18", - "source-map": "0.4.4", - "through2": "0.6.5", - "yargs": "3.10.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } + "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" } }, - "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.1", - "ent": "2.2.0", - "extend": "3.0.1", - "void-elements": "2.0.1" - } + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "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": { - "is-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true, "requires": { - "jsbn": "0.1.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^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 - }, - "electron-to-chromium": { - "version": "1.3.37", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.37.tgz", - "integrity": "sha1-SpJzTgBEyM8LFVO+V+riGkxuX6s=", - "dev": true - }, - "email-existence": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/email-existence/-/email-existence-0.1.5.tgz", - "integrity": "sha1-AwPbLoWEzAzV6MRukfR/w4QvUFs=", + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", "dev": true }, - "encodeurl": { + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chownr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", "dev": true, "requires": { - "once": "1.3.3" - }, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - } + "tslib": "^1.9.0" } }, - "engine.io": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.6.10.tgz", - "integrity": "sha1-+H2E4b0h0aLsf43u8MYgVKzfsno=", + "ci-info": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.5.1.tgz", + "integrity": "sha512-fKFIKXaYiL1exImwJ0AhR/6jxFPSKQBk2ayV5NiNoruUs2+rxC2kNw0EG+1Z9dugZRdCrppskQ8DN2cyaUM1Hw==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "accepts": "1.1.4", - "base64id": "0.1.0", - "debug": "2.2.0", - "engine.io-parser": "1.2.4", - "ws": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "engine.io-client": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.6.9.tgz", - "integrity": "sha1-HWrUgEilCDyVCWlDsp0279shJAE=", + "circular-json": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.5.tgz", + "integrity": "sha512-13YaR6kiz0kBNmIVM87Io8Hp7bWOo4r61vkEANy8iH9R9bc6avud/1FT0SBpqR1RpIQADOh/Q+yHZDA1iL6ysA==", + "dev": true + }, + "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": { - "component-emitter": "1.1.2", - "component-inherit": "0.0.3", - "debug": "2.2.0", - "engine.io-parser": "1.2.4", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.1", - "parseqs": "0.0.2", - "parseuri": "0.0.4", - "ws": "1.0.1", - "xmlhttprequest-ssl": "1.5.1", - "yeast": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "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": { - "ms": "0.7.1" + "is-descriptor": "^0.1.0" } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true } } }, - "engine.io-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz", - "integrity": "sha1-4Il7C/FOeS1M0qWVBVORnFaUjEI=", + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.4", - "has-binary": "0.1.6", - "utf8": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "has-binary": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", - "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "isarray": "0.0.1" + "ansi-regex": "^3.0.0" } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true } } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "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, - "optional": true, "requires": { - "prr": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "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": { - "is-arrayish": "0.2.1" + "color-name": "1.1.3" } }, - "es5-ext": { - "version": "0.10.40", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.40.tgz", - "integrity": "sha512-S9Fh3oya5OOvYSNGvPZJ+vyrs6VYpe1IXPowVe3N1OhaiwVaGlwfn3Zf5P5klYcWOA0toIwYQW8XEv/QqhdHvQ==", + "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.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "lodash": "^4.5.0" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-symbol": "3.1.1" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", + "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 + } } }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "delayed-stream": "~1.0.0" } }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "commander": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", + "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", "dev": true }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "compare-versions": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz", + "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", + "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 + }, + "compressible": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40" + "mime-db": ">= 1.36.0 < 2" } }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" } }, - "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=", + "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 }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "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 + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, - "optional": true, "requires": { - "amdefine": "1.0.1" + "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" } - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } - } - }, - "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.1", - "debug": "2.6.7", - "doctrine": "2.1.0", - "escope": "3.6.0", - "espree": "3.5.4", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.6.1", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.16.2", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "eslint-plugin-no-unsafe-innerhtml": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsafe-innerhtml/-/eslint-plugin-no-unsafe-innerhtml-1.0.16.tgz", - "integrity": "sha1-fQKHjI6b95FriINtWsEitC8VGTI=", + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "eslint": "3.19.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "eslint-plugin-scanjs-rules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-scanjs-rules/-/eslint-plugin-scanjs-rules-0.1.5.tgz", - "integrity": "sha1-IFU4G2Rs7Jid1bhyIDuuMyGFghk=", + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", "dev": true, "requires": { - "babel-eslint": "8.2.2", - "eslint": "3.19.0" + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" } }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } + "date-now": "^0.1.4" } }, - "eslint-visitor-keys": { + "constants-browserify": { "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==", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "5.5.3", - "acorn-jsx": "3.0.1" - } + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "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 }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "estraverse": "4.2.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } + "safe-buffer": "~5.1.1" } }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "estraverse": "4.2.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - } + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "estraverse-fb": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/estraverse-fb/-/estraverse-fb-1.3.2.tgz", - "integrity": "sha1-0yOky15awzHOoDNBOpJT4WQ+B8Q=", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", "dev": true }, - "etag": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", - "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=", + "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 }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "coveralls": { + "version": "2.11.15", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.11.15.tgz", + "integrity": "sha1-N9NHQ2nWbBTzP6c6nSXO5uCZ/KA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40" + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.75.0" } }, - "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", - "dev": true - }, - "execall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", - "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "clone-regexp": "1.0.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true + "create-hash": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "create-hmac": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" - }, - "dependencies": { - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true, - "requires": { - "expand-range": "0.1.1" - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, "requires": { - "fill-range": "2.2.3" + "boom": "2.x.x" } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "css-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", + "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "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" - } - } + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" } }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", "dev": true }, - "fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "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": { - "chalk": "1.1.3", - "time-stamp": "1.1.0" + "array-find-index": "^1.0.1" } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "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=", + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "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=", + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "es5-ext": "^0.10.9" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "d3": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.5.0.tgz", + "integrity": "sha512-HRDSYvT3n7kMvJH7Avp7iR0Xsz97bkCFka9aOg04EdyXyiAP8yQzUpLH3712y9R7ffVo1g94t1OYFHBB0yI9vQ==", + "dev": true, + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", "dev": true }, - "fileset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz", - "integrity": "sha1-WI74lzxmI7KnbfRlEFaWuWqsgGc=", + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==", + "dev": true + }, + "d3-brush": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.6.tgz", + "integrity": "sha512-lGSiF5SoSqO5/mYGD5FAeGKKS62JdA1EV7HPrU2b5rTX4qEJJtpjaGLJngjnkewQy7UnGstnFd3168wpf5z76w==", "dev": true, "requires": { - "glob": "5.0.15", - "minimatch": "2.0.10" - }, - "dependencies": { - "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.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - } + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" } }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "d3-array": "1", + "d3-path": "1" } }, - "filled-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", - "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=", + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", "dev": true }, - "finalhandler": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", - "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", + "d3-color": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.3.tgz", + "integrity": "sha512-x37qq3ChOTLd26hnps36lexMRhNXEtVxZ4B25rL0DVdDsGQIJGB18S7y9XDwlDD6MD/ZBzITCf4JjGMM10TZkw==", + "dev": true + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", "dev": true, "requires": { - "debug": "2.6.7", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.1", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "d3-array": "^1.1.1" } }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "d3-dispatch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", + "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==", "dev": true }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-8S3HWCAg+ilzjJsNtWW1Mutl74Nmzhb9yU6igspilaJzeZVFktmY6oO9xOh5TDk+BM2KrNFjttZNoJJmDnkjkg==", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "d3-dispatch": "1", + "d3-selection": "1" } }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "d3-dsv": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.10.tgz", + "integrity": "sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g==", "dev": true, "requires": { - "detect-file": "1.0.0", - "is-glob": "3.1.0", - "micromatch": "3.1.9", - "resolve-dir": "1.0.1" - }, - "dependencies": { - "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 - }, - "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 - }, - "braces": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "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.2" - } - }, - "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.1" - } - } - } - }, - "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.6.7", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "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.6" - } - }, - "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.1" - } - }, - "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.1.0" - } - }, - "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 - } - } - }, - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "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.2" - } - }, - "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.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.1" - }, - "dependencies": { - "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.1" - } - } - } - }, - "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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, - "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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, - "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-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.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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", - "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" } }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "d3-ease": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", + "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==", + "dev": true + }, + "d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "is-plain-object": "2.0.4", - "object.defaults": "1.1.0", - "object.pick": "1.3.0", - "parse-filepath": "1.0.2" + "d3-dsv": "1" } }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true + "d3-force": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", + "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", + "dev": true, + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } }, - "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==", "dev": true }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "d3-geo": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.1.tgz", + "integrity": "sha512-GsG7x9G9sykseLviOVSJ3h5yjw0ItLopOtuDQKUt1TRklEegCw5WAmnIpYYiCkSH/QgUMleAeE2xZK38Qb+1+Q==", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.0", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "d3-array": "1" } }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==", "dev": true }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "d3-interpolate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", + "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", "dev": true, "requires": { - "for-in": "1.0.2" + "d3-color": "1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "d3-polygon": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.5.tgz", + "integrity": "sha512-RHhh1ZUJZfhgoqzWWuRhzQJvO7LavchhitSTHGu9oj6uuLFzYZVeBzaWTQ2qSO6bz2w55RMoOCf0MsLCDB6e0w==", "dev": true }, - "form-data": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", - "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "d3-quadtree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.5.tgz", + "integrity": "sha512-U2tjwDFbZ75JRAg8A+cqMvqPg1G3BE7UTJn3h8DHjY/pnsAfWdbJKgyfcy7zKjqGtLAmI0q8aDSeG1TVIKRaHQ==", + "dev": true + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==", + "dev": true + }, + "d3-scale": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.1.2.tgz", + "integrity": "sha512-bESpd64ylaKzCDzvULcmHKZTlzA/6DGSVwx7QSDj/EnX9cpSevsdiwdHFYI9ouo9tNBbV3v5xztHS2uFeOzh8Q==", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "d3-scale-chromatic": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.3.3.tgz", + "integrity": "sha512-BWTipif1CimXcYfT02LKjAyItX5gKiwxuPRgr4xM58JwlLocWbjPLI7aMEjkcoOQXMkYsmNsvv3d2yl/OKuHHw==", "dev": true, "requires": { - "map-cache": "0.2.2" + "d3-color": "1", + "d3-interpolate": "1" } }, - "fresh": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", + "d3-selection": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.2.tgz", + "integrity": "sha512-OoXdv1nZ7h2aKMVg3kaUFbLLK5jXUFAMLD/Tu5JA96mjf8f2a9ZUESGY+C36t8R1WFeWk/e55hy54Ml2I62CRQ==", "dev": true }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "d3-shape": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.2.tgz", + "integrity": "sha512-hUGEozlKecFZ2bOSNt7ENex+4Tk9uc/m0TtTEHBvitCBxUNjhzm5hS2GrrVRD/ae4IylSmxGeqX5tWC2rASMlQ==", "dev": true, "requires": { - "null-check": "1.0.0" + "d3-path": "1" } }, - "fs-extra": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.28.0.tgz", - "integrity": "sha1-mhwHCOqMUWkperBv2MuRT1ZHsnI=", + "d3-time": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.10.tgz", + "integrity": "sha512-hF+NTLCaJHF/JqHN5hE8HVGAXPStEq6/omumPE/SxyHVrR7/qQxusFDo0t0c/44+sCGHthC7yNGFZIEgju0P8g==", + "dev": true + }, + "d3-time-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", + "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.1" + "d3-time": "1" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==", "dev": true }, - "fsevents": { + "d3-transition": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.3.tgz", + "integrity": "sha512-tEvo3qOXL6pZ1EzcXxFcPNxC/Ygivu5NoBY6mbzidATAeML86da+JfVIUzon3dNM6UX6zjDx+xbYDmMVtTSjuA==", + "dev": true, + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==", + "dev": true + }, + "d3-zoom": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.3.tgz", + "integrity": "sha512-xEBSwFx5Z9T3/VrwDkMt+mr0HCzv7XjpGURJ8lWmIC8wxe32L39eWHIasEe/e7Ox8MPU4p1hvH8PKN2olLzIBg==", + "dev": true, + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, - "optional": true, "requires": { - "nan": "2.9.2", - "node-pre-gyp": "0.6.39" + "assert-plus": "^1.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, + } + } + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "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 + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "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" + }, + "dependencies": { + "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, - "optional": true, "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "kind-of": "^6.0.0" } }, - "debug": { - "version": "2.6.8", - "bundled": true, + "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, - "optional": true, "requires": { - "ms": "2.0.0" + "kind-of": "^6.0.0" } }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { + "is-descriptor": { "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, - "optional": true, "requires": { - "jsbn": "0.1.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "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 - }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + } + }, + "del-cli": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-1.1.0.tgz", + "integrity": "sha1-J1V9aaC335ncuqHjSgnmrGWR0sQ=", + "dev": true, + "requires": { + "del": "^3.0.0", + "meow": "^3.6.0", + "update-notifier": "^2.1.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "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" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.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 + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", + "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", + "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, - "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "ms": "2.0.0" } - }, - "npmlog": { - "version": "4.1.0", - "bundled": 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, - "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "ms": "2.0.0" } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", + "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "dev": true, + "requires": { + "stackframe": "^1.0.4" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.46", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", + "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": 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.0.2" - } - }, - "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.4", - "bundled": true, + } + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "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": { + "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": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "amdefine": ">=0.0.4" } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, + } + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "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" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-stream": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz", + "integrity": "sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "flatmap-stream": "^0.1.0", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": ">=0.0.5" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, - "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } + "expand-range": "^0.1.0" } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": 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": { + "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": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "is-descriptor": "^0.1.0" } }, - "request": { - "version": "2.81.0", - "bundled": 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, - "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + }, + "dependencies": { + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expose-loader": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz", + "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==", + "dev": true + }, + "express": { + "version": "4.16.3", + "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.3", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" } }, - "rimraf": { - "version": "2.6.1", - "bundled": true, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { - "glob": "7.1.2" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, - "semver": { - "version": "5.3.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 - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true }, - "sshpk": { - "version": "1.13.0", - "bundled": true, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", "dev": true, - "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" }, "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } } }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, - "tar": { - "version": "2.2.1", - "bundled": true, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "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": "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" + }, + "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": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "is-plain-object": "^2.0.4" } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, + } + } + }, + "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, - "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "is-descriptor": "^1.0.0" } }, - "tough-cookie": { - "version": "2.3.2", - "bundled": 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, - "optional": true, "requires": { - "punycode": "1.4.1" + "is-extendable": "^0.1.0" } }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, + "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, - "optional": true, "requires": { - "safe-buffer": "5.0.1" + "kind-of": "^6.0.0" } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, + "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, - "optional": true, "requires": { - "extsprintf": "1.0.2" + "kind-of": "^6.0.0" } }, - "wide-align": { - "version": "1.1.2", - "bundled": true, + "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, - "optional": true, "requires": { - "string-width": "1.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true } } }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "extra-watch-webpack-plugin": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/extra-watch-webpack-plugin/-/extra-watch-webpack-plugin-1.0.3.tgz", + "integrity": "sha512-ZScQdMH6hNofRRN6QMQFg+aa5vqimfBgnPXmRDhdaLpttT6hrzpY9Oyren3Gh/FySPrgsvKCNbx/NFA7XNdIsg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", + "glob": "^7.1.2", + "is-glob": "^4.0.0", + "lodash.uniq": "^4.5.0", + "schema-utils": "^0.4.0" + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "yauzl": "2.4.1" } }, - "function-bind": { + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true, + "optional": 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 }, - "gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=", + "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 }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "globule": "0.1.0" + "websocket-driver": ">=0.5.1" } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "file-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz", + "integrity": "sha1-ycrSZdLIrfOoFHWw30dYWQafrvc=", + "dev": true, + "requires": { + "utils-extend": "^1.0.6" + } + }, + "file-system": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/file-system/-/file-system-2.2.2.tgz", + "integrity": "sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc=", + "dev": true, + "requires": { + "file-match": "^1.0.1", + "utils-extend": "^1.0.4" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", "dev": true }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "is-property": "1.0.2" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, - "get-own-enumerable-property-symbols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", - "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "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" + } + }, + "flatmap-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.0.tgz", + "integrity": "sha512-Nlic4ZRYxikqnK5rj3YoxDVKGGtUjcNDUtvQ7XsdGLZmMwdUYnXf10o1zcXtzEZTBgc6GxeRpQxV/Wu3WPIIHA==", "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=", + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "follow-redirects": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.8.tgz", + "integrity": "sha512-sy1mXPmv7kLAMKW/8XofG7o9T+6gAjzdZK4AJF6ryqQYUa/hnzgiypoeUecZ53x7XiqKNEpNqLtS97MshW2nxg==", + "dev": true, + "requires": { + "debug": "=3.1.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" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "getpass": { + "friendly-errors-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + } + }, + "from": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "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": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "null-check": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "is-glob": "2.0.1" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "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.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, + "optional": true, "requires": { - "glob": "4.5.3", - "glob2base": "0.0.12", - "minimatch": "2.0.10", - "ordered-read-streams": "0.1.0", - "through2": "0.6.5", - "unique-stream": "1.0.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "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.4", + "bundled": true, + "dev": true, + "optional": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "balanced-match": { + "version": "1.0.0", + "bundled": true, "dev": true }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "brace-expansion": { + "version": "1.1.11", + "bundled": true, "dev": true, "requires": { - "brace-expansion": "1.1.8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "chownr": { + "version": "1.0.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": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "ms": "2.0.0" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "deep-extend": { + "version": "0.5.1", + "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": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "minipass": "^2.2.1" } - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true, - "requires": { - "gaze": "0.5.2" - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "0.1.1" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.4", - "is-windows": "1.0.2", - "which": "1.2.14" - } - }, - "globalize": { - "version": "0.1.0-a2", - "resolved": "https://registry.npmjs.org/globalize/-/globalize-0.1.0a2.tgz", - "integrity": "sha1-fyizguvv2boMs9gDY1+7pkqH8pQ=", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", - "dev": true - }, - "globby": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", - "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "6.0.4", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, "dev": true, + "optional": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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" } - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { + }, "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "version": "7.1.2", + "bundled": true, "dev": true, + "optional": true, "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" + "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" } }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "iconv-lite": { + "version": "0.4.21", + "bundled": true, "dev": true, + "optional": true, "requires": { - "lru-cache": "2.2.4", - "sigmund": "1.0.1" + "safer-buffer": "^2.1.0" } - } - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } - }, - "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer2": "0.1.4", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "node-status-codes": "1.0.0", - "object-assign": "4.1.1", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "read-all-stream": "3.1.0", - "readable-stream": "2.0.6", - "timed-out": "3.1.3", - "unzip-response": "1.0.2", - "url-parse-lax": "1.0.0" - }, - "dependencies": { - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "readable-stream": "2.0.6" + "minimatch": "^3.0.4" } - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "gulp": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.0.tgz", - "integrity": "sha1-zx+6TLVYu4xq5slhP1g64mINIUo=", - "dev": true, - "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "deprecated": "0.0.1", - "gulp-util": "3.0.7", - "interpret": "0.6.6", - "liftoff": "2.5.0", - "minimist": "1.2.0", - "orchestrator": "0.3.8", - "pretty-hrtime": "1.0.3", - "semver": "4.3.6", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "vinyl-fs": "0.3.14" - }, - "dependencies": { - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", - "dev": true - } - } - }, - "gulp-debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gulp-debug/-/gulp-debug-3.1.0.tgz", - "integrity": "sha1-TakVaLVJFb6ANpbKqsEMiVssCnE=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "gulp-util": "3.0.7", - "plur": "2.1.2", - "stringify-object": "3.2.2", - "through2": "2.0.1", - "tildify": "1.2.0" - } - }, - "gulp-eslint": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-1.1.1.tgz", - "integrity": "sha1-nxY4D1MxchUrN/O1woFkmt+PRmQ=", - "dev": true, - "requires": { - "bufferstreams": "1.1.3", - "eslint": "1.10.3", - "gulp-util": "3.0.7", - "object-assign": "4.1.1" - }, - "dependencies": { - "cli-width": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", - "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=", - "dev": true }, - "doctrine": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", - "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "inflight": { + "version": "1.0.6", + "bundled": true, "dev": true, + "optional": true, "requires": { - "esutils": "1.1.6", - "isarray": "0.0.1" - }, - "dependencies": { - "esutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", - "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", - "dev": true - } + "once": "^1.3.0", + "wrappy": "1" } }, - "eslint": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-1.10.3.tgz", - "integrity": "sha1-+xmpGxPBWAgrvKKUsX2Xm8g1Ogo=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "concat-stream": "1.6.1", - "debug": "2.6.7", - "doctrine": "0.7.2", - "escape-string-regexp": "1.0.5", - "escope": "3.6.0", - "espree": "2.2.5", - "estraverse": "4.2.0", - "estraverse-fb": "1.3.2", - "esutils": "2.0.2", - "file-entry-cache": "1.3.1", - "glob": "5.0.15", - "globals": "8.18.0", - "handlebars": "4.0.10", - "inquirer": "0.11.4", - "is-my-json-valid": "2.16.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.4.5", - "json-stable-stringify": "1.0.1", - "lodash.clonedeep": "3.0.2", - "lodash.merge": "3.3.2", - "lodash.omit": "3.1.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "object-assign": "4.1.1", - "optionator": "0.6.0", - "path-is-absolute": "1.0.1", - "path-is-inside": "1.0.2", - "shelljs": "0.5.3", - "strip-json-comments": "1.0.4", - "text-table": "0.2.0", - "user-home": "2.0.0", - "xml-escape": "1.0.0" - } - }, - "espree": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/espree/-/espree-2.2.5.tgz", - "integrity": "sha1-32kbkxCIlAKuspzAZnCMVmkLhUs=", - "dev": true - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "inherits": { + "version": "2.0.3", + "bundled": true, "dev": true }, - "fast-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz", - "integrity": "sha1-AXjc3uAjuSkFGTrwlZ6KdjnP3Lk=", - "dev": true + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true }, - "file-entry-cache": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", - "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "number-is-nan": "^1.0.0" } }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "brace-expansion": "^1.1.7" } }, - "globals": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-8.18.0.tgz", - "integrity": "sha1-k9SmK9ysOM+vr8R9awNHaMsP/LQ=", + "minimist": { + "version": "0.0.8", + "bundled": true, "dev": true }, - "inquirer": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.4.tgz", - "integrity": "sha1-geM3ToNhvq/y2XAWIG01nQsy+k0=", + "minipass": { + "version": "2.2.4", + "bundled": true, "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "1.1.1", - "figures": "1.7.0", - "lodash": "3.10.1", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "js-yaml": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.5.tgz", - "integrity": "sha1-w0A3l98SuRhmV08t4jZG/oyvtE0=", + "minizlib": { + "version": "1.1.0", + "bundled": true, "dev": true, + "optional": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "minipass": "^2.2.1" } }, - "levn": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", - "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=", + "mkdirp": { + "version": "0.5.1", + "bundled": true, "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "minimist": "0.0.8" } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true }, - "optionator": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.6.0.tgz", - "integrity": "sha1-tj7Lvw4xX61LyYJ7Rdx7pFKE/LY=", + "needle": { + "version": "2.2.0", + "bundled": true, "dev": true, + "optional": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "1.0.7", - "levn": "0.2.5", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "0.0.3" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, - "shelljs": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", - "integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=", - "dev": true - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "gulp-help": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/gulp-help/-/gulp-help-1.6.1.tgz", - "integrity": "sha1-Jh2xhuGDl/7z9qLCLpwxW/qIrgw=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "object-assign": "3.0.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "gulp-stylelint": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/gulp-stylelint/-/gulp-stylelint-0.2.0.tgz", - "integrity": "sha1-glFqip9Xrc4OF9GsWsOKERRKqWk=", - "dev": true, - "requires": { - "gulp-util": "3.0.7", - "postcss": "5.2.18", - "stylelint": "4.5.1", - "through2": "2.0.1" - } - }, - "gulp-stylelint-console-reporter": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/gulp-stylelint-console-reporter/-/gulp-stylelint-console-reporter-0.1.0.tgz", - "integrity": "sha1-gPtWnIgfS6aPmE3+RQMxP5g4U5k=", - "dev": true, - "requires": { - "gulp-util": "3.0.7" - } - }, - "gulp-tslint": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gulp-tslint/-/gulp-tslint-4.3.1.tgz", - "integrity": "sha1-XY84gYJZ5X0xeUgTYASCs5cm8xk=", - "dev": true, - "requires": { - "gulp-util": "3.0.7", - "map-stream": "0.1.0", - "rcloader": "0.2.2", - "through": "2.3.8" - } - }, - "gulp-unzip": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/gulp-unzip/-/gulp-unzip-0.2.0.tgz", - "integrity": "sha1-KQCg3xzYfwZXy01IzjcSpAUYRXs=", - "dev": true, - "requires": { - "defaults": "1.0.3", - "gulp-util": "2.2.20", - "through2": "0.4.2", - "unzipper": "0.7.6" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "nopt": { + "version": "4.0.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-styles": "1.1.0", - "escape-string-regexp": "1.0.5", - "has-ansi": "0.1.0", - "strip-ansi": "0.3.0", - "supports-color": "0.2.0" + "abbrev": "1", + "osenv": "^0.1.4" } }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, "dev": true, + "optional": true, "requires": { - "chalk": "0.5.1", - "dateformat": "1.0.12", - "lodash._reinterpolate": "2.4.1", - "lodash.template": "2.4.1", - "minimist": "0.2.0", - "multipipe": "0.1.2", - "through2": "0.5.1", - "vinyl": "0.2.3" - }, - "dependencies": { - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "3.0.0" - } - } + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "npmlog": { + "version": "4.1.2", + "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "0.2.1" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "number-is-nan": { + "version": "1.0.1", + "bundled": true, "dev": true }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", - "dev": true + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "once": { + "version": "1.4.0", + "bundled": true, "dev": true, "requires": { - "lodash._escapehtmlchar": "2.4.1", - "lodash._reunescapedhtml": "2.4.1", - "lodash.keys": "2.4.1" + "wrappy": "1" } }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "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": { - "lodash._objecttypes": "2.4.1" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "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.7", + "bundled": true, "dev": true, + "optional": true, "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" + "deep-extend": "^0.5.1", + "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 + } } }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "readable-stream": { + "version": "2.3.6", + "bundled": true, "dev": true, + "optional": true, "requires": { - "lodash._escapestringchar": "2.4.1", - "lodash._reinterpolate": "2.4.1", - "lodash.defaults": "2.4.1", - "lodash.escape": "2.4.1", - "lodash.keys": "2.4.1", - "lodash.templatesettings": "2.4.1", - "lodash.values": "2.4.1" + "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" } }, - "lodash.templatesettings": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "rimraf": { + "version": "2.6.2", + "bundled": true, "dev": true, + "optional": true, "requires": { - "lodash._reinterpolate": "2.4.1", - "lodash.escape": "2.4.1" + "glob": "^7.0.5" } }, - "minimist": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "safe-buffer": { + "version": "5.1.1", + "bundled": true, "dev": true }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.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": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "version": "3.0.1", + "bundled": true, "dev": true, "requires": { - "ansi-regex": "0.2.1" + "ansi-regex": "^2.0.0" } }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "tar": { + "version": "4.4.1", + "bundled": true, "dev": true, + "optional": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "2.1.2" - }, - "dependencies": { - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "0.4.0" - } - } + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, "dev": true, + "optional": true, "requires": { - "clone-stats": "0.0.1" + "string-width": "^1.0.2" } }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, "dev": true } } }, - "gulp-using": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/gulp-using/-/gulp-using-0.1.0.tgz", - "integrity": "sha1-dzNHX5P/oMITpb88c5exBp0tmgY=", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "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 + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "chalk": "0.4.0", - "map-stream": "0.1.0" + "assert-plus": "^1.0.0" }, "dependencies": { - "ansi-styles": { + "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + } + } + }, + "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": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" + "is-extglob": "^2.1.0" } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true } } }, - "gulp-util": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", - "integrity": "sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-uniq": "1.0.3", - "beeper": "1.1.1", - "chalk": "1.1.3", - "dateformat": "1.0.12", - "fancy-log": "1.3.0", - "gulplog": "1.0.0", - "has-gulplog": "0.1.0", - "lodash._reescape": "3.0.0", - "lodash._reevaluate": "3.0.0", - "lodash._reinterpolate": "3.0.0", - "lodash.template": "3.6.2", - "minimist": "1.2.0", - "multipipe": "0.1.2", - "object-assign": "3.0.0", - "replace-ext": "0.0.1", - "through2": "2.0.1", - "vinyl": "0.5.3" + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globalize": { + "version": "0.1.0-a2", + "resolved": "https://registry.npmjs.org/globalize/-/globalize-0.1.0a2.tgz", + "integrity": "sha1-fyizguvv2boMs9gDY1+7pkqH8pQ=", + "dev": true + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "got": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", "dev": true, "requires": { - "glogg": "1.0.0" + "duplexer": "^0.1.1", + "pify": "^3.0.0" } }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - } + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" } }, "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true, "optional": true }, @@ -4837,10 +4740,19 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.9.0", - "is-my-json-valid": "2.16.0", - "pinkie-promise": "2.0.1" + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -4849,32 +4761,26 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "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": "0.0.1" + "isarray": "2.0.1" }, "dependencies": { "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true } } }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, "has-cors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", @@ -4882,19 +4788,16 @@ "dev": true }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "1.0.0" - } + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true }, "has-value": { "version": "1.0.0", @@ -4902,17 +4805,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -4921,51 +4816,62 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, "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" + "is-buffer": "^1.1.5" } } } }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -4974,41 +4880,81 @@ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "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 + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "hosted-git-info": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", - "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, "http-errors": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", - "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "1.1.0", + "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, + "http-parser-js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "dev": true + }, "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "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" + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", "dev": true, "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" } }, "http-signature": { @@ -5017,21 +4963,78 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "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" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", "dev": true }, - "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, "image-size": { @@ -5041,6 +5044,28 @@ "dev": true, "optional": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5053,15 +5078,9 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -5074,8 +5093,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -5085,45 +5104,35 @@ "dev": true }, "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.16.2", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "source-map": "~0.5.3" + }, + "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 + } } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "meow": "^3.3.0" } }, "invert-kv": { @@ -5132,36 +5141,35 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "1.0.0", - "is-windows": "1.0.2" - } + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true }, "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "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": "6.0.2" + "kind-of": "^3.0.2" }, "dependencies": { "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 + "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" + } } } }, @@ -5177,13 +5185,13 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.8.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "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-builtin-module": { @@ -5192,77 +5200,69 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, - "is-css-color-name": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-css-color-name/-/is-css-color-name-0.1.3.tgz", - "integrity": "sha1-6jtRvJAdiiQ9Msm3hz0GgNu+9/E=", + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { - "css-color-names": "0.0.2" - }, - "dependencies": { - "css-color-names": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.2.tgz", - "integrity": "sha1-+6GOjP+GV5Vy10nBRsR+6D8OqVU=", - "dev": true - } + "ci-info": "^1.5.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==", + "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": "6.0.2" + "kind-of": "^3.0.2" }, "dependencies": { "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 + "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" + } } } }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "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": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -5270,9 +5270,9 @@ "dev": true }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "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": { @@ -5281,37 +5281,51 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "is-extglob": "^2.1.1" } }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, "is-my-json-valid": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", - "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", + "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-npm": { @@ -5321,37 +5335,31 @@ "dev": true }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "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.2.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "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" + } + } } }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -5359,12 +5367,12 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -5373,38 +5381,18 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } + "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -5417,27 +5405,15 @@ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "is-unc-path": "1.0.0" + "has": "^1.0.1" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", @@ -5450,11 +5426,14 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-supported-regexp-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz", - "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=", - "dev": true + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -5462,15 +5441,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "0.1.2" - } - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -5483,6 +5453,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5490,10 +5466,13 @@ "dev": true }, "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true + "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", @@ -5502,13 +5481,10 @@ "dev": true }, "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" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -5522,42 +5498,54 @@ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.10", - "js-yaml": "3.6.1", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.2.14", - "wordwrap": "1.0.0" + "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 + }, "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "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 + }, "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" + "has-flag": "^1.0.0" } }, "wordwrap": { @@ -5568,15 +5556,153 @@ } } }, + "istanbul-api": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.0.6.tgz", + "integrity": "sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ==", + "dev": true, + "requires": { + "async": "^2.6.1", + "compare-versions": "^3.2.1", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.1", + "istanbul-lib-hook": "^2.0.1", + "istanbul-lib-instrument": "^3.0.0", + "istanbul-lib-report": "^2.0.2", + "istanbul-lib-source-maps": "^2.0.1", + "istanbul-reports": "^2.0.1", + "js-yaml": "^3.12.0", + "make-dir": "^1.3.0", + "once": "^1.4.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "istanbul-reports": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz", + "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz", + "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz", + "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", + "dev": true, + "requires": { + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.1", + "semver": "^5.5.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz", + "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" + }, + "dependencies": { + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz", + "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.0.tgz", + "integrity": "sha512-d2YRSnAOHHb+6vMc5qjJEyPN4VapkgUMhKlMmr3BzKdMDWdJbyYGEi/7m5AjDjkvRRTjs68ttPRZ7W2jBZ31SQ==", + "dev": true, + "requires": { + "handlebars": "^4.0.11" + } + }, "jasmine": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.5.2.tgz", "integrity": "sha1-YoPO9whcCVzCXWUelU3wBPfj5CE=", "dev": true, "requires": { - "exit": "0.1.2", - "glob": "7.1.2", - "jasmine-core": "2.5.2" + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.5.2" } }, "jasmine-core": { @@ -5597,12 +5723,6 @@ "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=", "dev": true }, - "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", - "dev": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -5615,8 +5735,8 @@ "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "jsbn": { @@ -5627,9 +5747,21 @@ "optional": true }, "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-schema": { @@ -5642,92 +5774,36 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, - "requires": { - "jsonify": "0.0.0" - } + "optional": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", - "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonfilter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jsonfilter/-/jsonfilter-1.1.2.tgz", - "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=", - "dev": true, - "requires": { - "JSONStream": "0.8.4", - "minimist": "1.2.0", - "stream-combiner": "0.2.2", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } + "dev": true }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "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" + } + }, "jsonpointer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", @@ -5735,21 +5811,21 @@ "dev": true }, "jsonschema": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.1.0.tgz", - "integrity": "sha1-A5zCGe1SSwbnHa8SymDQJjn68po=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", + "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==", "dev": true }, "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", - "extsprintf": "1.0.2", + "extsprintf": "1.3.0", "json-schema": "0.2.3", - "verror": "1.3.6" + "verror": "1.10.0" }, "dependencies": { "assert-plus": { @@ -5761,963 +5837,709 @@ } }, "jszip": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.0.0.tgz", - "integrity": "sha1-vBQVauWdnrO/hZjD5fB5zTsW+Vg=", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", "dev": true, "requires": { - "asap": "2.0.6", - "es6-promise": "3.0.2", - "pako": "1.0.6", - "readable-stream": "2.0.6" + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + } } }, "karma": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.3.0.tgz", - "integrity": "sha1-srlOj0mfrdAGnVT5rvSk1I7FzB8=", - "dev": true, - "requires": { - "bluebird": "3.5.0", - "body-parser": "1.17.2", - "chokidar": "1.7.0", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.2", - "core-js": "2.4.1", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.16.2", - "isbinaryfile": "3.0.2", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.3.6", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.1.5", - "range-parser": "1.2.0", - "rimraf": "2.6.1", - "socket.io": "1.4.7", - "source-map": "0.5.6", - "tmp": "0.0.28", - "useragent": "2.1.13" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.0.0.tgz", + "integrity": "sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^3.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.2.1" }, "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "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" + } + }, + "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" + } + }, + "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 } } }, "karma-chrome-launcher": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.0.0.tgz", - "integrity": "sha1-wnkMWjKxVXfQ//Wk1aJwOztDnCU=", + "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.1", - "which": "1.2.14" + "fs-access": "^1.0.0", + "which": "^1.2.1" } }, "karma-coverage": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-1.1.1.tgz", - "integrity": "sha1-Wv+LOc9plNwi3kyENix2ABtjfPY=", + "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.12", - "istanbul": "0.4.5", - "lodash": "3.10.1", - "minimatch": "3.0.4", - "source-map": "0.5.6" + "dateformat": "^1.0.6", + "istanbul": "^0.4.0", + "lodash": "^4.17.0", + "minimatch": "^3.0.0", + "source-map": "^0.5.1" }, "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "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": "1.0.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.0.2.tgz", - "integrity": "sha1-wLOrMnvyB9tg4X+ifbN8/e9djmw=", - "dev": true - }, - "karma-remap-istanbul": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/karma-remap-istanbul/-/karma-remap-istanbul-0.4.0.tgz", - "integrity": "sha1-Hyb/NAgazAY8j9Gl4CbeX9nQoIE=", + "karma-coverage-istanbul-reporter": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz", + "integrity": "sha512-xJS7QSQIVU6VK9HuJ/ieE5yynxKhjCCkd96NLY/BX/HXsx0CskU9JJiMQbd4cHALiddMwI4OWh1IIzeWrsavJw==", "dev": true, "requires": { - "istanbul": "0.4.5", - "object.assign": "4.0.4", - "remap-istanbul": "0.6.4" + "istanbul-api": "^2.0.5", + "minimatch": "^3.0.4" } }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, "karma-sourcemap-loader": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", "dev": true, "requires": { - "graceful-fs": "4.1.11" - } - }, - "karma-typescript-preprocessor": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/karma-typescript-preprocessor/-/karma-typescript-preprocessor-0.3.0.tgz", - "integrity": "sha1-47Ca4Z1erTVQxQOFUlehkriUbmo=", - "dev": true, - "requires": { - "typescript": "2.1.4" - } - }, - "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" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "latest-version": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", - "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", - "dev": true, - "requires": { - "package-json": "2.4.0" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazy-req": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" + "graceful-fs": "^4.1.2" } }, - "lcov-parse": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", - "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", - "dev": true - }, - "ldjson-stream": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ldjson-stream/-/ldjson-stream-1.2.1.tgz", - "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=", + "karma-typescript": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-3.0.13.tgz", + "integrity": "sha1-iUivvRA6wZh6WWGg9DoboocQZ80=", "dev": true, "requires": { - "split2": "0.2.1", - "through2": "0.6.5" + "acorn": "^4.0.4", + "assert": "^1.4.1", + "async": "^2.1.4", + "browser-resolve": "^1.11.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.0.6", + "combine-source-map": "^0.8.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "convert-source-map": "^1.5.0", + "crypto-browserify": "^3.11.1", + "diff": "^3.2.0", + "domain-browser": "^1.1.7", + "events": "^1.1.1", + "glob": "^7.1.1", + "https-browserify": "^1.0.0", + "istanbul": "0.4.5", + "json-stringify-safe": "^5.0.1", + "karma-coverage": "^1.1.1", + "lodash": "^4.17.4", + "log4js": "^1.1.1", + "minimatch": "^3.0.3", + "os-browserify": "^0.3.0", + "pad": "^2.0.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^2.3.3", + "remap-istanbul": "^0.10.1", + "source-map": "0.6.1", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.3", + "timers-browserify": "^2.0.2", + "tmp": "0.0.29", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" }, "dependencies": { + "date-format": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-0.0.0.tgz", + "integrity": "sha1-CSBoY6sHDrRZrOpVQsvYVrEZZrM=", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } - }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", - "dev": true, - "requires": { - "errno": "0.1.7", - "graceful-fs": "4.1.11", - "image-size": "0.5.5", - "mime": "1.3.6", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.81.0", - "source-map": "0.5.6" - }, - "dependencies": { - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "log4js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-1.1.1.tgz", + "integrity": "sha1-wh0px2BAieTyVYM+f5SzRh3h/0M=", "dev": true, - "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "debug": "^2.2.0", + "semver": "^5.3.0", + "streamroller": "^0.4.0" } }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": 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 }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.0", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "streamroller": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.4.1.tgz", + "integrity": "sha1-1DW9WXQ3Or2b2QaDWVEwhRBswF8=", "dev": true, - "optional": true, "requires": { - "safe-buffer": "5.1.0" + "date-format": "^0.0.0", + "debug": "^0.7.2", + "mkdirp": "^0.5.1", + "readable-stream": "^1.1.7" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "http://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } } }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "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, - "optional": true - } - } - }, - "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" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "3.0.1", - "findup-sync": "2.0.0", - "fined": "1.1.0", - "flagged-respawn": "1.0.0", - "is-plain-object": "2.0.4", - "object.map": "1.0.1", - "rechoir": "0.6.2", - "resolve": "1.1.7" - } - }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "lodash": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", - "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", - "dev": true - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", - "dev": true - }, - "lodash._arraymap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraymap/-/lodash._arraymap-3.0.0.tgz", - "integrity": "sha1-Go/Q9MDfS2HeoHbXF83Jfwo8PmY=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "dev": true, - "requires": { - "lodash._arraycopy": "3.0.0", - "lodash._arrayeach": "3.0.0", - "lodash._baseassign": "3.2.0", - "lodash._basefor": "3.0.3", - "lodash.isarray": "3.0.4", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basedifference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basedifference/-/lodash._basedifference-3.0.3.tgz", - "integrity": "sha1-8sIEKWwqeOArOJCBtu3KyTPPYpw=", - "dev": true, - "requires": { - "lodash._baseindexof": "3.1.0", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2" - } - }, - "lodash._baseflatten": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", - "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", - "dev": true, - "requires": { - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", - "dev": true - }, - "lodash._baseindexof": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", - "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz", - "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "3.0.1", - "lodash._isiterateecall": "3.0.9", - "lodash.restparam": "3.6.1" + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } } }, - "lodash._createcache": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", - "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", + "karma-typescript-preprocessor": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/karma-typescript-preprocessor/-/karma-typescript-preprocessor-0.3.1.tgz", + "integrity": "sha1-pO1Jdq8CoIAdF4Q3Vq2MzIAFPVo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1" + "typescript": "^2.1.4" + }, + "dependencies": { + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + } } }, - "lodash._escapehtmlchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "karma-webpack": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.0.tgz", + "integrity": "sha512-Ja1o9LLoqWaJyUNhTKaXjWiEH9y7a9H3mzP8pYB30SBsgoF5KBS/65NeHFd+QPuT9ITrym8xFt8BZeGbcOfujA==", "dev": true, "requires": { - "lodash._htmlescapes": "2.4.1" + "async": "^2.0.0", + "babel-runtime": "^6.0.0", + "loader-utils": "^1.0.0", + "lodash": "^4.0.0", + "source-map": "^0.5.6", + "webpack-dev-middleware": "^2.0.6" + }, + "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 + } } }, - "lodash._escapestringchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._htmlescapes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", - "dev": true - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, - "lodash._pickbyarray": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash._pickbyarray/-/lodash._pickbyarray-3.0.2.tgz", - "integrity": "sha1-H4mNlgfrVgsOFnOEt3x8bRCKpMU=", + "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 }, - "lodash._pickbycallback": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._pickbycallback/-/lodash._pickbycallback-3.0.0.tgz", - "integrity": "sha1-/2G5oBens699MObFPeKK+hm4dQo=", + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "lodash._basefor": "3.0.3", - "lodash.keysin": "3.0.8" + "package-json": "^4.0.0" } }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "leb": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", + "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", "dev": true }, - "lodash._reunescapedhtml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "less": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/less/-/less-2.1.1.tgz", + "integrity": "sha1-e6H9dpjntOtGKGw5VK7UPlTaQbY=", "dev": true, "requires": { - "lodash._htmlescapes": "2.4.1", - "lodash.keys": "2.4.1" + "graceful-fs": "^3.0.4", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^6.0.1", + "request": "^2.48.0", + "source-map": "^0.1.x" }, "dependencies": { - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", "dev": true, + "optional": true, "requires": { - "lodash._objecttypes": "2.4.1" + "natives": "^1.1.0" } }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, + "optional": true, "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" + "amdefine": ">=0.0.4" } } } }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", "dev": true, "requires": { - "lodash._objecttypes": "2.4.1" + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } } }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.clonedeep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", - "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "lodash._baseclone": "3.3.0", - "lodash._bindcallback": "3.0.1" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "dev": true, "requires": { - "lodash._objecttypes": "2.4.1", - "lodash.keys": "2.4.1" - }, - "dependencies": { - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true, - "requires": { - "lodash._objecttypes": "2.4.1" - } - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true, - "requires": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" - } - } + "immediate": "~3.0.5" } }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "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": { - "lodash._root": "3.0.1" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true - }, - "lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.istypedarray": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", - "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=", + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", "dev": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, - "lodash.keysin": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", - "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.merge": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", - "integrity": "sha1-DZDZPtY3sYeEN7s+IWASYNev6ZQ=", - "dev": true, - "requires": { - "lodash._arraycopy": "3.0.0", - "lodash._arrayeach": "3.0.0", - "lodash._createassigner": "3.1.1", - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4", - "lodash.isplainobject": "3.2.0", - "lodash.istypedarray": "3.0.6", - "lodash.keys": "3.1.2", - "lodash.keysin": "3.0.8", - "lodash.toplainobject": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { - "lodash.isplainobject": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", - "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", - "dev": true, - "requires": { - "lodash._basefor": "3.0.3", - "lodash.isarguments": "3.1.0", - "lodash.keysin": "3.0.8" - } + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true } } }, - "lodash.omit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-3.1.0.tgz", - "integrity": "sha1-iX/jguZBPZrJfGH3jtHgV6AK+fM=", - "dev": true, - "requires": { - "lodash._arraymap": "3.0.0", - "lodash._basedifference": "3.0.3", - "lodash._baseflatten": "3.1.4", - "lodash._bindcallback": "3.0.1", - "lodash._pickbyarray": "3.0.2", - "lodash._pickbycallback": "3.0.0", - "lodash.keysin": "3.0.8", - "lodash.restparam": "3.6.1" - } + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash._basetostring": "3.0.1", - "lodash._basevalues": "3.0.0", - "lodash._isiterateecall": "3.0.9", - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0", - "lodash.keys": "3.1.2", - "lodash.restparam": "3.6.1", - "lodash.templatesettings": "3.1.1" - } + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.escape": "3.2.0" - } + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", + "dev": true }, - "lodash.toplainobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", - "integrity": "sha1-KHkK2ULSk9eKpmOgfs9/UsoEGY0=", - "dev": true, - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keysin": "3.0.8" - } + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true }, - "lodash.values": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "lodash.keys": "2.4.1" + "chalk": "^2.0.1" }, "dependencies": { - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "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": { - "lodash._objecttypes": "2.4.1" + "color-convert": "^1.9.0" } }, - "lodash.keys": { + "chalk": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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": { - "lodash._isnative": "2.4.1", - "lodash._shimkeys": "2.4.1", - "lodash.isobject": "2.4.1" + "has-flag": "^3.0.0" } } } }, - "log-driver": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", - "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "1.1.3" - } - }, "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.5.tgz", + "integrity": "sha512-IX5c3G/7fuTtdr0JjOT2OIR12aTESVhsH6cEsijloYwKgcPRlO6DgOU72v0UFhWcoV1HN6+M3dwT89qVPLXm0w==", "dev": true, "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" + "circular-json": "^0.5.5", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "rfdc": "^1.1.2", + "streamroller": "0.7.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", "dev": true }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", "dev": true, "requires": { - "js-tokens": "3.0.2" + "es6-symbol": "^3.1.1", + "object.assign": "^4.1.0" } }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, "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.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, "lru-cache": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", - "dev": true + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } }, - "make-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz", - "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=", + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "pify": "^3.0.0" } }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -6731,9 +6553,9 @@ "dev": true }, "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", "dev": true }, "map-visit": { @@ -6742,43 +6564,17 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, - "matchdep": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-1.0.1.tgz", - "integrity": "sha1-pXozgESR+64girqPaDgEN6vC3KU=", + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "dev": true, "requires": { - "findup-sync": "0.3.0", - "micromatch": "2.3.11", - "resolve": "1.1.7", - "stack-trace": "0.0.9" - }, - "dependencies": { - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "5.0.15" - } - }, - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "media-typer": { @@ -6787,89 +6583,166 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, "meow": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.3.8", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "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" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.3" + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", "dev": true }, "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", "dev": true }, "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", "dev": true, "requires": { - "mime-db": "1.27.0" + "mime-db": "~1.36.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 + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -6878,14 +6751,14 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -6894,122 +6767,179 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "duplexer2": "0.0.2" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, - "mute-stdout": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.0.tgz", - "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0=", - "dev": true - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, "nan": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", - "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", "dev": true, "optional": true }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "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-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "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 - }, - "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 - }, - "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 - } + "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" } }, "natives": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz", - "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==", - "dev": true + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.5.tgz", + "integrity": "sha512-1pJ+02gl2KJgCPFtpZGtuD4lGSJnIZvvFHCQTOeDRMSXjfu2GmYWuhI8NFMA4W2I5NNFRbfy/YCiVt4CgNpP8A==", + "dev": true, + "optional": true }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, - "negotiator": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz", - "integrity": "sha1-kuRrbbU8fkIe1koryU8IvnYw3z8=", + "neo-async": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz", + "integrity": "sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw==", "dev": true }, - "node-status-codes": { + "next-tick": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", "dev": true }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "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 + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "node-uuid": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", @@ -7022,19 +6952,19 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "1" } }, "normalize-package-data": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", - "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.4.2", - "is-builtin-module": "1.0.0", - "semver": "4.3.6", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -7043,14 +6973,17 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.0.2" + "remove-trailing-separator": "^1.0.1" } }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } }, "null-check": { "version": "1.0.0", @@ -7058,12 +6991,6 @@ "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", "dev": true }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -7094,9 +7021,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -7105,52 +7032,24 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" - } - }, - "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.2.2" - } - }, - "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.2.2" + "is-descriptor": "^0.1.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.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-buffer": "^1.1.5" } } } }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true }, "object-visit": { @@ -7159,92 +7058,19 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } + "isobject": "^3.0.0" } }, "object.assign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", - "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.0", - "object-keys": "1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "1.0.1", - "array-slice": "1.1.0", - "for-own": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "1.0.0", - "make-iterator": "1.0.0" - }, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "object.pick": { @@ -7253,17 +7079,15 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } + "isobject": "^3.0.1" } }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -7273,26 +7097,35 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, - "onecolor": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/onecolor/-/onecolor-3.0.5.tgz", - "integrity": "sha1-Nu/zIgE3nv3xGA+0ReUajiQl+fY=", + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", "dev": true }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } }, "optimist": { "version": "0.6.1", @@ -7300,13 +7133,13 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true } @@ -7318,12 +7151,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "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" }, "dependencies": { "wordwrap": { @@ -7334,42 +7167,30 @@ } } }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { - "end-of-stream": "0.1.5", - "sequencify": "0.0.7", - "stream-consume": "0.1.1" + "url-parse": "^1.4.3" } }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "lcid": "1.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -7378,111 +7199,156 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "p-try": "^1.0.0" } }, - "package-json": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", - "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "got": "5.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } + "p-limit": "^1.1.0" } }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "is-absolute": "1.0.0", - "map-cache": "0.2.2", - "path-root": "0.1.1" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "pad": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/pad/-/pad-2.2.1.tgz", + "integrity": "sha512-lVia7rFne82Flf8V5Szzw2oP2zcQBGtCUXvo0pF1c6CmUHc9QLSZ1NQM/YujaM5YdQBsLJ1u90om+T1zKF42HQ==", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "wcwidth": "^1.0.1" } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "error-ex": "1.3.1" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "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 + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } }, - "parsejson": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", - "integrity": "sha1-mxDGwNglq1ieaFFTgm3go7oni8w=", + "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": { - "better-assert": "1.0.2" + "error-ex": "^1.2.0" } }, "parseqs": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", - "integrity": "sha1-nf5wss3aw4i95PNbHyQPpYrb5sc=", + "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.2" + "better-assert": "~1.0.0" } }, "parseuri": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", - "integrity": "sha1-gGWCo5iH4eoY3V4v4OAZAiaOk1A=", + "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.2" + "better-assert": "~1.0.0" } }, "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, "pascalcase": { @@ -7491,13 +7357,25 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "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.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -7512,19 +7390,22 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "0.1.2" - } + "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-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "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-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, "path-type": { @@ -7533,22 +7414,58 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true, "optional": true }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pinkie": { @@ -7563,33 +7480,93 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, - "pipetteur": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pipetteur/-/pipetteur-2.0.3.tgz", - "integrity": "sha1-GVV2CVno0aEcsqUOyD7sRwYz5J8=", + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "onecolor": "3.0.5", - "synesthesia": "1.0.1" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } } }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", "dev": true, "requires": { - "irregular-plurals": "1.4.0" + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } } }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true + "portfinder": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz", + "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } }, "posix-character-classes": { "version": "0.1.1", @@ -7598,64 +7575,84 @@ "dev": true }, "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.6", - "supports-color": "3.2.3" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "1.0.0" + "has-flag": "^3.0.0" } } } }, - "postcss-reporter": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-1.4.1.tgz", - "integrity": "sha1-wTbwpbFhkV83ndN2XGEHX357mvI=", + "postcss-modules-extract-imports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", + "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", "dev": true, "requires": { - "chalk": "1.1.3", - "lodash": "4.16.2", - "log-symbols": "1.0.2", - "postcss": "5.2.18" + "postcss": "^6.0.1" } }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true + "postcss-modules-local-by-default": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } }, - "postcss-scss": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-0.1.9.tgz", - "integrity": "sha1-dgbK/2S7SzS3YFq3SVdM942Iawg=", + "postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "postcss": "5.2.18" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, - "postcss-selector-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-1.3.3.tgz", - "integrity": "sha1-0u4Z33pk+O8hwacchvfUg1yIwoE=", + "postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "dev": true, "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" } }, "postcss-value-parser": { @@ -7670,647 +7667,508 @@ "integrity": "sha512-HsOSgvFpsg0zCeC1dfSeu8JlPqAJcYslvj5hyJV2f7iKkFwrbcFE4J6OrZYJst9ibW+ujni/dy19wTUn05/eyQ==", "dev": true }, - "powerbi-visuals-package-validator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/powerbi-visuals-package-validator/-/powerbi-visuals-package-validator-1.0.1.tgz", - "integrity": "sha1-HStL/eihzcV4k5m2KjwIPiczHrY=", - "dev": true, - "requires": { - "del": "2.2.0", - "email-existence": "0.1.5", - "eslint": "3.19.0", - "eslint-plugin-no-unsafe-innerhtml": "1.0.16", - "eslint-plugin-scanjs-rules": "0.1.5", - "glob": "7.0.3", - "gulp": "3.9.0", - "gulp-cli": "1.2.2", - "gulp-debug": "3.1.0", - "gulp-eslint": "1.1.1", - "gulp-help": "1.6.1", - "gulp-stylelint": "0.2.0", - "gulp-stylelint-console-reporter": "0.1.0", - "gulp-tslint": "4.3.1", - "gulp-unzip": "0.2.0", - "gulp-using": "0.1.0", - "gulp-util": "3.0.7", - "image-size": "0.3.5", - "jsonschema": "1.0.1", - "request": "2.83.0", - "run-sequence": "1.1.2", - "tslint": "3.3.0", - "typescript": "1.7.5", - "yargs": "3.32.0" + "powerbi-visuals-api": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/powerbi-visuals-api/-/powerbi-visuals-api-2.1.0.tgz", + "integrity": "sha512-d8Y6KfV5Vac3UYzEsKlrwsOXLG4rZfVT34oB8vwPS+DG9/vxwCwa3mqid/87+7+5EXuPD7nkUhDQQxDYZYe7dw==", + "dev": true + }, + "powerbi-visuals-tools": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/powerbi-visuals-tools/-/powerbi-visuals-tools-3.0.2.tgz", + "integrity": "sha512-qX2X9Gpnp12iHrlLXdT4RumzgDD1DEDLtwO8dpsRjfO8TYEEgvtERhsVGR1ShbLuGK7e2b/uJTaKTL/zA+SBgQ==", + "dev": true, + "requires": { + "async": "2.6.1", + "chalk": "2.4.1", + "commander": "2.16.0", + "connect": "3.6.6", + "css-loader": "1.0.0", + "expose-loader": "0.7.5", + "extra-watch-webpack-plugin": "^1.0.3", + "friendly-errors-webpack-plugin": "^1.7.0", + "fs-extra": "7.0.0", + "json-loader": "0.5.7", + "jsonschema": "1.2.4", + "jszip": "3.1.5", + "less": "3.8.0", + "less-loader": "4.1.0", + "lodash": "4.17.10", + "powerbi-visuals-webpack-plugin": "^1.0.8", + "serve-static": "1.13.2", + "source-map-concat": "1.0.1", + "style-loader": "0.21.0", + "ts-loader": "4.5.0", + "tsc-watch": "1.0.26", + "typescript": "3.0.1", + "uglify-js": "3.4.6", + "uglifyjs-webpack-plugin": "1.2.7", + "uuid": "3.3.2", + "webpack": "4.16.3", + "webpack-bundle-analyzer": "^3.0.2", + "webpack-dev-server": "3.1.5" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "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": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "color-convert": "^1.9.0" } }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "dev": true, + "optional": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, - "requires": { - "hoek": "4.2.1" - } + "optional": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } + "optional": true }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "findup-sync": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz", - "integrity": "sha1-4KkKRQB1xJRm7lE3MgV1FLgeh4w=", - "dev": true, - "requires": { - "glob": "4.3.5" - }, - "dependencies": { - "glob": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", - "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "2.0.10", - "once": "1.4.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "1.1.8" - } - } - } + "commander": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "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 }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, + "optional": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - } + "mime-types": "^2.1.12" } }, - "glob": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz", - "integrity": "sha1-CqI1kxpKlqwT1g/6wvuHe9btT1g=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "gulp-cli": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-1.2.2.tgz", - "integrity": "sha1-c5Le9jFsbnk5pPKW8/VAFRrjonU=", - "dev": true, - "requires": { - "archy": "1.0.0", - "chalk": "1.1.3", - "fancy-log": "1.3.0", - "gulplog": "1.0.0", - "interpret": "1.1.0", - "liftoff": "2.5.0", - "lodash.isfunction": "3.0.9", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.sortby": "4.7.0", - "matchdep": "1.0.1", - "mute-stdout": "1.0.0", - "pretty-hrtime": "1.0.3", - "semver-greatest-satisfied-range": "1.1.0", - "tildify": "1.2.0", - "v8flags": "2.1.1", - "wreck": "6.3.0", - "yargs": "3.32.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "dev": true, + "optional": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "ajv": "^5.3.0", + "har-schema": "^2.0.0" } }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, + "optional": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.0", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "image-size": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.3.5.tgz", - "integrity": "sha1-gyQOqy+1sAsEqrjHSwRx6cunrYw=", - "dev": true - }, - "jsonschema": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.0.1.tgz", - "integrity": "sha1-XSmTcxHmXWo/Pvmx3qX4u5vx/XU=", - "dev": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "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 }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "less": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.8.0.tgz", + "integrity": "sha512-746DPDyL+Wsjo7h/Z3t+A3Mg/mpDTaxW4puZyLhCQJjWJJvHggN735orjuCLIYgo7jKqv1zWLiQrxkuUOg5oGA==", "dev": true, "requires": { - "mime-db": "1.33.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "requires": { - "punycode": "1.4.1" - } + "optional": true }, - "tslint": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-3.3.0.tgz", - "integrity": "sha1-t8/2m1NWyKP6KUfaV3RkAT9AMes=", + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, - "requires": { - "findup-sync": "0.2.1", - "glob": "6.0.4", - "optimist": "0.6.1", - "underscore.string": "3.1.1" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } + "optional": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.1.1" + "asap": "~2.0.3" } }, - "typescript": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-1.7.5.tgz", - "integrity": "sha1-qA/CMdm5Wv650Q8FiVYEKN0KBF4=", - "dev": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "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, + "optional": true }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, + "optional": true, "requires": { - "camelcase": "2.1.1", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "os-locale": "1.4.0", - "string-width": "1.0.2", - "window-size": "0.1.4", - "y18n": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } - } - } - }, - "powerbi-visuals-tools": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-tools/-/powerbi-visuals-tools-1.11.0.tgz", - "integrity": "sha1-dYaM+stfIO2y9hcvIVPNPcSiFsA=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.9.0", - "connect": "3.4.1", - "fs-extra": "0.28.0", - "jsonschema": "1.1.0", - "jszip": "3.0.0", - "less": "2.7.3", - "lodash": "4.11.1", - "powerbi-visuals-package-validator": "1.0.1", - "powerbi-visuals-utils-dataviewutils": "1.2.0", - "serve-static": "1.10.2", - "source-map-concat": "1.0.1", - "typescript": "2.3.3", - "uglify-js": "2.6.2", - "uuid": "3.0.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true }, - "connect": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", - "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "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": { - "debug": "2.2.0", - "finalhandler": "0.4.1", - "parseurl": "1.3.1", - "utils-merge": "1.0.0" + "has-flag": "^3.0.0" } }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, + "optional": true, "requires": { - "ms": "0.7.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" } }, - "finalhandler": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", - "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "ts-loader": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", + "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", "dev": true, "requires": { - "debug": "2.2.0", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "unpipe": "1.0.0" + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" } }, - "lodash": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.11.1.tgz", - "integrity": "sha1-oyEG644uyOgsJBYRQUdzyd8V+Lw=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "powerbi-visuals-utils-dataviewutils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-dataviewutils/-/powerbi-visuals-utils-dataviewutils-1.2.0.tgz", - "integrity": "sha1-WaHJgzVclYoj2ZAYlPZfFXUZMhM=", - "dev": true - }, - "typescript": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.3.tgz", - "integrity": "sha1-ljnzw7QBSOjKl/4IpR3RiRu2viI=", - "dev": true + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } }, "uglify-js": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", - "integrity": "sha1-9QvoikLNOWpiUdxSqzcvccwS/vA=", + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.6.tgz", + "integrity": "sha512-O1D7L6WcOzS1qW2ehopEm4cWm5yA6bQBozlks8jO8ODxYCy4zv+bR/la4Lwp01tpkYGNonnpXvUpYtrvSu8Yzg==", "dev": true, "requires": { - "async": "0.2.10", - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "commander": "~2.16.0", + "source-map": "~0.6.1" } }, "uuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", - "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "webpack": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.3.tgz", + "integrity": "sha512-3VcrVoFgzSz1IYgga71YpU3HO89Al5bSnDOj9RJQPsy+FNyI1sFsUyJITn3pktNuaRBlQT0usvKZE3GgkPGAIw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "ajv": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz", + "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==", + "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" + } + } + } } } }, "powerbi-visuals-utils-chartutils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-chartutils/-/powerbi-visuals-utils-chartutils-1.4.1.tgz", - "integrity": "sha1-6OiDCkHQQ9emiJt5H5CDH0UNxo4=", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-chartutils/-/powerbi-visuals-utils-chartutils-2.0.7.tgz", + "integrity": "sha512-g/3CzxgmL/mOKtcKIURgRve+3Gg0d6RBdL5RRGKPWnkuooajlC2uuajaFU6V0mTMDu+XfPgZBu8Abaav50Q+2Q==", "dev": true, "requires": { - "d3": "3.5.5", + "d3": "5.5.0", "globalize": "0.1.0-a2", - "powerbi-visuals-utils-formattingutils": "2.1.0", - "powerbi-visuals-utils-interactivityutils": "1.0.0", - "powerbi-visuals-utils-svgutils": "1.1.0", - "powerbi-visuals-utils-typeutils": "1.1.0" - }, - "dependencies": { - "powerbi-visuals-utils-interactivityutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-interactivityutils/-/powerbi-visuals-utils-interactivityutils-1.0.0.tgz", - "integrity": "sha1-6Y8jHixrF1hl9z3OyYO8is1vumI=", - "dev": true, - "requires": { - "d3": "3.5.5", - "powerbi-visuals-utils-svgutils": "1.1.0", - "powerbi-visuals-utils-typeutils": "1.1.0" - } - } + "powerbi-visuals-utils-formattingutils": "4.0.2", + "powerbi-visuals-utils-interactivityutils": "^5.0.1", + "powerbi-visuals-utils-svgutils": "2.0.2", + "powerbi-visuals-utils-typeutils": "2.0.1" } }, "powerbi-visuals-utils-colorutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-colorutils/-/powerbi-visuals-utils-colorutils-1.0.0.tgz", - "integrity": "sha1-16EZxrG4hOQ2Mos4UZM9mIS2ggg=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-colorutils/-/powerbi-visuals-utils-colorutils-2.0.2.tgz", + "integrity": "sha512-uLvFbnzTx4+Fe3y/xNMU8OnTgJXat6jTZeO6zD8Qw2voify4XAdoiFPI6fzDb0dI8lx5PZpj/JwxTlyrQZ9SaA==", "dev": true, "requires": { - "powerbi-visuals-utils-dataviewutils": "1.2.0", - "powerbi-visuals-utils-typeutils": "1.1.0" - }, - "dependencies": { - "powerbi-visuals-utils-dataviewutils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-dataviewutils/-/powerbi-visuals-utils-dataviewutils-1.2.0.tgz", - "integrity": "sha1-WaHJgzVclYoj2ZAYlPZfFXUZMhM=", - "dev": true - } + "powerbi-visuals-utils-dataviewutils": "2.0.1", + "powerbi-visuals-utils-typeutils": "2.0.1" } }, "powerbi-visuals-utils-dataviewutils": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-dataviewutils/-/powerbi-visuals-utils-dataviewutils-1.1.1.tgz", - "integrity": "sha1-ijzSrG//dHP5AMPGWrukvnb1zEs=", - "dev": true, - "requires": { - "lodash": "4.16.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-dataviewutils/-/powerbi-visuals-utils-dataviewutils-2.0.1.tgz", + "integrity": "sha512-kYifZl6mA7or88rlHcS1EHRlPA/rWxQPlV5IP/84f+ObGfFGfmOwHe4IGwzDjWtpKRsU6YzQtzq6MGybSaDdsg==", + "dev": true }, "powerbi-visuals-utils-formattingutils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-formattingutils/-/powerbi-visuals-utils-formattingutils-2.1.0.tgz", - "integrity": "sha1-mXmvDXEagPD2qe6NK8TBc1/p4Ys=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-formattingutils/-/powerbi-visuals-utils-formattingutils-4.0.2.tgz", + "integrity": "sha512-hfRj7MaKSU4avQupsMqKxGx2vDfChMDwIZNzI7olzG6Hx7z3lxj8BKoylsMWcRFGRv/VOFXu/ErGk3bw7f6vZg==", "dev": true, "requires": { - "d3": "3.5.5", "globalize": "0.1.0-a2", - "powerbi-visuals-utils-dataviewutils": "1.2.0", - "powerbi-visuals-utils-svgutils": "1.1.0", - "powerbi-visuals-utils-typeutils": "1.1.0" - }, - "dependencies": { - "powerbi-visuals-utils-dataviewutils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-dataviewutils/-/powerbi-visuals-utils-dataviewutils-1.2.0.tgz", - "integrity": "sha1-WaHJgzVclYoj2ZAYlPZfFXUZMhM=", - "dev": true - } + "powerbi-visuals-utils-dataviewutils": "2.0.1", + "powerbi-visuals-utils-typeutils": "2.0.1" } }, "powerbi-visuals-utils-interactivityutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-interactivityutils/-/powerbi-visuals-utils-interactivityutils-3.1.0.tgz", - "integrity": "sha1-LiPnHD1hDTZJ+AFRw/iE2yCmvls=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-interactivityutils/-/powerbi-visuals-utils-interactivityutils-5.0.1.tgz", + "integrity": "sha512-THfJEUaVCBiNq9MDYvRMhTFqO2+V834x3gA0IhiTjZnuKC9H9YCPuU/yczPpGMfj/veco8W+NOO+9Vomq1ebNg==", "dev": true, "requires": { - "d3": "3.5.5", - "powerbi-visuals-utils-svgutils": "1.1.0", - "powerbi-visuals-utils-typeutils": "1.1.0" + "d3": "5.5.0", + "powerbi-models": "1.0.3", + "powerbi-visuals-utils-svgutils": "2.0.2", + "powerbi-visuals-utils-typeutils": "2.0.1" } }, "powerbi-visuals-utils-svgutils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-svgutils/-/powerbi-visuals-utils-svgutils-1.1.0.tgz", - "integrity": "sha1-i6IsbvVmKkAnCbR3dTpFGTQiV+c=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-svgutils/-/powerbi-visuals-utils-svgutils-2.0.2.tgz", + "integrity": "sha512-jwm46ubzkcH34WYxkMGcWC3J78kpcM7UHUWnWFapmUlHX8ymeye4FvGdg+Hx498TKXnRFbUc83ktpQ0nKplQTA==", "dev": true, "requires": { - "d3": "3.5.5", - "powerbi-visuals-utils-typeutils": "1.1.0" + "d3": "5.5.0", + "powerbi-visuals-utils-testutils": "2.0.3", + "powerbi-visuals-utils-typeutils": "2.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.16.2", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", + "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", + "dev": true + }, + "powerbi-visuals-utils-testutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-testutils/-/powerbi-visuals-utils-testutils-2.0.3.tgz", + "integrity": "sha512-nSu6Bm9Gzro6HEbv/sw6Yk5SAOyRrNkHa0+pLFgO+ZlZvUnSrB/CWcMIKrHdr49gBn+/cOYzaL7KGYusgDMDKw==", + "dev": true, + "requires": { + "d3-array": "^1.2.1", + "d3-timer": "^1.0.7", + "lodash": "4.16.2" + } + } } }, "powerbi-visuals-utils-testutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-testutils/-/powerbi-visuals-utils-testutils-1.0.1.tgz", - "integrity": "sha1-hqOzU0eAQsQVsaDoFWxwdLfrvIs=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-testutils/-/powerbi-visuals-utils-testutils-2.0.4.tgz", + "integrity": "sha512-uhT6k3gMKhZoIMusuumg9GhM81uxZzvD4oRu43+V8tbg5quqQK+cu8dWtOlX1yRmzf7AY85UyhMvlsARjf1hWw==", "dev": true, "requires": { - "d3": "3.5.5", - "jasmine-jquery": "2.1.1", - "jquery": "3.1.1", - "lodash": "4.16.2" - }, - "dependencies": { - "jquery": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.1.1.tgz", - "integrity": "sha1-NHwcIcfgBBFeCk2jLOzgQfrTyKM=", - "dev": true - } + "d3-array": "^1.2.1", + "d3-timer": "^1.0.7" } }, "powerbi-visuals-utils-tooltiputils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-tooltiputils/-/powerbi-visuals-utils-tooltiputils-1.0.0.tgz", - "integrity": "sha1-fsLOnm9IGCv/Upzh8aDwc6zegIM=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-tooltiputils/-/powerbi-visuals-utils-tooltiputils-2.0.2.tgz", + "integrity": "sha512-gg8JZdFMFMJtjRMkscbvgXQRTjkO8k8xDlH8oC6mt2AHrmdxQrdVCNyAOnPzikgO34WtspxQ6v/Q3hI/WnJBjQ==", "dev": true, "requires": { - "d3": "3.5.5" + "d3": "5.5.0" } }, "powerbi-visuals-utils-typeutils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-typeutils/-/powerbi-visuals-utils-typeutils-1.1.0.tgz", - "integrity": "sha1-NHlC5YGHNwDaVe//UTamk6dt+bI=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/powerbi-visuals-utils-typeutils/-/powerbi-visuals-utils-typeutils-2.0.1.tgz", + "integrity": "sha512-gQPsDezASa/nO4x+fVkjFqZxTu/tJq7Y0cbM5V9ZuFRs01jjHZ7gwasKvuLgPrAu4fFh0oH7UeIcW9C2mktVHA==", "dev": true }, + "powerbi-visuals-webpack-plugin": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/powerbi-visuals-webpack-plugin/-/powerbi-visuals-webpack-plugin-1.0.8.tgz", + "integrity": "sha512-e7CiikyDBYVptIrpGmgQ5by86/YJXlt0R66OLkzG57BkUsyu8nIENKebq+mTdIc0k64XU9pXozWf8j7fA3Zsqg==", + "dev": true, + "requires": { + "base64-img": "1.0.4", + "chalk": "2.4.1", + "fs-extra": "6.0.1", + "jszip": "3.1.5", + "lodash": "^4.17.5" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -8323,16 +8181,10 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, "process-nextick-args": { @@ -8342,170 +8194,241 @@ "dev": true }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", "dev": true, "optional": true, "requires": { - "asap": "2.0.6" + "asap": "~1.0.0" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "dev": true, + "requires": { + "event-stream": "~3.3.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", "dev": true, "optional": true }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, - "qjobs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", - "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", - "dev": true - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "puppeteer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.5.0.tgz", + "integrity": "sha512-eELwFtFxL+uhmg4jPZOZXzSrPEYy4CaYQNbcchBbfxY+KjMpnv6XGf/aYWaQG49OTpfi2/DMziXtDM8XuJgoUA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.0", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^5.1.1" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", "dev": true, "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "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" - } - } + "ms": "^2.1.1" } }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "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 + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "dev": true, "requires": { - "is-buffer": "1.1.5" + "async-limiter": "~1.0.0" } } } }, - "range-parser": { + "qjobs": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "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 }, - "raw-body": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", - "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", - "dev": true, - "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.15", - "unpipe": "1.0.0" - } + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - } + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "dev": true }, - "rcfinder": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", - "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "lodash.clonedeep": "4.5.0" - }, - "dependencies": { - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - } + "safe-buffer": "^5.1.0" } }, - "rcloader": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.2.2.tgz", - "integrity": "sha1-WNIpi0YtC5v9ITPSoex0+9cFxxc=", + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "lodash.assign": "4.2.0", - "lodash.isobject": "3.0.2", - "lodash.merge": "4.6.1", - "rcfinder": "0.1.9" - }, - "dependencies": { - "lodash.merge": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", - "dev": true - } + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "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": { - "pinkie-promise": "2.0.1", - "readable-stream": "2.0.6" + "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-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "gather-stream": "1.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, "read-pkg": { @@ -8514,9 +8437,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.3.8", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -8525,22 +8448,22 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -8549,30 +8472,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.0.6", - "set-immediate-shim": "1.0.1" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "1.1.7" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "redent": { @@ -8581,19 +8484,21 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, - "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" - } + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true }, "regex-not": { "version": "1.0.2", @@ -8601,18 +8506,29 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "rc": "1.2.1", - "safe-buffer": "5.1.0" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -8621,77 +8537,48 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.1" + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" } }, "remap-istanbul": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.6.4.tgz", - "integrity": "sha1-rFUe/xqmQVBLTzGNAwPdph47tpU=", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.10.1.tgz", + "integrity": "sha512-gsNQXs5kJLhErICSyYhzVZ++C8LBW8dgwr874Y2QvzAUS75zBlD/juZgXs39nbYJ09fZDlX2AVLVJAY2jbFJoQ==", "dev": true, "requires": { - "amdefine": "1.0.0", - "gulp-util": "3.0.7", - "istanbul": "0.4.3", - "source-map": "0.5.6", + "amdefine": "^1.0.0", + "istanbul": "0.4.5", + "minimatch": "^3.0.3", + "plugin-error": "^0.1.2", + "source-map": "^0.6.1", "through2": "2.0.1" - }, - "dependencies": { - "amdefine": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", - "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=", - "dev": true - }, - "istanbul": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.3.tgz", - "integrity": "sha1-W3FO4K5JOsXvIEuZ84crzu9z1To=", - "dev": true, - "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "fileset": "0.2.1", - "handlebars": "4.0.10", - "js-yaml": "3.6.1", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.2.14", - "wordwrap": "1.0.0" - } - }, - "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" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } } }, "remove-trailing-separator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", - "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=", + "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.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -8706,59 +8593,49 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, "request": { "version": "2.75.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "resolved": "http://registry.npmjs.org/request/-/request-2.75.0.tgz", "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", "dev": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "bl": "1.1.2", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.0.0", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "node-uuid": "1.4.8", - "oauth-sign": "0.8.2", - "qs": "6.2.3", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.4.3" - } - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.0.0", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true }, "requires-port": { "version": "1.0.0", @@ -8772,20 +8649,19 @@ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "resolve-from": "^3.0.0" } }, "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, "resolve-url": { @@ -8794,68 +8670,56 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, "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 }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } + "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.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "once": "1.4.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "run-sequence": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.1.2.tgz", - "integrity": "sha1-lhoEDE5hMhJDBvquD1TzdQIBQms=", + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "chalk": "1.1.3" + "aproba": "^1.1.1" } }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", "dev": true }, "safe-buffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", - "integrity": "sha1-/kyEYDl/nqqqWOc75GJzQIpF4iM=", + "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": { @@ -8864,123 +8728,155 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "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-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "semver": "5.3.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" }, "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "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" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true } } }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "sver-compat": "1.5.0" + "semver": "^5.0.3" } }, "send": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", - "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", - "dev": true, - "requires": { - "debug": "2.2.0", - "depd": "1.1.0", - "destroy": "1.0.4", - "escape-html": "1.0.3", - "etag": "1.7.0", - "fresh": "0.3.0", - "http-errors": "1.3.1", - "mime": "1.3.4", - "ms": "0.7.1", - "on-finished": "2.3.0", - "range-parser": "1.0.3", - "statuses": "1.2.1" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "statuses": "1.2.1" - } - }, "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "range-parser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", - "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, "statuses": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", - "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true } } }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", "dev": true }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + } + }, "serve-static": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", - "integrity": "sha1-/rgA0OciEk3QsAMzFgwW6cqovLM=", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "escape-html": "1.0.3", - "parseurl": "1.3.1", - "send": "0.13.1" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", @@ -8993,10 +8889,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -9005,7 +8901,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -9017,26 +8913,34 @@ "dev": true }, "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "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": { @@ -9045,32 +8949,20 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, "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.2", - "debug": "2.6.7", - "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.1", - "use": "3.1.0" + "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": { "define-property": { @@ -9079,7 +8971,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -9088,64 +8980,13 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" - } - }, - "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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, - "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.2.2" - }, - "dependencies": { - "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" - } - } - } - }, - "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.1.0" + "is-extendable": "^0.1.0" } }, - "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==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } @@ -9156,9 +8997,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -9167,14 +9008,37 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "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" + } } } }, @@ -9184,7 +9048,18 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" + }, + "dependencies": { + "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" + } + } } }, "sntp": { @@ -9193,182 +9068,154 @@ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { - "hoek": "2.16.3" - } - }, - "socket.io": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.4.7.tgz", - "integrity": "sha1-krf3y4jFeX1NruJ5/oB12+bT+hw=", - "dev": true, - "requires": { - "debug": "2.2.0", - "engine.io": "1.6.10", - "has-binary": "0.1.7", - "socket.io-adapter": "0.4.0", - "socket.io-client": "1.4.6", - "socket.io-parser": "2.2.6" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } + "hoek": "2.x.x" } }, - "socket.io-adapter": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.4.0.tgz", - "integrity": "sha1-+5+CqxqmUpC/csNleVW5MKmRok8=", + "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": "2.2.0", - "socket.io-parser": "2.2.2" + "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": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "socket.io-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", - "integrity": "sha1-PXr2tkSX6Va32f53X5mXFgJ/lBc=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "benchmark": "1.0.0", - "component-emitter": "1.1.2", - "debug": "0.7.4", - "isarray": "0.0.1", - "json3": "3.2.6" - }, - "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - } + "ms": "2.0.0" } } } }, + "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": "1.4.6", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.4.6.tgz", - "integrity": "sha1-SbC6U379FbgpfIQBbmQuHHx1LD0=", + "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.0", - "debug": "2.2.0", - "engine.io-client": "1.6.9", - "has-binary": "0.1.7", + "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", - "parseuri": "0.0.4", - "socket.io-parser": "2.2.6", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", "to-array": "0.1.4" }, "dependencies": { - "component-emitter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.0.tgz", - "integrity": "sha1-zNETqGOI0GSC0D3j/H35hSa6jv4=", - "dev": true - }, "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "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": "0.7.1" + "ms": "2.0.0" } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true } } }, "socket.io-parser": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.6.tgz", - "integrity": "sha1-ON/WHfUNz4qx2eIJEyK/kCuii5k=", + "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": { - "benchmark": "1.0.0", - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" }, "dependencies": { "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "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": "0.7.1" + "ms": "2.0.0" } }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true - }, - "json3": { + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true } } }, + "sockjs-client": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "dev": true, + "requires": { + "debug": "^2.6.6", + "eventsource": "0.1.6", + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "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-concat": { @@ -9377,21 +9224,39 @@ "integrity": "sha1-B+ADHiyRVwRl2+v6nSpGg5AFk7M=", "dev": true, "requires": { - "source-map": "0.5.6", - "urix": "0.1.0" + "source-map": "^0.5.3", + "urix": "^0.1.0" + }, + "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 + } } }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "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-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { @@ -9400,87 +9265,117 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "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" + } }, - "specificity": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.1.6.tgz", - "integrity": "sha1-qlAQSPluaUhd3JXvn3pbd/ASMqo=", + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==", "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==", + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" } }, - "split2": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz", - "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=", + "spdy-transport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", "dev": true, "requires": { - "through2": "0.6.5" + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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 }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "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" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "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": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "safe-buffer": "~5.1.0" } } } }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "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" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -9488,19 +9383,20 @@ "dev": true }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -9511,10 +9407,19 @@ } } }, - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", "dev": true }, "static-extend": { @@ -9523,8 +9428,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -9533,99 +9438,182 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" - } - }, - "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.2.2" - }, - "dependencies": { - "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" - } - } + "is-descriptor": "^0.1.0" } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "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 }, - "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=", + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "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" - } - } + "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" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "safe-buffer": "~5.1.0" } - }, - "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 } } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", "dev": true, "requires": { - "duplexer": "0.1.1", - "through": "2.3.8" + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "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 + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", - "dev": true - }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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" + } + } } }, "string_decoder": { @@ -9634,21 +9622,10 @@ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, - "stringify-object": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.2.tgz", - "integrity": "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "2.0.1", - "is-obj": "1.0.1", - "is-regexp": "1.0.0" - } - }, "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", "dev": true }, "strip-ansi": { @@ -9657,7 +9634,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -9666,16 +9643,22 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "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" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -9684,87 +9667,14 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, - "stylehacks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-2.3.2.tgz", - "integrity": "sha1-ZMg+BDimjJ7fRJ6MVSp9mrYAmws=", + "style-loader": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", + "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", "dev": true, "requires": { - "browserslist": "1.7.7", - "chalk": "1.1.3", - "log-symbols": "1.0.2", - "minimist": "1.2.0", - "plur": "2.1.2", - "postcss": "5.2.18", - "postcss-reporter": "1.4.1", - "postcss-selector-parser": "2.2.3", - "read-file-stdin": "0.2.1", - "text-table": "0.2.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - } - } - }, - "stylelint": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-4.5.1.tgz", - "integrity": "sha1-6KoFY02s1J+3hYp2tlBRd8e4SV0=", - "dev": true, - "requires": { - "autoprefixer": "6.7.7", - "balanced-match": "0.3.0", - "chalk": "1.1.3", - "colorguard": "1.2.1", - "cosmiconfig": "1.1.0", - "doiuse": "2.6.0", - "execall": "1.0.0", - "get-stdin": "5.0.1", - "globby": "4.1.0", - "globjoin": "0.1.4", - "is-css-color-name": "0.1.3", - "lodash": "4.16.2", - "meow": "3.7.0", - "multimatch": "2.1.0", - "postcss": "5.2.18", - "postcss-reporter": "1.4.1", - "postcss-resolve-nested-selector": "0.1.1", - "postcss-scss": "0.1.9", - "postcss-selector-parser": "1.3.3", - "postcss-value-parser": "3.3.0", - "resolve-from": "2.0.0", - "specificity": "0.1.6", - "stylehacks": "2.3.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", - "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", - "dev": true - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - } + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" } }, "supports-color": { @@ -9773,81 +9683,24 @@ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "synesthesia": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/synesthesia/-/synesthesia-1.0.1.tgz", - "integrity": "sha1-XvlepUjA1cbm+btLDQcx3/hkp3c=", - "dev": true, - "requires": { - "css-color-names": "0.0.3" - } + "tapable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", + "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "dev": true }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.16.2", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "execa": "^0.7.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", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -9857,38 +9710,38 @@ "integrity": "sha1-OE51MU1J8y3hLuu4E2uOtrXVnak=", "dev": true, "requires": { - "readable-stream": "2.0.6", - "xtend": "4.0.1" - } - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" + "readable-stream": "~2.0.0", + "xtend": "~4.0.0" } }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", "dev": true }, "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, "tmp": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", - "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "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" + "os-tmpdir": "~1.0.2" } }, "to-array": { @@ -9897,6 +9750,12 @@ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -9909,7 +9768,18 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "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" + } + } } }, "to-regex": { @@ -9918,10 +9788,10 @@ "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" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -9930,36 +9800,19 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - }, - "dependencies": { - "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.2.2" - } - } + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -9972,58 +9825,227 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-loader": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.4.2.tgz", + "integrity": "sha512-Z3Y1a7A0KZZ1s/mAZkt74l1NAF7Y5xUhD1V9VB8/1eUlUOk8Qa/oo46tO2Uu5kQ3wXypOlbv77lLQySjXEDcdw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + } + } + }, + "ts-node": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.0.tgz", + "integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tsc-watch": { + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/tsc-watch/-/tsc-watch-1.0.26.tgz", + "integrity": "sha512-dNEic+kUspyw3b+/9wiur5ruw9Ke2cBLh7eE48GcCw+nuutvpuTBMP/F0fYOolU3IJLCbRVwVx5o0NY8lq7S0g==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "cross-spawn": "^5.1.0", + "ps-tree": "^1.1.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, "tslint": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.0.2.tgz", - "integrity": "sha1-1D8kwMH4Jt5/Ogl7t4CKi0Ml/qw=", - "dev": true, - "requires": { - "colors": "1.1.2", - "diff": "3.2.0", - "findup-sync": "0.3.0", - "glob": "7.1.2", - "optimist": "0.6.1", - "resolve": "1.1.7", - "underscore.string": "3.3.4", - "update-notifier": "1.0.3" + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" }, "dependencies": { - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "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": { - "glob": "5.0.15" - }, - "dependencies": { - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "sprintf-js": "1.0.3", - "util-deprecate": "1.0.2" + "path-parse": "^1.0.5" + } + }, + "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" } } } }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, "tunnel-agent": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", @@ -10043,17 +10065,17 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "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.15" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -10063,45 +10085,69 @@ "dev": true }, "typescript": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.1.4.tgz", - "integrity": "sha1-tTtp+4QRJqyx3Us5fSHauodXIlE=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.1.tgz", + "integrity": "sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg==", "dev": true }, "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { - "source-map": "0.5.6", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true + "uglifyjs-webpack-plugin": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", + "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "uglify-es": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.10.tgz", + "integrity": "sha512-rPzPisCzW68Okj1zNrfa2dR9uEm43SevDmpR6FChoZABFk9dANGnzzBMgHYUXI3609//63fnVkyQ1SQmAMyjww==", + "dev": true, + "requires": { + "commander": "~2.14.1", + "source-map": "~0.6.1" + } + } + } }, "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore.string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.1.1.tgz", - "integrity": "sha1-DN1rytDARv12Y9MF2KeFtdoQ8zU=", + "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": { @@ -10110,10 +10156,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -10122,7 +10168,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -10131,24 +10177,45 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } }, - "unique-stream": { + "unique-string": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "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": { @@ -10163,8 +10230,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -10173,9 +10240,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -10189,337 +10256,860 @@ } } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "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 + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", + "dev": true + }, + "url-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", + "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "dev": true, + "requires": { + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-extend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/utils-extend/-/utils-extend-1.0.8.tgz", + "integrity": "sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8=", + "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" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.14.0.tgz", + "integrity": "sha512-CgZPUwobJbQlZqpylDNtEazZLfNnGuyFmpk1dHIP2kFchtyMWB+W2wBKPImSnSQ2rbX/WZMKiQax+SZmlUXuQQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-module-context": "1.5.12", + "@webassemblyjs/wasm-edit": "1.5.12", + "@webassemblyjs/wasm-opt": "1.5.12", + "@webassemblyjs/wasm-parser": "1.5.12", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^3.7.1", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.12.tgz", + "integrity": "sha512-bmTBEKuuhSU6dC95QIW250xO769cdYGx9rWn3uBLTw2pUpud0Z5kVuMw9m9fqbNzGeuOU2HpyuZa+yUt2CTEDA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/wast-parser": "1.5.12", + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.12.tgz", + "integrity": "sha512-epTvkdwOIPpTE9edHS+V+shetYzpTbd91XOzUli1zAS0+NSgSe6ZsNggIqUNzhma1s4bN2f/m8c6B1NMdCERAg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.12.tgz", + "integrity": "sha512-Goxag86JvLq8ucHLXFNSLYzf9wrR+CJr37DsESTAzSnGoqDTgw5eqiXSQVd/D9Biih7+DIn8UIQCxMs8emRRwg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.12.tgz", + "integrity": "sha512-tJNUjttL5CxiiS/KLxT4/Zk0Nbl/poFhztFxktb46zoQEUWaGHR9ZJ0SnvE7DbFX5PY5JNJDMZ0Li4lm246fWw==", + "dev": true, + "requires": { + "debug": "^3.1.0" + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.12.tgz", + "integrity": "sha512-0FrJgiST+MQDMvPigzs+UIk1vslLIqGadkEWdn53Lr0NsUC2JbheG9QaO3Zf6ycK2JwsHiUpGaMFcHYXStTPMA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.12" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.12.tgz", + "integrity": "sha512-QBHZ45VPUJ7UyYKvUFoaxrSS9H5hbkC9U7tdWgFHmnTMutkXSEgDg2gZg3I/QTsiKOCIwx4qJUJwPd7J4D5CNQ==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.12.tgz", + "integrity": "sha512-SCXR8hPI4JOG3cdy9HAO8W5/VQ68YXG/Hfs7qDf1cd64zWuMNshyEour5NYnLMVkrrtc0XzfVS/MdeV94woFHA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.12.tgz", + "integrity": "sha512-0Gz5lQcyvElNVbOTKwjEmIxGwdWf+zpAW/WGzGo95B7IgMEzyyfZU+PrGHDwiSH9c0knol9G7smQnY0ljrSA6g==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.12.tgz", + "integrity": "sha512-ge/CKVKBGpiJhFN9PIOQ7sPtGYJhxm/mW1Y3SpG1L6XBunfRz0YnLjW3TmhcOEFozIVyODPS1HZ9f7VR3GBGow==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-buffer": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/wasm-gen": "1.5.12", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.12.tgz", + "integrity": "sha512-F+PEv9QBzPi1ThLBouUJbuxhEr+Sy/oua1ftXFKHiaYYS5Z9tKPvK/hgCxlSdq+RY4MSG15jU2JYb/K5pkoybg==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.12.tgz", + "integrity": "sha512-cCOx/LVGiWyCwVrVlvGmTdnwHzIP4+zflLjGkZxWpYCpdNax9krVIJh1Pm7O86Ox/c5PrJpbvZU1cZLxndlPEw==", + "dev": true, + "requires": { + "leb": "^0.3.0" + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.12.tgz", + "integrity": "sha512-FX8NYQMiTRU0TfK/tJVntsi9IEKsedSsna8qtsndWVE0x3zLndugiApxdNMIOoElBV9o4j0BUqR+iwU58QfPxQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.12.tgz", + "integrity": "sha512-r/oZAyC4EZl0ToOYJgvj+b0X6gVEKQMLT34pNNbtvWBehQOnaSXvVUA5FIYlH8ubWjFNAFqYaVGgQTjR1yuJdQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-buffer": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/helper-wasm-section": "1.5.12", + "@webassemblyjs/wasm-gen": "1.5.12", + "@webassemblyjs/wasm-opt": "1.5.12", + "@webassemblyjs/wasm-parser": "1.5.12", + "@webassemblyjs/wast-printer": "1.5.12", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.12.tgz", + "integrity": "sha512-LTu+cr1YRxGGiVIXWhei/35lXXEwTnQU18x4V/gE+qCSJN21QcVTMjJuasTUh8WtmBZtOlqJbOQIeN7fGnHWhg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/ieee754": "1.5.12", + "@webassemblyjs/leb128": "1.5.12", + "@webassemblyjs/utf8": "1.5.12" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.12.tgz", + "integrity": "sha512-LBwG5KPA9u/uigZVyTsDpS3CVxx3AePCnTItVL+OPkRCp5LqmLsOp4a3/c5CQE0Lecm0Ss9hjUTDcbYFZkXlfQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-buffer": "1.5.12", + "@webassemblyjs/wasm-gen": "1.5.12", + "@webassemblyjs/wasm-parser": "1.5.12", + "debug": "^3.1.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.12.tgz", + "integrity": "sha512-xset3+1AtoFYEfMg30nzCGBnhKmTBzbIKvMyLhqJT06TvYV+kA884AOUpUvhSmP6XPF3G+HVZPm/PbCGxH4/VQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/helper-api-error": "1.5.12", + "@webassemblyjs/helper-wasm-bytecode": "1.5.12", + "@webassemblyjs/ieee754": "1.5.12", + "@webassemblyjs/leb128": "1.5.12", + "@webassemblyjs/utf8": "1.5.12" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.12.tgz", + "integrity": "sha512-QWUtzhvfY7Ue9GlJ3HeOB6w5g9vNYUUnG+Y96TWPkFHJTxZlcvGfNrUoACCw6eDb9gKaHrjt77aPq41a7y8svg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/floating-point-hex-parser": "1.5.12", + "@webassemblyjs/helper-api-error": "1.5.12", + "@webassemblyjs/helper-code-frame": "1.5.12", + "@webassemblyjs/helper-fsm": "1.5.12", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.12.tgz", + "integrity": "sha512-XF9RTeckFgDyl196uRKZWHFFfbkzsMK96QTXp+TC0R9gsV9DMiDGMSIllgy/WdrZ3y3dsQp4fTA5r4GoaOBchA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.12", + "@webassemblyjs/wast-parser": "1.5.12", + "long": "^3.2.0" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "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" + } + }, + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "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 }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 + }, + "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 } } }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true - }, - "unzipper": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.7.6.tgz", - "integrity": "sha1-/ntGYW6hJDWYgDbeube7v9x3gG4=", - "dev": true, - "requires": { - "binary": "0.3.0", - "bluebird": "3.4.7", - "buffer-indexof-polyfill": "1.0.1", - "duplexer2": "0.1.4", - "fstream": "1.0.11", - "listenercount": "1.0.1", - "readable-stream": "2.1.5", - "setimmediate": "1.0.5" + "webpack-bundle-analyzer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.2.tgz", + "integrity": "sha512-cZG4wSQtKrSpk5RJ33dxiaAyo8bP0V+JvycAyIDFEiDIhw4LHhhVKhn40YT1w6TR9E4scHA00LnIoBtTA13Mow==", + "dev": true, + "requires": { + "acorn": "^5.7.3", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" }, "dependencies": { - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "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": { - "readable-stream": "2.1.5" + "color-convert": "^1.9.0" } }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "ws": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.0.0.tgz", + "integrity": "sha512-c2UlYcAZp1VS8AORtpq6y4RJIkJ9dQz18W32SpR/qXGfLDZ2jU4y4wKvvZwqbi7U6gxFQTeE+urMbXU/tsDy4w==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" } } } }, - "update-notifier": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", - "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", - "dev": true, - "requires": { - "boxen": "0.6.0", - "chalk": "1.1.3", - "configstore": "2.1.0", - "is-npm": "1.0.0", - "latest-version": "2.0.0", - "lazy-req": "1.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "2.0.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - }, - "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "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 - } - } - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "useragent": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.1.13.tgz", - "integrity": "sha1-u6Q+iqJNXOuDwpN0c+EC4h33TBA=", - "dev": true, - "requires": { - "lru-cache": "2.2.4", - "tmp": "0.0.28" - } - }, - "utf8": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", - "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=", - "dev": true - }, - "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.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "1.0.2", - "clone-stats": "0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "requires": { - "defaults": "1.0.3", - "glob-stream": "3.1.18", - "glob-watcher": "0.0.6", - "graceful-fs": "3.0.11", - "mkdirp": "0.5.1", - "strip-bom": "1.0.0", - "through2": "0.6.5", - "vinyl": "0.4.6" + "webpack-dev-middleware": { + "version": "2.0.6", + "resolved": "http://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz", + "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==", + "dev": true, + "requires": { + "loud-rejection": "^1.6.0", + "memory-fs": "~0.4.1", + "mime": "^2.1.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "url-join": "^2.0.2", + "webpack-log": "^1.0.1" + } + }, + "webpack-dev-server": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.5.tgz", + "integrity": "sha512-LVHg+EPwZLHIlfvokSTgtJqO/vI5CQi89fASb5JEDtVMDjY0yuIEqPPdMiKaBJIB/Ab7v/UN/sYZ7WsZvntQKw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^1.0.0", + "internal-ip": "1.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.1.5", + "spdy": "^3.4.1", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "webpack-dev-middleware": "3.1.3", + "webpack-log": "^1.1.2", + "yargs": "11.0.0" }, "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "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": { - "natives": "1.1.1" + "has-flag": "^3.0.0" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", "dev": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "webpack-dev-middleware": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz", + "integrity": "sha512-I6Mmy/QjWU/kXwCSFGaiOoL5YEQIVmbb0o45xMoCyQAg/mClqZVTcsX327sPfekDyJWpCxb+04whNyLOIxpJdQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "loud-rejection": "^1.6.0", + "memory-fs": "~0.4.1", + "mime": "^2.1.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "url-join": "^4.0.0", + "webpack-log": "^1.0.1" } - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + } + } + }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "loglevelnext": "^1.0.1", + "uuid": "^3.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "first-chunk-stream": "1.0.0", - "is-utf8": "0.2.1" + "color-convert": "^1.9.0" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "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": { - "clone": "0.2.0", - "clone-stats": "0.0.1" + "has-flag": "^3.0.0" } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true } } }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "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" + "isexe": "^2.0.0" } }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, "widest-line": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^2.1.1" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } } }, "wrappy": { @@ -10528,71 +11118,38 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "wreck": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/wreck/-/wreck-6.3.0.tgz", - "integrity": "sha1-oTaXafB7u2LWo3gzanhx/Hc8dAs=", - "dev": true, - "requires": { - "boom": "2.10.1", - "hoek": "2.16.3" - } - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "0.5.1" - } - }, "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=", - "dev": true - }, "ws": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz", - "integrity": "sha1-fQsqLljN3YGQOcKcneZQReGzEOk=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, "xdg-basedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "dev": true, - "requires": { - "os-homedir": "1.0.2" - } - }, - "xml-escape": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.0.0.tgz", - "integrity": "sha1-AJY9aXsq3wwYXE4E5zF0upsojrI=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, "xmlhttprequest-ssl": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz", - "integrity": "sha1-O3dB/qSoZnWXbpCNKW1ERZYfqmc=", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, "xtend": { @@ -10602,36 +11159,91 @@ "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } } }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true } } } diff --git a/package.json b/package.json index 47f48e7..6052450 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "powerbi-visuals-mekkochart", - "version": "2.1.2", + "version": "3.0.0", "description": "A Mekko chart is a mix of a 100% stacked column chart and a 100% stacked bar chart combined into one view. Similar to a treemap, the dimensional values are represented by length and width of each rectangle. The width of a column is proportional to the total value of the column.", "repository": { "type": "git", @@ -10,11 +10,10 @@ "powerbi-visuals" ], "scripts": { - "postinstall": "pbiviz update 1.11.0", - "typings": "typings", "pbiviz": "pbiviz", "start": "pbiviz start", - "package": "pbiviz package", + "cert": "pbiviz --create-cert", + "package": "pbiviz package --resources", "lint": "node node_modules/tslint/bin/tslint \"+(src|test)/**/*.ts\"", "pretest": "pbiviz package --resources --no-minify --no-pbiviz --no-plugin", "test": "karma start" @@ -29,35 +28,51 @@ }, "homepage": "https://github.com/Microsoft/powerbi-visuals-mekkochart#readme", "devDependencies": { - "@types/jquery": "2.0.41", + "@types/d3": "5.0.0", "@types/jasmine": "2.5.37", - "@types/d3": "3.5.36", - "@types/lodash": "4.14.50", "@types/jasmine-jquery": "1.5.28", + "@types/jquery": "2.0.41", + "@types/karma": "1.7.3", + "@types/lodash": "4.14.109", + "@types/webpack": "4.4.4", "coveralls": "2.11.15", - "d3": "3.5.5", + "css-loader": "1.0.0", + "d3": "5.5.0", + "del-cli": "1.1.0", + "istanbul-reports": "2.0.0", "jasmine": "2.5.2", "jasmine-jquery": "2.1.1", "jquery": "3.2.1", - "karma": "1.3.0", - "karma-chrome-launcher": "2.0.0", - "karma-coverage": "1.1.1", - "karma-jasmine": "1.0.2", - "karma-remap-istanbul": "0.4.0", - "karma-sourcemap-loader": "0.3.7", - "karma-typescript-preprocessor": "0.3.0", - "lodash": "4.16.2", - "powerbi-visuals-tools": "1.11.2", - "powerbi-visuals-utils-colorutils": "1.0.0", - "powerbi-visuals-utils-dataviewutils": "1.1.1", - "powerbi-visuals-utils-chartutils": "1.4.1", - "powerbi-visuals-utils-formattingutils": "2.1.0", - "powerbi-visuals-utils-interactivityutils": "3.1.0", + "karma": "3.0.0", + "karma-chrome-launcher": "2.2.0", + "karma-coverage": "1.1.2", + "karma-coverage-istanbul-reporter": "^2.0.4", + "karma-jasmine": "1.1.2", + "karma-sourcemap-loader": "^0.3.7", + "karma-typescript": "3.0.13", + "karma-typescript-preprocessor": "0.3.1", + "karma-webpack": "3.0.0", + "less": "2.1.1", + "less-loader": "4.1.0", + "lodash.isequal": "4.5.0", "powerbi-models": "1.0.3", - "powerbi-visuals-utils-svgutils": "1.1.0", - "powerbi-visuals-utils-testutils": "1.2.1", - "powerbi-visuals-utils-tooltiputils": "1.0.0", - "powerbi-visuals-utils-typeutils": "1.1.0", - "tslint": "4.0.2" + "powerbi-visuals-api": "^2.1.0", + "powerbi-visuals-tools": "3.0.2", + "powerbi-visuals-utils-chartutils": "2.0.7", + "powerbi-visuals-utils-colorutils": "2.0.2", + "powerbi-visuals-utils-dataviewutils": "2.0.1", + "powerbi-visuals-utils-formattingutils": "4.0.2", + "powerbi-visuals-utils-interactivityutils": "^5.0.1", + "powerbi-visuals-utils-svgutils": "^2.0.2", + "powerbi-visuals-utils-testutils": "^2.0.4", + "powerbi-visuals-utils-tooltiputils": "2.0.2", + "powerbi-visuals-utils-typeutils": "2.0.1", + "puppeteer": "1.5.0", + "style-loader": "0.21.0", + "ts-loader": "4.4.2", + "ts-node": "7.0.0", + "tslint": "^5.11.0", + "typescript": "3.0.1", + "webpack": "4.14.0" } } diff --git a/pbiviz.json b/pbiviz.json index d48bbac..669a0a4 100644 --- a/pbiviz.json +++ b/pbiviz.json @@ -1,15 +1,15 @@ { "visual": { "name": "MekkoChart", - "displayName": "Mekko Chart 2.1.2", + "displayName": "Mekko Chart 3.0.0", "guid": "MekkoChart1449744733038", "visualClassName": "MekkoChart", - "version": "2.1.2", + "version": "3.0.0", "description": "A Mekko chart is a mix of a 100% stacked column chart and a 100% stacked bar chart combined into one view. Similar to a treemap, the dimensional values are represented by length and width of each rectangle. The width of a column is proportional to the total value of the column.", "supportUrl": "http://community.powerbi.com", "gitHubUrl": "https://github.com/Microsoft/powerbi-visuals-mekkochart" }, - "apiVersion": "1.11.0", + "apiVersion": "2.1.0", "author": { "name": "Microsoft", "email": "pbicvsupport@microsoft.com" @@ -17,21 +17,6 @@ "assets": { "icon": "assets/icon.png" }, - "externalJS": [ - "node_modules/jquery/dist/jquery.min.js", - "node_modules/d3/d3.min.js", - "node_modules/lodash/lodash.min.js", - "node_modules/globalize/lib/globalize.js", - "node_modules/globalize/lib/cultures/globalize.culture.en-US.js", - "node_modules/powerbi-visuals-utils-dataviewutils/lib/index.js", - "node_modules/powerbi-visuals-utils-typeutils/lib/index.js", - "node_modules/powerbi-visuals-utils-svgutils/lib/index.js", - "node_modules/powerbi-visuals-utils-formattingutils/lib/index.js", - "node_modules/powerbi-visuals-utils-interactivityutils/lib/index.js", - "node_modules/powerbi-visuals-utils-chartutils/lib/index.js", - "node_modules/powerbi-visuals-utils-tooltiputils/lib/index.js", - "node_modules/powerbi-visuals-utils-colorutils/lib/index.js" - ], "style": "style/visual.less", "capabilities": "capabilities.json" -} +} \ No newline at end of file diff --git a/src/axis/position.ts b/src/axis/position.ts index 828a77a..bf3c4a1 100644 --- a/src/axis/position.ts +++ b/src/axis/position.ts @@ -24,7 +24,5 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.axis.position { export const left: string = "Left"; export const right: string = "Right"; -} diff --git a/src/axis/type.ts b/src/axis/type.ts index 24f5191..6263e21 100644 --- a/src/axis/type.ts +++ b/src/axis/type.ts @@ -24,8 +24,6 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.axis.type { export const scalar: string = "Scalar"; export const categorical: string = "Categorical"; export const both: string = "Both"; -} diff --git a/src/axis/utils.ts b/src/axis/utils.ts index fc15d2b..08fc382 100644 --- a/src/axis/utils.ts +++ b/src/axis/utils.ts @@ -23,18 +23,27 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - -module powerbi.extensibility.visual.axis.utils { - // powerbi.extensibility.utils.svg - import IMargin = powerbi.extensibility.utils.svg.IMargin; - - // powerbi.extensibility.utils.chart - import AxisHelper = powerbi.extensibility.utils.chart.axis; - import axisScale = AxisHelper.scale; - import IAxisProperties = AxisHelper.IAxisProperties; - - // powerbi.extensibility.utils.formatting - import valueFormatter = powerbi.extensibility.utils.formatting.valueFormatter; +import powerbi from "powerbi-visuals-api"; +import { IMargin } from "powerbi-visuals-utils-svgutils"; +import { + axis as AxisHelper, + axisInterfaces, + axisScale, + axisStyle +} from "powerbi-visuals-utils-chartutils"; +import { valueFormatter as vf } from "powerbi-visuals-utils-formattingutils"; +import valueFormatter = vf.valueFormatter; + +import IAxisProperties = axisInterfaces.IAxisProperties; +import DataViewObject = powerbi.DataViewObject; +import IViewport = powerbi.IViewport; +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; + +import * as columnChart from "./../columnChart/columnChartVisual"; +import { + MekkoCalculateScaleAndDomainOptions, + MekkoChartAxisProperties, +} from "./../dataInterfaces"; export interface AxesLabels { xAxisLabel: string; @@ -171,4 +180,3 @@ module powerbi.extensibility.visual.axis.utils { yAxisLabel }; } -} diff --git a/src/behavior/customVisualBehavior.ts b/src/behavior/customVisualBehavior.ts index 1441973..698e376 100644 --- a/src/behavior/customVisualBehavior.ts +++ b/src/behavior/customVisualBehavior.ts @@ -1,60 +1,62 @@ /* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -module powerbi.extensibility.visual.behavior { - // interactivity - import ISelectionHandler = powerbi.extensibility.utils.interactivity.ISelectionHandler; - import IInteractiveBehavior = powerbi.extensibility.utils.interactivity.IInteractiveBehavior; - - export class CustomVisualBehavior implements IInteractiveBehavior { - private behaviors: IInteractiveBehavior[]; - - constructor(behaviors: IInteractiveBehavior[] = []) { - this.behaviors = behaviors; - } - - public bindEvents( - options: CustomVisualBehaviorOptions, - selectionHandler: ISelectionHandler): void { - - this.behaviors.forEach((behavior: IInteractiveBehavior, behaviorIndex: number) => { - behavior.bindEvents( - options.layerOptions[behaviorIndex], - selectionHandler); - }); - - options.clearCatcher.on("click", () => { - selectionHandler.handleClearSelection(); - }); - } - - public renderSelection(hasSelection: boolean): void { - this.behaviors.forEach((behavior: IInteractiveBehavior) => { - behavior.renderSelection(hasSelection); - }); - } +* Power BI Visualizations +* +* Copyright (c) Microsoft Corporation +* All rights reserved. +* MIT License +* +* 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. +*/ +import { + interactivityService, +} from "powerbi-visuals-utils-interactivityutils"; + +import { CustomVisualBehaviorOptions } from "./customVisualBehaviorOptions"; + +import ISelectionHandler = interactivityService.ISelectionHandler; +import IInteractiveBehavior = interactivityService.IInteractiveBehavior; + +export class CustomVisualBehavior implements IInteractiveBehavior { + private behaviors: IInteractiveBehavior[]; + + constructor(behaviors: IInteractiveBehavior[] = []) { + this.behaviors = behaviors; + } + + public bindEvents( + options: CustomVisualBehaviorOptions, + selectionHandler: ISelectionHandler): void { + + this.behaviors.forEach((behavior: IInteractiveBehavior, behaviorIndex: number) => { + behavior.bindEvents( + options.layerOptions[behaviorIndex], + selectionHandler); + }); + + options.clearCatcher.on("click", () => { + selectionHandler.handleClearSelection(); + }); + } + + public renderSelection(hasSelection: boolean): void { + this.behaviors.forEach((behavior: IInteractiveBehavior) => { + behavior.renderSelection(hasSelection); + }); } } diff --git a/src/behavior/customVisualBehaviorOptions.ts b/src/behavior/customVisualBehaviorOptions.ts index de06328..1345f4f 100644 --- a/src/behavior/customVisualBehaviorOptions.ts +++ b/src/behavior/customVisualBehaviorOptions.ts @@ -24,12 +24,10 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.behavior { - // d3 - import Selection = d3.Selection; +// d3 +import Selection = d3.Selection; - export interface CustomVisualBehaviorOptions { - layerOptions: any[]; - clearCatcher: Selection; - } +export interface CustomVisualBehaviorOptions { + layerOptions: any[]; + clearCatcher: Selection; } diff --git a/src/behavior/visualBehavior.ts b/src/behavior/visualBehavior.ts index b7cbb49..6da1d17 100644 --- a/src/behavior/visualBehavior.ts +++ b/src/behavior/visualBehavior.ts @@ -1,83 +1,89 @@ /* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -module powerbi.extensibility.visual.behavior { - // d3 - import Selection = d3.Selection; - - // powerbi.extensibility.utils.interactivity - import ISelectionHandler = powerbi.extensibility.utils.interactivity.ISelectionHandler; - import interactivityUtils = powerbi.extensibility.utils.interactivity.interactivityUtils; - import SelectableDataPoint = powerbi.extensibility.utils.interactivity.SelectableDataPoint; - import IInteractiveBehavior = powerbi.extensibility.utils.interactivity.IInteractiveBehavior; - - export class VisualBehavior implements IInteractiveBehavior { - private options: VisualBehaviorOptions; - - public bindEvents( - options: VisualBehaviorOptions, - selectionHandler: ISelectionHandler): void { - - this.options = options; - - const eventGroup: Selection = options.eventGroup; - - eventGroup.on("click", () => { - const dataOfTheLastEvent: SelectableDataPoint = VisualBehavior.getDatumForLastInputEvent(); - - selectionHandler.handleSelection( - dataOfTheLastEvent, - (d3.event as MouseEvent).ctrlKey); - }); - - eventGroup.on("contextmenu", () => { - const mouseEvent: MouseEvent = d3.event as MouseEvent; - - if (mouseEvent.ctrlKey) { - return; - } - - mouseEvent.preventDefault(); - }); - } - - public renderSelection(hasSelection: boolean): void { - this.options.bars.style("fill-opacity", (dataPoint: MekkoChartColumnDataPoint) => { - return utils.getFillOpacity( - dataPoint.selected, - dataPoint.highlight, - !dataPoint.highlight && hasSelection, - !dataPoint.selected && this.options.hasHighlights); - }); - } - - private static getDatumForLastInputEvent(): SelectableDataPoint { - const target: EventTarget = (d3.event as MouseEvent).target; - - return d3.select(target).datum(); - } +* Power BI Visualizations +* +* Copyright (c) Microsoft Corporation +* All rights reserved. +* MIT License +* +* 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. +*/ + +import { + interactivityService, +} from "powerbi-visuals-utils-interactivityutils"; +import { Selection, select } from "d3-selection"; +import { MekkoChartColumnDataPoint } from "./../dataInterfaces"; + +import { VisualBehaviorOptions } from "./visualBehaviorOptions"; + +import * as utils from "./../utils"; + + +// powerbi.extensibility.utils.interactivity +import ISelectionHandler = interactivityService.ISelectionHandler; +import IInteractiveBehavior = interactivityService.IInteractiveBehavior; +import SelectableDataPoint = interactivityService.SelectableDataPoint; + +const getEvent = () => require("d3-selection").event; + +export class VisualBehavior implements IInteractiveBehavior { + private options: VisualBehaviorOptions; + + public bindEvents( + options: VisualBehaviorOptions, + selectionHandler: ISelectionHandler): void { + + this.options = options; + + const eventGroup: Selection = options.eventGroup; + + eventGroup.on("click", function () { + const dataOfTheLastEvent: SelectableDataPoint = VisualBehavior.getDatumForLastInputEvent(); + + selectionHandler.handleSelection( + dataOfTheLastEvent, + (getEvent() as MouseEvent).ctrlKey); + }); + + eventGroup.on("contextmenu", function () { + const mouseEvent: MouseEvent = getEvent() as MouseEvent; + + if (mouseEvent.ctrlKey) { + return; + } + + mouseEvent.preventDefault(); + }); + } + + public renderSelection(hasSelection: boolean): void { + this.options.bars.style("fill-opacity", (dataPoint: MekkoChartColumnDataPoint) => { + return utils.getFillOpacity( + dataPoint.selected, + dataPoint.highlight, + !dataPoint.highlight && hasSelection, + !dataPoint.selected && this.options.hasHighlights); + }); + } + + private static getDatumForLastInputEvent(): SelectableDataPoint { + const target: EventTarget = (getEvent() as MouseEvent).target; + return select((target)).datum() as any; } } diff --git a/src/behavior/visualBehaviorOptions.ts b/src/behavior/visualBehaviorOptions.ts index 7a90a30..321619c 100644 --- a/src/behavior/visualBehaviorOptions.ts +++ b/src/behavior/visualBehaviorOptions.ts @@ -1,44 +1,45 @@ /* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ +* Power BI Visualizations +* +* Copyright (c) Microsoft Corporation +* All rights reserved. +* MIT License +* +* 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. +*/ -module powerbi.extensibility.visual.behavior { - // d3 - import Selection = d3.Selection; +import powerbi from "powerbi-visuals-api"; +import { interactivityService } from "powerbi-visuals-utils-interactivityutils"; +import { Selection } from "d3-selection"; +import { MekkoChartAxisOptions } from "./../dataInterfaces"; - // powerbi.extensibility.utils.interactivity - import SelectableDataPoint = powerbi.extensibility.utils.interactivity.SelectableDataPoint; +// powerbi.extensibility.utils.interactivity +import SelectableDataPoint = interactivityService.SelectableDataPoint; +import IViewport = powerbi.IViewport; - export interface VisualBehaviorOptions { - dataPoints: SelectableDataPoint[]; - bars: Selection; - eventGroup: Selection; - mainGraphicsContext: Selection; - hasHighlights: boolean; - viewport: IViewport; - axisOptions: MekkoChartAxisOptions; - showLabel: boolean; - } +export interface VisualBehaviorOptions { + dataPoints: SelectableDataPoint[]; + bars: Selection; + eventGroup: Selection; + mainGraphicsContext: Selection; + hasHighlights: boolean; + viewport: IViewport; + axisOptions: MekkoChartAxisOptions; + showLabel: boolean; } diff --git a/src/columnChart/baseColumnChart.ts b/src/columnChart/baseColumnChart.ts index 726eb89..ae6827f 100644 --- a/src/columnChart/baseColumnChart.ts +++ b/src/columnChart/baseColumnChart.ts @@ -23,449 +23,578 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +import powerbi from "powerbi-visuals-api"; +import { + ColorHelper +} + from "powerbi-visuals-utils-colorutils"; +import { + converterHelper as ch, + dataViewObjects +} + from "powerbi-visuals-utils-dataviewutils"; -module powerbi.extensibility.visual.columnChart { - // powerbi.visuals - import ISelectionId = powerbi.visuals.ISelectionId; - import createLinearColorScale = powerbi.extensibility.utils.color.createLinearColorScale; +import converterHelper = ch.converterHelper; - // d3 - import Selection = d3.Selection; - import LinearScale = d3.scale.Linear; +import DataViewObjects = dataViewObjects.DataViewObjects; - // powerbi - import IDataViewObjects = powerbi.DataViewObjects; +import { + IMargin, + CssConstants, - // powerbi.extensibility.utils.dataview - import converterHelper = powerbi.extensibility.utils.dataview.converterHelper; - import DataViewObjects = powerbi.extensibility.utils.dataview.DataViewObjects; +} + from "powerbi-visuals-utils-svgutils"; +import { + axis as AxisHelper, + axisInterfaces, + legendInterfaces, + dataLabelUtils, + dataLabelInterfaces +} + from "powerbi-visuals-utils-chartutils"; - // powerbi.extensibility.utils.svg - import IMargin = powerbi.extensibility.utils.svg.IMargin; - import ClassAndSelector = powerbi.extensibility.utils.svg.CssConstants.ClassAndSelector; - import createClassAndSelector = powerbi.extensibility.utils.svg.CssConstants.createClassAndSelector; +import { + prototype as Prototype, + valueType, + enumExtensions, + arrayExtensions +} + from "powerbi-visuals-utils-typeutils"; +import { + interactivityService +} + from "powerbi-visuals-utils-interactivityutils"; +import { + valueFormatter as vf, + displayUnitSystemType +} + from "powerbi-visuals-utils-formattingutils"; - // powerbi.extensibility.utils.chart - import AxisHelper = powerbi.extensibility.utils.chart.axis; - import IAxisProperties = AxisHelper.IAxisProperties; +import { + TooltipEventArgs, + ITooltipServiceWrapper, + TooltipEnabledDataPoint, + createTooltipServiceWrapper +} + from "powerbi-visuals-utils-tooltiputils"; + +import { + MekkoColumnChartData, + IMekkoChartVisualHost, + MekkoChartConstructorOptions, + MekkoChartVisualInitOptions, + MekkoCalculateScaleAndDomainOptions, + MekkoChartCategoryLayout, + MekkoBorderSettings, + MekkoSeriesSortSettings, + MekkoLegendSortSettings, + MekkoXAxisLabelsSettings, + MekkoCategoryColorSettings, + MekkoDataPointSettings, + LegendSeriesInfo, + MekkoLegendDataPoint, + MekkoDataPoints, + MekkoChartSeries, + ICategoryValuesCollection, + ValueMultiplers, + MekkoVisualRenderResult, + MekkoChartDrawInfo, + MekkoCategoryProperties, + MekkoChartLabelSettings, + MekkoChartLabelSettingsOptions, + MekkoChartColumnDataPoint, + MekkoColumnChartContext, + MekkoChartBaseData, + MekkoChartConstructorBaseOptions +} from "./../dataInterfaces"; + +import * as axisUtils from "./../axis/utils"; + +import VisualDataLabelsSettings = dataLabelInterfaces.VisualDataLabelsSettings; +import DisplayUnitSystemType = displayUnitSystemType.DisplayUnitSystemType; + +import { max, sum } from "d3-array"; +import { ScaleLinear as LinearScale, scaleLinear } from "d3-scale"; +import { select, Selection } from "d3-selection"; + +import { MekkoChart } from "./../visual"; + +import * as formattingUtils from "./../formattingUtils"; +import * as converterStrategy from "./../converterStrategy/baseConverterStrategy"; +import * as visualStrategy from "./../visualStrategy/visualStrategy"; +import * as baseVisualStrategy from "./../visualStrategy/baseVisualStrategy"; +import { IColumnChart, } from "./columnChartVisual"; + +import { MekkoVisualChartType, flagStacked, flagBar } from "./../visualChartType"; - // powerbi.extensibility.utils.type - import Prototype = powerbi.extensibility.utils.type.Prototype; - import ValueType = powerbi.extensibility.utils.type.ValueType; - import EnumExtensions = powerbi.extensibility.utils.type.EnumExtensions; - import ArrayExtensions = powerbi.extensibility.utils.type.ArrayExtensions; +import { RoleNames, } from "./../roleNames"; - // powerbi.extensibility.utils.interactivity - import LegendIcon = powerbi.extensibility.utils.chart.legend.LegendIcon; - import ILegendData = powerbi.extensibility.utils.chart.legend.LegendData; - import dataLabelUtils = powerbi.extensibility.utils.chart.dataLabel.utils; - import LegendDataPoint = powerbi.extensibility.utils.chart.legend.LegendDataPoint; - import DataLabelObject = powerbi.extensibility.utils.chart.dataLabel.DataLabelObject; - import IInteractivityService = powerbi.extensibility.utils.interactivity.IInteractivityService; - import VisualDataLabelsSettings = powerbi.extensibility.utils.chart.dataLabel.VisualDataLabelsSettings; - import VisualDataLabelsSettingsOptions = powerbi.extensibility.utils.chart.dataLabel.VisualDataLabelsSettingsOptions; +import * as dataViewUtils from "./../dataViewUtils"; - // powerbi.extensibility.utils.formatting - import valueFormatter = powerbi.extensibility.utils.formatting.valueFormatter; - import IValueFormatter = powerbi.extensibility.utils.formatting.IValueFormatter; - import DisplayUnitSystemType = powerbi.extensibility.utils.formatting.DisplayUnitSystemType; +import * as utils from "./../utils"; - // powerbi.extensibility.utils.tooltip - import TooltipEventArgs = powerbi.extensibility.utils.tooltip.TooltipEventArgs; - import ITooltipServiceWrapper = powerbi.extensibility.utils.tooltip.ITooltipServiceWrapper; - import TooltipEnabledDataPoint = powerbi.extensibility.utils.tooltip.TooltipEnabledDataPoint; - import createTooltipServiceWrapper = powerbi.extensibility.utils.tooltip.createTooltipServiceWrapper; +import * as tooltip from "./../tooltip"; - // powerbi.extensibility.utils.color - import ColorHelper = powerbi.extensibility.utils.color.ColorHelper; +import * as axisType from "./../axis/type"; + +import IViewport = powerbi.IViewport; +import IVisualHost = powerbi.extensibility.visual.IVisualHost; +import IColorPalette = powerbi.extensibility.IColorPalette; +import ILocalizationManager = powerbi.extensibility.ILocalizationManager; +import DataViewCategorical = powerbi.DataViewCategorical; +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; +import DataViewMetadata = powerbi.DataViewMetadata; +import DataViewCategoryColumn = powerbi.DataViewCategoryColumn; +import DataRepetitionSelector = powerbi.data.DataRepetitionSelector; +import PrimitiveValue = powerbi.PrimitiveValue; +import DataViewValueColumn = powerbi.DataViewValueColumn; +import VisualObjectInstance = powerbi.VisualObjectInstance; +import EnumerateVisualObjectInstancesOptions = powerbi.EnumerateVisualObjectInstancesOptions; +import DataViewValueColumnGroup = powerbi.DataViewValueColumnGroup; +import VisualTooltipDataItem = powerbi.extensibility.VisualTooltipDataItem; + +// powerbi.visuals +import ISelectionId = powerbi.visuals.ISelectionId; + +// powerbi.extensibility.utils.svg +import ClassAndSelector = CssConstants.ClassAndSelector; +import createClassAndSelector = CssConstants.createClassAndSelector; + +// powerbi.extensibility.utils.chart +import IAxisProperties = axisInterfaces.IAxisProperties; + +// powerbi.extensibility.utils.type +import ValueType = valueType.ValueType; +import EnumExtensions = enumExtensions.EnumExtensions; +import ArrayExtensions = arrayExtensions.ArrayExtensions; + +// powerbi.extensibility.utils.interactivity +import LegendIcon = legendInterfaces.LegendIcon; +import ILegendData = legendInterfaces.LegendData; +import LegendDataPoint = legendInterfaces.LegendDataPoint; +import DataLabelObject = dataLabelInterfaces.DataLabelObject; +import IInteractivityService = interactivityService.IInteractivityService; + +// powerbi.extensibility.utils.formatting +import valueFormatter = vf.valueFormatter; +import IValueFormatter = vf.IValueFormatter; + +// visualStrategy +import IVisualStrategy = visualStrategy.IVisualStrategy; +import BaseVisualStrategy = baseVisualStrategy.BaseVisualStrategy; - // visualStrategy - import IVisualStrategy = visualStrategy.IVisualStrategy; - import BaseVisualStrategy = visualStrategy.BaseVisualStrategy; +// converterStrategy +import BaseConverterStrategy = converterStrategy.BaseConverterStrategy; - // converterStrategy - import BaseConverterStrategy = converterStrategy.BaseConverterStrategy; +// formattingUtils +import getFormattedLegendLabel = formattingUtils.getFormattedLegendLabel; - // formattingUtils - import getFormattedLegendLabel = formattingUtils.getFormattedLegendLabel; +// behavior +import { VisualBehaviorOptions } from "./../behavior/visualBehaviorOptions"; - // behavior - import VisualBehaviorOptions = behavior.VisualBehaviorOptions; +export class BaseColumnChart implements IColumnChart { + private static ColumnChartClassName: string = "columnChart"; - export class BaseColumnChart implements IColumnChart { - private static ColumnChartClassName: string = "columnChart"; + private static LabelGraphicsContextSelector: ClassAndSelector = createClassAndSelector("labelGraphicsContext"); - private static LabelGraphicsContextSelector: ClassAndSelector = createClassAndSelector("labelGraphicsContext"); + private static ColumnChartUnclippedGraphicsContextSelector: ClassAndSelector = createClassAndSelector("columnChartUnclippedGraphicsContext"); + private static ColumnChartMainGraphicsContextSelector: ClassAndSelector = createClassAndSelector("columnChartMainGraphicsContext"); - private static ColumnChartUnclippedGraphicsContextSelector: ClassAndSelector = createClassAndSelector("columnChartUnclippedGraphicsContext"); - private static ColumnChartMainGraphicsContextSelector: ClassAndSelector = createClassAndSelector("columnChartMainGraphicsContext"); + private static HighlightedKeyPostfix: string = "-highlighted-data-point"; - private static HighlightedKeyPostfix: string = "-highlighted-data-point"; + private static DefaultStackedPosition: number = 0; - private static DefaultStackedPosition: number = 0; + private static ColumSortField: string = "valueOriginal"; - private static ColumSortField: string = "valueOriginal"; + private static Is100Pct: boolean = true; - private static Is100Pct: boolean = true; + private svg: Selection; + private unclippedGraphicsContext: Selection; + private mainGraphicsContext: Selection; + private labelGraphicsContext: Selection; - private svg: Selection; - private unclippedGraphicsContext: Selection; - private mainGraphicsContext: Selection; - private labelGraphicsContext: Selection; + private xAxisProperties: IAxisProperties; + private yAxisProperties: IAxisProperties; - private xAxisProperties: IAxisProperties; - private yAxisProperties: IAxisProperties; + private currentViewport: IViewport; - private currentViewport: IViewport; + private data: MekkoColumnChartData; - private data: MekkoColumnChartData; + private colorPalette: IColorPalette; + private visualHost: IVisualHost; + private localizationManager: ILocalizationManager; - private colorPalette: IColorPalette; - private visualHost: IVisualHost; - private localizationManager: ILocalizationManager; + private chartType: MekkoVisualChartType; - private chartType: MekkoVisualChartType; + private columnChart: IVisualStrategy; - private columnChart: IVisualStrategy; + private cartesianVisualHost: IMekkoChartVisualHost; - private cartesianVisualHost: IMekkoChartVisualHost; + private margin: IMargin; + private lastInteractiveSelectedColumnIndex: number; + private supportsOverflow: boolean; + private interactivityService: IInteractivityService; + private dataViewCat: DataViewCategorical; + private categoryAxisType: string = null; + private isScrollable: boolean; - private margin: IMargin; - private lastInteractiveSelectedColumnIndex: number; - private supportsOverflow: boolean; - private interactivityService: IInteractivityService; - private dataViewCat: DataViewCategorical; - private categoryAxisType: string = null; - private isScrollable: boolean; + private tooltipServiceWrapper: ITooltipServiceWrapper; - private tooltipServiceWrapper: ITooltipServiceWrapper; + constructor(options: MekkoChartConstructorOptions) { + this.chartType = options.chartType; + this.isScrollable = options.isScrollable; + this.interactivityService = options.interactivityService; + } - constructor(options: MekkoChartConstructorOptions) { - this.chartType = options.chartType; - this.isScrollable = options.isScrollable; - this.interactivityService = options.interactivityService; - } + public init(options: MekkoChartVisualInitOptions) { + this.svg = options.svg; - public init(options: MekkoChartVisualInitOptions) { - this.svg = options.svg; + this.unclippedGraphicsContext = this.svg + .append("g") + .classed(BaseColumnChart.ColumnChartUnclippedGraphicsContextSelector.className, true); - this.unclippedGraphicsContext = this.svg - .append("g") - .classed(BaseColumnChart.ColumnChartUnclippedGraphicsContextSelector.className, true); + this.mainGraphicsContext = this.unclippedGraphicsContext + .append("svg") + .classed(BaseColumnChart.ColumnChartMainGraphicsContextSelector.className, true); - this.mainGraphicsContext = this.unclippedGraphicsContext - .append("svg") - .classed(BaseColumnChart.ColumnChartMainGraphicsContextSelector.className, true); + this.labelGraphicsContext = this.svg + .append("g") + .classed(BaseColumnChart.LabelGraphicsContextSelector.className, true); - this.labelGraphicsContext = this.svg - .append("g") - .classed(BaseColumnChart.LabelGraphicsContextSelector.className, true); + this.visualHost = options.host; + this.localizationManager = this.visualHost.createLocalizationManager(); + this.colorPalette = this.visualHost.colorPalette; - this.visualHost = options.host; - this.localizationManager = this.visualHost.createLocalizationManager(); - this.colorPalette = this.visualHost.colorPalette; + this.cartesianVisualHost = options.cartesianHost; + this.supportsOverflow = !EnumExtensions.hasFlag(this.chartType, flagStacked); - this.cartesianVisualHost = options.cartesianHost; - this.supportsOverflow = !EnumExtensions.hasFlag(this.chartType, flagStacked); + select(options.element) + .classed(BaseColumnChart.ColumnChartClassName, true); - d3.select(options.element) - .classed(BaseColumnChart.ColumnChartClassName, true); + this.tooltipServiceWrapper = createTooltipServiceWrapper( + this.visualHost.tooltipService, + options.element); - this.tooltipServiceWrapper = createTooltipServiceWrapper( - this.visualHost.tooltipService, - options.element); + this.columnChart = new BaseVisualStrategy(); + } - this.columnChart = new BaseVisualStrategy(); - } + private getCategoryLayout( + numCategoryValues: number, + options: MekkoCalculateScaleAndDomainOptions): MekkoChartCategoryLayout { - private getCategoryLayout( - numCategoryValues: number, - options: MekkoCalculateScaleAndDomainOptions): MekkoChartCategoryLayout { - - const availableWidth: number = this.currentViewport.width - - (this.margin.left + this.margin.right), - metadataColumn: DataViewMetadataColumn = this.data - ? this.data.categoryMetadata - : undefined, - categoryDataType: ValueType = AxisHelper.getCategoryValueType(metadataColumn), - isScalar: boolean = this.data - ? this.data.scalarCategoryAxis - : false, - domain: number[] = AxisHelper.createDomain( - this.data.series, - categoryDataType, - isScalar, - options.forcedXDomain); - - return MekkoChart.getLayout( - this.data, - { - domain, - isScalar, - availableWidth, - categoryCount: numCategoryValues, - isScrollable: this.isScrollable, - trimOrdinalDataOnOverflow: false - }); - } + const availableWidth: number = this.currentViewport.width + - (this.margin.left + this.margin.right), + metadataColumn: DataViewMetadataColumn = this.data + ? this.data.categoryMetadata + : undefined, + categoryDataType: ValueType = AxisHelper.getCategoryValueType(metadataColumn), + isScalar: boolean = this.data + ? this.data.scalarCategoryAxis + : false, + domain: number[] = AxisHelper.createDomain( + this.data.series, + categoryDataType, + isScalar, + options.forcedXDomain); - public static getBorderWidth(border: MekkoBorderSettings): number { - if (!border - || !border.show - || !border.width) { - return 0; - } + return MekkoChart.getLayout( + this.data, + { + domain, + isScalar, + availableWidth, + categoryCount: numCategoryValues, + isScrollable: this.isScrollable, + trimOrdinalDataOnOverflow: false + }); + } - const width: number = border.width; + public static getBorderWidth(border: MekkoBorderSettings): number { + if (!border + || !border.show + || !border.width) { + return 0; + } - if (width < 0) { - return 0; - } + const width: number = border.width; - if (width > border.maxWidth) { - return border.maxWidth; - } + if (width < 0) { + return 0; + } - return width; + if (width > border.maxWidth) { + return border.maxWidth; } - public static getBorderColor(border: MekkoBorderSettings): string { - if (!border) { - return MekkoChart.DefaultSettings.columnBorder.color; - } + return width; + } - return border.color; + public static getBorderColor(border: MekkoBorderSettings): string { + if (!border) { + return MekkoChart.DefaultSettings.columnBorder.color; } - public static converter( - visualHost: IVisualHost, - categorical: DataViewCategorical, - colors: IColorPalette, - is100PercentStacked: boolean = false, - isScalar: boolean = false, - supportsOverflow: boolean = false, - dataViewMetadata: DataViewMetadata = null, - localizationManager: ILocalizationManager, - chartType?: MekkoVisualChartType): MekkoColumnChartData { - - const xAxisCardProperties: DataViewObject = dataViewUtils.getCategoryAxisProperties(dataViewMetadata); - const valueAxisProperties: DataViewObject = dataViewUtils.getValueAxisProperties(dataViewMetadata); - - isScalar = dataViewUtils.isScalar(isScalar, xAxisCardProperties); - categorical = utils.applyUserMinMax(isScalar, categorical, xAxisCardProperties); - - const converterStrategy: BaseConverterStrategy = - new BaseConverterStrategy(categorical, visualHost); - - const firstCategory: DataViewCategoryColumn = categorical - && categorical.categories - && categorical.categories[0], - categories: PrimitiveValue[] = firstCategory - ? firstCategory.values - : [], - categoryIdentities: DataViewScopeIdentity[] = firstCategory - ? firstCategory.identity - : [], - categoryMetadata: DataViewMetadataColumn = firstCategory - ? firstCategory.source - : undefined; - - const categoryFormatter: IValueFormatter = valueFormatter.create({ - format: valueFormatter.getFormatStringByColumn(categoryMetadata), - value: categories[0], - value2: categories[categories.length - 1], - displayUnitSystemType: DisplayUnitSystemType.Verbose - }); - - let borderSettings: MekkoBorderSettings = MekkoChart.DefaultSettings.columnBorder, - sortSeriesSettings: MekkoSeriesSortSettings = MekkoChart.DefaultSettings.sortSeries, - sortLegendSettings: MekkoLegendSortSettings = MekkoChart.DefaultSettings.sortLegend, - xAxisLabelsSettings: MekkoXAxisLabelsSettings = MekkoChart.DefaultSettings.xAxisLabels, - categoryColumnSettings: MekkoCategoryColorSettings = MekkoChart.DefaultSettings.categoryColor, - labelSettings: VisualDataLabelsSettings = dataLabelUtils.getDefaultColumnLabelSettings(true), - dataPointSettings: MekkoDataPointSettings = MekkoChart.DefaultSettings.dataPoint; - - let defaultDataPointColor: string = undefined, - showAllDataPoints: boolean = undefined; - - if (dataViewMetadata && dataViewMetadata.objects) { - const objects: IDataViewObjects = dataViewMetadata.objects; - - defaultDataPointColor = DataViewObjects.getFillColor( - objects, - MekkoChart.Properties["dataPoint"]["defaultColor"]); - - showAllDataPoints = DataViewObjects.getValue( - objects, - MekkoChart.Properties["dataPoint"]["showAllDataPoints"]); - - labelSettings = MekkoChart.parseLabelSettings(objects); - borderSettings = MekkoChart.parseBorderSettings(objects); - sortLegendSettings = MekkoChart.parseLegendSortSettings(objects); - sortSeriesSettings = MekkoChart.parseSeriesSortSettings(objects); - xAxisLabelsSettings = MekkoChart.parseXAxisLabelsSettings(objects); - dataPointSettings = MekkoChart.parseDataPointSettings(objects); - } + return border.color; + } - // Allocate colors - let legendAndSeriesInfo: LegendSeriesInfo = converterStrategy.getLegend(colors, defaultDataPointColor, "", dataPointSettings.categoryGradient, dataPointSettings.colorGradientEndColor.solid.color); - let legend: MekkoLegendDataPoint[] = legendAndSeriesInfo.legend.dataPoints; + public static converter( + visualHost: IVisualHost, + categorical: DataViewCategorical, + colors: IColorPalette, + is100PercentStacked: boolean = false, + isScalar: boolean = false, + supportsOverflow: boolean = false, + dataViewMetadata: DataViewMetadata = null, + localizationManager: ILocalizationManager, + chartType?: MekkoVisualChartType): MekkoColumnChartData { + + const xAxisCardProperties: powerbi.DataViewObject = dataViewUtils.getCategoryAxisProperties(dataViewMetadata); + const valueAxisProperties: powerbi.DataViewObject = dataViewUtils.getValueAxisProperties(dataViewMetadata); + + isScalar = dataViewUtils.isScalar(isScalar, xAxisCardProperties); + categorical = utils.applyUserMinMax(isScalar, categorical, xAxisCardProperties); + + const converterStrategy: BaseConverterStrategy = + new BaseConverterStrategy(categorical, visualHost); + + const firstCategory: DataViewCategoryColumn = categorical + && categorical.categories + && categorical.categories[0], + categories: PrimitiveValue[] = firstCategory + ? firstCategory.values + : [], + categoryIdentities: DataRepetitionSelector[] = firstCategory + ? firstCategory.identity + : [], + categoryMetadata: DataViewMetadataColumn = firstCategory + ? firstCategory.source + : undefined; - let seriesSources: DataViewMetadataColumn[] = legendAndSeriesInfo.seriesSources; + const categoryFormatter: IValueFormatter = valueFormatter.create({ + format: valueFormatter.getFormatStringByColumn(categoryMetadata), + value: categories[0], + value2: categories[categories.length - 1], + displayUnitSystemType: DisplayUnitSystemType.Verbose + }); + + let borderSettings: MekkoBorderSettings = MekkoChart.DefaultSettings.columnBorder, + sortSeriesSettings: MekkoSeriesSortSettings = MekkoChart.DefaultSettings.sortSeries, + sortLegendSettings: MekkoLegendSortSettings = MekkoChart.DefaultSettings.sortLegend, + xAxisLabelsSettings: MekkoXAxisLabelsSettings = MekkoChart.DefaultSettings.xAxisLabels, + categoryColumnSettings: MekkoCategoryColorSettings = MekkoChart.DefaultSettings.categoryColor, + labelSettings: VisualDataLabelsSettings = dataLabelUtils.getDefaultColumnLabelSettings(true), + dataPointSettings: MekkoDataPointSettings = MekkoChart.DefaultSettings.dataPoint; + + let defaultDataPointColor: string = undefined, + showAllDataPoints: boolean = undefined; + + if (dataViewMetadata && dataViewMetadata.objects) { + const objects: powerbi.DataViewObjects = dataViewMetadata.objects; + + defaultDataPointColor = DataViewObjects.getFillColor( + objects, + MekkoChart.Properties["dataPoint"]["defaultColor"]); + + showAllDataPoints = DataViewObjects.getValue( + objects, + MekkoChart.Properties["dataPoint"]["showAllDataPoints"]); + + labelSettings = MekkoChart.parseLabelSettings(objects); + borderSettings = MekkoChart.parseBorderSettings(objects); + sortLegendSettings = MekkoChart.parseLegendSortSettings(objects); + sortSeriesSettings = MekkoChart.parseSeriesSortSettings(objects); + xAxisLabelsSettings = MekkoChart.parseXAxisLabelsSettings(objects); + dataPointSettings = MekkoChart.parseDataPointSettings(objects); + } - // Determine data points - let result: MekkoDataPoints = BaseColumnChart.createDataPoints( - visualHost, + // Allocate colors + let legendAndSeriesInfo: LegendSeriesInfo = converterStrategy.getLegend(colors, defaultDataPointColor, "", dataPointSettings.categoryGradient, dataPointSettings.colorGradientEndColor.solid.color); + let legend: MekkoLegendDataPoint[] = legendAndSeriesInfo.legend.dataPoints; + + let seriesSources: DataViewMetadataColumn[] = legendAndSeriesInfo.seriesSources; + + // Determine data points + let result: MekkoDataPoints = BaseColumnChart.createDataPoints( + visualHost, + categorical, + categories, + categoryIdentities, + legend, + legendAndSeriesInfo.seriesObjects, + converterStrategy, + labelSettings, + is100PercentStacked, + isScalar, + supportsOverflow, + localizationManager, + converterHelper.categoryIsAlsoSeriesRole( categorical, - categories, - categoryIdentities, - legend, - legendAndSeriesInfo.seriesObjects, - converterStrategy, - labelSettings, - is100PercentStacked, - isScalar, - supportsOverflow, - localizationManager, - converterHelper.categoryIsAlsoSeriesRole( - categorical, - RoleNames.series, - RoleNames.category), - firstCategory && firstCategory.objects, - defaultDataPointColor, - chartType, - categoryMetadata); - - if (sortSeriesSettings.enabled) { - let columns = BaseColumnChart.createAlternateStructure(result, sortSeriesSettings.direction === "des"); - BaseColumnChart.reorderPositions(result, columns); - } + RoleNames.series, + RoleNames.category), + firstCategory && firstCategory.objects, + defaultDataPointColor, + chartType, + categoryMetadata); + + if (sortSeriesSettings.enabled) { + let columns = BaseColumnChart.createAlternateStructure(result, sortSeriesSettings.direction === "des"); + BaseColumnChart.reorderPositions(result, columns); + } - const valuesMetadata: DataViewMetadataColumn[] = []; + const valuesMetadata: DataViewMetadataColumn[] = []; - for (let j: number = 0; j < legend.length; j++) { - valuesMetadata.push(seriesSources[j]); - } + for (let j: number = 0; j < legend.length; j++) { + valuesMetadata.push(seriesSources[j]); + } - const labels: axis.utils.AxesLabels = axis.utils.createAxesLabels( - xAxisCardProperties, - valueAxisProperties, - categoryMetadata, - valuesMetadata); + const labels: axisUtils.AxesLabels = axisUtils.createAxesLabels( + xAxisCardProperties, + valueAxisProperties, + categoryMetadata, + valuesMetadata); + + return { + categories, + categoryFormatter, + defaultDataPointColor, + showAllDataPoints, + categoryMetadata, + categoriesWidth: result.categoriesWidth, + borderSettings, + sortlegend: sortLegendSettings, + sortSeries: sortSeriesSettings, + xAxisLabelsSettings: xAxisLabelsSettings, + labelSettings, + series: result.series, + valuesMetadata, + legendData: legendAndSeriesInfo.legend, + hasHighlights: result.hasHighlights, + scalarCategoryAxis: isScalar, + axesLabels: { + x: labels.xAxisLabel, + y: labels.yAxisLabel + }, + hasDynamicSeries: result.hasDynamicSeries, + categoryProperties: result.categoryProperties, + isMultiMeasure: false, + dataPointSettings: dataPointSettings + }; + } - return { - categories, - categoryFormatter, - defaultDataPointColor, - showAllDataPoints, - categoryMetadata, - categoriesWidth: result.categoriesWidth, - borderSettings, - sortlegend: sortLegendSettings, - sortSeries: sortSeriesSettings, - xAxisLabelsSettings: xAxisLabelsSettings, - labelSettings, - series: result.series, - valuesMetadata, - legendData: legendAndSeriesInfo.legend, - hasHighlights: result.hasHighlights, - scalarCategoryAxis: isScalar, - axesLabels: { - x: labels.xAxisLabel, - y: labels.yAxisLabel - }, - hasDynamicSeries: result.hasDynamicSeries, - categoryProperties: result.categoryProperties, - isMultiMeasure: false, - dataPointSettings: dataPointSettings - }; - } + private static createAlternateStructure(dataPoint: MekkoDataPoints, descendingDirection: boolean = true): ICategoryValuesCollection[] { + let series: MekkoChartSeries[] = dataPoint.series; + let columns: ICategoryValuesCollection[] = []; + let rowsCount: number = series.length; + let colsCount: number = max(series.map(s => s.data.length)); + + // define all cols + series.some((value: MekkoChartSeries): boolean => { + if (value.data.length === colsCount) { + value.data.forEach(data => { + columns[data.categoryIndex] = []; + }); - private static createAlternateStructure(dataPoint: MekkoDataPoints, descendingDirection: boolean = true): ICategoryValuesCollection[] { - let series: MekkoChartSeries[] = dataPoint.series; - let columns: ICategoryValuesCollection[] = []; - let rowsCount: number = series.length; - let colsCount: number = d3.max(series.map( s => s.data.length)); - - // define all cols - series.some((value: MekkoChartSeries, index: number, arr: MekkoChartSeries[]): boolean => { - if (value.data.length === colsCount) { - value.data.forEach(data => { - columns[data.categoryIndex] = []; - }); + return true; + } + return false; + }); - return true; + for (let col = 0; col < colsCount; col++) { + for (let row = 0; row < rowsCount; row++) { + columns[col] = columns[col] || []; + if (series[row].data[col] === undefined) { + continue; + } + if (columns[series[row].data[col].categoryIndex].categoryValue === undefined) { + columns[series[row].data[col].categoryIndex].identity = series[row].data[col].identity; + columns[series[row].data[col].categoryIndex].categoryValue = series[row].data[col].categoryValue; + columns[series[row].data[col].categoryIndex].color = series[row].data[col].color; } - return false; - }); - for (let col = 0; col < colsCount; col++) { - for (let row = 0; row < rowsCount; row++) { - columns[col] = columns[col] || []; - if (series[row].data[col] === undefined) { - continue; - } - if (columns[series[row].data[col].categoryIndex].categoryValue === undefined) { - columns[series[row].data[col].categoryIndex].identity = series[row].data[col].identity; - columns[series[row].data[col].categoryIndex].categoryValue = series[row].data[col].categoryValue; - columns[series[row].data[col].categoryIndex].color = series[row].data[col].color; - } + columns[series[row].data[col].categoryIndex][row] = series[row].data[col]; + } + } - columns[series[row].data[col].categoryIndex][row] = series[row].data[col]; - } + // copy array with specific fields + for (let col = 0; col < colsCount; col++) { + let tmpObject = []; + tmpObject["identity"] = columns[col].identity; + tmpObject["categoryValue"] = columns[col].categoryValue; + tmpObject["color"] = columns[col].color; + columns[col] = columns[col].sort((a, b) => a[BaseColumnChart.ColumSortField] > b[BaseColumnChart.ColumSortField] ? 1 : -1); + if (descendingDirection) { + columns[col] = (columns[col]).reverse(); } + columns[col].identity = tmpObject["identity"]; + columns[col].categoryValue = tmpObject["categoryValue"]; + columns[col].color = tmpObject["color"]; + } + + return columns; + } - // copy array with specific fields - for (let col = 0; col < colsCount; col++) { - let tmpObject = []; - tmpObject["identity"] = columns[col].identity; - tmpObject["categoryValue"] = columns[col].categoryValue; - tmpObject["color"] = columns[col].color; - columns[col] = _.sortBy(columns[col], BaseColumnChart.ColumSortField); - if (descendingDirection) { - columns[col] = (columns[col]).reverse(); + private static reorderPositions(dataPoint: MekkoDataPoints, columns: ICategoryValuesCollection[]) { + let series: MekkoChartSeries[] = dataPoint.series; + let colsCount: number = series[0].data.length; + for (let col = 0; col < colsCount; col++) { + let columnAbsoluteValue: number = sum(columns[col].map((val) => { + if (val === undefined) { + return 0; } - columns[col].identity = tmpObject["identity"]; - columns[col].categoryValue = tmpObject["categoryValue"]; - columns[col].color = tmpObject["color"]; + return val.valueAbsolute; + })); + let absValScale: LinearScale = scaleLinear().domain([0, columnAbsoluteValue]).range([0, 1]); + let rowsCount: number = columns[col].length; + for (let row = 0; row < rowsCount; row++) { + if (columns[col][row] === undefined) { + continue; + } + columns[col][row].position = absValScale(columnAbsoluteValue); + columnAbsoluteValue -= columns[col][row].valueAbsolute; } - - return columns; } + } - private static reorderPositions(dataPoint: MekkoDataPoints, columns: ICategoryValuesCollection[]) { - let series: MekkoChartSeries[] = dataPoint.series; - let colsCount: number = series[0].data.length; - for (let col = 0; col < colsCount; col++) { - let columnAbsoluteValue: number = d3.sum(columns[col].map( (val) => { - if (val === undefined) { - return 0; - } - return val.valueAbsolute; - })); - let absValScale: LinearScale = d3.scale.linear().domain([0, columnAbsoluteValue]).range([0, 1]); - let rowsCount: number = columns[col].length; - for (let row = 0; row < rowsCount; row++) { - if (columns[col][row] === undefined) { - continue; - } - columns[col][row].position = absValScale(columnAbsoluteValue); - columnAbsoluteValue -= columns[col][row].valueAbsolute; - } + private static getStackedMultiplier( + rawValues: number[][], + rowIdx: number, + seriesCount: number, + categoryCount: number): ValueMultiplers { + + let pos: number = 0, + neg: number = 0; + + for (let i: number = 0; i < seriesCount; i++) { + let value: number = rawValues[i][rowIdx]; + + value = AxisHelper.normalizeNonFiniteNumber(value); + + if (value > 0) { + pos += value; + } else if (value < 0) { + neg -= value; } } - private static getStackedMultiplier( - rawValues: number[][], - rowIdx: number, - seriesCount: number, - categoryCount: number): ValueMultiplers { + const absTotal: number = pos + neg; - let pos: number = 0, - neg: number = 0; + return { + pos: BaseColumnChart.getPosition(pos, absTotal), + neg: BaseColumnChart.getPosition(neg, absTotal) + }; + } + private static getStackedMultiplierForAllDataSet( + rawValues: number[][], + seriesCount: number, + categoryCount: number): ValueMultiplers { + + let pos: number = 0, + neg: number = 0; + + for (let j: number = 0; j < categoryCount; j++) { for (let i: number = 0; i < seriesCount; i++) { - let value: number = rawValues[i][rowIdx]; + let value: number = rawValues[i][j]; value = AxisHelper.normalizeNonFiniteNumber(value); @@ -475,120 +604,149 @@ module powerbi.extensibility.visual.columnChart { neg -= value; } } + } + const absTotal: number = pos + neg; - const absTotal: number = pos + neg; + return { + pos: BaseColumnChart.getPosition(pos, absTotal), + neg: BaseColumnChart.getPosition(neg, absTotal) + }; + } + + private static getPosition(position: number, absTotal: number): number { + return position + ? (position / absTotal) / position + : BaseColumnChart.DefaultStackedPosition; + } + + private static createDataPoints( + visualHost: IVisualHost, + dataViewCat: DataViewCategorical, + categories: any[], + categoryIdentities: DataRepetitionSelector[], + legend: MekkoLegendDataPoint[], + seriesObjectsList: powerbi.DataViewObjects[][], + converterStrategy: BaseConverterStrategy, + defaultLabelSettings: VisualDataLabelsSettings, + is100PercentStacked: boolean = false, + isScalar: boolean = false, + supportsOverflow: boolean = false, + localizationManager: ILocalizationManager, + isCategoryAlsoSeries?: boolean, + categoryObjectsList?: powerbi.DataViewObjects[], + defaultDataPointColor?: string, + chartType?: MekkoVisualChartType, + categoryMetadata?: DataViewMetadataColumn): MekkoDataPoints { + + const grouped: DataViewValueColumnGroup[] = dataViewCat && dataViewCat.values + ? dataViewCat.values.grouped() + : undefined; + + const categoryCount = categories.length, + seriesCount = legend.length, + columnSeries: MekkoChartSeries[] = []; + + if (seriesCount < 1 + || categoryCount < 1 + || (categories[0] === null && categories[1] === undefined)) { return { - pos: BaseColumnChart.getPosition(pos, absTotal), - neg: BaseColumnChart.getPosition(neg, absTotal) + series: columnSeries, + hasHighlights: false, + hasDynamicSeries: false, + categoriesWidth: [], }; } - private static getStackedMultiplierForAllDataSet( - rawValues: number[][], - seriesCount: number, - categoryCount: number): ValueMultiplers { + const dvCategories: DataViewCategoryColumn[] = dataViewCat.categories; - let pos: number = 0, - neg: number = 0; + categoryMetadata = (dvCategories && dvCategories.length > 0) + ? dvCategories[0].source + : null; - for (let j: number = 0; j < categoryCount; j++) { - for (let i: number = 0; i < seriesCount; i++) { - let value: number = rawValues[i][j]; + const categoryType: ValueType = AxisHelper.getCategoryValueType(categoryMetadata), + isDateTime: boolean = AxisHelper.isDateTime(categoryType), + baseValuesPos: number[] = [], + baseValuesNeg: number[] = [], + rawHighlightValues: number[][] = [], + hasDynamicSeries = !!(dataViewCat.values && dataViewCat.values.source), + widthColumns: number[] = []; - value = AxisHelper.normalizeNonFiniteNumber(value); + let rawValues: number[][] = [], + widthIndex: number = -1; - if (value > 0) { - pos += value; - } else if (value < 0) { - neg -= value; - } + let highlightsOverflow: boolean = false, + hasHighlights: boolean = converterStrategy.hasHighlightValues(0); + + for (let seriesIndex: number = 0; seriesIndex < dataViewCat.values.length; seriesIndex++) { + if (dataViewCat.values[seriesIndex].source.roles + && dataViewCat.values[seriesIndex].source.roles[RoleNames.width] + && !dataViewCat.values[seriesIndex].source.roles[RoleNames.y]) { + + widthIndex = seriesIndex; + + const widthValues: number[] = dataViewCat.values[seriesIndex].values as number[]; + + for (let i: number = 0; i < widthValues.length; i++) { + widthColumns[i] = sum([ + 0, + widthColumns[i], + widthValues[i] + ]); } + + continue; } - const absTotal: number = pos + neg; - return { - pos: BaseColumnChart.getPosition(pos, absTotal), - neg: BaseColumnChart.getPosition(neg, absTotal) - }; - } + const seriesValues: number[] = [], + seriesHighlightValues: number[] = []; - private static getPosition(position: number, absTotal: number): number { - return position - ? (position / absTotal) / position - : BaseColumnChart.DefaultStackedPosition; - } + for (let categoryIndex: number = 0; categoryIndex < categoryCount; categoryIndex++) { + const value: number = converterStrategy.getValueBySeriesAndCategory( + seriesIndex, + categoryIndex); - private static createDataPoints( - visualHost: IVisualHost, - dataViewCat: DataViewCategorical, - categories: any[], - categoryIdentities: DataViewScopeIdentity[], - legend: MekkoLegendDataPoint[], - seriesObjectsList: IDataViewObjects[][], - converterStrategy: BaseConverterStrategy, - defaultLabelSettings: VisualDataLabelsSettings, - is100PercentStacked: boolean = false, - isScalar: boolean = false, - supportsOverflow: boolean = false, - localizationManager: ILocalizationManager, - isCategoryAlsoSeries?: boolean, - categoryObjectsList?: IDataViewObjects[], - defaultDataPointColor?: string, - chartType?: MekkoVisualChartType, - categoryMetadata?: DataViewMetadataColumn): MekkoDataPoints { - - const grouped: DataViewValueColumnGroup[] = dataViewCat && dataViewCat.values - ? dataViewCat.values.grouped() - : undefined; + seriesValues[categoryIndex] = value; - const categoryCount = categories.length, - seriesCount = legend.length, - columnSeries: MekkoChartSeries[] = []; + if (hasHighlights) { + const highlightValue: number = converterStrategy.getHighlightBySeriesAndCategory( + seriesIndex, + categoryIndex); - if (seriesCount < 1 - || categoryCount < 1 - || (categories[0] === null && categories[1] === undefined)) { + seriesHighlightValues[categoryIndex] = highlightValue; - return { - series: columnSeries, - hasHighlights: false, - hasDynamicSeries: false, - categoriesWidth: [], - }; + // There are two cases where we don't use overflow logic; if all are false, use overflow logic appropriate for the chart. + if (!((value >= 0 && highlightValue >= 0 && value >= highlightValue) || // Both positive; value greater than highlight + (value <= 0 && highlightValue <= 0 && value <= highlightValue))) { // Both negative; value less than highlight + highlightsOverflow = true; + } + } } - const dvCategories: DataViewCategoryColumn[] = dataViewCat.categories; + rawValues.push(seriesValues); - categoryMetadata = (dvCategories && dvCategories.length > 0) - ? dvCategories[0].source - : null; - - const categoryType: ValueType = AxisHelper.getCategoryValueType(categoryMetadata), - isDateTime: boolean = AxisHelper.isDateTime(categoryType), - baseValuesPos: number[] = [], - baseValuesNeg: number[] = [], - rawHighlightValues: number[][] = [], - hasDynamicSeries = !!(dataViewCat.values && dataViewCat.values.source), - widthColumns: number[] = []; - - let rawValues: number[][] = [], - widthIndex: number = -1; + if (hasHighlights) { + rawHighlightValues.push(seriesHighlightValues); + } + } - let highlightsOverflow: boolean = false, - hasHighlights: boolean = converterStrategy.hasHighlightValues(0); + if (highlightsOverflow && !supportsOverflow) { + highlightsOverflow = false; + hasHighlights = false; + rawValues = rawHighlightValues; + } + if (widthColumns.length < 1) { for (let seriesIndex: number = 0; seriesIndex < dataViewCat.values.length; seriesIndex++) { if (dataViewCat.values[seriesIndex].source.roles - && dataViewCat.values[seriesIndex].source.roles[RoleNames.width] - && !dataViewCat.values[seriesIndex].source.roles[RoleNames.y]) { + && dataViewCat.values[seriesIndex].source.roles[RoleNames.width]) { widthIndex = seriesIndex; const widthValues: number[] = dataViewCat.values[seriesIndex].values as number[]; for (let i: number = 0; i < widthValues.length; i++) { - widthColumns[i] = d3.sum([ + widthColumns[i] = sum([ 0, widthColumns[i], widthValues[i] @@ -597,1133 +755,1073 @@ module powerbi.extensibility.visual.columnChart { continue; } + } + } - const seriesValues: number[] = [], - seriesHighlightValues: number[] = []; - - for (let categoryIndex: number = 0; categoryIndex < categoryCount; categoryIndex++) { - const value: number = converterStrategy.getValueBySeriesAndCategory( - seriesIndex, - categoryIndex); + if (widthColumns.length < 1) { + for (let seriesIndex: number = 0; seriesIndex < categoryCount; seriesIndex++) { + widthColumns.push(1); + } + } - seriesValues[categoryIndex] = value; + const totalSum: number = sum(widthColumns), + linearScale: LinearScale = scaleLinear() + .domain([0, totalSum]) + .range([0, 1]); - if (hasHighlights) { - const highlightValue: number = converterStrategy.getHighlightBySeriesAndCategory( - seriesIndex, - categoryIndex); + const columnStartX: number[] = [0], + columnWidth: number[] = []; - seriesHighlightValues[categoryIndex] = highlightValue; + for (let seriesIndex: number = 0; seriesIndex < (categoryCount - 1); seriesIndex++) { + const stepWidth: number = columnStartX[columnStartX.length - 1] + + (widthColumns[seriesIndex] || 0); - // There are two cases where we don't use overflow logic; if all are false, use overflow logic appropriate for the chart. - if (!((value >= 0 && highlightValue >= 0 && value >= highlightValue) || // Both positive; value greater than highlight - (value <= 0 && highlightValue <= 0 && value <= highlightValue))) { // Both negative; value less than highlight - highlightsOverflow = true; - } - } - } + columnStartX.push(stepWidth); + } - rawValues.push(seriesValues); + for (let seriesIndex: number = 0; seriesIndex < categoryCount; seriesIndex++) { + columnStartX[seriesIndex] = linearScale(columnStartX[seriesIndex]); + columnWidth[seriesIndex] = linearScale(widthColumns[seriesIndex]); + } - if (hasHighlights) { - rawHighlightValues.push(seriesHighlightValues); + let dataPointObjects: powerbi.DataViewObjects[] = categoryObjectsList; + let multipliersAllData: ValueMultiplers = BaseColumnChart.getStackedMultiplierForAllDataSet(rawValues, seriesCount, categoryCount); + + for (let seriesIndex: number = 0; seriesIndex < seriesCount; seriesIndex++) { + let seriesDataPoints: MekkoChartColumnDataPoint[] = [], + legendItem: MekkoLegendDataPoint = legend[seriesIndex], + seriesLabelSettings: VisualDataLabelsSettings; + + if (!hasDynamicSeries) { + const labelsSeriesGroup: DataViewValueColumn = grouped + && grouped.length > 0 + && grouped[0].values + ? grouped[0].values[seriesIndex] + : null; + + const labelObjects: DataLabelObject = labelsSeriesGroup + && labelsSeriesGroup.source + && labelsSeriesGroup.source.objects + ? labelsSeriesGroup.source.objects["labels"] as any + : null; + + if (labelObjects) { + seriesLabelSettings = Prototype.inherit(defaultLabelSettings); + + dataLabelUtils.updateLabelSettingsFromLabelsObject( + labelObjects, + seriesLabelSettings); } } - if (highlightsOverflow && !supportsOverflow) { - highlightsOverflow = false; - hasHighlights = false; - rawValues = rawHighlightValues; + const series: MekkoChartSeries = { + displayName: legendItem.label, + key: `series${seriesIndex}`, + index: seriesIndex, + data: seriesDataPoints, + identity: legendItem.identity as ISelectionId, + color: legendItem.color, + labelSettings: seriesLabelSettings, + }; + + if (seriesCount > 1) { + dataPointObjects = seriesObjectsList[seriesIndex]; } - if (widthColumns.length < 1) { - for (let seriesIndex: number = 0; seriesIndex < dataViewCat.values.length; seriesIndex++) { - if (dataViewCat.values[seriesIndex].source.roles - && dataViewCat.values[seriesIndex].source.roles[RoleNames.width]) { + const metadata: DataViewMetadataColumn = dataViewCat.values[seriesIndex].source; - widthIndex = seriesIndex; + for (let categoryIndex: number = 0; categoryIndex < categoryCount; categoryIndex++) { + if (seriesIndex === 0) { + baseValuesPos.push(0); + baseValuesNeg.push(0); + } - const widthValues: number[] = dataViewCat.values[seriesIndex].values as number[]; + let value: number = AxisHelper.normalizeNonFiniteNumber( + rawValues[seriesIndex][categoryIndex]); - for (let i: number = 0; i < widthValues.length; i++) { - widthColumns[i] = d3.sum([ - 0, - widthColumns[i], - widthValues[i] - ]); - } - - continue; - } + if (value == null && seriesIndex > 0) { + continue; } - } - if (widthColumns.length < 1) { - for (let seriesIndex: number = 0; seriesIndex < categoryCount; seriesIndex++) { - widthColumns.push(1); + let originalValue: number = value, + categoryValue: any = categories[categoryIndex]; + + if (isDateTime && categoryValue) { + categoryValue = categoryValue.getTime(); } - } - const totalSum: number = d3.sum(widthColumns), - linearScale: LinearScale = d3.scale.linear() - .domain([0, totalSum]) - .range([0, 1]); + if (isScalar && (categoryValue == null || isNaN(categoryValue))) { + continue; + } - const columnStartX: number[] = [0], - columnWidth: number[] = []; + let multipliers: ValueMultiplers; - for (let seriesIndex: number = 0; seriesIndex < (categoryCount - 1); seriesIndex++) { - const stepWidth: number = columnStartX[columnStartX.length - 1] - + (widthColumns[seriesIndex] || 0); + if (is100PercentStacked) { + multipliers = BaseColumnChart.getStackedMultiplier( + rawValues, + categoryIndex, + seriesCount, + categoryCount); + } - columnStartX.push(stepWidth); - } + let unadjustedValue: number = value, + isNegative: boolean = value < 0; - for (let seriesIndex: number = 0; seriesIndex < categoryCount; seriesIndex++) { - columnStartX[seriesIndex] = linearScale(columnStartX[seriesIndex]); - columnWidth[seriesIndex] = linearScale(widthColumns[seriesIndex]); - } + if (multipliers) { + if (isNegative) { + value *= multipliers.neg; + } else { + value *= multipliers.pos; + } + } - let dataPointObjects: IDataViewObjects[] = categoryObjectsList; - let multipliersAllData: ValueMultiplers = BaseColumnChart.getStackedMultiplierForAllDataSet(rawValues, seriesCount, categoryCount); - - for (let seriesIndex: number = 0; seriesIndex < seriesCount; seriesIndex++) { - let seriesDataPoints: MekkoChartColumnDataPoint[] = [], - legendItem: MekkoLegendDataPoint = legend[seriesIndex], - seriesLabelSettings: VisualDataLabelsSettings; - - if (!hasDynamicSeries) { - const labelsSeriesGroup: DataViewValueColumn = grouped - && grouped.length > 0 - && grouped[0].values - ? grouped[0].values[seriesIndex] - : null; - - const labelObjects: DataLabelObject = labelsSeriesGroup - && labelsSeriesGroup.source - && labelsSeriesGroup.source.objects - ? labelsSeriesGroup.source.objects["labels"] as DataLabelObject - : null; - - if (labelObjects) { - seriesLabelSettings = Prototype.inherit(defaultLabelSettings); - - dataLabelUtils.updateLabelSettingsFromLabelsObject( - labelObjects, - seriesLabelSettings); + let valueByAllData = originalValue; + if (multipliersAllData) { + if (isNegative) { + valueByAllData *= multipliersAllData.neg; + } else { + valueByAllData *= multipliersAllData.pos; } } - const series: MekkoChartSeries = { - displayName: legendItem.label, - key: `series${seriesIndex}`, - index: seriesIndex, - data: seriesDataPoints, - identity: legendItem.identity as ISelectionId, - color: legendItem.color, - labelSettings: seriesLabelSettings, - }; + let valueAbsolute: number = Math.abs(value); + let position: number; - if (seriesCount > 1) { - dataPointObjects = seriesObjectsList[seriesIndex]; - } + let valueAbsoluteByAllData: number = Math.abs(valueByAllData); - const metadata: DataViewMetadataColumn = dataViewCat.values[seriesIndex].source; + if (isNegative) { + position = baseValuesNeg[categoryIndex]; - for (let categoryIndex: number = 0; categoryIndex < categoryCount; categoryIndex++) { - if (seriesIndex === 0) { - baseValuesPos.push(0); - baseValuesNeg.push(0); + if (!isNaN(valueAbsolute)) { + baseValuesNeg[categoryIndex] -= valueAbsolute; + } + } + else { + if (!isNaN(valueAbsolute)) { + baseValuesPos[categoryIndex] += valueAbsolute; } - let value: number = AxisHelper.normalizeNonFiniteNumber( - rawValues[seriesIndex][categoryIndex]); + position = baseValuesPos[categoryIndex]; + } + + const columnGroup: DataViewValueColumnGroup = grouped + && grouped.length > seriesIndex + && grouped[seriesIndex].values + ? grouped[seriesIndex] + : null; + + const category: DataViewCategoryColumn = dataViewCat.categories + && dataViewCat.categories.length > 0 + ? dataViewCat.categories[0] + : null; + + const identity: ISelectionId = visualHost.createSelectionIdBuilder() + .withCategory(category, categoryIndex) + .withSeries(dataViewCat.values, columnGroup) + .withMeasure(converterStrategy.getMeasureNameByIndex(seriesIndex)) + .createSelectionId(); - if (value == null && seriesIndex > 0) { - continue; - } + let color: string = BaseColumnChart.getDataPointColor( + legendItem, + categoryIndex, + dataPointObjects + ); - let originalValue: number = value, - categoryValue: any = categories[categoryIndex]; + const seriesData: tooltip.TooltipSeriesDataItem[] = []; - if (isDateTime && categoryValue) { - categoryValue = categoryValue.getTime(); - } + if (columnGroup) { + const seriesValueColumn: DataViewValueColumn = { + values: [], + source: dataViewCat.values.source, + }; - if (isScalar && (categoryValue == null || isNaN(categoryValue))) { - continue; - } + seriesData.push({ + value: columnGroup.name, + metadata: seriesValueColumn, + }); - let multipliers: ValueMultiplers; + for (let columnIndex: number = 0; columnIndex < columnGroup.values.length; columnIndex++) { + const columnValues: DataViewValueColumn = columnGroup.values[columnIndex]; - if (is100PercentStacked) { - multipliers = BaseColumnChart.getStackedMultiplier( - rawValues, - categoryIndex, - seriesCount, - categoryCount); + seriesData.push({ + value: columnValues.values[categoryIndex], + metadata: columnValues, + }); } + } - let unadjustedValue: number = value, - isNegative: boolean = value < 0; + let rawCategoryValue: any = categories[categoryIndex]; + let tooltipInfo: VisualTooltipDataItem[] = tooltip.createTooltipInfo( + null, + rawCategoryValue, + localizationManager, + originalValue, + [category], + seriesData, + null, + categoryIndex); + + const dataPointLabelSettings: VisualDataLabelsSettings = series && series.labelSettings + ? series.labelSettings + : defaultLabelSettings; + + let labelColor: string = dataPointLabelSettings.labelColor, + lastValue: boolean = undefined; + + // Stacked column/bar label color is white by default (except last series) + if ((EnumExtensions.hasFlag(chartType, flagStacked))) { + lastValue = this.getStackedLabelColor( + isNegative, + seriesIndex, + seriesCount, + categoryIndex, + rawValues); - if (multipliers) { - if (isNegative) { - value *= multipliers.neg; - } else { - value *= multipliers.pos; - } - } + labelColor = lastValue || (seriesIndex === seriesCount - 1 && !isNegative) + ? labelColor + : dataLabelUtils.defaultInsideLabelColor; + } - let valueByAllData = originalValue; - if (multipliersAllData) { - if (isNegative) { - valueByAllData *= multipliersAllData.neg; - } else { - valueByAllData *= multipliersAllData.pos; - } - } + value = columnWidth[categoryIndex]; - let valueAbsolute: number = Math.abs(value); - let position: number; + let originalPosition: number = columnStartX[categoryIndex], + dataPoint: MekkoChartColumnDataPoint = { + categoryValue, + value, + position, + valueAbsolute, + categoryIndex, + color, + seriesIndex, + chartType, + identity, + tooltipInfo, + originalPosition, + valueOriginal: unadjustedValue, + labelSettings: dataPointLabelSettings, + selected: false, + originalValue: value, + originalValueAbsolute: valueAbsolute, + originalValueAbsoluteByAlLData: valueAbsoluteByAllData, + key: identity.getKey(), + labelFill: labelColor, + labelFormatString: metadata.format, + lastSeries: lastValue + }; - let valueAbsoluteByAllData: number = Math.abs(valueByAllData); + seriesDataPoints.push(dataPoint); - if (isNegative) { - position = baseValuesNeg[categoryIndex]; + if (hasHighlights) { + let valueHighlight: number = rawHighlightValues[seriesIndex][categoryIndex], + unadjustedValueHighlight: number = valueHighlight; - if (!isNaN(valueAbsolute)) { - baseValuesNeg[categoryIndex] -= valueAbsolute; - } + let highlightedTooltip: boolean = true; + + if (valueHighlight === null) { + valueHighlight = 0; + highlightedTooltip = false; } - else { - if (!isNaN(valueAbsolute)) { - baseValuesPos[categoryIndex] += valueAbsolute; - } - position = baseValuesPos[categoryIndex]; + if (is100PercentStacked) { + valueHighlight *= multipliers.pos; } - const columnGroup: DataViewValueColumnGroup = grouped - && grouped.length > seriesIndex - && grouped[seriesIndex].values - ? grouped[seriesIndex] - : null; - - const category: DataViewCategoryColumn = dataViewCat.categories - && dataViewCat.categories.length > 0 - ? dataViewCat.categories[0] - : null; - - const identity: ISelectionId = visualHost.createSelectionIdBuilder() - .withCategory(category, categoryIndex) - .withSeries(dataViewCat.values, columnGroup) - .withMeasure(converterStrategy.getMeasureNameByIndex(seriesIndex)) - .createSelectionId(); - - let color: string = BaseColumnChart.getDataPointColor( - legendItem, - categoryIndex, - dataPointObjects - ); - - const seriesData: tooltip.TooltipSeriesDataItem[] = []; - - if (columnGroup) { - const seriesValueColumn: DataViewValueColumn = { - values: [], - source: dataViewCat.values.source, - }; + let absoluteValueHighlight: number = Math.abs(valueHighlight), + highlightPosition: number = position; - seriesData.push({ - value: columnGroup.name, - metadata: seriesValueColumn, - }); + if (valueHighlight > 0) { + highlightPosition -= valueAbsolute - absoluteValueHighlight; + } + else if (valueHighlight === 0 && value > 0) { + highlightPosition -= valueAbsolute; + } - for (let columnIndex: number = 0; columnIndex < columnGroup.values.length; columnIndex++) { - const columnValues: DataViewValueColumn = columnGroup.values[columnIndex]; + rawCategoryValue = categories[categoryIndex]; - seriesData.push({ - value: columnValues.values[categoryIndex], - metadata: columnValues, - }); - } - } + let highlightedValue: number = highlightedTooltip + ? valueHighlight + : undefined; - let rawCategoryValue: any = categories[categoryIndex]; - let tooltipInfo: VisualTooltipDataItem[] = tooltip.createTooltipInfo( - null, + tooltipInfo = tooltip.createTooltipInfo( + dataViewCat, rawCategoryValue, localizationManager, originalValue, - [category], - seriesData, null, - categoryIndex); + null, + seriesIndex, + categoryIndex, + highlightedValue); - const dataPointLabelSettings: VisualDataLabelsSettings = series && series.labelSettings - ? series.labelSettings - : defaultLabelSettings; - - let labelColor: string = dataPointLabelSettings.labelColor, - lastValue: boolean = undefined; - - // Stacked column/bar label color is white by default (except last series) - if ((EnumExtensions.hasFlag(chartType, flagStacked))) { - lastValue = this.getStackedLabelColor( - isNegative, - seriesIndex, - seriesCount, - categoryIndex, - rawValues); - - labelColor = lastValue || (seriesIndex === seriesCount - 1 && !isNegative) - ? labelColor - : dataLabelUtils.defaultInsideLabelColor; + if (highlightedTooltip) { + dataPoint.tooltipInfo = tooltipInfo; } - value = columnWidth[categoryIndex]; - - let originalPosition: number = columnStartX[categoryIndex], - dataPoint: MekkoChartColumnDataPoint = { - categoryValue, - value, - position, - valueAbsolute, - categoryIndex, - color, - seriesIndex, - chartType, - identity, - tooltipInfo, - originalPosition, - valueOriginal: unadjustedValue, - labelSettings: dataPointLabelSettings, - selected: false, - originalValue: value, - originalValueAbsolute: valueAbsolute, - originalValueAbsoluteByAlLData: valueAbsoluteByAllData, - key: identity.getKey(), - labelFill: labelColor, - labelFormatString: metadata.format, - lastSeries: lastValue - }; - - seriesDataPoints.push(dataPoint); - - if (hasHighlights) { - let valueHighlight: number = rawHighlightValues[seriesIndex][categoryIndex], - unadjustedValueHighlight: number = valueHighlight; - - let highlightedTooltip: boolean = true; - - if (valueHighlight === null) { - valueHighlight = 0; - highlightedTooltip = false; - } - - if (is100PercentStacked) { - valueHighlight *= multipliers.pos; - } - - let absoluteValueHighlight: number = Math.abs(valueHighlight), - highlightPosition: number = position; - - if (valueHighlight > 0) { - highlightPosition -= valueAbsolute - absoluteValueHighlight; - } - else if (valueHighlight === 0 && value > 0) { - highlightPosition -= valueAbsolute; - } - - rawCategoryValue = categories[categoryIndex]; - - let highlightedValue: number = highlightedTooltip - ? valueHighlight - : undefined; - - tooltipInfo = tooltip.createTooltipInfo( - dataViewCat, - rawCategoryValue, - localizationManager, - originalValue, - null, - null, - seriesIndex, - categoryIndex, - highlightedValue); - - if (highlightedTooltip) { - dataPoint.tooltipInfo = tooltipInfo; - } + const highlightDataPoint: MekkoChartColumnDataPoint = { + categoryValue, + value, + seriesIndex, + categoryIndex, + color, + originalPosition, + identity, + chartType, + tooltipInfo, + position: highlightPosition, + valueAbsolute: absoluteValueHighlight, + valueOriginal: unadjustedValueHighlight, + labelSettings: dataPointLabelSettings, + selected: false, + highlight: true, + originalValue: value, + originalValueAbsolute: valueAbsolute, + drawThinner: highlightsOverflow, + key: `${identity.getKey()}${BaseColumnChart.HighlightedKeyPostfix}`, + labelFormatString: metadata.format, + labelFill: labelColor, + lastSeries: lastValue + }; - const highlightDataPoint: MekkoChartColumnDataPoint = { - categoryValue, - value, - seriesIndex, - categoryIndex, - color, - originalPosition, - identity, - chartType, - tooltipInfo, - position: highlightPosition, - valueAbsolute: absoluteValueHighlight, - valueOriginal: unadjustedValueHighlight, - labelSettings: dataPointLabelSettings, - selected: false, - highlight: true, - originalValue: value, - originalValueAbsolute: valueAbsolute, - drawThinner: highlightsOverflow, - key: `${identity.getKey()}${BaseColumnChart.HighlightedKeyPostfix}`, - labelFormatString: metadata.format, - labelFill: labelColor, - lastSeries: lastValue - }; - - seriesDataPoints.push(highlightDataPoint); - } + seriesDataPoints.push(highlightDataPoint); } - - columnSeries.push(series); } - let result: MekkoDataPoints = { - series: columnSeries, - categoriesWidth: columnWidth, - hasHighlights: hasHighlights, - hasDynamicSeries: hasDynamicSeries - }; + columnSeries.push(series); + } - let categoryProperties: MekkoCategoryProperties[] = []; + let result: MekkoDataPoints = { + series: columnSeries, + categoriesWidth: columnWidth, + hasHighlights: hasHighlights, + hasDynamicSeries: hasDynamicSeries + }; - result.series.forEach((series) => { - if (series.data.length !== 1) { - return; - } - if (categoryProperties[series.data[0].categoryIndex] === undefined) { - categoryProperties[series.data[0].categoryIndex] = { - valueAbsolute: 0 - }; - } - if (series.data[0] !== undefined && series.data[0].valueAbsolute > categoryProperties[series.data[0].categoryIndex].valueAbsolute) { - categoryProperties[series.data[0].categoryIndex].valueAbsolute = series.data[0].valueAbsolute; - categoryProperties[series.data[0].categoryIndex].color = series.data[0].color; - categoryProperties[series.data[0].categoryIndex].name = (series.data[0].categoryValue || "").toString(); - categoryProperties[series.data[0].categoryIndex].series = series; - categoryProperties[series.data[0].categoryIndex].identity = series.identity; - } - }); - result.categoryProperties = categoryProperties; + let categoryProperties: MekkoCategoryProperties[] = []; - return result; - } + result.series.forEach((series) => { + if (series.data.length !== 1) { + return; + } + if (categoryProperties[series.data[0].categoryIndex] === undefined) { + categoryProperties[series.data[0].categoryIndex] = { + valueAbsolute: 0 + }; + } + if (series.data[0] !== undefined && series.data[0].valueAbsolute > categoryProperties[series.data[0].categoryIndex].valueAbsolute) { + categoryProperties[series.data[0].categoryIndex].valueAbsolute = series.data[0].valueAbsolute; + categoryProperties[series.data[0].categoryIndex].color = series.data[0].color; + categoryProperties[series.data[0].categoryIndex].name = (series.data[0].categoryValue || "").toString(); + categoryProperties[series.data[0].categoryIndex].series = series; + categoryProperties[series.data[0].categoryIndex].identity = series.identity; + } + }); + result.categoryProperties = categoryProperties; + + return result; + } - private static getDataPointColor( - legendItem: MekkoLegendDataPoint, - categoryIndex: number, - dataPointObjects?: IDataViewObjects[]): string { + private static getDataPointColor( + legendItem: MekkoLegendDataPoint, + categoryIndex: number, + dataPointObjects?: powerbi.DataViewObjects[]): string { - if (dataPointObjects) { - let colorOverride: string = DataViewObjects.getFillColor( - dataPointObjects[categoryIndex], - MekkoChart.Properties["dataPoint"]["fill"]); + if (dataPointObjects) { + let colorOverride: string = DataViewObjects.getFillColor( + dataPointObjects[categoryIndex], + MekkoChart.Properties["dataPoint"]["fill"]); - if (colorOverride) { - return colorOverride; - } + if (colorOverride) { + return colorOverride; } - - return legendItem.color; } - private static getStackedLabelColor( - isNegative: boolean, - seriesIndex: number, - seriesCount: number, - categoryIndex: number, - rawValues: number[][]): boolean { + return legendItem.color; + } - let lastValue: boolean = !(isNegative - && seriesIndex === seriesCount - 1 - && seriesCount !== 1); + private static getStackedLabelColor( + isNegative: boolean, + seriesIndex: number, + seriesCount: number, + categoryIndex: number, + rawValues: number[][]): boolean { - // run for the next series and check if current series is last - for (let i: number = seriesIndex + 1; i < seriesCount; i++) { - const nextValues: number = AxisHelper.normalizeNonFiniteNumber(rawValues[i][categoryIndex]); + let lastValue: boolean = !(isNegative + && seriesIndex === seriesCount - 1 + && seriesCount !== 1); - if ((nextValues !== null) - && (((!isNegative || (isNegative && seriesIndex === 0)) && nextValues > 0) - || (isNegative && seriesIndex !== 0))) { + // run for the next series and check if current series is last + for (let i: number = seriesIndex + 1; i < seriesCount; i++) { + const nextValues: number = AxisHelper.normalizeNonFiniteNumber(rawValues[i][categoryIndex]); - lastValue = false; - break; - } - } + if ((nextValues !== null) + && (((!isNegative || (isNegative && seriesIndex === 0)) && nextValues > 0) + || (isNegative && seriesIndex !== 0))) { - return lastValue; + lastValue = false; + break; + } } - public static sliceSeries( - series: MekkoChartSeries[], - endIndex: number, - startIndex: number = 0): MekkoChartSeries[] { + return lastValue; + } - const newSeries: MekkoChartSeries[] = []; + public static sliceSeries( + series: MekkoChartSeries[], + endIndex: number, + startIndex: number = 0): MekkoChartSeries[] { - if (series && series.length > 0) { - for (let i: number = 0, len = series.length; i < len; i++) { - const iNewSeries: MekkoChartSeries = newSeries[i] = Prototype.inherit(series[i]); + const newSeries: MekkoChartSeries[] = []; - iNewSeries.data = series[i].data.filter((dataPoint: MekkoChartColumnDataPoint) => { - return dataPoint.categoryIndex >= startIndex - && dataPoint.categoryIndex < endIndex; - }); - } - } + if (series && series.length > 0) { + for (let i: number = 0, len = series.length; i < len; i++) { + const iNewSeries: MekkoChartSeries = newSeries[i] = Prototype.inherit(series[i]); - return newSeries; + iNewSeries.data = series[i].data.filter((dataPoint: MekkoChartColumnDataPoint) => { + return dataPoint.categoryIndex >= startIndex + && dataPoint.categoryIndex < endIndex; + }); + } } - public getColumnsWidth(): number[] { - const data: MekkoColumnChartData = this.data; + return newSeries; + } - if (!data - || !data.series - || !data.series[0] - || !data.series[0].data) { + public getColumnsWidth(): number[] { + const data: MekkoColumnChartData = this.data; - return []; - } + if (!data + || !data.series + || !data.series[0] + || !data.series[0].data) { - return data.categoriesWidth; + return []; } - public getBorderWidth(): number { - return BaseColumnChart.getBorderWidth(this.data.borderSettings); - } + return data.categoriesWidth; + } - public getSeriesSortSettings(): MekkoSeriesSortSettings { - return this.data.sortSeries; - } + public getBorderWidth(): number { + return BaseColumnChart.getBorderWidth(this.data.borderSettings); + } - public getLegendSortSettings(): MekkoLegendSortSettings { - return this.data.sortlegend; - } + public getSeriesSortSettings(): MekkoSeriesSortSettings { + return this.data.sortSeries; + } - public getXAxisLabelsSettings(): MekkoXAxisLabelsSettings { - return this.data.xAxisLabelsSettings; - } + public getLegendSortSettings(): MekkoLegendSortSettings { + return this.data.sortlegend; + } - public setData(dataViews: DataView[]): void { - this.data = { - categories: [], - categoriesWidth: [], - categoryFormatter: null, - series: [], - valuesMetadata: [], - legendData: null, - hasHighlights: false, - categoryMetadata: null, - scalarCategoryAxis: false, - borderSettings: null, - sortlegend: null, - sortSeries: null, - xAxisLabelsSettings: null, - labelSettings: dataLabelUtils.getDefaultColumnLabelSettings(true), - axesLabels: { x: null, y: null }, - hasDynamicSeries: false, - defaultDataPointColor: null, - isMultiMeasure: false, - categoryProperties: null, - dataPointSettings: null - }; + public getXAxisLabelsSettings(): MekkoXAxisLabelsSettings { + return this.data.xAxisLabelsSettings; + } - if (dataViews.length > 0) { - const dataView: DataView = dataViews[0]; + public setData(dataViews: powerbi.DataView[]): void { + this.data = { + categories: [], + categoriesWidth: [], + categoryFormatter: null, + series: [], + valuesMetadata: [], + legendData: null, + hasHighlights: false, + categoryMetadata: null, + scalarCategoryAxis: false, + borderSettings: null, + sortlegend: null, + sortSeries: null, + xAxisLabelsSettings: null, + labelSettings: dataLabelUtils.getDefaultColumnLabelSettings(true), + axesLabels: { x: null, y: null }, + hasDynamicSeries: false, + defaultDataPointColor: null, + isMultiMeasure: false, + categoryProperties: null, + dataPointSettings: null + }; - if (dataView && dataView.categorical) { - this.dataViewCat = dataView.categorical; - this.data = BaseColumnChart.converter( - this.visualHost, - this.dataViewCat, - this.cartesianVisualHost.getSharedColors(), - true, - false, - this.supportsOverflow, - dataView.metadata, - this.localizationManager, - this.chartType); - - for (let currentSeries of this.data.series) { - if (this.interactivityService) { - this.interactivityService.applySelectionStateToData(currentSeries.data); - } + if (dataViews.length > 0) { + const dataView: powerbi.DataView = dataViews[0]; + + if (dataView && dataView.categorical) { + this.dataViewCat = dataView.categorical; + this.data = BaseColumnChart.converter( + this.visualHost, + this.dataViewCat, + this.cartesianVisualHost.getSharedColors(), + true, + false, + this.supportsOverflow, + dataView.metadata, + this.localizationManager, + this.chartType); + + for (let currentSeries of this.data.series) { + if (this.interactivityService) { + this.interactivityService.applySelectionStateToData(currentSeries.data); } } } } + } - public calculateLegend(): ILegendData { - const legendData: ILegendData = this.data - ? this.data.legendData - : null; - - const dataPoints: LegendDataPoint[] = legendData - ? legendData.dataPoints - : []; + public calculateLegend(): ILegendData { + const legendData: ILegendData = this.data + ? this.data.legendData + : null; - if (ArrayExtensions.isUndefinedOrEmpty(dataPoints)) { - return null; - } + const dataPoints: LegendDataPoint[] = legendData + ? legendData.dataPoints + : []; - return legendData; + if (ArrayExtensions.isUndefinedOrEmpty(dataPoints)) { + return null; } - public hasLegend(): boolean { - return this.data - && (this.data.hasDynamicSeries - || (this.data.series && this.data.series.length > 1)); - } + return legendData; + } - public enumerateObjectInstances( - enumeration: VisualObjectInstance[], - options: EnumerateVisualObjectInstancesOptions): void { + public hasLegend(): boolean { + return this.data + && (this.data.hasDynamicSeries + || (this.data.series && this.data.series.length > 1)); + } - switch (options.objectName) { - case "dataPoint": { - this.enumerateDataPoints(enumeration); - break; - } - case "labels": { - this.enumerateDataLabels(enumeration); - break; - } - case "xAxisLabels": { - this.enumerateXAxisLabels(enumeration); - break; - } - case "sortLegend": { - this.enumerateSortLegend(enumeration); - break; - } - case "sortSeries": { - this.enumerateSortSeries(enumeration); - break; - } - case "categoryColorStart": { - this.enumerateCategoryColors(enumeration, "categoryColorStart", "Start color"); - break; - } - case "categoryColorEnd": { - this.enumerateCategoryColors(enumeration, "categoryColorEnd", "End color"); - break; - } + public enumerateObjectInstances( + enumeration: VisualObjectInstance[], + options: EnumerateVisualObjectInstancesOptions): void { + + switch (options.objectName) { + case "dataPoint": { + this.enumerateDataPoints(enumeration); + break; + } + case "labels": { + this.enumerateDataLabels(enumeration); + break; + } + case "xAxisLabels": { + this.enumerateXAxisLabels(enumeration); + break; + } + case "sortLegend": { + this.enumerateSortLegend(enumeration); + break; + } + case "sortSeries": { + this.enumerateSortSeries(enumeration); + break; + } + case "categoryColorStart": { + this.enumerateCategoryColors(enumeration, "categoryColorStart", "Start color"); + break; + } + case "categoryColorEnd": { + this.enumerateCategoryColors(enumeration, "categoryColorEnd", "End color"); + break; } } + } - private enumerateCategoryColors(instances: VisualObjectInstance[], objectName: string, label: string) { - if (this.data.dataPointSettings && this.data.dataPointSettings.categoryGradient && this.checkDataToFeatures()) { - this.data.categories.forEach( (category, index ) => { - let categoryLegends: MekkoLegendDataPoint[] = this.data.legendData.dataPoints.filter( legend => legend.category === category); + private enumerateCategoryColors(instances: VisualObjectInstance[], objectName: string, label: string) { + if (this.data.dataPointSettings && this.data.dataPointSettings.categoryGradient && this.checkDataToFeatures()) { + this.data.categories.forEach((category, index) => { + let categoryLegends: MekkoLegendDataPoint[] = this.data.legendData.dataPoints.filter(legend => legend.category === category); - instances.push({ - objectName: objectName, - displayName: `${label} -${category}`, - selector: ColorHelper.normalizeSelector((categoryLegends[0].categoryIdentity as ISelectionId).getSelector(), true), - properties: { - categoryGradient: { - solid: { - color: objectName === "categoryColorStart" ? categoryLegends[0].categoryStartColor : categoryLegends[0].categoryEndColor - } + instances.push({ + objectName: objectName, + displayName: `${label} -${category}`, + selector: ColorHelper.normalizeSelector(categoryLegends[0].categoryIdentity.getSelector(), true), + properties: { + categoryGradient: { + solid: { + color: objectName === "categoryColorStart" ? categoryLegends[0].categoryStartColor : categoryLegends[0].categoryEndColor } - }, - }); + } + }, }); - } - } - - private enumerateXAxisLabels(instances: VisualObjectInstance[]): void { - instances[0] = { - objectName: "xAxisLabels", - properties: {} - }; - instances[0].properties["enableRotataion"] = this.data.xAxisLabelsSettings.enableRotataion; - } - - private enumerateSortLegend(instances: VisualObjectInstance[]): void { - instances[0] = { - objectName: "sortLegend", - properties: {} - }; - instances[0].properties["enabled"] = this.data.sortlegend.enabled; - instances[0].properties["direction"] = this.data.sortlegend.direction; - - instances[0].properties["groupByCategory"] = this.data.sortlegend.groupByCategory; - instances[0].properties["groupByCategoryDirection"] = this.data.sortlegend.groupByCategoryDirection; + }); } + } - private enumerateSortSeries(instances: VisualObjectInstance[]): void { - instances[0] = { - objectName: "sortSeries", - properties: {} - }; - instances[0].properties["enabled"] = this.data.sortSeries.enabled; - instances[0].properties["direction"] = this.data.sortSeries.direction; - instances[0].properties["displayPercents"] = this.data.sortSeries.displayPercents; - } + private enumerateXAxisLabels(instances: VisualObjectInstance[]): void { + instances[0] = { + objectName: "xAxisLabels", + properties: {} + }; + instances[0].properties["enableRotataion"] = this.data.xAxisLabelsSettings.enableRotataion; + } - private enumerateDataLabels(instances: VisualObjectInstance[]): void { - const data: MekkoColumnChartData = this.data, - seriesCount: number = data.series.length; + private enumerateSortLegend(instances: VisualObjectInstance[]): void { + instances[0] = { + objectName: "sortLegend", + properties: {} + }; + instances[0].properties["enabled"] = this.data.sortlegend.enabled; + instances[0].properties["direction"] = this.data.sortlegend.direction; - // Draw default settings - dataLabelUtils.enumerateDataLabels(this.getLabelSettingsOptions( - instances, - this.data.labelSettings, - false)); + instances[0].properties["groupByCategory"] = this.data.sortlegend.groupByCategory; + instances[0].properties["groupByCategoryDirection"] = this.data.sortlegend.groupByCategoryDirection; + } - (instances[0].properties).forceDisplay = (this.data.labelSettings).forceDisplay; + private enumerateSortSeries(instances: VisualObjectInstance[]): void { + instances[0] = { + objectName: "sortSeries", + properties: {} + }; + instances[0].properties["enabled"] = this.data.sortSeries.enabled; + instances[0].properties["direction"] = this.data.sortSeries.direction; + instances[0].properties["displayPercents"] = this.data.sortSeries.displayPercents; + } - if (seriesCount === 0) { - return; - } + private enumerateDataLabels(instances: VisualObjectInstance[]): void { + const data: MekkoColumnChartData = this.data, + seriesCount: number = data.series.length; - if (!data.hasDynamicSeries && (seriesCount > 1 || !data.categoryMetadata)) { - for (let i: number = 0; i < seriesCount; i++) { - const series: MekkoChartSeries = data.series[i], - labelSettings: VisualDataLabelsSettings = (series.labelSettings) - ? series.labelSettings - : this.data.labelSettings; - - dataLabelUtils.enumerateDataLabels( - this.getLabelSettingsOptions( - instances, - labelSettings, - true, - series)); - } - } - } + // Draw default settings + dataLabelUtils.enumerateDataLabels(this.getLabelSettingsOptions( + instances, + this.data.labelSettings, + false)); - private getLabelSettingsOptions( - instances: VisualObjectInstance[], - labelSettings: VisualDataLabelsSettings, - isSeries: boolean, - series?: MekkoChartSeries): MekkoChartLabelSettingsOptions { + (instances[0].properties).forceDisplay = (this.data.labelSettings).forceDisplay; - return { - instances: instances, - dataLabelsSettings: labelSettings, - show: !isSeries, - displayUnits: true, - precision: true, - forceDisplay: true, - fontSize: false, - selector: series && series.identity - ? series.identity.getSelector() - : null - }; + if (seriesCount === 0) { + return; } - public getData() { - return this.data; - } + if (!data.hasDynamicSeries && (seriesCount > 1 || !data.categoryMetadata)) { + for (let i: number = 0; i < seriesCount; i++) { + const series: MekkoChartSeries = data.series[i], + labelSettings: VisualDataLabelsSettings = (series.labelSettings) + ? series.labelSettings + : this.data.labelSettings; - private checkDataToFeatures(): boolean { - return !this.data.legendData.dataPoints.some( (value: MekkoLegendDataPoint) => { - return value.categoryValues.filter( value => value).length > 1; - }); + dataLabelUtils.enumerateDataLabels( + this.getLabelSettingsOptions( + instances, + labelSettings, + true, + series)); + } } + } - private enumerateDataPoints(instances: VisualObjectInstance[]): void { - const data: MekkoColumnChartData = this.data; - - if (!data || !data.series) { - return; - } + private getLabelSettingsOptions( + instances: VisualObjectInstance[], + labelSettings: VisualDataLabelsSettings, + isSeries: boolean, + series?: MekkoChartSeries): MekkoChartLabelSettingsOptions { + + return { + instances: instances, + dataLabelsSettings: labelSettings, + show: !isSeries, + displayUnits: true, + precision: true, + forceDisplay: true, + fontSize: false, + selector: series && series.identity + ? series.identity.getSelector() + : null + }; + } - const seriesCount: number = data.series.length; + public getData() { + return this.data; + } - if (seriesCount === 0) { - return; - } + private checkDataToFeatures(): boolean { + return !this.data.legendData.dataPoints.some((value: MekkoLegendDataPoint) => { + return value.categoryValues.filter(value => value).length > 1; + }); + } - let properties: any = {}; - if (this.checkDataToFeatures()) { - properties["categoryGradient"] = this.data.dataPointSettings.categoryGradient; + private enumerateDataPoints(instances: VisualObjectInstance[]): void { + const data: MekkoColumnChartData = this.data; - instances.push({ - objectName: "dataPoint", - selector: null, - properties: properties - }); - } + if (!data || !data.series) { + return; + } - if (data.hasDynamicSeries || seriesCount > 1 || !data.categoryMetadata) { - if (!this.data.dataPointSettings.categoryGradient) { - for (let series of data.series) { - instances.push({ - objectName: "dataPoint", - displayName: series.displayName, - selector: ColorHelper.normalizeSelector(series.identity.getSelector()), - properties: { - fill: { solid: { color: series.color } } - }, - }); - } - } - } - else { - // For single-category, single-measure column charts, the user can color the individual bars. - const singleSeriesData: MekkoChartColumnDataPoint[] = data.series[0].data, - categoryFormatter: IValueFormatter = data.categoryFormatter; + const seriesCount: number = data.series.length; - // Add default color and show all slices - instances.push({ - objectName: "dataPoint", - selector: null, - properties: { - defaultColor: { - solid: { - color: data.defaultDataPointColor || this.colorPalette.getColor("0").value - } - } - } - }); + if (seriesCount === 0) { + return; + } - instances.push({ - objectName: "dataPoint", - selector: null, - properties: { - showAllDataPoints: !!data.showAllDataPoints - } - }); + let properties: any = {}; + if (this.checkDataToFeatures()) { + properties["categoryGradient"] = this.data.dataPointSettings.categoryGradient; - for (let i: number = 0; i < singleSeriesData.length && data.showAllDataPoints; i++) { - const singleSeriesDataPoints = singleSeriesData[i], - categoryValue: any = data.categories[i]; + instances.push({ + objectName: "dataPoint", + selector: null, + properties: properties + }); + } + if (data.hasDynamicSeries || seriesCount > 1 || !data.categoryMetadata) { + if (!this.data.dataPointSettings.categoryGradient) { + for (let series of data.series) { instances.push({ objectName: "dataPoint", - displayName: categoryFormatter - ? categoryFormatter.format(categoryValue) - : categoryValue, - selector: ColorHelper.normalizeSelector( - (singleSeriesDataPoints.identity as ISelectionId).getSelector(), - true), + displayName: series.displayName, + selector: ColorHelper.normalizeSelector(series.identity.getSelector()), properties: { - fill: { solid: { color: singleSeriesDataPoints.color } } + fill: { solid: { color: series.color } } }, }); } } } + else { + // For single-category, single-measure column charts, the user can color the individual bars. + const singleSeriesData: MekkoChartColumnDataPoint[] = data.series[0].data, + categoryFormatter: IValueFormatter = data.categoryFormatter; + + // Add default color and show all slices + instances.push({ + objectName: "dataPoint", + selector: null, + properties: { + defaultColor: { + solid: { + color: data.defaultDataPointColor || this.colorPalette.getColor("0").value + } + } + } + }); - public calculateAxesProperties(options: MekkoCalculateScaleAndDomainOptions): IAxisProperties[] { - const data: MekkoColumnChartData = this.data; + instances.push({ + objectName: "dataPoint", + selector: null, + properties: { + showAllDataPoints: !!data.showAllDataPoints + } + }); - this.currentViewport = options.viewport; - this.margin = options.margin; + for (let i: number = 0; i < singleSeriesData.length && data.showAllDataPoints; i++) { + const singleSeriesDataPoints = singleSeriesData[i], + categoryValue: any = data.categories[i]; - const origCategorySize: number = data && data.categories - ? data.categories.length - : 0; + instances.push({ + objectName: "dataPoint", + displayName: categoryFormatter + ? categoryFormatter.format(categoryValue) + : categoryValue, + selector: ColorHelper.normalizeSelector( + (singleSeriesDataPoints.identity as ISelectionId).getSelector(), + true), + properties: { + fill: { solid: { color: singleSeriesDataPoints.color } } + }, + }); + } + } + } - const chartLayout: MekkoChartCategoryLayout = data - ? this.getCategoryLayout(origCategorySize, options) - : { - categoryCount: 0, - categoryThickness: MekkoChart.MinOrdinalRectThickness, - outerPaddingRatio: MekkoChart.OuterPaddingRatio, - isScalar: false - }; + public calculateAxesProperties(options: MekkoCalculateScaleAndDomainOptions): IAxisProperties[] { + const data: MekkoColumnChartData = this.data; - this.categoryAxisType = chartLayout.isScalar - ? axis.type.scalar - : null; + this.currentViewport = options.viewport; + this.margin = options.margin; - this.columnChart.setData(data); + const origCategorySize: number = data && data.categories + ? data.categories.length + : 0; - const preferredPlotArea: IViewport = this.getPreferredPlotArea( - chartLayout.isScalar, - chartLayout.categoryCount, - chartLayout.categoryThickness); + const chartLayout: MekkoChartCategoryLayout = data + ? this.getCategoryLayout(origCategorySize, options) + : { + categoryCount: 0, + categoryThickness: MekkoChart.MinOrdinalRectThickness, + outerPaddingRatio: MekkoChart.OuterPaddingRatio, + isScalar: false + }; - /** - * preferredPlotArea would be same as currentViewport width when there is no scrollbar. - * In that case we want to calculate the available plot area for the shapes by subtracting the margin from available viewport - */ - if (preferredPlotArea.width === this.currentViewport.width) { - preferredPlotArea.width -= (this.margin.left + this.margin.right); - } + this.categoryAxisType = chartLayout.isScalar + ? axisType.scalar + : null; - preferredPlotArea.height -= (this.margin.top + this.margin.bottom); + this.columnChart.setData(data); - // When the category axis is scrollable the height of the category axis and value axis will be different - // The height of the value axis would be same as viewportHeight - const chartContext: MekkoColumnChartContext = { - height: preferredPlotArea.height, - width: preferredPlotArea.width, - duration: 0, - hostService: this.visualHost, - unclippedGraphicsContext: this.unclippedGraphicsContext, - mainGraphicsContext: this.mainGraphicsContext, - labelGraphicsContext: this.labelGraphicsContext, - margin: this.margin, - layout: chartLayout, - interactivityService: this.interactivityService, - viewportHeight: this.currentViewport.height - (this.margin.top + this.margin.bottom), - viewportWidth: this.currentViewport.width - (this.margin.left + this.margin.right), - is100Pct: BaseColumnChart.Is100Pct, - isComboChart: true, - }; + const preferredPlotArea: IViewport = this.getPreferredPlotArea( + chartLayout.isScalar, + chartLayout.categoryCount, + chartLayout.categoryThickness); - this.columnChart.setupVisualProps(chartContext); + /** + * preferredPlotArea would be same as currentViewport width when there is no scrollbar. + * In that case we want to calculate the available plot area for the shapes by subtracting the margin from available viewport + */ + if (preferredPlotArea.width === this.currentViewport.width) { + preferredPlotArea.width -= (this.margin.left + this.margin.right); + } - const isBarChart: boolean = EnumExtensions.hasFlag(this.chartType, flagBar); + preferredPlotArea.height -= (this.margin.top + this.margin.bottom); + + // When the category axis is scrollable the height of the category axis and value axis will be different + // The height of the value axis would be same as viewportHeight + const chartContext: MekkoColumnChartContext = { + height: preferredPlotArea.height, + width: preferredPlotArea.width, + duration: 0, + hostService: this.visualHost, + unclippedGraphicsContext: this.unclippedGraphicsContext, + mainGraphicsContext: this.mainGraphicsContext, + labelGraphicsContext: this.labelGraphicsContext, + margin: this.margin, + layout: chartLayout, + interactivityService: this.interactivityService, + viewportHeight: this.currentViewport.height - (this.margin.top + this.margin.bottom), + viewportWidth: this.currentViewport.width - (this.margin.left + this.margin.right), + is100Pct: BaseColumnChart.Is100Pct, + isComboChart: true, + }; - if (isBarChart) { - [options.forcedXDomain, options.forcedYDomain] = [options.forcedYDomain, options.forcedXDomain]; - } + this.columnChart.setupVisualProps(chartContext); - this.xAxisProperties = this.columnChart.setXScale( - BaseColumnChart.Is100Pct, - options.forcedTickCount, - options.forcedXDomain, - isBarChart - ? options.valueAxisScaleType - : options.categoryAxisScaleType); - - this.yAxisProperties = this.columnChart.setYScale( - BaseColumnChart.Is100Pct, - options.forcedTickCount, - options.forcedYDomain, - isBarChart - ? options.categoryAxisScaleType - : options.valueAxisScaleType); - - if (options.showCategoryAxisLabel - && this.xAxisProperties.isCategoryAxis - || options.showValueAxisLabel - && !this.xAxisProperties.isCategoryAxis) { - - this.xAxisProperties.axisLabel = data.axesLabels.x; - } - else { - this.xAxisProperties.axisLabel = null; - } - if (options.showValueAxisLabel - && !this.yAxisProperties.isCategoryAxis - || options.showCategoryAxisLabel - && this.yAxisProperties.isCategoryAxis) { + const isBarChart: boolean = EnumExtensions.hasFlag(this.chartType, flagBar); - this.yAxisProperties.axisLabel = data.axesLabels.y; - } - else { - this.yAxisProperties.axisLabel = null; - } + if (isBarChart) { + [options.forcedXDomain, options.forcedYDomain] = [options.forcedYDomain, options.forcedXDomain]; + } + + this.xAxisProperties = this.columnChart.setXScale( + BaseColumnChart.Is100Pct, + options.forcedTickCount, + options.forcedXDomain, + isBarChart + ? options.valueAxisScaleType + : options.categoryAxisScaleType); + + this.yAxisProperties = this.columnChart.setYScale( + BaseColumnChart.Is100Pct, + options.forcedTickCount, + options.forcedYDomain, + isBarChart + ? options.categoryAxisScaleType + : options.valueAxisScaleType); + + if (options.showCategoryAxisLabel + && this.xAxisProperties.isCategoryAxis + || options.showValueAxisLabel + && !this.xAxisProperties.isCategoryAxis) { + + this.xAxisProperties.axisLabel = data.axesLabels.x; + } + else { + this.xAxisProperties.axisLabel = null; + } + if (options.showValueAxisLabel + && !this.yAxisProperties.isCategoryAxis + || options.showCategoryAxisLabel + && this.yAxisProperties.isCategoryAxis) { - return [ - this.xAxisProperties, - this.yAxisProperties - ]; + this.yAxisProperties.axisLabel = data.axesLabels.y; + } + else { + this.yAxisProperties.axisLabel = null; } - public getPreferredPlotArea( - isScalar: boolean, - categoryCount: number, - categoryThickness: number): IViewport { + return [ + this.xAxisProperties, + this.yAxisProperties + ]; + } - const viewport: IViewport = { - height: this.currentViewport.height, - width: this.currentViewport.width - }; + public getPreferredPlotArea( + isScalar: boolean, + categoryCount: number, + categoryThickness: number): IViewport { - if (this.isScrollable && !isScalar) { - const preferredWidth: number = MekkoChart.getPreferredCategorySpan( - categoryCount, - categoryThickness); + const viewport: IViewport = { + height: this.currentViewport.height, + width: this.currentViewport.width + }; - if (EnumExtensions.hasFlag(this.chartType, flagBar)) { - viewport.height = Math.max(preferredWidth, viewport.height); - } - else { - viewport.width = Math.max(preferredWidth, viewport.width); - } - } + if (this.isScrollable && !isScalar) { + const preferredWidth: number = MekkoChart.getPreferredCategorySpan( + categoryCount, + categoryThickness); - return viewport; + if (EnumExtensions.hasFlag(this.chartType, flagBar)) { + viewport.height = Math.max(preferredWidth, viewport.height); + } + else { + viewport.width = Math.max(preferredWidth, viewport.width); + } } - private selectColumn(indexOfColumnSelected: number, force: boolean = false): void { - if (!force && this.lastInteractiveSelectedColumnIndex === indexOfColumnSelected) { // same column, nothing to do here - return; - } + return viewport; + } - const legendData: ILegendData = this.createInteractiveMekkoLegendDataPoints(indexOfColumnSelected), - MekkoLegendDataPoints: MekkoLegendDataPoint[] = legendData.dataPoints; + private selectColumn(indexOfColumnSelected: number, force: boolean = false): void { + if (!force && this.lastInteractiveSelectedColumnIndex === indexOfColumnSelected) { // same column, nothing to do here + return; + } - this.cartesianVisualHost.updateLegend(legendData); + const legendData: ILegendData = this.createInteractiveMekkoLegendDataPoints(indexOfColumnSelected), + MekkoLegendDataPoints: MekkoLegendDataPoint[] = legendData.dataPoints; - if (MekkoLegendDataPoints.length > 0) { - this.columnChart.selectColumn( - indexOfColumnSelected, - this.lastInteractiveSelectedColumnIndex); - } + this.cartesianVisualHost.updateLegend(legendData); - this.lastInteractiveSelectedColumnIndex = indexOfColumnSelected; + if (MekkoLegendDataPoints.length > 0) { + this.columnChart.selectColumn( + indexOfColumnSelected, + this.lastInteractiveSelectedColumnIndex); } - private createInteractiveMekkoLegendDataPoints(columnIndex: number): ILegendData { - const data: MekkoColumnChartData = this.data; + this.lastInteractiveSelectedColumnIndex = indexOfColumnSelected; + } - if (!data || ArrayExtensions.isUndefinedOrEmpty(data.series)) { - return { dataPoints: [] }; - } + private createInteractiveMekkoLegendDataPoints(columnIndex: number): ILegendData { + const data: MekkoColumnChartData = this.data; - const legendDataPoints: MekkoLegendDataPoint[] = [], - category: any = data.categories && data.categories[columnIndex], - allSeries: MekkoChartSeries[] = data.series, - dataPoints: LegendDataPoint[] = data.legendData && data.legendData.dataPoints, - converterStrategy: BaseConverterStrategy = - new BaseConverterStrategy(this.dataViewCat, this.visualHost); - - for (let i: number = 0, len = allSeries.length; i < len; i++) { - let measure: number = converterStrategy.getValueBySeriesAndCategory(i, columnIndex), - valueMetadata: DataViewMetadataColumn = data.valuesMetadata[i], - formattedLabel: string = getFormattedLegendLabel(valueMetadata, this.dataViewCat.values), - dataPointColor: string; - - if (allSeries.length === 1) { - const series: MekkoChartSeries = allSeries[0]; - - dataPointColor = series.data.length > columnIndex && series.data[columnIndex].color; - } else { - dataPointColor = dataPoints.length > i && dataPoints[i].color; - } - - const emptyIdentity: ISelectionId = this.visualHost - .createSelectionIdBuilder() - .createSelectionId(); + if (!data || ArrayExtensions.isUndefinedOrEmpty(data.series)) { + return { dataPoints: [] }; + } - legendDataPoints.push({ - color: dataPointColor, - icon: LegendIcon.Box, - label: formattedLabel, - category: data.categoryFormatter - ? data.categoryFormatter.format(category) - : category, - measure: valueFormatter.format( - measure, - valueFormatter.getFormatStringByColumn(valueMetadata)), - identity: emptyIdentity, - selected: false - }); + const legendDataPoints: MekkoLegendDataPoint[] = [], + category: any = data.categories && data.categories[columnIndex], + allSeries: MekkoChartSeries[] = data.series, + dataPoints: LegendDataPoint[] = data.legendData && data.legendData.dataPoints, + converterStrategy: BaseConverterStrategy = + new BaseConverterStrategy(this.dataViewCat, this.visualHost); + + for (let i: number = 0, len = allSeries.length; i < len; i++) { + let measure: number = converterStrategy.getValueBySeriesAndCategory(i, columnIndex), + valueMetadata: DataViewMetadataColumn = data.valuesMetadata[i], + formattedLabel: string = getFormattedLegendLabel(valueMetadata, this.dataViewCat.values), + dataPointColor: string; + + if (allSeries.length === 1) { + const series: MekkoChartSeries = allSeries[0]; + + dataPointColor = series.data.length > columnIndex && series.data[columnIndex].color; + } else { + dataPointColor = dataPoints.length > i && dataPoints[i].color; } - return { dataPoints: legendDataPoints }; + const emptyIdentity: ISelectionId = this.visualHost + .createSelectionIdBuilder() + .createSelectionId(); + + legendDataPoints.push({ + color: dataPointColor, + icon: LegendIcon.Box, + label: formattedLabel, + category: data.categoryFormatter + ? data.categoryFormatter.format(category) + : category, + measure: valueFormatter.format( + measure, + valueFormatter.getFormatStringByColumn(valueMetadata)), + identity: emptyIdentity, + selected: false + }); } - public overrideXScale(xProperties: IAxisProperties): void { - this.xAxisProperties = xProperties; - } + return { dataPoints: legendDataPoints }; + } - public render(suppressAnimations: boolean): MekkoVisualRenderResult { - const chartDrawInfo: MekkoChartDrawInfo = this.columnChart.drawColumns(!suppressAnimations), - data: MekkoColumnChartData = this.data; + public overrideXScale(xProperties: IAxisProperties): void { + this.xAxisProperties = xProperties; + } - const margin: IMargin = this.margin, - viewport: IViewport = this.currentViewport, - height: number = viewport.height - (margin.top + margin.bottom), - width: number = viewport.width - (margin.left + margin.right); + public render(suppressAnimations: boolean): MekkoVisualRenderResult { + const chartDrawInfo: MekkoChartDrawInfo = this.columnChart.drawColumns(!suppressAnimations), + data: MekkoColumnChartData = this.data; - this.mainGraphicsContext.attr({ - height: height, - width: width - }); + const margin: IMargin = this.margin, + viewport: IViewport = this.currentViewport, + height: number = viewport.height - (margin.top + margin.bottom), + width: number = viewport.width - (margin.left + margin.right); - this.tooltipServiceWrapper.addTooltip( - chartDrawInfo.shapesSelection, - (tooltipEvent: TooltipEventArgs) => { - return tooltipEvent.data.tooltipInfo; - }); + this.mainGraphicsContext.attr("height", height); + this.mainGraphicsContext.attr("width", width); - let dataPoints: MekkoChartColumnDataPoint[] = [], - behaviorOptions: VisualBehaviorOptions = undefined; + this.tooltipServiceWrapper.addTooltip( + chartDrawInfo.shapesSelection, + (tooltipEvent: TooltipEventArgs) => { + return tooltipEvent.data.tooltipInfo; + }); - if (this.interactivityService) { - for (let dataPointIndex: number = 0; dataPointIndex < data.series.length; dataPointIndex++) { - dataPoints = dataPoints.concat(data.series[dataPointIndex].data); - } + let dataPoints: MekkoChartColumnDataPoint[] = [], + behaviorOptions: VisualBehaviorOptions = undefined; - behaviorOptions = { - dataPoints, - bars: chartDrawInfo.shapesSelection, - hasHighlights: data.hasHighlights, - eventGroup: this.mainGraphicsContext, - mainGraphicsContext: this.mainGraphicsContext, - viewport: chartDrawInfo.viewport, - axisOptions: chartDrawInfo.axisOptions, - showLabel: data.labelSettings.show - }; + if (this.interactivityService) { + for (let dataPointIndex: number = 0; dataPointIndex < data.series.length; dataPointIndex++) { + dataPoints = dataPoints.concat(data.series[dataPointIndex].data); } - return { + behaviorOptions = { dataPoints, - behaviorOptions, - labelDataPoints: chartDrawInfo.labelDataPoints, - labelsAreNumeric: true + bars: chartDrawInfo.shapesSelection, + hasHighlights: data.hasHighlights, + eventGroup: this.mainGraphicsContext, + mainGraphicsContext: this.mainGraphicsContext, + viewport: chartDrawInfo.viewport, + axisOptions: chartDrawInfo.axisOptions, + showLabel: data.labelSettings.show }; } - public onClearSelection(): void { - if (this.interactivityService) { - this.interactivityService.clearSelection(); - } - } + return { + dataPoints, + behaviorOptions, + labelDataPoints: chartDrawInfo.labelDataPoints, + labelsAreNumeric: true + }; + } - public getVisualCategoryAxisIsScalar(): boolean { - return this.data - ? this.data.scalarCategoryAxis - : false; + public onClearSelection(): void { + if (this.interactivityService) { + this.interactivityService.clearSelection(); } + } - public getSupportedCategoryAxisType(): string { - const metaDataColumn: DataViewMetadataColumn = this.data - ? this.data.categoryMetadata - : undefined; + public getVisualCategoryAxisIsScalar(): boolean { + return this.data + ? this.data.scalarCategoryAxis + : false; + } - const valueType: ValueType = AxisHelper.getCategoryValueType(metaDataColumn), - isOrdinal: boolean = AxisHelper.isOrdinal(valueType); + public getSupportedCategoryAxisType(): string { + const metaDataColumn: DataViewMetadataColumn = this.data + ? this.data.categoryMetadata + : undefined; - return isOrdinal - ? axis.type.categorical - : axis.type.both; - } + const valueType: ValueType = AxisHelper.getCategoryValueType(metaDataColumn), + isOrdinal: boolean = AxisHelper.isOrdinal(valueType); - public setFilteredData(startIndex: number, endIndex: number): MekkoChartBaseData { - const data: MekkoColumnChartData = Prototype.inherit(this.data); + return isOrdinal + ? axisType.categorical + : axisType.both; + } - data.series = BaseColumnChart.sliceSeries(data.series, endIndex, startIndex); - data.categories = data.categories.slice(startIndex, endIndex); - this.columnChart.setData(data); + public setFilteredData(startIndex: number, endIndex: number): MekkoChartBaseData { + const data: MekkoColumnChartData = Prototype.inherit(this.data); - return data; - } + data.series = BaseColumnChart.sliceSeries(data.series, endIndex, startIndex); + data.categories = data.categories.slice(startIndex, endIndex); + this.columnChart.setData(data); + + return data; } +} - export function createBaseColumnChartLayer( - type: MekkoVisualChartType, - defaultOptions: MekkoChartConstructorBaseOptions): BaseColumnChart { +export function createBaseColumnChartLayer( + type: MekkoVisualChartType, + defaultOptions: MekkoChartConstructorBaseOptions): BaseColumnChart { - const options: MekkoChartConstructorOptions = { - interactivityService: defaultOptions.interactivityService, - isScrollable: defaultOptions.isScrollable, - chartType: type - }; + const options: MekkoChartConstructorOptions = { + interactivityService: defaultOptions.interactivityService, + isScrollable: defaultOptions.isScrollable, + chartType: type + }; - return new BaseColumnChart(options); - } + return new BaseColumnChart(options); } + diff --git a/src/columnChart/columnChartVisual.ts b/src/columnChart/columnChartVisual.ts index 234b438..7793ffa 100644 --- a/src/columnChart/columnChartVisual.ts +++ b/src/columnChart/columnChartVisual.ts @@ -23,35 +23,46 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +import powerbi from "powerbi-visuals-api"; +import { legendInterfaces, axisInterfaces } from "powerbi-visuals-utils-chartutils"; -module powerbi.extensibility.visual.columnChart { - // powerbi.extensibility.utils.chart - import LegendData = powerbi.extensibility.utils.chart.legend.LegendData; - import IAxisProperties = powerbi.extensibility.utils.chart.axis.IAxisProperties; +import VisualObjectInstance = powerbi.VisualObjectInstance; +import EnumerateVisualObjectInstancesOptions = powerbi.EnumerateVisualObjectInstancesOptions; +import IViewport = powerbi.IViewport; - export interface IColumnChart { - getColumnsWidth(): number[]; - getBorderWidth(): number; +import { + MekkoChartVisualInitOptions, + MekkoCalculateScaleAndDomainOptions, + MekkoVisualRenderResult, + MekkoChartBaseData +} from "./../dataInterfaces"; - init(options: MekkoChartVisualInitOptions): void; - setData(dataViews: DataView[], resized?: boolean): void; - calculateAxesProperties(options: MekkoCalculateScaleAndDomainOptions): IAxisProperties[]; - overrideXScale(xProperties: IAxisProperties): void; - render(suppressAnimations: boolean): MekkoVisualRenderResult; - calculateLegend(): LegendData; - hasLegend(): boolean; - onClearSelection(): void; - enumerateObjectInstances?( - instances: VisualObjectInstance[], - options: EnumerateVisualObjectInstancesOptions): void; - getVisualCategoryAxisIsScalar?(): boolean; - getSupportedCategoryAxisType?(): string; - getPreferredPlotArea?( - isScalar: boolean, - categoryCount: number, - categoryThickness: number): IViewport; - setFilteredData?(startIndex: number, endIndex: number): MekkoChartBaseData; +// powerbi.extensibility.utils.chart +import LegendData = legendInterfaces.LegendData; +import IAxisProperties = axisInterfaces.IAxisProperties; - getData?(): MekkoChartBaseData; - } +export interface IColumnChart { + getColumnsWidth(): number[]; + getBorderWidth(): number; + + init(options: MekkoChartVisualInitOptions): void; + setData(dataViews: powerbi.DataView[], resized?: boolean): void; + calculateAxesProperties(options: MekkoCalculateScaleAndDomainOptions): IAxisProperties[]; + overrideXScale(xProperties: IAxisProperties): void; + render(suppressAnimations: boolean): MekkoVisualRenderResult; + calculateLegend(): LegendData; + hasLegend(): boolean; + onClearSelection(): void; + enumerateObjectInstances?( + instances: VisualObjectInstance[], + options: EnumerateVisualObjectInstancesOptions): void; + getVisualCategoryAxisIsScalar?(): boolean; + getSupportedCategoryAxisType?(): string; + getPreferredPlotArea?( + isScalar: boolean, + categoryCount: number, + categoryThickness: number): IViewport; + setFilteredData?(startIndex: number, endIndex: number): MekkoChartBaseData; + + getData?(): MekkoChartBaseData; } diff --git a/src/converterStrategy/baseConverterStrategy.ts b/src/converterStrategy/baseConverterStrategy.ts index 886ac84..47ce99c 100644 --- a/src/converterStrategy/baseConverterStrategy.ts +++ b/src/converterStrategy/baseConverterStrategy.ts @@ -24,275 +24,302 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.converterStrategy { - // powerbi.extensibility.utils.color - import ColorHelper = powerbi.extensibility.utils.color.ColorHelper; - import createLinearColorScale = powerbi.extensibility.utils.color.createLinearColorScale; - - // powerbi.extensibility.utils.chart - import LegendIcon = powerbi.extensibility.utils.chart.legend.LegendIcon; - import ILegendData = powerbi.extensibility.utils.chart.legend.LegendData; - - // formattingUtils - import getFormattedLegendLabel = formattingUtils.getFormattedLegendLabel; - - export class BaseConverterStrategy implements ConverterStrategy { - private static WidthColumnName: string = "Width"; - private static YColumnName: string = "Y"; - - private static SortField: string = "categoryValue"; - - private dataView: DataViewCategorical; - private visualHost: IVisualHost; - - constructor(dataView: DataViewCategorical, visualHost: IVisualHost) { - this.dataView = dataView; - this.visualHost = visualHost; - } +import powerbi from "powerbi-visuals-api"; +import { ColorHelper, createLinearColorScale } from "powerbi-visuals-utils-colorutils"; +import { legendInterfaces } from "powerbi-visuals-utils-chartutils"; +import * as formattingUtils from "./../formattingUtils"; +import { max, sum, min } from "d3-array"; + +import IColorPalette = powerbi.extensibility.IColorPalette; +import IVisualHost = powerbi.extensibility.visual.IVisualHost; +import DataViewCategorical = powerbi.DataViewCategorical; +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; +import DataViewObjects = powerbi.DataViewObjects; +import PrimitiveValue = powerbi.PrimitiveValue; +import DataViewValueColumnGroup = powerbi.DataViewValueColumnGroup; +import ISelectionId = powerbi.visuals.ISelectionId; +import Fill = powerbi.Fill; +import DataViewValueColumn = powerbi.DataViewValueColumn; +import DataViewCategoryColumn = powerbi.DataViewCategoryColumn; +import DataViewValueColumns = powerbi.DataViewValueColumns; +import isEqual from "lodash.isequal"; + +import { MekkoChart } from "./../visual"; +import { + MekkoLegendDataPoint, + ICategotyValuesStatsCollection, + IFilteredValueGroups, + BaseColorIdentity, + LegendSeriesInfo, + MekkoGradientSettings +} from "./../dataInterfaces"; + +// powerbi.extensibility.utils.chart +import LegendIcon = legendInterfaces.LegendIcon; +import ILegendData = legendInterfaces.LegendData; + +// formattingUtils +import getFormattedLegendLabel = formattingUtils.getFormattedLegendLabel; + +import { ConverterStrategy } from "./converterStrategy"; + +export class BaseConverterStrategy implements ConverterStrategy { + private static WidthColumnName: string = "Width"; + private static YColumnName: string = "Y"; + + private static SortField: string = "categoryValue"; + + private dataView: DataViewCategorical; + private visualHost: IVisualHost; + + constructor(dataView: DataViewCategorical, visualHost: IVisualHost) { + this.dataView = dataView; + this.visualHost = visualHost; + } - private static hasRole(column: DataViewMetadataColumn, name: string): boolean { - return column.roles && column.roles[name]; - } + private static hasRole(column: DataViewMetadataColumn, name: string): boolean { + return column.roles && column.roles[name]; + } - public getLegend(colorPalette: IColorPalette, defaultLabelLegendColor?: string, defaultColor?: string, colorGradient?: boolean, colorGradientEndColor?: string): LegendSeriesInfo { - const legend: MekkoLegendDataPoint[] = []; - const seriesSources: DataViewMetadataColumn[] = []; - const seriesObjects: DataViewObjects[][] = []; - - let grouped: boolean = false; - let legendTitle: string = undefined; - - const colorHelper: ColorHelper = new ColorHelper( - colorPalette, - MekkoChart.Properties["dataPoint"]["fill"], - defaultLabelLegendColor - ); - - const categoryFieldIndex: number = 0; - let categoryMaxValues: ICategotyValuesStatsCollection = {}; - this.dataView.categories[categoryFieldIndex].values.forEach((category, index) => { - categoryMaxValues[index] = { - category: category, - maxValueOfCategory: d3.max(this.dataView.values.map(v => v.values[index])), - maxItemOfCategory: d3.sum(this.dataView.values.map(v => v.values[index] !== undefined ? 1 : 0)), - minValueOfCategory: d3.min(this.dataView.values.map(v => v.values[index])) - }; + public getLegend(colorPalette: IColorPalette, defaultLabelLegendColor?: string, defaultColor?: string, colorGradient?: boolean, colorGradientEndColor?: string): LegendSeriesInfo { + const legend: MekkoLegendDataPoint[] = []; + const seriesSources: DataViewMetadataColumn[] = []; + const seriesObjects: DataViewObjects[][] = []; + + let grouped: boolean = false; + let legendTitle: string = undefined; + + const colorHelper: ColorHelper = new ColorHelper( + colorPalette, + MekkoChart.Properties["dataPoint"]["fill"], + defaultLabelLegendColor + ); + + const categoryFieldIndex: number = 0; + let categoryMaxValues: ICategotyValuesStatsCollection = {}; + this.dataView.categories[categoryFieldIndex].values.forEach((category, index) => { + categoryMaxValues[index] = { + category: category, + maxValueOfCategory: max(this.dataView.values.map(v => v.values[index])), + maxItemOfCategory: sum(this.dataView.values.map(v => v.values[index] !== undefined ? 1 : 0)), + minValueOfCategory: min(this.dataView.values.map(v => v.values[index])) + }; + }); + + // find base color identity + // todo handle color change of + let valueGroups: DataViewValueColumnGroup[] = this.dataView.values.grouped(); + let categoryGradientBaseColorIdentities: BaseColorIdentity[] = []; + let categoryGradientEndBaseColorIdentities: BaseColorIdentity[] = []; + let categoryItemsCount: Array = []; + + let restoredColors: any; + this.dataView.categories[categoryFieldIndex].values.forEach((category: PrimitiveValue, index: number) => { + + const categorySelectionId: ISelectionId = this.visualHost.createSelectionIdBuilder() + .withCategory(this.dataView.categories[categoryFieldIndex], index) + .createSelectionId(); + + // gradiend start color + let mappedItems: IFilteredValueGroups[] = []; + valueGroups.forEach(group => { + if (group.values[0].values[index] !== null) { + mappedItems.push({ + gr: group, + categoryValue: group.values[0].values[index], + categoryIndex: index, + category: category || "", + identity: group.identity + }); + } }); + categoryItemsCount[index] = mappedItems; - // find base color identity - // todo handle color change of - let valueGroups: DataViewValueColumnGroup[] = this.dataView.values.grouped(); - let categoryGradientBaseColorIdentities: BaseColorIdentity[] = []; - let categoryGradientEndBaseColorIdentities: BaseColorIdentity[] = []; - let categoryItemsCount: Array = []; - - let restoredColors: any; - this.dataView.categories[categoryFieldIndex].values.forEach((category: PrimitiveValue, index: number) => { - - const categorySelectionId: ISelectionId = this.visualHost.createSelectionIdBuilder() - .withCategory(this.dataView.categories[categoryFieldIndex], index) - .createSelectionId(); - - // gradiend start color - let mappedItems: IFilteredValueGroups[] = []; - valueGroups.forEach(group => { - if (group.values[0].values[index] !== null) { - mappedItems.push({ - gr: group, - categoryValue: group.values[0].values[index], - categoryIndex: index, - category: category || "", - identity: group.identity - }); - } + if (colorGradient) { + categoryItemsCount[index] = categoryItemsCount[index].sort((a, b) => { + return a[BaseConverterStrategy.SortField] > b[BaseConverterStrategy.SortField] ? 1 : -1; }); - categoryItemsCount[index] = mappedItems; - - if (colorGradient) { - categoryItemsCount[index] = _.sortBy(categoryItemsCount[index], BaseConverterStrategy.SortField); - } + } - let baseStartColorIdentity: IFilteredValueGroups = _.maxBy(mappedItems, BaseConverterStrategy.SortField); - if (baseStartColorIdentity === undefined) { - return; - } + let baseStartColorIdentity: IFilteredValueGroups = mappedItems.sort((a, b) => a[BaseConverterStrategy.SortField] > b[BaseConverterStrategy.SortField] ? 1 : -1)[0]; + if (baseStartColorIdentity === undefined) { + return; + } - let colorStart: string = defaultLabelLegendColor; + let colorStart: string = defaultLabelLegendColor; - if (baseStartColorIdentity.gr.objects !== undefined && ((baseStartColorIdentity.gr.objects).dataPoint.fill).solid !== undefined) { - colorStart = ((baseStartColorIdentity.gr.objects).dataPoint.fill).solid.color; - } - if (colorStart === undefined) { - colorStart = colorHelper.getColorForSeriesValue(baseStartColorIdentity.gr.objects, baseStartColorIdentity.categoryValue); - } + if (baseStartColorIdentity.gr.objects !== undefined && ((baseStartColorIdentity.gr.objects).dataPoint.fill).solid !== undefined) { + colorStart = ((baseStartColorIdentity.gr.objects).dataPoint.fill).solid.color; + } + if (colorStart === undefined) { + colorStart = colorHelper.getColorForSeriesValue(baseStartColorIdentity.gr.objects, baseStartColorIdentity.categoryValue); + } - // gradiend end color - let baseEndColorIdentity: IFilteredValueGroups = _.minBy(mappedItems, BaseConverterStrategy.SortField); + // gradiend end color + let baseEndColorIdentity: IFilteredValueGroups = mappedItems.sort((a, b) => a[BaseConverterStrategy.SortField] < b[BaseConverterStrategy.SortField] ? 1 : -1)[0]; - if (baseEndColorIdentity === undefined) { - return; - } + if (baseEndColorIdentity === undefined) { + return; + } - let colorEnd: string = defaultLabelLegendColor; + let colorEnd: string = defaultLabelLegendColor; - if (baseEndColorIdentity.gr.objects !== undefined && ((baseEndColorIdentity.gr.objects).dataPoint.fill).solid !== undefined) { - colorEnd = ((baseEndColorIdentity.gr.objects).dataPoint.fill).solid.color; - } + if (baseEndColorIdentity.gr.objects !== undefined && ((baseEndColorIdentity.gr.objects).dataPoint.fill).solid !== undefined) { + colorEnd = ((baseEndColorIdentity.gr.objects).dataPoint.fill).solid.color; + } - if (colorEnd === undefined) { - colorEnd = colorHelper.getColorForSeriesValue(baseEndColorIdentity.gr.objects, baseEndColorIdentity.categoryValue); - } + if (colorEnd === undefined) { + colorEnd = colorHelper.getColorForSeriesValue(baseEndColorIdentity.gr.objects, baseEndColorIdentity.categoryValue); + } - let categoryStartColor: string = (( - this.dataView.categories[categoryFieldIndex].objects && - this.dataView.categories[categoryFieldIndex].objects[index] && - this.dataView.categories[categoryFieldIndex].objects[index]["categoryColorStart"] || - { - categoryGradient: { - solid: { - color: colorStart - } + let categoryStartColor: string = (( + this.dataView.categories[categoryFieldIndex].objects && + this.dataView.categories[categoryFieldIndex].objects[index] && + this.dataView.categories[categoryFieldIndex].objects[index]["categoryColorStart"] || + { + categoryGradient: { + solid: { + color: colorStart } - }) as MekkoGradientSettings).categoryGradient.solid.color; - - let categoryEndColor: string = (( - this.dataView.categories[categoryFieldIndex].objects && - this.dataView.categories[categoryFieldIndex].objects[index] && - this.dataView.categories[categoryFieldIndex].objects[index]["categoryColorEnd"] || - { - categoryGradient: { - solid: { - color: colorEnd - } + } + }) as MekkoGradientSettings).categoryGradient.solid.color; + + let categoryEndColor: string = (( + this.dataView.categories[categoryFieldIndex].objects && + this.dataView.categories[categoryFieldIndex].objects[index] && + this.dataView.categories[categoryFieldIndex].objects[index]["categoryColorEnd"] || + { + categoryGradient: { + solid: { + color: colorEnd } - }) as MekkoGradientSettings).categoryGradient.solid.color; - - categoryGradientBaseColorIdentities[index] = { - category: (baseStartColorIdentity.category || "").toString(), - color: colorStart, - identity: baseStartColorIdentity.gr.identity, - group: baseStartColorIdentity.gr, - categorySelectionId: categorySelectionId, - categoryStartColor: categoryStartColor, - categoryEndColor: categoryEndColor - }; - }); - - if (this.dataView && this.dataView.values) { - const allValues: DataViewValueColumns = this.dataView.values; - const valueGroups: DataViewValueColumnGroup[] = allValues.grouped(); - const hasDynamicSeries: boolean = !!(allValues && allValues.source); - - for (let valueGroupsIndex: number = 0; valueGroupsIndex < valueGroups.length; valueGroupsIndex++) { - const valueGroup: DataViewValueColumnGroup = valueGroups[valueGroupsIndex]; - const valueGroupObjects: DataViewObjects = valueGroup.objects; - const values: DataViewValueColumn[] = valueGroup.values; + } + }) as MekkoGradientSettings).categoryGradient.solid.color; + + categoryGradientBaseColorIdentities[index] = { + category: (baseStartColorIdentity.category || "").toString(), + color: colorStart, + identity: baseStartColorIdentity.gr.identity, + group: baseStartColorIdentity.gr, + categorySelectionId: categorySelectionId, + categoryStartColor: categoryStartColor, + categoryEndColor: categoryEndColor + }; + }); - for (let valueIndex: number = 0; valueIndex < values.length; valueIndex++) { - const series: DataViewValueColumn = values[valueIndex]; - const source: DataViewMetadataColumn = series.source; + if (this.dataView && this.dataView.values) { + const allValues: DataViewValueColumns = this.dataView.values; + const valueGroups: DataViewValueColumnGroup[] = allValues.grouped(); + const hasDynamicSeries: boolean = !!(allValues && allValues.source); - // Gradient measures do not create series. - if (BaseConverterStrategy.hasRole(source, BaseConverterStrategy.WidthColumnName) - && !BaseConverterStrategy.hasRole(source, BaseConverterStrategy.YColumnName)) { + for (let valueGroupsIndex: number = 0; valueGroupsIndex < valueGroups.length; valueGroupsIndex++) { + const valueGroup: DataViewValueColumnGroup = valueGroups[valueGroupsIndex]; + const valueGroupObjects: DataViewObjects = valueGroup.objects; + const values: DataViewValueColumn[] = valueGroup.values; - continue; - } + for (let valueIndex: number = 0; valueIndex < values.length; valueIndex++) { + const series: DataViewValueColumn = values[valueIndex]; + const source: DataViewMetadataColumn = series.source; - seriesSources.push(source); - seriesObjects.push(series.objects); + // Gradient measures do not create series. + if (BaseConverterStrategy.hasRole(source, BaseConverterStrategy.WidthColumnName) + && !BaseConverterStrategy.hasRole(source, BaseConverterStrategy.YColumnName)) { - const categoryColumn: DataViewCategoryColumn = { - source: series.source, - identity: [series.identity], - values: undefined - }; + continue; + } - const selectionId: ISelectionId = this.visualHost.createSelectionIdBuilder() - .withCategory(categoryColumn, 0) - .withMeasure(this.getMeasureNameByIndex(valueIndex)) - .createSelectionId(); + seriesSources.push(source); + seriesObjects.push(series.objects); - const label: string = getFormattedLegendLabel(source, allValues); - let category: string; + const categoryColumn: DataViewCategoryColumn = { + source: series.source, + identity: [series.identity], + values: undefined + }; - let color: string; - let categoryIndex: number = _.findIndex(series.values, value => value); + const selectionId: ISelectionId = this.visualHost.createSelectionIdBuilder() + .withCategory(categoryColumn, 0) + .withMeasure(this.getMeasureNameByIndex(valueIndex)) + .createSelectionId(); - if (!colorGradient) { - color = hasDynamicSeries ? colorHelper.getColorForSeriesValue(valueGroupObjects || source.objects, source.groupName) - : colorHelper.getColorForMeasure(valueGroupObjects || source.objects, source.queryName); - } - else { + const label: string = getFormattedLegendLabel(source, allValues); + let category: string; - let positionIndex: number = _.findIndex(categoryItemsCount[categoryIndex], ser => ser.identity === series.identity); - category = (categoryMaxValues[categoryIndex].category || "").toString(); - let gradientBaseColorStart: string = categoryGradientBaseColorIdentities[categoryIndex].categoryStartColor; - let gradientBaseColorEnd: string = categoryGradientBaseColorIdentities[categoryIndex].categoryEndColor; + let color: string; + let categoryIndex: number = series.values.findIndex(value => typeof value !== undefined && value !== null); - color = createLinearColorScale( - [0, categoryItemsCount[categoryIndex].length], - [gradientBaseColorEnd, gradientBaseColorStart], true) - (positionIndex); - } + if (!colorGradient) { + color = hasDynamicSeries ? colorHelper.getColorForSeriesValue(valueGroupObjects || source.objects, source.groupName) + : colorHelper.getColorForMeasure(valueGroupObjects || source.objects, source.queryName); + } + else { + let positionIndex: number = (categoryItemsCount[categoryIndex]).findIndex(ser => isEqual(ser.identity, series.identity)); + category = (categoryMaxValues[categoryIndex].category || "").toString(); + let gradientBaseColorStart: string = categoryGradientBaseColorIdentities[categoryIndex].categoryStartColor; + let gradientBaseColorEnd: string = categoryGradientBaseColorIdentities[categoryIndex].categoryEndColor; + + color = createLinearColorScale( + [0, categoryItemsCount[categoryIndex].length], + [gradientBaseColorEnd, gradientBaseColorStart], true) + (positionIndex); + } - legend.push({ - color, - label, - icon: LegendIcon.Box, - identity: selectionId, - selected: false, - valueSum: d3.sum(series.values), - categoryValues: series.values, - category: category, - categoryStartColor: categoryGradientBaseColorIdentities[categoryIndex].categoryStartColor, - categoryEndColor: categoryGradientBaseColorIdentities[categoryIndex].categoryEndColor, - categoryIdentity: categoryGradientBaseColorIdentities[categoryIndex].categorySelectionId, - categorySort: this.dataView.categories[categoryFieldIndex].values[categoryIndex] - }); - - if (series.identity && source.groupName !== undefined) { - grouped = true; - } + legend.push({ + color, + label, + icon: LegendIcon.Box, + identity: selectionId, + selected: false, + valueSum: sum(series.values), + categoryValues: series.values, + category: category, + categoryStartColor: categoryGradientBaseColorIdentities[categoryIndex].categoryStartColor, + categoryEndColor: categoryGradientBaseColorIdentities[categoryIndex].categoryEndColor, + categoryIdentity: categoryGradientBaseColorIdentities[categoryIndex].categorySelectionId, + categorySort: this.dataView.categories[categoryFieldIndex].values[categoryIndex] + }); + + if (series.identity && source.groupName !== undefined) { + grouped = true; } } - - legendTitle = allValues && allValues.source - ? allValues.source.displayName - : ""; } - const legendData: ILegendData = { - title: legendTitle, - dataPoints: legend, - grouped: grouped, - }; - - return { - seriesSources, - seriesObjects, - legend: legendData - }; + legendTitle = allValues && allValues.source + ? allValues.source.displayName + : ""; } - public getValueBySeriesAndCategory(series: number, category: number): number { - return this.dataView.values[series].values[category] as number; - } + const legendData: ILegendData = { + title: legendTitle, + dataPoints: legend, + grouped: grouped, + }; + + return { + seriesSources, + seriesObjects, + legend: legendData + }; + } - public getMeasureNameByIndex(index: number): string { - return this.dataView.values[index].source.queryName; - } + public getValueBySeriesAndCategory(series: number, category: number): number { + return this.dataView.values[series].values[category] as number; + } - public hasHighlightValues(series: number): boolean { - const valueColumn: DataViewValueColumn = this.dataView && this.dataView.values - ? this.dataView.values[series] - : undefined; + public getMeasureNameByIndex(index: number): string { + return this.dataView.values[index].source.queryName; + } - return valueColumn && !!valueColumn.highlights; - } + public hasHighlightValues(series: number): boolean { + const valueColumn: DataViewValueColumn = this.dataView && this.dataView.values + ? this.dataView.values[series] + : undefined; - public getHighlightBySeriesAndCategory(series: number, category: number): number { - return this.dataView.values[series].highlights[category] as number; - } + return valueColumn && !!valueColumn.highlights; + } + + public getHighlightBySeriesAndCategory(series: number, category: number): number { + return this.dataView.values[series].highlights[category] as number; } } diff --git a/src/converterStrategy/converterStrategy.ts b/src/converterStrategy/converterStrategy.ts index 56c9119..e9fe5b9 100644 --- a/src/converterStrategy/converterStrategy.ts +++ b/src/converterStrategy/converterStrategy.ts @@ -24,18 +24,20 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.converterStrategy { - export interface ConverterStrategy { - getLegend( - colors: IColorPalette, - defaultLegendLabelColor: string, - defaultColor?: string, - colorGradient?: boolean, - colorGradientEndColor?: string - ): LegendSeriesInfo; - getValueBySeriesAndCategory(series: number, category: number): number; - getMeasureNameByIndex(series: number, category: number): string; - hasHighlightValues(series: number): boolean; - getHighlightBySeriesAndCategory(series: number, category: number): number; - } +import powerbi from "powerbi-visuals-api"; +import IColorPalette = powerbi.extensibility.IColorPalette; +import { LegendSeriesInfo } from "./../dataInterfaces"; + +export interface ConverterStrategy { + getLegend( + colors: IColorPalette, + defaultLegendLabelColor: string, + defaultColor?: string, + colorGradient?: boolean, + colorGradientEndColor?: string + ): LegendSeriesInfo; + getValueBySeriesAndCategory(series: number, category: number): number; + getMeasureNameByIndex(series: number, category: number): string; + hasHighlightValues(series: number): boolean; + getHighlightBySeriesAndCategory(series: number, category: number): number; } diff --git a/src/dataInterfaces.ts b/src/dataInterfaces.ts new file mode 100644 index 0000000..07be8dd --- /dev/null +++ b/src/dataInterfaces.ts @@ -0,0 +1,540 @@ +/* + * Power BI Visualizations + * + * Copyright (c) Microsoft Corporation + * All rights reserved. + * MIT License + * + * 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. + */ +import powerbi from "powerbi-visuals-api"; + +import PrimitiveValue = powerbi.PrimitiveValue; +import NumberRange = powerbi.NumberRange; +import Fill = powerbi.Fill; +import IViewport = powerbi.IViewport; +import IVisualHost = powerbi.extensibility.visual.IVisualHost; +import IColorPalette = powerbi.extensibility.IColorPalette; +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; +import DataRepetitionSelector = powerbi.data.DataRepetitionSelector; +import VisualConstructorOptions = powerbi.extensibility.visual.VisualConstructorOptions; +import DataViewObjectPropertyIdentifier = powerbi.DataViewObjectPropertyIdentifier; +import DataViewValueColumnGroup = powerbi.DataViewValueColumnGroup; + +import { + IMargin, + CssConstants, + IRect, + shapesInterfaces +} + from "powerbi-visuals-utils-svgutils"; + +import ISize = shapesInterfaces.ISize; + +import { + axisInterfaces, + legendInterfaces, + dataLabelInterfaces +} + from "powerbi-visuals-utils-chartutils"; + + +import { + interactivityService +} + from "powerbi-visuals-utils-interactivityutils"; + +import { MekkoVisualChartType } from "./visualChartType"; + +import { TooltipEnabledDataPoint } from "powerbi-visuals-utils-tooltiputils"; +import { valueFormatter as vf } from "powerbi-visuals-utils-formattingutils"; + +// d3 +export type Selection = d3.Selection; + +// powerbi +import IDataViewObjects = powerbi.DataViewObjects; + +// powerbi.visuals +import ISelectionId = powerbi.visuals.ISelectionId; + +// powerbi.extensibility.utils.svg +import ClassAndSelector = CssConstants.ClassAndSelector; + +// powerbi.extensibility.utils.chart +import ILegendData = legendInterfaces.LegendData; +import IAxisProperties = axisInterfaces.IAxisProperties; +import LegendDataPoint = legendInterfaces.LegendDataPoint; +import CreateAxisOptionsBase = axisInterfaces.CreateAxisOptions; +import IInteractivityService = interactivityService.IInteractivityService; +import LabelEnabledDataPoint = dataLabelInterfaces.LabelEnabledDataPoint; +import VisualDataLabelsSettings = dataLabelInterfaces.VisualDataLabelsSettings; +import ILegend = legendInterfaces.ILegend; + +// powerbi.extensibility.utils.interactivity +import SelectableDataPoint = interactivityService.SelectableDataPoint; + +// powerbi.extensibility.utils.tooltip + +// powerbi.extensibility.utils.formatting +import IValueFormatter = vf.IValueFormatter; + +import VisualDataLabelsSettingsOptions = dataLabelInterfaces.VisualDataLabelsSettingsOptions; +import DataLabelObject = dataLabelInterfaces.DataLabelObject; + +export interface ValueMultiplers { + pos: number; + neg: number; +} + +export interface LegendSeriesInfo { + legend: ILegendData; + seriesSources: DataViewMetadataColumn[]; + seriesObjects: IDataViewObjects[][]; +} + +export interface IGrouppedLegendData { + category: string; + index: number; + data: MekkoLegendDataPoint[]; + dataValues: number; + categorySorting: PrimitiveValue; +} + +export interface ILegendGroup extends ILegend { + element: HTMLElement; + position: number; +} + +export interface IMekkoChartVisualHost { + updateLegend(data: ILegendData): void; + getSharedColors(): IColorPalette; + triggerRender(suppressAnimations: boolean): void; +} + +export interface MekkoChartAnimationOptions { + viewModel: MekkoChartData; + series: Selection; + layout: IMekkoChartLayout; + itemCS: ClassAndSelector; + mainGraphicsContext: Selection; + viewPort: IViewport; +} + +export interface MekkoChartAnimationResult { + shapes: Selection; +} + +export interface MekkoChartAxisOptions { + xScale: d3.ScaleLinear; + yScale: d3.ScaleLinear; + seriesOffsetScale?: d3.ScaleLinear; + columnWidth: number; + categoryWidth?: number; + isScalar: boolean; + margin: IMargin; +} + +export interface MekkoChartDataPoint { + categoryValue: any; + value: number; + categoryIndex: number; + seriesIndex: number; + highlight?: boolean; +} + +export interface MekkoChartBaseSeries { + data: MekkoChartDataPoint[]; +} + +export interface MekkoChartBaseData { + series: MekkoChartBaseSeries[]; + categoryMetadata: DataViewMetadataColumn; + categories: any[]; + hasHighlights?: boolean; +} + +export interface MekkoChartAxesLabels { + x: string; + y: string; + y2?: string; +} + +export interface MekkoChartAxisProperties { + x: IAxisProperties; + y1: IAxisProperties; + y2?: IAxisProperties; +} + +export interface MekkoChartCategoryLayoutOptions { + availableWidth: number; + categoryCount: number; + domain: any; + trimOrdinalDataOnOverflow: boolean; + isScalar?: boolean; + isScrollable?: boolean; +} + +export interface MekkoChartColumnDataPoint extends + MekkoChartDataPoint, + SelectableDataPoint, + TooltipEnabledDataPoint, + LabelEnabledDataPoint { + + categoryValue: number; + value: number; + position: number; + valueAbsolute: number; + valueOriginal: number; + seriesIndex: number; + labelSettings: VisualDataLabelsSettings; + categoryIndex: number; + color: string; + originalValue: number; + originalPosition: number; + originalValueAbsolute: number; + originalValueAbsoluteByAlLData?: number; + drawThinner?: boolean; + key: string; + lastSeries?: boolean; + chartType: MekkoVisualChartType; +} + +export interface MekkoChartSeries extends MekkoChartBaseSeries { + displayName: string; + key: string; + index: number; + data: MekkoChartColumnDataPoint[]; + identity: ISelectionId; + color: string; + labelSettings: VisualDataLabelsSettings; +} + +export interface MekkoChartLabelSettingsOptions extends VisualDataLabelsSettingsOptions { + forceDisplay: boolean; +} + +export interface MekkoChartLabelSettings extends VisualDataLabelsSettings { + forceDisplay: boolean; +} + +export interface MekkoChartDataLabelObject extends DataLabelObject { + forceDisplay: boolean; +} + +export interface MekkoChartData extends MekkoChartBaseData { + categoryFormatter: IValueFormatter; + series: MekkoChartSeries[]; + valuesMetadata: DataViewMetadataColumn[]; + legendData: ILegendData; + hasHighlights: boolean; + categoryMetadata: DataViewMetadataColumn; + scalarCategoryAxis: boolean; + labelSettings: VisualDataLabelsSettings; + axesLabels: MekkoChartAxesLabels; + hasDynamicSeries: boolean; + isMultiMeasure: boolean; + defaultDataPointColor?: string; + showAllDataPoints?: boolean; +} + +export interface MekkoChartSmallViewPortProperties { + hideLegendOnSmallViewPort: boolean; + hideAxesOnSmallViewPort: boolean; + MinHeightLegendVisible: number; + MinHeightAxesVisible: number; +} + +export interface LabelDataPoint { + parentRect: IRect; + size?: ISize; + text: string; + fillColor: string; +} + +export interface MekkoChartVisualInitOptions extends VisualConstructorOptions { + svg: Selection; + cartesianHost: IMekkoChartVisualHost; +} + +export interface IMekkoChartLayout { + shapeLayout: { + width: (d: MekkoChartColumnDataPoint) => number; + x: (d: MekkoChartColumnDataPoint) => number; + y: (d: MekkoChartColumnDataPoint) => number; + height: (d: MekkoChartColumnDataPoint) => number; + }; + shapeLayoutWithoutHighlights: { + width: (d: MekkoChartColumnDataPoint) => number; + x: (d: MekkoChartColumnDataPoint) => number; + y: (d: MekkoChartColumnDataPoint) => number; + height: (d: MekkoChartColumnDataPoint) => number; + }; + zeroShapeLayout: { + width: (d: MekkoChartColumnDataPoint) => number; + x: (d: MekkoChartColumnDataPoint) => number; + y: (d: MekkoChartColumnDataPoint) => number; + height: (d: MekkoChartColumnDataPoint) => number; + }; +} + +export interface MekkoVisualRenderResult { + dataPoints: SelectableDataPoint[]; + behaviorOptions: any; + labelDataPoints: LabelDataPoint[]; + labelsAreNumeric: boolean; +} + +export interface MekkoCalculateScaleAndDomainOptions { + viewport: IViewport; + margin: IMargin; + showCategoryAxisLabel: boolean; + showValueAxisLabel: boolean; + forceMerge: boolean; + categoryAxisScaleType: string; + valueAxisScaleType: string; + trimOrdinalDataOnOverflow: boolean; + playAxisControlLayout?: IRect; + forcedTickCount?: number; + forcedYDomain?: any[]; + forcedXDomain?: any[]; + ensureXDomain?: NumberRange; + ensureYDomain?: NumberRange; + categoryAxisDisplayUnits?: number; + categoryAxisPrecision?: number; + valueAxisDisplayUnits?: number; + valueAxisPrecision?: number; +} + +export interface MekkoColumnChartData extends MekkoChartData { + borderSettings: MekkoBorderSettings; + sortSeries: MekkoSeriesSortSettings; + sortlegend: MekkoLegendSortSettings; + xAxisLabelsSettings: MekkoXAxisLabelsSettings; + categoriesWidth: number[]; + categoryProperties: MekkoCategoryProperties[]; + dataPointSettings: MekkoDataPointSettings; +} + +export interface MekkoBorderSettings { + show: boolean; + color: string; + width: number; + maxWidth?: number; +} + +export interface MekkoLegendSortSettings { + enabled: boolean; + groupByCategory: boolean; + direction: any; + groupByCategoryDirection: any; +} + +export interface MekkoDataPointSettings { + categoryGradient: boolean; + colorGradientEndColor: any; + colorDistribution: boolean; +} + +export interface MekkoGradientSettings { + categoryGradient: Fill; +} + +export interface MekkoSeriesSortSettings { + enabled: boolean; + direction: any; + displayPercents: any; +} + +export interface MekkoXAxisLabelsSettings { + enableRotataion: boolean; +} + +export interface MekkoCategoryColorSettings { + color: string; +} + +export interface CreateAxisOptions extends CreateAxisOptionsBase { + borderSettings: MekkoBorderSettings; +} + +export interface MekkoLabelSettings { + maxPrecision: number; + minPrecision: number; +} + +export interface MekkoColumnAxisOptions extends MekkoChartAxisOptions { } + +export interface IMekkoColumnLayout extends IMekkoChartLayout { + shapeBorder?: { + width: (d: MekkoChartColumnDataPoint) => number; + x: (d: MekkoChartColumnDataPoint) => number; + y: (d: MekkoChartColumnDataPoint) => number; + height: (d: MekkoChartColumnDataPoint) => number; + }; + shapeXAxis?: { + width: (d: MekkoChartColumnDataPoint) => number; + x: (d: MekkoChartColumnDataPoint) => number; + y: (d: MekkoChartColumnDataPoint) => number; + height: (d: MekkoChartColumnDataPoint) => number; + }; +} + +export interface MekkoAxisRenderingOptions { + axisLabels: MekkoChartAxesLabels; + legendMargin: number; + viewport: IViewport; + margin: IMargin; + hideXAxisTitle: boolean; + hideYAxisTitle: boolean; + hideY2AxisTitle?: boolean; + xLabelColor?: Fill; + yLabelColor?: Fill; + y2LabelColor?: Fill; +} + +export interface MekkoCategoryProperties { + color?: string; + identity?: ISelectionId; + name?: string; + valueAbsolute?: any; + series?: MekkoChartSeries; +} + +export interface MekkoDataPoints { + categoriesWidth: number[]; + series: MekkoChartSeries[]; + hasHighlights: boolean; + hasDynamicSeries: boolean; + categoryProperties?: MekkoCategoryProperties[]; +} + +export interface MekkoLegendDataPoint extends LegendDataPoint { + fontSize?: number; + valueSum?: number; + categoryValues?: PrimitiveValue[]; + categorySort?: PrimitiveValue; + categoryIdentity?: powerbi.visuals.ISelectionId; + categoryStartColor?: string; + categoryEndColor?: string; +} + +export interface MekkoCreateAxisOptions extends CreateAxisOptionsBase { + formatString: string; + is100Pct?: boolean; + shouldClamp?: boolean; + formatStringProp?: DataViewObjectPropertyIdentifier; +} + +export interface MekkoChartCategoryLayout { + categoryCount: number; + categoryThickness: number; + outerPaddingRatio: number; + isScalar?: boolean; +} + +export interface MekkoChartContext { + height: number; + width: number; + duration: number; + hostService: IVisualHost; + margin: IMargin; + unclippedGraphicsContext: Selection; + mainGraphicsContext: Selection; + layout: MekkoChartCategoryLayout; + onDragStart?: (datum: MekkoChartColumnDataPoint) => void; + interactivityService: IInteractivityService; + viewportHeight: number; + viewportWidth: number; + is100Pct: boolean; + isComboChart: boolean; +} + +export interface MekkoColumnChartContext extends MekkoChartContext { + height: number; + width: number; + duration: number; + margin: IMargin; + mainGraphicsContext: Selection; + labelGraphicsContext: Selection; + layout: MekkoChartCategoryLayout; + onDragStart?: (datum: MekkoChartColumnDataPoint) => void; + interactivityService: IInteractivityService; + viewportHeight: number; + viewportWidth: number; + is100Pct: boolean; + hostService: IVisualHost; + isComboChart: boolean; +} + +export interface MekkoChartConstructorBaseOptions { + isScrollable: boolean; + interactivityService?: IInteractivityService; + isLabelInteractivityEnabled?: boolean; + tooltipsEnabled?: boolean; + tooltipBucketEnabled?: boolean; + cartesianLoadMoreEnabled?: boolean; +} + +export interface MekkoChartConstructorOptions extends MekkoChartConstructorBaseOptions { + chartType: MekkoVisualChartType; +} + +export interface MekkoChartDrawInfo { + eventGroup?: Selection; + shapesSelection: d3.Selection; + viewport: IViewport; + axisOptions: MekkoChartAxisOptions; + labelDataPoints: LabelDataPoint[]; +} + +export interface BaseColorIdentity { + identity: DataRepetitionSelector; + category: string; + color: string; + group: DataViewValueColumnGroup; + categorySelectionId: powerbi.visuals.ISelectionId; + categoryStartColor?: string; + categoryEndColor?: string; +} + +export interface ICategotyValuesStatsCollection { + [propName: number]: ICategotyValuesStats; +} + +export interface ICategotyValuesStats { + category: PrimitiveValue; + maxValueOfCategory: number; + maxItemOfCategory: number; + minValueOfCategory: number; +} + +export interface IFilteredValueGroups { + gr: DataViewValueColumnGroup; + categoryValue: PrimitiveValue; + categoryIndex: number; + category: PrimitiveValue; + identity: DataRepetitionSelector; +} +export class ICategoryValuesCollection extends Array { + [index: number]: MekkoChartColumnDataPoint; + categoryValue?: PrimitiveValue; + identity?: powerbi.visuals.ISelectionId; + color?: string; +} diff --git a/src/dataIntrefaces.ts b/src/dataIntrefaces.ts deleted file mode 100644 index 08d095d..0000000 --- a/src/dataIntrefaces.ts +++ /dev/null @@ -1,518 +0,0 @@ -/* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -module powerbi.extensibility.visual { - // d3 - import Selection = d3.Selection; - import LinearScale = d3.scale.Linear; - import UpdateSelection = d3.selection.Update; - - // powerbi - import IDataViewObjects = powerbi.DataViewObjects; - - // powerbi.visuals - import ISelectionId = powerbi.visuals.ISelectionId; - - // powerbi.extensibility.utils.svg - import IRect = powerbi.extensibility.utils.svg.IRect; - import IMargin = powerbi.extensibility.utils.svg.IMargin; - import ISize = powerbi.extensibility.utils.svg.shapes.ISize; - import ClassAndSelector = powerbi.extensibility.utils.svg.CssConstants.ClassAndSelector; - - // powerbi.extensibility.utils.chart - import ILegendData = powerbi.extensibility.utils.chart.legend.LegendData; - import IAxisProperties = powerbi.extensibility.utils.chart.axis.IAxisProperties; - import LegendDataPoint = powerbi.extensibility.utils.chart.legend.LegendDataPoint; - import CreateAxisOptionsBase = powerbi.extensibility.utils.chart.axis.CreateAxisOptions; - import IInteractivityService = powerbi.extensibility.utils.interactivity.IInteractivityService; - import LabelEnabledDataPoint = powerbi.extensibility.utils.chart.dataLabel.LabelEnabledDataPoint; - import VisualDataLabelsSettings = powerbi.extensibility.utils.chart.dataLabel.VisualDataLabelsSettings; - import ILegend = powerbi.extensibility.utils.chart.legend.ILegend; - - // powerbi.extensibility.utils.interactivity - import SelectableDataPoint = powerbi.extensibility.utils.interactivity.SelectableDataPoint; - - // powerbi.extensibility.utils.tooltip - import TooltipEnabledDataPoint = powerbi.extensibility.utils.tooltip.TooltipEnabledDataPoint; - - // powerbi.extensibility.utils.formatting - import IValueFormatter = powerbi.extensibility.utils.formatting.IValueFormatter; - - import VisualDataLabelsSettingsOptions = powerbi.extensibility.utils.chart.dataLabel.VisualDataLabelsSettingsOptions; - import DataLabelObject = powerbi.extensibility.utils.chart.dataLabel.DataLabelObject; - - export interface ValueMultiplers { - pos: number; - neg: number; - } - - export interface LegendSeriesInfo { - legend: ILegendData; - seriesSources: DataViewMetadataColumn[]; - seriesObjects: IDataViewObjects[][]; - } - - export interface IGrouppedLegendData { - category: string; - index: number; - data: MekkoLegendDataPoint[]; - dataValues: number; - categorySorting: PrimitiveValue; - } - - export interface ILegendGroup extends ILegend { - element: HTMLElement; - position: number; - } - - export interface IMekkoChartVisualHost { - updateLegend(data: ILegendData): void; - getSharedColors(): IColorPalette; - triggerRender(suppressAnimations: boolean): void; - } - - export interface MekkoChartAnimationOptions { - viewModel: MekkoChartData; - series: UpdateSelection; - layout: IMekkoChartLayout; - itemCS: ClassAndSelector; - mainGraphicsContext: Selection; - viewPort: IViewport; - } - - export interface MekkoChartAnimationResult { - shapes: UpdateSelection; - } - - export interface MekkoChartAxisOptions { - xScale: LinearScale; - yScale: LinearScale; - seriesOffsetScale?: LinearScale; - columnWidth: number; - categoryWidth?: number; - isScalar: boolean; - margin: IMargin; - } - - export interface MekkoChartDataPoint { - categoryValue: any; - value: number; - categoryIndex: number; - seriesIndex: number; - highlight?: boolean; - } - - export interface MekkoChartBaseSeries { - data: MekkoChartDataPoint[]; - } - - export interface MekkoChartBaseData { - series: MekkoChartBaseSeries[]; - categoryMetadata: DataViewMetadataColumn; - categories: any[]; - hasHighlights?: boolean; - } - - export interface MekkoChartAxesLabels { - x: string; - y: string; - y2?: string; - } - - export interface MekkoChartAxisProperties { - x: IAxisProperties; - y1: IAxisProperties; - y2?: IAxisProperties; - } - - export interface MekkoChartCategoryLayoutOptions { - availableWidth: number; - categoryCount: number; - domain: any; - trimOrdinalDataOnOverflow: boolean; - isScalar?: boolean; - isScrollable?: boolean; - } - - export interface MekkoChartColumnDataPoint extends - MekkoChartDataPoint, - SelectableDataPoint, - TooltipEnabledDataPoint, - LabelEnabledDataPoint { - - categoryValue: number; - value: number; - position: number; - valueAbsolute: number; - valueOriginal: number; - seriesIndex: number; - labelSettings: VisualDataLabelsSettings; - categoryIndex: number; - color: string; - originalValue: number; - originalPosition: number; - originalValueAbsolute: number; - originalValueAbsoluteByAlLData?: number; - drawThinner?: boolean; - key: string; - lastSeries?: boolean; - chartType: MekkoVisualChartType; - } - - export interface MekkoChartSeries extends MekkoChartBaseSeries { - displayName: string; - key: string; - index: number; - data: MekkoChartColumnDataPoint[]; - identity: ISelectionId; - color: string; - labelSettings: VisualDataLabelsSettings; - } - - export interface MekkoChartLabelSettingsOptions extends VisualDataLabelsSettingsOptions { - forceDisplay: boolean; - } - - export interface MekkoChartLabelSettings extends VisualDataLabelsSettings { - forceDisplay: boolean; - } - - export interface MekkoChartDataLabelObject extends DataLabelObject { - forceDisplay: boolean; - } - - export interface MekkoChartData extends MekkoChartBaseData { - categoryFormatter: IValueFormatter; - series: MekkoChartSeries[]; - valuesMetadata: DataViewMetadataColumn[]; - legendData: ILegendData; - hasHighlights: boolean; - categoryMetadata: DataViewMetadataColumn; - scalarCategoryAxis: boolean; - labelSettings: VisualDataLabelsSettings; - axesLabels: MekkoChartAxesLabels; - hasDynamicSeries: boolean; - isMultiMeasure: boolean; - defaultDataPointColor?: string; - showAllDataPoints?: boolean; - } - - export interface MekkoChartSmallViewPortProperties { - hideLegendOnSmallViewPort: boolean; - hideAxesOnSmallViewPort: boolean; - MinHeightLegendVisible: number; - MinHeightAxesVisible: number; - } - - export interface LabelDataPoint { - parentRect: IRect; - size?: ISize; - text: string; - fillColor: string; - } - - export interface MekkoChartVisualInitOptions extends VisualConstructorOptions { - svg: Selection; - cartesianHost: IMekkoChartVisualHost; - } - - export interface IMekkoChartLayout { - shapeLayout: { - width: (d: MekkoChartColumnDataPoint) => number; - x: (d: MekkoChartColumnDataPoint) => number; - y: (d: MekkoChartColumnDataPoint) => number; - height: (d: MekkoChartColumnDataPoint) => number; - }; - shapeLayoutWithoutHighlights: { - width: (d: MekkoChartColumnDataPoint) => number; - x: (d: MekkoChartColumnDataPoint) => number; - y: (d: MekkoChartColumnDataPoint) => number; - height: (d: MekkoChartColumnDataPoint) => number; - }; - zeroShapeLayout: { - width: (d: MekkoChartColumnDataPoint) => number; - x: (d: MekkoChartColumnDataPoint) => number; - y: (d: MekkoChartColumnDataPoint) => number; - height: (d: MekkoChartColumnDataPoint) => number; - }; - } - - export interface MekkoVisualRenderResult { - dataPoints: SelectableDataPoint[]; - behaviorOptions: any; - labelDataPoints: LabelDataPoint[]; - labelsAreNumeric: boolean; - } - - export interface MekkoCalculateScaleAndDomainOptions { - viewport: IViewport; - margin: IMargin; - showCategoryAxisLabel: boolean; - showValueAxisLabel: boolean; - forceMerge: boolean; - categoryAxisScaleType: string; - valueAxisScaleType: string; - trimOrdinalDataOnOverflow: boolean; - playAxisControlLayout?: IRect; - forcedTickCount?: number; - forcedYDomain?: any[]; - forcedXDomain?: any[]; - ensureXDomain?: NumberRange; - ensureYDomain?: NumberRange; - categoryAxisDisplayUnits?: number; - categoryAxisPrecision?: number; - valueAxisDisplayUnits?: number; - valueAxisPrecision?: number; - } - - export interface MekkoColumnChartData extends MekkoChartData { - borderSettings: MekkoBorderSettings; - sortSeries: MekkoSeriesSortSettings; - sortlegend: MekkoLegendSortSettings; - xAxisLabelsSettings: MekkoXAxisLabelsSettings; - categoriesWidth: number[]; - categoryProperties: MekkoCategoryProperties[]; - dataPointSettings: MekkoDataPointSettings; - } - - export interface MekkoBorderSettings { - show: boolean; - color: string; - width: number; - maxWidth?: number; - } - - export interface MekkoLegendSortSettings { - enabled: boolean; - groupByCategory: boolean; - direction: any; - groupByCategoryDirection: any; - } - - export interface MekkoDataPointSettings { - categoryGradient: boolean; - colorGradientEndColor: any; - colorDistribution: boolean; - } - - export interface MekkoGradientSettings { - categoryGradient: Fill; - } - - export interface MekkoSeriesSortSettings { - enabled: boolean; - direction: any; - displayPercents: any; - } - - export interface MekkoXAxisLabelsSettings { - enableRotataion: boolean; - } - - export interface MekkoCategoryColorSettings { - color: string; - } - - export interface CreateAxisOptions extends CreateAxisOptionsBase { - borderSettings: MekkoBorderSettings; - } - - export interface MekkoLabelSettings { - maxPrecision: number; - minPrecision: number; - } - - export interface MekkoColumnAxisOptions extends MekkoChartAxisOptions { } - - export interface IMekkoColumnLayout extends IMekkoChartLayout { - shapeBorder?: { - width: (d: MekkoChartColumnDataPoint) => number; - x: (d: MekkoChartColumnDataPoint) => number; - y: (d: MekkoChartColumnDataPoint) => number; - height: (d: MekkoChartColumnDataPoint) => number; - }; - shapeXAxis?: { - width: (d: MekkoChartColumnDataPoint) => number; - x: (d: MekkoChartColumnDataPoint) => number; - y: (d: MekkoChartColumnDataPoint) => number; - height: (d: MekkoChartColumnDataPoint) => number; - }; - } - - export interface MekkoAxisRenderingOptions { - axisLabels: MekkoChartAxesLabels; - legendMargin: number; - viewport: IViewport; - margin: IMargin; - hideXAxisTitle: boolean; - hideYAxisTitle: boolean; - hideY2AxisTitle?: boolean; - xLabelColor?: Fill; - yLabelColor?: Fill; - y2LabelColor?: Fill; - } - - export interface MekkoChartRenderOptions { - axes: MekkoChartAxisProperties; - width: number; - tickLabelMargins: any; - chartHasAxisLabels: boolean; - axisLabels: MekkoChartAxesLabels; - viewport: IViewport; - suppressAnimations: boolean; - } - - export interface MekkoCategoryProperties { - color?: string; - identity?: ISelectionId; - name?: string; - valueAbsolute?: any; - series?: MekkoChartSeries; - } - - export interface MekkoDataPoints { - categoriesWidth: number[]; - series: MekkoChartSeries[]; - hasHighlights: boolean; - hasDynamicSeries: boolean; - categoryProperties?: MekkoCategoryProperties[]; - } - - export interface MekkoLegendDataPoint extends LegendDataPoint { - fontSize?: number; - valueSum?: number; - categoryValues?: PrimitiveValue[]; - categorySort?: PrimitiveValue; - categoryIdentity?: powerbi.data.Selector; - categoryStartColor?: string; - categoryEndColor?: string; - } - - export interface MekkoCreateAxisOptions extends CreateAxisOptionsBase { - formatString: string; - is100Pct?: boolean; - shouldClamp?: boolean; - formatStringProp?: DataViewObjectPropertyIdentifier; - } - - export interface MekkoChartCategoryLayout { - categoryCount: number; - categoryThickness: number; - outerPaddingRatio: number; - isScalar?: boolean; - } - - export interface MekkoChartContext { - height: number; - width: number; - duration: number; - hostService: IVisualHost; - margin: IMargin; - unclippedGraphicsContext: Selection; - mainGraphicsContext: Selection; - layout: MekkoChartCategoryLayout; - onDragStart?: (datum: MekkoChartColumnDataPoint) => void; - interactivityService: IInteractivityService; - viewportHeight: number; - viewportWidth: number; - is100Pct: boolean; - isComboChart: boolean; - } - - export interface MekkoColumnChartContext extends MekkoChartContext { - height: number; - width: number; - duration: number; - margin: IMargin; - mainGraphicsContext: Selection; - labelGraphicsContext: Selection; - layout: MekkoChartCategoryLayout; - onDragStart?: (datum: MekkoChartColumnDataPoint) => void; - interactivityService: IInteractivityService; - viewportHeight: number; - viewportWidth: number; - is100Pct: boolean; - hostService: IVisualHost; - isComboChart: boolean; - } - - export interface MekkoChartConstructorBaseOptions { - isScrollable: boolean; - interactivityService?: IInteractivityService; - isLabelInteractivityEnabled?: boolean; - tooltipsEnabled?: boolean; - tooltipBucketEnabled?: boolean; - cartesianLoadMoreEnabled?: boolean; - } - - export interface MekkoChartConstructorOptions extends MekkoChartConstructorBaseOptions { - chartType: MekkoVisualChartType; - } - - export interface MekkoChartDrawInfo { - eventGroup?: Selection; - shapesSelection: Selection; - viewport: IViewport; - axisOptions: MekkoChartAxisOptions; - labelDataPoints: LabelDataPoint[]; - } - - export interface BaseColorIdentity { - identity: DataViewScopeIdentity; - category: string; - color: string; - group: DataViewValueColumnGroup; - categorySelectionId: powerbi.extensibility.ISelectionId; - categoryStartColor?: string; - categoryEndColor?: string; - } - - export interface ICategotyValuesStatsCollection { - [propName: number]: ICategotyValuesStats; - } - - export interface ICategotyValuesStats { - category: PrimitiveValue; - maxValueOfCategory: number; - maxItemOfCategory: number; - minValueOfCategory: number; - } - - export interface IFilteredValueGroups { - gr: DataViewValueColumnGroup; - categoryValue: PrimitiveValue; - categoryIndex: number; - category: PrimitiveValue; - identity: DataViewScopeIdentity; - } - - export class ICategoryValuesCollection extends Array { - [index: number]: MekkoChartColumnDataPoint; - categoryValue?: PrimitiveValue; - identity?: powerbi.extensibility.ISelectionId; - color?: string; - } -} diff --git a/src/dataViewUtils.ts b/src/dataViewUtils.ts index 89efa2d..9601f47 100644 --- a/src/dataViewUtils.ts +++ b/src/dataViewUtils.ts @@ -24,113 +24,119 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.dataViewUtils { - export function getCategoryAxisProperties( - dataViewMetadata: DataViewMetadata, - axisTitleOnByDefault?: boolean): DataViewObject { +import powerbi from "powerbi-visuals-api"; - let toReturn: DataViewObject = {}; +import * as axisType from "./axis/type"; - if (!dataViewMetadata) { - return toReturn; - } +import DataViewObject = powerbi.DataViewObject; +import DataViewObjects = powerbi.DataViewObjects; +import DataViewMetadata = powerbi.DataViewMetadata; - const objects: DataViewObjects = dataViewMetadata.objects; - - if (objects) { - const categoryAxisObject: DataViewObject = objects["categoryAxis"]; - - if (categoryAxisObject) { - toReturn = { - show: categoryAxisObject["show"], - axisType: categoryAxisObject["axisType"], - axisScale: categoryAxisObject["axisScale"], - start: categoryAxisObject["start"], - end: categoryAxisObject["end"], - showAxisTitle: categoryAxisObject["showAxisTitle"] == null - ? axisTitleOnByDefault - : categoryAxisObject["showAxisTitle"], - axisStyle: categoryAxisObject["axisStyle"], - labelColor: categoryAxisObject["labelColor"], - labelDisplayUnits: categoryAxisObject["labelDisplayUnits"], - labelPrecision: categoryAxisObject["labelPrecision"], - duration: categoryAxisObject["duration"], - }; - } - } +export function getCategoryAxisProperties( + dataViewMetadata: DataViewMetadata, + axisTitleOnByDefault?: boolean): DataViewObject { + let toReturn: DataViewObject = {}; + + if (!dataViewMetadata) { return toReturn; } - export function getValueAxisProperties( - dataViewMetadata: DataViewMetadata, - axisTitleOnByDefault?: boolean): DataViewObject { + const objects: DataViewObjects = dataViewMetadata.objects; + + if (objects) { + const categoryAxisObject: DataViewObject = objects["categoryAxis"]; + + if (categoryAxisObject) { + toReturn = { + show: categoryAxisObject["show"], + axisType: categoryAxisObject["axisType"], + axisScale: categoryAxisObject["axisScale"], + start: categoryAxisObject["start"], + end: categoryAxisObject["end"], + showAxisTitle: categoryAxisObject["showAxisTitle"] == null + ? axisTitleOnByDefault + : categoryAxisObject["showAxisTitle"], + axisStyle: categoryAxisObject["axisStyle"], + labelColor: categoryAxisObject["labelColor"], + labelDisplayUnits: categoryAxisObject["labelDisplayUnits"], + labelPrecision: categoryAxisObject["labelPrecision"], + duration: categoryAxisObject["duration"], + }; + } + } - let toReturn: DataViewObject = {}; + return toReturn; +} - if (!dataViewMetadata) { - return toReturn; - } +export function getValueAxisProperties( + dataViewMetadata: DataViewMetadata, + axisTitleOnByDefault?: boolean): DataViewObject { - const objects: DataViewObjects = dataViewMetadata.objects; - - if (objects) { - const valueAxisObject: DataViewObject = objects["valueAxis"]; - - if (valueAxisObject) { - toReturn = { - show: valueAxisObject["show"], - position: valueAxisObject["position"], - axisScale: valueAxisObject["axisScale"], - start: valueAxisObject["start"], - end: valueAxisObject["end"], - showAxisTitle: valueAxisObject["showAxisTitle"] == null - ? axisTitleOnByDefault - : valueAxisObject["showAxisTitle"], - axisStyle: valueAxisObject["axisStyle"], - labelColor: valueAxisObject["labelColor"], - labelDisplayUnits: valueAxisObject["labelDisplayUnits"], - labelPrecision: valueAxisObject["labelPrecision"], - secShow: valueAxisObject["secShow"], - secPosition: valueAxisObject["secPosition"], - secAxisScale: valueAxisObject["secAxisScale"], - secStart: valueAxisObject["secStart"], - secEnd: valueAxisObject["secEnd"], - secShowAxisTitle: valueAxisObject["secShowAxisTitle"], - secAxisStyle: valueAxisObject["secAxisStyle"], - secLabelColor: valueAxisObject["secLabelColor"], - secLabelDisplayUnits: valueAxisObject["secLabelDisplayUnits"], - secLabelPrecision: valueAxisObject["secLabelPrecision"] - }; - } - } + let toReturn: DataViewObject = {}; + if (!dataViewMetadata) { return toReturn; } - export function isScalar(isScalar: boolean, xAxisCardProperties: DataViewObject): boolean { - if (isScalar) { - isScalar = xAxisCardProperties && xAxisCardProperties["axisType"] - ? xAxisCardProperties["axisType"] === axis.type.scalar - : true; + const objects: DataViewObjects = dataViewMetadata.objects; + + if (objects) { + const valueAxisObject: DataViewObject = objects["valueAxis"]; + + if (valueAxisObject) { + toReturn = { + show: valueAxisObject["show"], + position: valueAxisObject["position"], + axisScale: valueAxisObject["axisScale"], + start: valueAxisObject["start"], + end: valueAxisObject["end"], + showAxisTitle: valueAxisObject["showAxisTitle"] == null + ? axisTitleOnByDefault + : valueAxisObject["showAxisTitle"], + axisStyle: valueAxisObject["axisStyle"], + labelColor: valueAxisObject["labelColor"], + labelDisplayUnits: valueAxisObject["labelDisplayUnits"], + labelPrecision: valueAxisObject["labelPrecision"], + secShow: valueAxisObject["secShow"], + secPosition: valueAxisObject["secPosition"], + secAxisScale: valueAxisObject["secAxisScale"], + secStart: valueAxisObject["secStart"], + secEnd: valueAxisObject["secEnd"], + secShowAxisTitle: valueAxisObject["secShowAxisTitle"], + secAxisStyle: valueAxisObject["secAxisStyle"], + secLabelColor: valueAxisObject["secLabelColor"], + secLabelDisplayUnits: valueAxisObject["secLabelDisplayUnits"], + secLabelPrecision: valueAxisObject["secLabelPrecision"] + }; } + } + + return toReturn; +} - return isScalar; +export function isScalar(isScalar: boolean, xAxisCardProperties: DataViewObject): boolean { + if (isScalar) { + isScalar = xAxisCardProperties && xAxisCardProperties["axisType"] + ? xAxisCardProperties["axisType"] === axisType.scalar + : true; } - export function getLayerData( - dataViews: DataView[], - currentIdx: number, - totalLayers: number): DataView[] { + return isScalar; +} - if (totalLayers > 1) { - if (dataViews && dataViews.length > currentIdx) { - return [dataViews[currentIdx]]; - } +export function getLayerData( + dataViews: powerbi.DataView[], + currentIdx: number, + totalLayers: number): powerbi.DataView[] { - return []; + if (totalLayers > 1) { + if (dataViews && dataViews.length > currentIdx) { + return [dataViews[currentIdx]]; } - return dataViews; + return []; } + + return dataViews; } diff --git a/src/dataWrapper.ts b/src/dataWrapper.ts index 6042175..5adfcd4 100644 --- a/src/dataWrapper.ts +++ b/src/dataWrapper.ts @@ -24,58 +24,63 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual { - // powerbi.extensibility.utils.chart - import AxisHelper = powerbi.extensibility.utils.chart.axis; +import { axis as AxisHelper } from "powerbi-visuals-utils-chartutils"; +import { valueType } from "powerbi-visuals-utils-typeutils"; - // powerbi.extensibility.utils.type - import ValueType = powerbi.extensibility.utils.type.ValueType; +import { + MekkoChartBaseSeries, + MekkoChartBaseData, + MekkoChartDataPoint +} from "./dataInterfaces"; - export class DataWrapper { - private static HighlightedIndexFactor: number = 2; - private data: MekkoChartBaseData; - private isScalar: boolean; +// powerbi.extensibility.utils.type +import ValueType = valueType.ValueType; - public constructor(columnChartData: MekkoChartBaseData, isScalar: boolean) { - this.data = columnChartData; - this.isScalar = isScalar; - } +export class DataWrapper { + private static HighlightedIndexFactor: number = 2; - public lookupXValue(index: number, type: ValueType): any { - const isDateTime: boolean = AxisHelper.isDateTime(type); + private data: MekkoChartBaseData; + private isScalar: boolean; - if (isDateTime && this.isScalar) { - return new Date(index); - } + public constructor(columnChartData: MekkoChartBaseData, isScalar: boolean) { + this.data = columnChartData; + this.isScalar = isScalar; + } - if (type.text) { - return this.data.categories[index]; - } + public lookupXValue(index: number, type: ValueType): any { + const isDateTime: boolean = AxisHelper.isDateTime(type); + + if (isDateTime && this.isScalar) { + return new Date(index); + } - const firstSeries: MekkoChartBaseSeries = this.data.series[0]; + if (type.text) { + return this.data.categories[index]; + } - if (firstSeries) { - const dataPoints: MekkoChartDataPoint[] = firstSeries.data; + const firstSeries: MekkoChartBaseSeries = this.data.series[0]; - if (dataPoints) { - if (this.data.hasHighlights) { - index = index * DataWrapper.HighlightedIndexFactor; - } + if (firstSeries) { + const dataPoints: MekkoChartDataPoint[] = firstSeries.data; - const dataPoint: MekkoChartDataPoint = dataPoints[index]; + if (dataPoints) { + if (this.data.hasHighlights) { + index = index * DataWrapper.HighlightedIndexFactor; + } - if (dataPoint) { - if (isDateTime) { - return new Date(dataPoint.categoryValue); - } + const dataPoint: MekkoChartDataPoint = dataPoints[index]; - return dataPoint.categoryValue; + if (dataPoint) { + if (isDateTime) { + return new Date(dataPoint.categoryValue); } + + return dataPoint.categoryValue; } } - - return index; } + + return index; } } diff --git a/src/formattingUtils.ts b/src/formattingUtils.ts index ad68fed..f5485b3 100644 --- a/src/formattingUtils.ts +++ b/src/formattingUtils.ts @@ -24,24 +24,30 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.formattingUtils { - // powerbi.extensibility.utils.formatting - import valueFormatter = powerbi.extensibility.utils.formatting.valueFormatter; +import powerbi from "powerbi-visuals-api"; - export function getFormattedLegendLabel( - source: DataViewMetadataColumn, - values: DataViewValueColumns): string { +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; +import DataViewValueColumns = powerbi.DataViewValueColumns; +import PrimitiveValue = powerbi.PrimitiveValue; - let sourceForFormat: DataViewMetadataColumn = source, - formatName: PrimitiveValue = source.displayName; +import { valueFormatter as vf } from "powerbi-visuals-utils-formattingutils"; - if (source.groupName !== undefined) { - sourceForFormat = values.source; - formatName = source.groupName; - } +// powerbi.extensibility.utils.formatting +import valueFormatter = vf.valueFormatter; - return valueFormatter.format( - formatName, - valueFormatter.getFormatStringByColumn(sourceForFormat)); +export function getFormattedLegendLabel( + source: DataViewMetadataColumn, + values: DataViewValueColumns): string { + + let sourceForFormat: DataViewMetadataColumn = source, + formatName: PrimitiveValue = source.displayName; + + if (source.groupName !== undefined) { + sourceForFormat = values.source; + formatName = source.groupName; } + + return valueFormatter.format( + formatName, + valueFormatter.getFormatStringByColumn(sourceForFormat)); } diff --git a/src/labelUtils.ts b/src/labelUtils.ts index 9faf2a8..d713926 100644 --- a/src/labelUtils.ts +++ b/src/labelUtils.ts @@ -24,193 +24,206 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.labelUtils { - // powerbi.extensibility.utils.formatting - import wordBreaker = powerbi.extensibility.utils.formatting.wordBreaker; - import TextProperties = powerbi.extensibility.utils.formatting.TextProperties; - import ITextAsSVGMeasurer = powerbi.extensibility.utils.formatting.ITextAsSVGMeasurer; - - // powerbi.extensibility.utils.chart - import AxisHelper = powerbi.extensibility.utils.chart.axis; - import IAxisProperties = AxisHelper.IAxisProperties; - import TickLabelMargins = AxisHelper.TickLabelMargins; - - const XLabelMaxAllowedOverflow: number = 35; - const OffsetDelimiter: number = 2; - const WidthDelimiter: number = 2; - const DefaultOverflow: number = 0; - const HeightFactor: number = 1.4; - const HeightOffset: number = 15; - - export function getTickLabelMargins( - viewport: IViewport, - yMarginLimit: number, - textWidthMeasurer: ITextAsSVGMeasurer, - textHeightMeasurer: ITextAsSVGMeasurer, - axes: MekkoChartAxisProperties, - bottomMarginLimit: number, - xAxisTextProperties: TextProperties, - y1AxisTextProperties: TextProperties, - y2AxisTextProperties: TextProperties, - enableOverflowCheck: boolean, - scrollbarVisible?: boolean, - showOnRight?: boolean, - renderXAxis?: boolean, - renderY1Axis?: boolean, - renderY2Axis?: boolean): TickLabelMargins { - - const xAxisProperties: IAxisProperties = axes.x, - y1AxisProperties: IAxisProperties = axes.y1, - y2AxisProperties: IAxisProperties = axes.y2, - xLabels: any[] = xAxisProperties.values, - y1Labels: any[] = y1AxisProperties.values; - - let leftOverflow: number = 0, - rightOverflow: number = 0, - maxWidthY1: number = 0, - maxWidthY2: number = 0, - xMax: number = 0; // bottom margin - - const ordinalLabelOffset: number = xAxisProperties.categoryThickness - ? xAxisProperties.categoryThickness / OffsetDelimiter - : 0; - - const scaleIsOrdinal: boolean = AxisHelper.isOrdinalScale(xAxisProperties.scale); - - let xLabelOuterPadding: number = 0; - - if (xAxisProperties.outerPadding !== undefined) { - xLabelOuterPadding = xAxisProperties.outerPadding; - } - else if (xAxisProperties.xLabelMaxWidth !== undefined) { - xLabelOuterPadding = Math.max( - 0, - (viewport.width - xAxisProperties.xLabelMaxWidth * xLabels.length) / OffsetDelimiter); - } +import powerbi from "powerbi-visuals-api"; + +import IViewport = powerbi.IViewport; +import { + wordBreaker, + textMeasurementService +} from "powerbi-visuals-utils-formattingutils"; + +import { + MekkoChartAxisProperties +} from "./dataInterfaces"; + +import { + axis as AxisHelper, + axisInterfaces +} from "powerbi-visuals-utils-chartutils"; + +// powerbi.extensibility.utils.formatting +import TextProperties = textMeasurementService.TextProperties; +import ITextAsSVGMeasurer = textMeasurementService.ITextAsSVGMeasurer; + +// powerbi.extensibility.utils.chart +import IAxisProperties = axisInterfaces.IAxisProperties; +import TickLabelMargins = axisInterfaces.TickLabelMargins; + +const XLabelMaxAllowedOverflow: number = 35; +const OffsetDelimiter: number = 2; +const WidthDelimiter: number = 2; +const DefaultOverflow: number = 0; +const HeightFactor: number = 1.4; +const HeightOffset: number = 15; + +export function getTickLabelMargins( + viewport: IViewport, + yMarginLimit: number, + textWidthMeasurer: ITextAsSVGMeasurer, + textHeightMeasurer: ITextAsSVGMeasurer, + axes: MekkoChartAxisProperties, + bottomMarginLimit: number, + xAxisTextProperties: TextProperties, + y1AxisTextProperties: TextProperties, + y2AxisTextProperties: TextProperties, + enableOverflowCheck: boolean, + scrollbarVisible?: boolean, + showOnRight?: boolean, + renderXAxis?: boolean, + renderY1Axis?: boolean, + renderY2Axis?: boolean): TickLabelMargins { + + const xAxisProperties: IAxisProperties = axes.x, + y1AxisProperties: IAxisProperties = axes.y1, + y2AxisProperties: IAxisProperties = axes.y2, + xLabels: any[] = xAxisProperties.values, + y1Labels: any[] = y1AxisProperties.values; + + let leftOverflow: number = 0, + rightOverflow: number = 0, + maxWidthY1: number = 0, + maxWidthY2: number = 0, + xMax: number = 0; // bottom margin + + const ordinalLabelOffset: number = xAxisProperties.categoryThickness + ? xAxisProperties.categoryThickness / OffsetDelimiter + : 0; + + const scaleIsOrdinal: boolean = AxisHelper.isOrdinalScale(xAxisProperties.scale); + + let xLabelOuterPadding: number = 0; + + if (xAxisProperties.outerPadding !== undefined) { + xLabelOuterPadding = xAxisProperties.outerPadding; + } + else if (xAxisProperties.xLabelMaxWidth !== undefined) { + xLabelOuterPadding = Math.max( + 0, + (viewport.width - xAxisProperties.xLabelMaxWidth * xLabels.length) / OffsetDelimiter); + } - if (AxisHelper.getRecommendedNumberOfTicksForXAxis(viewport.width) !== 0 - || AxisHelper.getRecommendedNumberOfTicksForYAxis(viewport.height) !== 0) { + if (AxisHelper.getRecommendedNumberOfTicksForXAxis(viewport.width) !== 0 + || AxisHelper.getRecommendedNumberOfTicksForYAxis(viewport.height) !== 0) { - let rotation: any = scrollbarVisible - ? AxisHelper.LabelLayoutStrategy.DefaultRotationWithScrollbar - : AxisHelper.LabelLayoutStrategy.DefaultRotation; + let rotation: any = scrollbarVisible + ? AxisHelper.LabelLayoutStrategy.DefaultRotationWithScrollbar + : AxisHelper.LabelLayoutStrategy.DefaultRotation; - if (renderY1Axis) { - for (let i: number = 0; i < y1Labels.length; i++) { - y1AxisTextProperties.text = y1Labels[i]; + if (renderY1Axis) { + for (let i: number = 0; i < y1Labels.length; i++) { + y1AxisTextProperties.text = y1Labels[i]; - maxWidthY1 = Math.max( - maxWidthY1, - textWidthMeasurer(y1AxisTextProperties)); - } + maxWidthY1 = Math.max( + maxWidthY1, + textWidthMeasurer(y1AxisTextProperties)); } + } - if (y2AxisProperties && renderY2Axis) { - const y2Labels: any[] = y2AxisProperties.values; + if (y2AxisProperties && renderY2Axis) { + const y2Labels: any[] = y2AxisProperties.values; - for (let i: number = 0; i < y2Labels.length; i++) { - y2AxisTextProperties.text = y2Labels[i]; + for (let i: number = 0; i < y2Labels.length; i++) { + y2AxisTextProperties.text = y2Labels[i]; - maxWidthY2 = Math.max( - maxWidthY2, - textWidthMeasurer(y2AxisTextProperties)); - } + maxWidthY2 = Math.max( + maxWidthY2, + textWidthMeasurer(y2AxisTextProperties)); } + } - const textHeight: number = textHeightMeasurer(xAxisTextProperties), - maxNumLines: number = Math.floor(bottomMarginLimit / textHeight), - xScale: any = xAxisProperties.scale, - xDomain: any = xScale.domain(); + const textHeight: number = textHeightMeasurer(xAxisTextProperties), + maxNumLines: number = Math.floor(bottomMarginLimit / textHeight), + xScale: any = xAxisProperties.scale, + xDomain: any = xScale.domain(); - if (renderXAxis && xLabels.length > 0) { - for (let i: number = 0, len = xLabels.length; i < len; i++) { - let height: number; + if (renderXAxis && xLabels.length > 0) { + for (let i: number = 0, len = xLabels.length; i < len; i++) { + let height: number; - xAxisTextProperties.text = xLabels[i]; + xAxisTextProperties.text = xLabels[i]; - let width: number = textWidthMeasurer(xAxisTextProperties); + let width: number = textWidthMeasurer(xAxisTextProperties); - if (xAxisProperties.willLabelsWordBreak) { - // Split label and count rows - const wordBreaks: string[] = wordBreaker.splitByWidth( - xAxisTextProperties.text, - xAxisTextProperties, - textWidthMeasurer, - xAxisProperties.xLabelMaxWidth, - maxNumLines); + if (xAxisProperties.willLabelsWordBreak) { + // Split label and count rows + const wordBreaks: string[] = wordBreaker.splitByWidth( + xAxisTextProperties.text, + xAxisTextProperties, + textWidthMeasurer, + xAxisProperties.xLabelMaxWidth, + maxNumLines); - height = wordBreaks.length * textHeight; - width = xAxisProperties.xLabelMaxWidth; - } - else if (!xAxisProperties.willLabelsFit && scaleIsOrdinal) { - height = width * rotation.sine; - width = width * rotation.cosine; - } - else { - height = textHeight; - } - - if (i === 0) { - if (scaleIsOrdinal) { - if (!xAxisProperties.willLabelsFit) { - leftOverflow = width - ordinalLabelOffset - xLabelOuterPadding; - } else { - leftOverflow = (width / WidthDelimiter) - ordinalLabelOffset - xLabelOuterPadding; - } + height = wordBreaks.length * textHeight; + width = xAxisProperties.xLabelMaxWidth; + } + else if (!xAxisProperties.willLabelsFit && scaleIsOrdinal) { + height = width * rotation.sine; + width = width * rotation.cosine; + } + else { + height = textHeight; + } - leftOverflow = Math.max(leftOverflow, 0); + if (i === 0) { + if (scaleIsOrdinal) { + if (!xAxisProperties.willLabelsFit) { + leftOverflow = width - ordinalLabelOffset - xLabelOuterPadding; + } else { + leftOverflow = (width / WidthDelimiter) - ordinalLabelOffset - xLabelOuterPadding; } - else if (xDomain.length > 1) { - const xPos: number = xScale(xDomain[0]); - leftOverflow = (width / WidthDelimiter) - xPos; - leftOverflow = Math.max(leftOverflow, 0); - } - } else if (i === len - 1) { - if (scaleIsOrdinal) { - if (xAxisProperties.willLabelsFit || xAxisProperties.willLabelsWordBreak) { - rightOverflow = (width / WidthDelimiter) - ordinalLabelOffset - xLabelOuterPadding; - rightOverflow = Math.max(rightOverflow, 0); - } - } - else if (xDomain.length > 1) { - const xPos: number = xScale(xDomain[1]); + leftOverflow = Math.max(leftOverflow, 0); + } + else if (xDomain.length > 1) { + const xPos: number = xScale(xDomain[0]); - rightOverflow = (width / WidthDelimiter) - (viewport.width - xPos); + leftOverflow = (width / WidthDelimiter) - xPos; + leftOverflow = Math.max(leftOverflow, 0); + } + } else if (i === len - 1) { + if (scaleIsOrdinal) { + if (xAxisProperties.willLabelsFit || xAxisProperties.willLabelsWordBreak) { + rightOverflow = (width / WidthDelimiter) - ordinalLabelOffset - xLabelOuterPadding; rightOverflow = Math.max(rightOverflow, 0); } } + else if (xDomain.length > 1) { + const xPos: number = xScale(xDomain[1]); - xMax = Math.max(xMax, height * HeightFactor - HeightOffset); + rightOverflow = (width / WidthDelimiter) - (viewport.width - xPos); + rightOverflow = Math.max(rightOverflow, 0); + } } - // trim any actual overflow to the limit - leftOverflow = enableOverflowCheck - ? Math.min(leftOverflow, XLabelMaxAllowedOverflow) - : DefaultOverflow; - - rightOverflow = enableOverflowCheck - ? Math.min(rightOverflow, XLabelMaxAllowedOverflow) - : DefaultOverflow; + + xMax = Math.max(xMax, height * HeightFactor - HeightOffset); } + // trim any actual overflow to the limit + leftOverflow = enableOverflowCheck + ? Math.min(leftOverflow, XLabelMaxAllowedOverflow) + : DefaultOverflow; + + rightOverflow = enableOverflowCheck + ? Math.min(rightOverflow, XLabelMaxAllowedOverflow) + : DefaultOverflow; } + } - let rightMargin: number = 0, - leftMargin: number = 0, - bottomMargin: number = Math.min(Math.ceil(xMax), bottomMarginLimit); - - if (showOnRight) { - leftMargin = Math.min(Math.max(leftOverflow, maxWidthY2), yMarginLimit); - rightMargin = Math.min(Math.max(rightOverflow, maxWidthY1), yMarginLimit); - } - else { - leftMargin = Math.min(Math.max(leftOverflow, maxWidthY1), yMarginLimit); - rightMargin = Math.min(Math.max(rightOverflow, maxWidthY2), yMarginLimit); - } + let rightMargin: number = 0, + leftMargin: number = 0, + bottomMargin: number = Math.min(Math.ceil(xMax), bottomMarginLimit); - return { - xMax: Math.ceil(bottomMargin), - yLeft: Math.ceil(leftMargin), - yRight: Math.ceil(rightMargin), - }; + if (showOnRight) { + leftMargin = Math.min(Math.max(leftOverflow, maxWidthY2), yMarginLimit); + rightMargin = Math.min(Math.max(rightOverflow, maxWidthY1), yMarginLimit); + } + else { + leftMargin = Math.min(Math.max(leftOverflow, maxWidthY1), yMarginLimit); + rightMargin = Math.min(Math.max(rightOverflow, maxWidthY2), yMarginLimit); } + + return { + xMax: Math.ceil(bottomMargin), + yLeft: Math.ceil(leftMargin), + yRight: Math.ceil(rightMargin), + }; } diff --git a/src/roleNames.ts b/src/roleNames.ts index 3e26a41..dfe3426 100644 --- a/src/roleNames.ts +++ b/src/roleNames.ts @@ -24,11 +24,9 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual { - export const RoleNames = { - category: "Category", - series: "Series", - y: "Y", - width: "Width" - }; -} +export const RoleNames = { + category: "Category", + series: "Series", + y: "Y", + width: "Width" +}; diff --git a/src/tooltip.ts b/src/tooltip.ts index a90e806..84d27eb 100644 --- a/src/tooltip.ts +++ b/src/tooltip.ts @@ -23,215 +23,224 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +import powerbi from "powerbi-visuals-api"; +import DataViewValueColumn = powerbi.DataViewValueColumn; +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; +import DataViewCategorical = powerbi.DataViewCategorical; +import DataViewCategoryColumn = powerbi.DataViewCategoryColumn; +import ILocalizationManager = powerbi.extensibility.ILocalizationManager; +import VisualTooltipDataItem = powerbi.extensibility.VisualTooltipDataItem; + +import { + valueFormatter as vf +} from "powerbi-visuals-utils-formattingutils"; + +// powerbi.extensibility.utils.formatting +import valueFormatter = vf.valueFormatter; + +export const DisplayNameSeparator: string = "/"; + +export interface TooltipSeriesDataItem { + value?: any; + highlightedValue?: any; + metadata: DataViewValueColumn; +} -module powerbi.extensibility.visual.tooltip { - // powerbi.extensibility.utils.formatting - import valueFormatter = powerbi.extensibility.utils.formatting.valueFormatter; - - export const DisplayNameSeparator: string = "/"; +export interface TooltipCategoryDataItem { + value?: any; + metadata: DataViewMetadataColumn[]; +} - export interface TooltipSeriesDataItem { - value?: any; - highlightedValue?: any; - metadata: DataViewValueColumn; - } +export function createTooltipInfo( + dataViewCat: DataViewCategorical, + categoryValue: any, + localizationManager: ILocalizationManager, + value?: any, + categories?: DataViewCategoryColumn[], + seriesData?: TooltipSeriesDataItem[], + seriesIndex?: number, + categoryIndex?: number, + highlightedValue?: any): VisualTooltipDataItem[] { + + let categorySource: TooltipCategoryDataItem, + seriesSource: TooltipSeriesDataItem[] = [], + valuesSource: DataViewMetadataColumn = undefined; + + seriesIndex = seriesIndex | 0; + + let categoriesData: DataViewCategoryColumn[] = dataViewCat + ? dataViewCat.categories + : categories; + + if (categoriesData && categoriesData.length > 0) { + if (categoriesData.length > 1) { + const compositeCategoriesData: DataViewMetadataColumn[] = []; + + for (let i: number = 0; i < categoriesData.length; i++) { + compositeCategoriesData.push(categoriesData[i].source); + } - export interface TooltipCategoryDataItem { - value?: any; - metadata: DataViewMetadataColumn[]; + categorySource = { + value: categoryValue, + metadata: compositeCategoriesData + }; + } + else { + categorySource = { + value: categoryValue, + metadata: [categoriesData[0].source] + }; + } } - export function createTooltipInfo( - dataViewCat: DataViewCategorical, - categoryValue: any, - localizationManager: ILocalizationManager, - value?: any, - categories?: DataViewCategoryColumn[], - seriesData?: TooltipSeriesDataItem[], - seriesIndex?: number, - categoryIndex?: number, - highlightedValue?: any): VisualTooltipDataItem[] { - - let categorySource: TooltipCategoryDataItem, - seriesSource: TooltipSeriesDataItem[] = [], - valuesSource: DataViewMetadataColumn = undefined; - - seriesIndex = seriesIndex | 0; - - let categoriesData: DataViewCategoryColumn[] = dataViewCat - ? dataViewCat.categories - : categories; - - if (categoriesData && categoriesData.length > 0) { - if (categoriesData.length > 1) { - const compositeCategoriesData: DataViewMetadataColumn[] = []; - - for (let i: number = 0; i < categoriesData.length; i++) { - compositeCategoriesData.push(categoriesData[i].source); - } - - categorySource = { - value: categoryValue, - metadata: compositeCategoriesData - }; - } - else { - categorySource = { - value: categoryValue, - metadata: [categoriesData[0].source] - }; - } + if (dataViewCat && dataViewCat.values) { + if (!categorySource + || !(categorySource.metadata[0] === dataViewCat.values.source)) { + valuesSource = dataViewCat.values.source; } - if (dataViewCat && dataViewCat.values) { - if (!categorySource - || !(categorySource.metadata[0] === dataViewCat.values.source)) { - valuesSource = dataViewCat.values.source; - } + if (dataViewCat.values.length > 0) { + const valueColumn: DataViewValueColumn = dataViewCat.values[seriesIndex], + isAutoGeneratedColumn: boolean = !!(valueColumn + && valueColumn.source + && (valueColumn.source as any).isAutoGeneratedColumn); - if (dataViewCat.values.length > 0) { - const valueColumn: DataViewValueColumn = dataViewCat.values[seriesIndex], - isAutoGeneratedColumn: boolean = !!(valueColumn - && valueColumn.source - && (valueColumn.source as any).isAutoGeneratedColumn); - - if (!isAutoGeneratedColumn) { - seriesSource.push({ - value, - highlightedValue, - metadata: valueColumn - }); - } + if (!isAutoGeneratedColumn) { + seriesSource.push({ + value, + highlightedValue, + metadata: valueColumn + }); } } + } - if (seriesData) { - for (let i: number = 0; i < seriesData.length; i++) { - const singleSeriesData: TooltipSeriesDataItem = seriesData[i]; - - if (categorySource - && categorySource.metadata[0] === singleSeriesData.metadata.source) { - continue; - } + if (seriesData) { + for (let i: number = 0; i < seriesData.length; i++) { + const singleSeriesData: TooltipSeriesDataItem = seriesData[i]; - seriesSource.push({ - value: singleSeriesData.value, - metadata: singleSeriesData.metadata - }); + if (categorySource + && categorySource.metadata[0] === singleSeriesData.metadata.source) { + continue; } - } - return createTooltipData(categorySource, valuesSource, seriesSource, localizationManager); + seriesSource.push({ + value: singleSeriesData.value, + metadata: singleSeriesData.metadata + }); + } } - export function createTooltipData( - categoryValue: TooltipCategoryDataItem, - valuesSource: DataViewMetadataColumn, - seriesValues: TooltipSeriesDataItem[], - localizationManager: ILocalizationManager): VisualTooltipDataItem[] { + return createTooltipData(categorySource, valuesSource, seriesSource, localizationManager); +} - let items: VisualTooltipDataItem[] = []; +export function createTooltipData( + categoryValue: TooltipCategoryDataItem, + valuesSource: DataViewMetadataColumn, + seriesValues: TooltipSeriesDataItem[], + localizationManager: ILocalizationManager): VisualTooltipDataItem[] { - if (categoryValue) { - if (categoryValue.metadata.length > 1) { - let displayName: string = ""; + let items: VisualTooltipDataItem[] = []; - for (let i: number = 0; i < categoryValue.metadata.length; i++) { - if (i !== 0) { - displayName += DisplayNameSeparator; - } + if (categoryValue) { + if (categoryValue.metadata.length > 1) { + let displayName: string = ""; - displayName += categoryValue.metadata[i].displayName; + for (let i: number = 0; i < categoryValue.metadata.length; i++) { + if (i !== 0) { + displayName += DisplayNameSeparator; } - const categoryFormattedValue: string = getFormattedValue( - categoryValue.metadata[0], - categoryValue.value); - - items.push({ - displayName, - value: categoryFormattedValue - }); + displayName += categoryValue.metadata[i].displayName; } - else { - const categoryFormattedValue: string = getFormattedValue( - categoryValue.metadata[0], - categoryValue.value); - items.push({ - displayName: categoryValue.metadata[0].displayName, - value: categoryFormattedValue - }); - } + const categoryFormattedValue: string = getFormattedValue( + categoryValue.metadata[0], + categoryValue.value); + + items.push({ + displayName, + value: categoryFormattedValue + }); } + else { + const categoryFormattedValue: string = getFormattedValue( + categoryValue.metadata[0], + categoryValue.value); - if (valuesSource) { - // Dynamic series value - let dynamicValue: string; + items.push({ + displayName: categoryValue.metadata[0].displayName, + value: categoryFormattedValue + }); + } + } - if (seriesValues.length > 0) { - const dynamicValueMetadata: DataViewMetadataColumn = seriesValues[0].metadata.source; + if (valuesSource) { + // Dynamic series value + let dynamicValue: string; - dynamicValue = getFormattedValue( - valuesSource, - dynamicValueMetadata.groupName); - } + if (seriesValues.length > 0) { + const dynamicValueMetadata: DataViewMetadataColumn = seriesValues[0].metadata.source; - items.push({ - displayName: valuesSource.displayName, - value: dynamicValue - }); + dynamicValue = getFormattedValue( + valuesSource, + dynamicValueMetadata.groupName); } - for (let i: number = 0; i < seriesValues.length; i++) { - const seriesData: TooltipSeriesDataItem = seriesValues[i]; + items.push({ + displayName: valuesSource.displayName, + value: dynamicValue + }); + } - if (seriesData && seriesData.metadata) { - const seriesMetadataColumn: DataViewMetadataColumn = seriesData.metadata.source, - value: any = seriesData.value, - highlightedValue: any = seriesData.highlightedValue; + for (let i: number = 0; i < seriesValues.length; i++) { + const seriesData: TooltipSeriesDataItem = seriesValues[i]; - if (value || value === 0) { - const formattedValue: string = getFormattedValue( - seriesMetadataColumn, - value); + if (seriesData && seriesData.metadata) { + const seriesMetadataColumn: DataViewMetadataColumn = seriesData.metadata.source, + value: any = seriesData.value, + highlightedValue: any = seriesData.highlightedValue; - items.push({ - displayName: seriesMetadataColumn.displayName, - value: formattedValue - }); - } + if (value || value === 0) { + const formattedValue: string = getFormattedValue( + seriesMetadataColumn, + value); + + items.push({ + displayName: seriesMetadataColumn.displayName, + value: formattedValue + }); + } - if (highlightedValue || highlightedValue === 0) { - const formattedHighlightedValue: string = getFormattedValue( - seriesMetadataColumn, - highlightedValue); + if (highlightedValue || highlightedValue === 0) { + const formattedHighlightedValue: string = getFormattedValue( + seriesMetadataColumn, + highlightedValue); - items.push({ - displayName: localizationManager.getDisplayName("Visual_HighlightedValueDisplayName"), - value: formattedHighlightedValue - }); - } + items.push({ + displayName: localizationManager.getDisplayName("Visual_HighlightedValueDisplayName"), + value: formattedHighlightedValue + }); } } - - return items; } - export function getFormattedValue(column: DataViewMetadataColumn, value: any): string { - let formatString: string = getFormatStringFromColumn(column); - - return valueFormatter.format(value, formatString); - } + return items; +} - export function getFormatStringFromColumn(column: DataViewMetadataColumn): string { - if (!column) { - return null; - } +export function getFormattedValue(column: DataViewMetadataColumn, value: any): string { + let formatString: string = getFormatStringFromColumn(column); - const formatString: string = - valueFormatter.getFormatStringByColumn(column, true); + return valueFormatter.format(value, formatString); +} - return formatString || column.format; +export function getFormatStringFromColumn(column: DataViewMetadataColumn): string { + if (!column) { + return null; } + + const formatString: string = + valueFormatter.getFormatStringByColumn(column, true); + + return formatString || column.format; } diff --git a/src/utils.ts b/src/utils.ts index 7e5f650..749b3a7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -23,273 +23,294 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +import powerbi from "powerbi-visuals-api"; + +import DataViewCategorical = powerbi.DataViewCategorical; +import DataViewPropertyValue = powerbi.DataViewPropertyValue; +import PrimitiveValue = powerbi.PrimitiveValue; +import DataViewObjects = powerbi.DataViewObjects; +import DataViewCategoryColumn = powerbi.DataViewCategoryColumn; +import DataViewValueColumn = powerbi.DataViewValueColumn; +import ValueTypeDescriptor = powerbi.ValueTypeDescriptor; +import DataViewObject = powerbi.DataViewObject; +import NumberRange = powerbi.NumberRange; +import DataViewValueColumns = powerbi.DataViewValueColumns; + +import { MekkoChart } from "./visual"; + +import { + double as Double, + prototype as Prototype +} from "powerbi-visuals-utils-typeutils"; + +import { + MekkoChartSeries, + MekkoChartColumnDataPoint, + MekkoChartAxisOptions, + MekkoChartData, + +} from "./dataInterfaces"; + +import { + axis as AxisHelper +} from "powerbi-visuals-utils-chartutils"; + +// d3 +import * as d3selection from "d3-selection"; +import * as d3scale from "d3-scale"; +import * as d3array from "d3-array"; +import LinearScale = d3scale.ScaleLinear; +import Selection = d3selection.Selection; + +const PctRoundingError: number = 0.0001; +const RectName: string = "rect"; + +export const DimmedOpacity = 0.4; +export const DefaultOpacity = 1.0; + +const DefaultNumberRange: NumberRange = { + min: 0, + max: 10 +}; + +export function getSize(scale: LinearScale, size: number, zeroVal: number = 0): number { + return AxisHelper.diffScaled(scale, zeroVal, size); +} -module powerbi.extensibility.visual.utils { - // d3 - import Selection = d3.Selection; - import LinearScale = d3.scale.Linear; - import UpdateSelection = d3.selection.Update; - - // powerbi.extensibility.utils.chart - import AxisHelper = powerbi.extensibility.utils.chart.axis; - - // powerbi.extensibility.utils.type - import Double = powerbi.extensibility.utils.type.Double; - - // powerbi.extensibility.utils.type - import Prototype = powerbi.extensibility.utils.type.Prototype; - - const PctRoundingError: number = 0.0001; - const RectName: string = "rect"; - - export const DimmedOpacity = 0.4; - export const DefaultOpacity = 1.0; - - const DefaultNumberRange: NumberRange = { - min: 0, - max: 10 - }; - - export function getSize(scale: LinearScale, size: number, zeroVal: number = 0): number { - return AxisHelper.diffScaled(scale, zeroVal, size); - } - - export function calcValueDomain(data: MekkoChartSeries[], is100pct: boolean): NumberRange { - if (data.length === 0) { - return { - min: DefaultNumberRange.min, - max: DefaultNumberRange.max - }; - } - - let min: number = d3.min( - data, - (series: MekkoChartSeries) => { - return d3.min( - series.data, - (dataPoint: MekkoChartColumnDataPoint) => { - return dataPoint.position - dataPoint.valueAbsolute; - }); - }); - - let max: number = d3.max( - data, - (series: MekkoChartSeries) => { - return d3.max( - series.data, - (dataPoint: MekkoChartColumnDataPoint) => dataPoint.position); - }); - - if (is100pct) { - min = Double.roundToPrecision(min, PctRoundingError); - max = Double.roundToPrecision(max, PctRoundingError); - } - +export function calcValueDomain(data: MekkoChartSeries[], is100pct: boolean): NumberRange { + if (data.length === 0) { return { - min, - max + min: DefaultNumberRange.min, + max: DefaultNumberRange.max }; } - export function drawSeries( - data: MekkoChartData, - graphicsContext: Selection, - axisOptions: MekkoChartAxisOptions): UpdateSelection { + let min: number = d3array.min( + data, + (series: MekkoChartSeries) => { + return d3array.min( + series.data, + (dataPoint: MekkoChartColumnDataPoint) => { + return dataPoint.position - dataPoint.valueAbsolute; + }); + }); + + let max: number = d3array.max( + data, + (series: MekkoChartSeries) => { + return d3array.max( + series.data, + (dataPoint: MekkoChartColumnDataPoint) => dataPoint.position); + }); + + if (is100pct) { + min = Double.roundToPrecision(min, PctRoundingError); + max = Double.roundToPrecision(max, PctRoundingError); + } - const series: UpdateSelection = graphicsContext - .selectAll(MekkoChart.SeriesSelector.selectorName) - .data(data.series, (series: MekkoChartSeries) => series.key); + return { + min, + max + }; +} - series - .enter() - .append("g") - .classed(MekkoChart.SeriesSelector.className, true); +export function drawSeries( + data: MekkoChartData, + graphicsContext: Selection, + axisOptions: MekkoChartAxisOptions): Selection { + + let series: Selection = graphicsContext + .selectAll(MekkoChart.SeriesSelector.selectorName) + .data(data.series, (series: MekkoChartSeries) => series.key); + + series = series + .enter() + .append("g") + .classed(MekkoChart.SeriesSelector.className, true) + .merge(series) + .style( + "fill", (series: MekkoChartSeries) => series.color, + ); + + series + .exit() + .remove(); + + return series; +} - series - .style({ - fill: (series: MekkoChartSeries) => series.color, - }); +export function applyInteractivity(columns: Selection, onDragStart): void { + if (onDragStart) { + columns + .attr("draggable", "true") + .on("dragstart", onDragStart); + } +} - series - .exit() - .remove(); +export function getFillOpacity( + selected: boolean, + highlight: boolean, + hasSelection: boolean, + hasPartialHighlights: boolean): number { - return series; + if ((hasPartialHighlights && !highlight) || (hasSelection && !selected)) { + return DimmedOpacity; } - export function applyInteractivity(columns: Selection, onDragStart): void { - if (onDragStart) { - columns - .attr("draggable", "true") - .on("dragstart", onDragStart); - } - } + return DefaultOpacity; +} - export function getFillOpacity( - selected: boolean, - highlight: boolean, - hasSelection: boolean, - hasPartialHighlights: boolean): number { +export function setChosenColumnOpacity( + mainGraphicsContext: Selection, + columnGroupSelector: string, + selectedColumnIndex: number, + lastColumnIndex: number): void { + + const series: Selection = mainGraphicsContext + .selectAll(MekkoChart.SeriesSelector.selectorName); + + const lastColumnUndefined: boolean = typeof lastColumnIndex === "undefined"; + + series.selectAll(RectName + columnGroupSelector) + .filter((dataPoint: MekkoChartColumnDataPoint) => { + return (dataPoint.categoryIndex !== selectedColumnIndex) + && (lastColumnUndefined || dataPoint.categoryIndex === lastColumnIndex); + }) + .transition() + .style("fill-opacity", DimmedOpacity); + + series.selectAll(RectName + columnGroupSelector) + .filter((dataPoint: MekkoChartColumnDataPoint) => { + return dataPoint.categoryIndex === selectedColumnIndex; + }) + .style("fill-opacity", DefaultOpacity); +} - if ((hasPartialHighlights && !highlight) || (hasSelection && !selected)) { - return DimmedOpacity; - } +export function getClosestColumnIndex(coordinate: number, columnsCenters: number[]): number { + let currentIndex: number = 0, + distance: number = Number.MAX_VALUE; - return DefaultOpacity; - } + for (let i: number = 0; i < columnsCenters.length; i++) { + const currentDistance: number = Math.abs(coordinate - columnsCenters[i]); - export function setChosenColumnOpacity( - mainGraphicsContext: Selection, - columnGroupSelector: string, - selectedColumnIndex: number, - lastColumnIndex: number): void { - - const series: Selection = mainGraphicsContext - .selectAll(MekkoChart.SeriesSelector.selectorName); - - const lastColumnUndefined: boolean = typeof lastColumnIndex === "undefined"; - - series.selectAll(RectName + columnGroupSelector) - .filter((dataPoint: MekkoChartColumnDataPoint) => { - return (dataPoint.categoryIndex !== selectedColumnIndex) - && (lastColumnUndefined || dataPoint.categoryIndex === lastColumnIndex); - }) - .transition() - .style("fill-opacity", DimmedOpacity); - - series.selectAll(RectName + columnGroupSelector) - .filter((dataPoint: MekkoChartColumnDataPoint) => { - return dataPoint.categoryIndex === selectedColumnIndex; - }) - .style("fill-opacity", DefaultOpacity); + if (currentDistance < distance) { + distance = currentDistance; + currentIndex = i; + } } - export function getClosestColumnIndex(coordinate: number, columnsCenters: number[]): number { - let currentIndex: number = 0, - distance: number = Number.MAX_VALUE; + return currentIndex; +} - for (let i: number = 0; i < columnsCenters.length; i++) { - const currentDistance: number = Math.abs(coordinate - columnsCenters[i]); +export function applyUserMinMax( + isScalar: boolean, + dataView: DataViewCategorical, + xAxisCardProperties: DataViewObject): DataViewCategorical { - if (currentDistance < distance) { - distance = currentDistance; - currentIndex = i; - } - } + if (isScalar) { + const min: DataViewPropertyValue = xAxisCardProperties["start"], + max: DataViewPropertyValue = xAxisCardProperties["end"]; - return currentIndex; + return transformDomain(dataView, min, max); } - export function applyUserMinMax( - isScalar: boolean, - dataView: DataViewCategorical, - xAxisCardProperties: DataViewObject): DataViewCategorical { + return dataView; +} - if (isScalar) { - const min: DataViewPropertyValue = xAxisCardProperties["start"], - max: DataViewPropertyValue = xAxisCardProperties["end"]; +export function transformDomain( + dataView: DataViewCategorical, + min: DataViewPropertyValue, + max: DataViewPropertyValue): DataViewCategorical { - return transformDomain(dataView, min, max); - } + if (!dataView.categories + || !dataView.values + || dataView.categories.length === 0 + || dataView.values.length === 0) { return dataView; } - export function transformDomain( - dataView: DataViewCategorical, - min: DataViewPropertyValue, - max: DataViewPropertyValue): DataViewCategorical { - - if (!dataView.categories - || !dataView.values - || dataView.categories.length === 0 - || dataView.values.length === 0) { - - return dataView; - } - - if (typeof min !== "number" && typeof max !== "number") { - return dataView; - } + if (typeof min !== "number" && typeof max !== "number") { + return dataView; + } - const category: DataViewCategoryColumn = dataView.categories[0]; + const category: DataViewCategoryColumn = dataView.categories[0]; - const categoryType: ValueTypeDescriptor = category - ? category.source.type - : null; + const categoryType: ValueTypeDescriptor = category + ? category.source.type + : null; - // Min/Max comparison won't work if category source is Ordinal - if (AxisHelper.isOrdinal(categoryType)) { - return; - } + // Min/Max comparison won't work if category source is Ordinal + if (AxisHelper.isOrdinal(categoryType)) { + return; + } - const categoryValues: PrimitiveValue[] = category.values, - categoryObjects: DataViewObjects[] = category.objects; + const categoryValues: PrimitiveValue[] = category.values, + categoryObjects: DataViewObjects[] = category.objects; - if (!categoryValues || !categoryObjects) { - return dataView; - } + if (!categoryValues || !categoryObjects) { + return dataView; + } - const newcategoryValues: PrimitiveValue[] = [], - newValues: PrimitiveValue[][] = [], - newObjects: DataViewObjects[] = []; + const newcategoryValues: PrimitiveValue[] = [], + newValues: PrimitiveValue[][] = [], + newObjects: DataViewObjects[] = []; - if (typeof min !== "number") { - min = categoryValues[0]; - } - if (typeof max !== "number") { - max = categoryValues[categoryValues.length - 1]; - } + if (typeof min !== "number") { + min = categoryValues[0]; + } + if (typeof max !== "number") { + max = categoryValues[categoryValues.length - 1]; + } - if (min > max) { - return dataView; - } + if (min > max) { + return dataView; + } - for (let j: number = 0; j < dataView.values.length; j++) { - newValues.push([]); - } + for (let j: number = 0; j < dataView.values.length; j++) { + newValues.push([]); + } - for (let t: number = 0; t < categoryValues.length; t++) { - if (categoryValues[t] >= min && categoryValues[t] <= max) { - newcategoryValues.push(categoryValues[t]); + for (let t: number = 0; t < categoryValues.length; t++) { + if (categoryValues[t] >= min && categoryValues[t] <= max) { + newcategoryValues.push(categoryValues[t]); - if (categoryObjects) { - newObjects.push(categoryObjects[t]); - } + if (categoryObjects) { + newObjects.push(categoryObjects[t]); + } - if (dataView.values) { - for (let k: number = 0; k < dataView.values.length; k++) { - newValues[k].push(dataView.values[k].values[t]); - } + if (dataView.values) { + for (let k: number = 0; k < dataView.values.length; k++) { + newValues[k].push(dataView.values[k].values[t]); } } } + } - const resultDataView: DataViewCategorical = Prototype.inherit(dataView), - resultDataViewValues: DataViewValueColumns - = resultDataView.values - = Prototype.inherit(resultDataView.values), - resultDataViewCategories: DataViewCategoryColumn[] - = resultDataView.categories - = Prototype.inherit(dataView.categories), - resultDataViewCategories0: DataViewCategoryColumn - = resultDataView.categories[0] - = Prototype.inherit(resultDataViewCategories[0]); - - resultDataViewCategories0.values = newcategoryValues; - - if (resultDataViewCategories0.objects) { - resultDataViewCategories0.objects = newObjects; - } + const resultDataView: DataViewCategorical = Prototype.inherit(dataView), + resultDataViewValues: DataViewValueColumns + = resultDataView.values + = Prototype.inherit(resultDataView.values), + resultDataViewCategories: DataViewCategoryColumn[] + = resultDataView.categories + = Prototype.inherit(dataView.categories), + resultDataViewCategories0: DataViewCategoryColumn + = resultDataView.categories[0] + = Prototype.inherit(resultDataViewCategories[0]); + + resultDataViewCategories0.values = newcategoryValues; + + if (resultDataViewCategories0.objects) { + resultDataViewCategories0.objects = newObjects; + } - for (let t: number = 0; t < dataView.values.length; t++) { - const measureArray: DataViewValueColumn - = resultDataViewValues[t] - = Prototype.inherit(resultDataViewValues[t]); + for (let t: number = 0; t < dataView.values.length; t++) { + const measureArray: DataViewValueColumn + = resultDataViewValues[t] + = Prototype.inherit(resultDataViewValues[t]); - measureArray.values = newValues[t]; - } - - return resultDataView; + measureArray.values = newValues[t]; } -} + + return resultDataView; +} \ No newline at end of file diff --git a/src/visual.ts b/src/visual.ts index 82fe799..d4568be 100644 --- a/src/visual.ts +++ b/src/visual.ts @@ -24,2512 +24,2615 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual { - // powerbi - import IDataViewObjects = powerbi.DataViewObjects; - - // powerbi.visuals - import ISelectionId = powerbi.visuals.ISelectionId; - - // d3 - import Brush = d3.svg.Brush; - import Selection = d3.Selection; - import LinearScale = d3.scale.Linear; - import UpdateSelection = d3.selection.Update; - - // powerbi.extensibility.utils.dataview - import DataViewObject = powerbi.extensibility.utils.dataview.DataViewObject; - import DataViewObjects = powerbi.extensibility.utils.dataview.DataViewObjects; - - // powerbi.extensibility.utils.chart - import AxisHelper = powerbi.extensibility.utils.chart.axis; - import axisScale = AxisHelper.scale; - import axisStyle = AxisHelper.style; - import IAxisProperties = AxisHelper.IAxisProperties; - import TickLabelMargins = AxisHelper.TickLabelMargins; - import ILegend = powerbi.extensibility.utils.chart.legend.ILegend; - import LegendData = powerbi.extensibility.utils.chart.legend.data; - import ILegendData = powerbi.extensibility.utils.chart.legend.LegendData; - import legendPosition = powerbi.extensibility.utils.chart.legend.position; - import legendProps = powerbi.extensibility.utils.chart.legend.legendProps; - import dataLabelUtils = powerbi.extensibility.utils.chart.dataLabel.utils; - import createLegend = powerbi.extensibility.utils.chart.legend.createLegend; - import ILabelLayout = powerbi.extensibility.utils.chart.dataLabel.ILabelLayout; - import LegendPosition = powerbi.extensibility.utils.chart.legend.LegendPosition; - import DataLabelObject = powerbi.extensibility.utils.chart.dataLabel.DataLabelObject; - import VisualDataLabelsSettings = powerbi.extensibility.utils.chart.dataLabel.VisualDataLabelsSettings; - import drawDefaultLabelsForDataPointChart = powerbi.extensibility.utils.chart.dataLabel.utils.drawDefaultLabelsForDataPointChart; - - // powerbi.extensibility.utils.svg - import SVGUtil = powerbi.extensibility.utils.svg; - import IMargin = SVGUtil.IMargin; - import ClassAndSelector = SVGUtil.CssConstants.ClassAndSelector; - import createClassAndSelector = SVGUtil.CssConstants.createClassAndSelector; - - // powerbi.extensibility.utils.interactivity - import appendClearCatcher = powerbi.extensibility.utils.interactivity.appendClearCatcher; - import SelectableDataPoint = powerbi.extensibility.utils.interactivity.SelectableDataPoint; - import IInteractiveBehavior = powerbi.extensibility.utils.interactivity.IInteractiveBehavior; - import IInteractivityService = powerbi.extensibility.utils.interactivity.IInteractivityService; - import createInteractivityService = powerbi.extensibility.utils.interactivity.createInteractivityService; - - // powerbi.extensibility.utils.formatting - import TextProperties = powerbi.extensibility.utils.formatting.TextProperties; - import textMeasurementService = powerbi.extensibility.utils.formatting.textMeasurementService; - import valueFormatter = powerbi.extensibility.utils.formatting.valueFormatter; - - // powerbi.extensibility.utils.type - import Double = powerbi.extensibility.utils.type.Double; - import Prototype = powerbi.extensibility.utils.type.Prototype; - import ValueType = powerbi.extensibility.utils.type.ValueType; - import PixelConverter = powerbi.extensibility.utils.type.PixelConverter; - - // behavior - import VisualBehavior = behavior.VisualBehavior; - import CustomVisualBehavior = behavior.CustomVisualBehavior; - import CustomVisualBehaviorOptions = behavior.CustomVisualBehaviorOptions; - - // columnChart - import IColumnChart = columnChart.IColumnChart; - import BaseColumnChart = columnChart.BaseColumnChart; - import createBaseColumnChartLayer = columnChart.createBaseColumnChartLayer; - - // dataViewUtils - import isScalar = dataViewUtils.isScalar; - import getValueAxisProperties = dataViewUtils.getValueAxisProperties; - import getCategoryAxisProperties = dataViewUtils.getCategoryAxisProperties; - - export interface MekkoChartProperty { - [propertyName: string]: DataViewObjectPropertyIdentifier; - } +import "./../style/visual.less"; + +import powerbi from "powerbi-visuals-api"; + +import IViewport = powerbi.IViewport; +import IVisualHost = powerbi.extensibility.visual.IVisualHost; +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; +import DataViewMetadata = powerbi.DataViewMetadata; +import PrimitiveValue = powerbi.PrimitiveValue; +import VisualObjectInstance = powerbi.VisualObjectInstance; +import EnumerateVisualObjectInstancesOptions = powerbi.EnumerateVisualObjectInstancesOptions; +import DataViewObjectPropertyIdentifier = powerbi.DataViewObjectPropertyIdentifier; +import DataView = powerbi.DataView; +import ValueTypeDescriptor = powerbi.ValueTypeDescriptor; +import Fill = powerbi.Fill; +import VisualConstructorOptions = powerbi.extensibility.visual.VisualConstructorOptions; +import VisualUpdateOptions = powerbi.extensibility.visual.VisualUpdateOptions; +import DataViewPropertyValue = powerbi.DataViewPropertyValue; +import SortDirection = powerbi.SortDirection; +import IVisual = powerbi.extensibility.visual.IVisual; +import VisualObjectInstanceEnumeration = powerbi.VisualObjectInstanceEnumeration; + +import { + MekkoColumnChartData, + MekkoChartVisualInitOptions, + MekkoChartCategoryLayout, + MekkoBorderSettings, + MekkoSeriesSortSettings, + MekkoLegendSortSettings, + MekkoXAxisLabelsSettings, + MekkoCategoryColorSettings, + MekkoDataPointSettings, + MekkoLegendDataPoint, + MekkoVisualRenderResult, + MekkoChartLabelSettings, + MekkoChartConstructorBaseOptions, + MekkoChartAxisProperties, + MekkoChartSmallViewPortProperties, + MekkoChartAxesLabels, + MekkoAxisRenderingOptions, + MekkoChartCategoryLayoutOptions, + MekkoChartData, + LabelDataPoint, + IGrouppedLegendData, + MekkoLabelSettings, + MekkoChartBaseSeries, + MekkoChartDataPoint, + ILegendGroup, + MekkoChartDataLabelObject, + Selection +} from "./dataInterfaces"; + +import { + MekkoChartType, + MekkoVisualChartType +} from "./visualChartType"; + +import * as dataViewUtils from "./dataViewUtils"; + +import * as labelUtils from "./labelUtils"; + +import * as axisType from "./axis/type"; +import * as axisPosition from "./axis/position"; +import * as axisUtils from "./axis/utils"; + +import { + dataViewObjects, + dataViewObject +} + from "powerbi-visuals-utils-dataviewutils"; + +import DataViewObject = dataViewObject.DataViewObject; +import DataViewObjects = dataViewObjects.DataViewObjects; + +import { max, sum } from "d3-array"; +import { select } from "d3-selection"; +import { brushX, BrushBehavior } from "d3-brush"; + +// powerbi.extensibility.utils.chart +import { + axis as AxisHelper, + axisInterfaces, + axisScale, + axisStyle, + dataLabelInterfaces, + dataLabelUtils, + legendInterfaces, + legendData as LegendData, + legend, + legendPosition, +} from "powerbi-visuals-utils-chartutils"; + +import IAxisProperties = axisInterfaces.IAxisProperties; +import TickLabelMargins = axisInterfaces.TickLabelMargins; +import ILegend = legendInterfaces.ILegend; +import ILegendData = legendInterfaces.LegendData; + +import legendProps = legendInterfaces.legendProps; +import createLegend = legend.createLegend; +import ILabelLayout = dataLabelInterfaces.ILabelLayout; +import LegendPosition = legendInterfaces.LegendPosition; +import VisualDataLabelsSettings = dataLabelInterfaces.VisualDataLabelsSettings; +import drawDefaultLabelsForDataPointChart = dataLabelUtils.drawDefaultLabelsForDataPointChart; + +// powerbi.extensibility.utils.svg +import { + IMargin, + manipulation, + CssConstants +} from "powerbi-visuals-utils-svgutils"; +import ClassAndSelector = CssConstants.ClassAndSelector; +import createClassAndSelector = CssConstants.createClassAndSelector; + +// powerbi.extensibility.utils.interactivity +import { + interactivityService +} from "powerbi-visuals-utils-interactivityutils"; + +import appendClearCatcher = interactivityService.appendClearCatcher; +import SelectableDataPoint = interactivityService.SelectableDataPoint; +import IInteractiveBehavior = interactivityService.IInteractiveBehavior; +import IInteractivityService = interactivityService.IInteractivityService; +import createInteractivityService = interactivityService.createInteractivityService; + +// powerbi.extensibility.utils.formatting +import { + valueFormatter as vf, + textMeasurementService as tms +} from "powerbi-visuals-utils-formattingutils"; +import TextProperties = tms.TextProperties; +import textMeasurementService = tms.textMeasurementService; +import valueFormatter = vf.valueFormatter; + +// powerbi.extensibility.utils.type + +import { + double as Double, + prototype as Prototype, + valueType, + pixelConverter as PixelConverter +} from "powerbi-visuals-utils-typeutils"; + +import ValueType = valueType.ValueType; + +// behavior +import { VisualBehavior } from "./behavior/visualBehavior"; +import { CustomVisualBehavior } from "./behavior/customVisualBehavior"; +import { CustomVisualBehaviorOptions } from "./behavior/customVisualBehaviorOptions"; + +import * as columnChart from "./columnChart/columnChartVisual"; +import * as columnChartBaseColumnChart from "./columnChart/baseColumnChart"; + +// columnChart +import IColumnChart = columnChart.IColumnChart; +import BaseColumnChart = columnChartBaseColumnChart.BaseColumnChart; +import createBaseColumnChartLayer = columnChartBaseColumnChart.createBaseColumnChartLayer; + +// dataViewUtils +import isScalar = dataViewUtils.isScalar; +import getValueAxisProperties = dataViewUtils.getValueAxisProperties; +import getCategoryAxisProperties = dataViewUtils.getCategoryAxisProperties; + +export interface MekkoChartProperty { + [propertyName: string]: DataViewObjectPropertyIdentifier; +} - export interface MekkoChartProperties { - [propertyName: string]: MekkoChartProperty; - } +export interface MekkoChartProperties { + [propertyName: string]: MekkoChartProperty; +} - export interface MekkoChartSettings { - columnBorder: MekkoBorderSettings; - labelSettings: MekkoLabelSettings; +export interface MekkoChartSettings { + columnBorder: MekkoBorderSettings; + labelSettings: MekkoLabelSettings; + + sortSeries: MekkoSeriesSortSettings; + sortLegend: MekkoLegendSortSettings; + xAxisLabels: MekkoXAxisLabelsSettings; + categoryColor: MekkoCategoryColorSettings; + dataPoint: MekkoDataPointSettings; + categoryAxis: MekkoCategoryXAxisSettings; + valueAxis: MekkoCategoryXAxisSettings; +} +export interface MekkoCategoryXAxisSettings { + labelColor: Fill; +} - sortSeries: MekkoSeriesSortSettings; - sortLegend: MekkoLegendSortSettings; - xAxisLabels: MekkoXAxisLabelsSettings; - categoryColor: MekkoCategoryColorSettings; - dataPoint: MekkoDataPointSettings; +/** + * Renders a data series as a cartesian visual. + */ +export class MekkoChart implements IVisual { + private static XAxisYPositionOffset: number = 33; + private static WidthDelimiter: number = 2; + private static XDelimiter: number = 2; + private static TransformRotate: string = "rotate(-90)"; + private static DefaultDy: string = "1em"; + + private static LabelGraphicsContextClass: ClassAndSelector = createClassAndSelector("labelGraphicsContext"); + private static BaseXAxisSelector: ClassAndSelector = createClassAndSelector("x.axis"); + private static XAxisLabelSelector: ClassAndSelector = createClassAndSelector("xAxisLabel"); + private static YAxisLabelSelector: ClassAndSelector = createClassAndSelector("yAxisLabel"); + private static LegendSelector: ClassAndSelector = createClassAndSelector("legend"); + private static XBrushSelector: ClassAndSelector = createClassAndSelector("x brush"); + private static BrushSelector: ClassAndSelector = createClassAndSelector("brush"); + private static LabelMiddleSelector: ClassAndSelector = createClassAndSelector("labelMiddle"); + private static ZeroLineSelector: ClassAndSelector = createClassAndSelector("zero-line"); + private static SvgScrollableSelector: ClassAndSelector = createClassAndSelector("svgScrollable"); + private static XAxisSelector: ClassAndSelector = createClassAndSelector("x axis"); + private static YAxisSelector: ClassAndSelector = createClassAndSelector("y axis"); + private static ShowLinesOnAxisSelector: ClassAndSelector = createClassAndSelector("showLinesOnAxis"); + private static HideLinesOnAxisSelector: ClassAndSelector = createClassAndSelector("hideLinesOnAxis"); + private static RootSvgSelector: ClassAndSelector = createClassAndSelector("root-svg-element"); + + private static DefaultLabelDx: string = "0em"; + private static DefaultLabelDy: string = "1em"; + private static DefaultLabelRotate: string = "rotate(0)"; + + private static DefaultLabelFontSizeInPt: number = 9; + + private static XFontSizeDelimiter: number = 1.5; + private static XFontSizeOffset: number = 12; + + private static TickLabelMarginsXMaxFactor: number = 1.8; + + private static MarginTopFactor: number = 2; + + private static OuterPaddingRatioFactor: number = 2; + private static OuterPaddingRatioDelimiter: number = 2; + private static OuterPaddingRatioOffset: number = 3; + + private static ClassName: string = "mekkoChart"; + private static AxisGraphicsContextClassName: string = "axisGraphicsContext"; + private static MaxMarginFactor: number = 0.25; + private static MinBottomMargin: number = 50; + private static LeftPadding: number = 17; + private static RightPadding: number = 10; + private static BottomPadding: number = 22; + private static YAxisLabelPadding: number = 20; + private static XAxisLabelPadding: number = 20; + private static TickPaddingY: number = 10; + private static TickPaddingRotatedX: number = 5; + private static FontSize: number = 11; + + private static MinWidth: number = 100; + private static MinHeight: number = 80; + + private static ScrollBarWidth: number = 10; + + private static AnimationDuration: number = 0; + + private static ShowAxisTitlePropertyName: string = "showAxisTitle"; + private static SecondShowAxisTitlePropertyName: string = "secShowAxisTitle"; + + private static SortDirectionDescending: string = "des"; + private static SortDirectionAscending: string = "asc"; + + private static CategoryTextRotataionDegree: number = 45.0; + + private static LegendBarHeightMargin: number = 5; + + private static LegendBarTextFont: string = "helvetica, arial, sans-serif;"; + + private static getTextProperties(fontSize: number = MekkoChart.FontSize): TextProperties { + return { + fontFamily: "helvetica, arial, sans-serif", + fontSize: PixelConverter.toString(fontSize), + }; } - /** - * Renders a data series as a cartesian visual. - */ - export class MekkoChart implements IVisual { - private static XAxisYPositionOffset: number = 33; - private static WidthDelimiter: number = 2; - private static XDelimiter: number = 2; - private static TransformRotate: string = "rotate(-90)"; - private static DefaultDy: string = "1em"; - - private static LabelGraphicsContextClass: ClassAndSelector = createClassAndSelector("labelGraphicsContext"); - private static BaseXAxisSelector: ClassAndSelector = createClassAndSelector("x.axis"); - private static XAxisLabelSelector: ClassAndSelector = createClassAndSelector("xAxisLabel"); - private static YAxisLabelSelector: ClassAndSelector = createClassAndSelector("yAxisLabel"); - private static LegendSelector: ClassAndSelector = createClassAndSelector("legend"); - private static XBrushSelector: ClassAndSelector = createClassAndSelector("x brush"); - private static BrushSelector: ClassAndSelector = createClassAndSelector("brush"); - private static LabelMiddleSelector: ClassAndSelector = createClassAndSelector("labelMiddle"); - private static ZeroLineSelector: ClassAndSelector = createClassAndSelector("zero-line"); - private static SvgScrollableSelector: ClassAndSelector = createClassAndSelector("svgScrollable"); - private static XAxisSelector: ClassAndSelector = createClassAndSelector("x axis"); - private static YAxisSelector: ClassAndSelector = createClassAndSelector("y axis"); - private static ShowLinesOnAxisSelector: ClassAndSelector = createClassAndSelector("showLinesOnAxis"); - private static HideLinesOnAxisSelector: ClassAndSelector = createClassAndSelector("hideLinesOnAxis"); - private static RootSvgSelector: ClassAndSelector = createClassAndSelector("root-svg-element"); - - private static DefaultLabelDx: string = "0em"; - private static DefaultLabelDy: string = "1em"; - private static DefaultLabelRotate: string = "rotate(0)"; - - private static DefaultLabelFontSizeInPt: number = 9; - - private static XFontSizeDelimiter: number = 1.5; - private static XFontSizeOffset: number = 12; - - private static TickLabelMarginsXMaxFactor: number = 1.8; - - private static MarginTopFactor: number = 2; - - private static OuterPaddingRatioFactor: number = 2; - private static OuterPaddingRatioDelimiter: number = 2; - private static OuterPaddingRatioOffset: number = 3; - - private static ClassName: string = "mekkoChart"; - private static AxisGraphicsContextClassName: string = "axisGraphicsContext"; - private static MaxMarginFactor: number = 0.25; - private static MinBottomMargin: number = 50; - private static LeftPadding: number = 17; - private static RightPadding: number = 10; - private static BottomPadding: number = 22; - private static YAxisLabelPadding: number = 20; - private static XAxisLabelPadding: number = 20; - private static TickPaddingY: number = 10; - private static TickPaddingRotatedX: number = 5; - private static FontSize: number = 11; - - private static MinWidth: number = 100; - private static MinHeight: number = 80; - - private static ScrollBarWidth: number = 10; - - private static AnimationDuration: number = 0; - - private static ShowAxisTitlePropertyName: string = "showAxisTitle"; - private static SecondShowAxisTitlePropertyName: string = "secShowAxisTitle"; - - private static SortDirectionDescending: string = "des"; - private static SortDirectionAscending: string = "asc"; - - private static CategoryTextRotataionDegree: number = 45.0; - - private static LegendBarHeightMargin: number = 5; - - private static LegendBarTextFont: string = "helvetica, arial, sans-serif;"; - - private static getTextProperties(fontSize: number = MekkoChart.FontSize): TextProperties { - return { - fontFamily: "helvetica, arial, sans-serif", - fontSize: PixelConverter.toString(fontSize), - }; + public static SeriesSelector: ClassAndSelector = createClassAndSelector("series"); + + public static Properties: MekkoChartProperties = { + dataPoint: { + defaultColor: { objectName: "dataPoint", propertyName: "defaultColor" }, + fill: { objectName: "dataPoint", propertyName: "fill" }, + showAllDataPoints: { objectName: "dataPoint", propertyName: "showAllDataPoints" }, + categoryGradient: { objectName: "dataPoint", propertyName: "categoryGradient" }, + colorGradientEndColor: { objectName: "dataPoint", propertyName: "colorGradientEndColor" }, + colorDistribution: { objectName: "dataPoint", propertyName: "colorDistribution" } + }, + columnBorder: { + show: { objectName: "columnBorder", propertyName: "show", }, + color: { objectName: "columnBorder", propertyName: "color" }, + width: { objectName: "columnBorder", propertyName: "width" } + }, + sortSeries: { + enabled: { objectName: "sortSeries", propertyName: "enabled", }, + direction: { objectName: "sortSeries", propertyName: "direction" }, + displayPercents: { objectName: "sortSeries", propertyName: "displayPercents" } + }, + sortLegend: { + enabled: { objectName: "sortLegend", propertyName: "enabled", }, + direction: { objectName: "sortLegend", propertyName: "direction" }, + groupByCategory: { objectName: "sortLegend", propertyName: "groupByCategory" }, + groupByCategoryDirection: { objectName: "sortLegend", propertyName: "groupByCategoryDirection" } + }, + xAxisLabels: { + enableRotataion: { objectName: "xAxisLabels", propertyName: "enableRotataion", }, + }, + categoryColors: { + color: { objectName: "categoryColors", propertyName: "color" }, } - - public static SeriesSelector: ClassAndSelector = createClassAndSelector("series"); - - public static Properties: MekkoChartProperties = { - dataPoint: { - defaultColor: { objectName: "dataPoint", propertyName: "defaultColor" }, - fill: { objectName: "dataPoint", propertyName: "fill" }, - showAllDataPoints: { objectName: "dataPoint", propertyName: "showAllDataPoints" }, - categoryGradient: { objectName: "dataPoint", propertyName: "categoryGradient" }, - colorGradientEndColor: { objectName: "dataPoint", propertyName: "colorGradientEndColor" }, - colorDistribution: { objectName: "dataPoint", propertyName: "colorDistribution" } - }, - columnBorder: { - show: { objectName: "columnBorder", propertyName: "show", }, - color: { objectName: "columnBorder", propertyName: "color" }, - width: { objectName: "columnBorder", propertyName: "width" } - }, - sortSeries: { - enabled: { objectName: "sortSeries", propertyName: "enabled", }, - direction: { objectName: "sortSeries", propertyName: "direction" }, - displayPercents: { objectName: "sortSeries", propertyName: "displayPercents" } - }, - sortLegend: { - enabled: { objectName: "sortLegend", propertyName: "enabled", }, - direction: { objectName: "sortLegend", propertyName: "direction" }, - groupByCategory: { objectName: "sortLegend", propertyName: "groupByCategory" }, - groupByCategoryDirection: { objectName: "sortLegend", propertyName: "groupByCategoryDirection" } - }, - xAxisLabels: { - enableRotataion: { objectName: "xAxisLabels", propertyName: "enableRotataion", }, - }, - categoryColors: { - color: { objectName: "categoryColors", propertyName: "color" }, + }; + + public static DefaultSettings: MekkoChartSettings = { + columnBorder: { + show: true, + color: "#fff", + width: 2, + maxWidth: 5, + }, + labelSettings: { + maxPrecision: 4, + minPrecision: 0, + }, + sortLegend: { + enabled: false, + groupByCategory: false, + direction: SortDirection.Ascending, + groupByCategoryDirection: SortDirection.Ascending + }, + sortSeries: { + enabled: false, + direction: SortDirection.Ascending, + displayPercents: "category" + }, + xAxisLabels: { + enableRotataion: false + }, + categoryAxis: { + labelColor: { + solid: { + color: "#000000" + } } - }; - - public static DefaultSettings: MekkoChartSettings = { - columnBorder: { - show: true, - color: "#fff", - width: 2, - maxWidth: 5, - }, - labelSettings: { - maxPrecision: 4, - minPrecision: 0, - }, - sortLegend: { - enabled: false, - groupByCategory: false, - direction: SortDirection.Ascending, - groupByCategoryDirection: SortDirection.Ascending - }, - sortSeries: { - enabled: false, - direction: SortDirection.Ascending, - displayPercents: "category" - }, - xAxisLabels: { - enableRotataion: false - }, - categoryColor: { - color: "#ffffff", - }, - dataPoint: { - categoryGradient: false, - colorDistribution: true, - colorGradientEndColor: { - solid: { - color: "#f9eaea" - } + }, + valueAxis: { + labelColor: { + solid: { + color: "#000000" } } - }; - - public static MinOrdinalRectThickness: number = 20; - public static MinScalarRectThickness: number = 2; - public static OuterPaddingRatio: number = 0.4; - public static InnerPaddingRatio: number = 0.2; - public static TickLabelPadding: number = 2; - - private rootElement: Selection; - private legendParent: Selection; - private axisGraphicsContext: Selection; - private xAxisGraphicsContext: Selection; - private y1AxisGraphicsContext: Selection; - private y2AxisGraphicsContext: Selection; - private svg: Selection; - private clearCatcher: Selection; - - private margin: IMargin = { - top: 1, - right: 1, - bottom: 1, - left: 1 - }; + }, + categoryColor: { + color: "#ffffff", + }, + dataPoint: { + categoryGradient: false, + colorDistribution: true, + colorGradientEndColor: { + solid: { + color: "#f9eaea" + } + } + } + }; + + public static MinOrdinalRectThickness: number = 20; + public static MinScalarRectThickness: number = 2; + public static OuterPaddingRatio: number = 0.4; + public static InnerPaddingRatio: number = 0.2; + public static TickLabelPadding: number = 2; + + private rootElement: Selection; + private legendParent: Selection; + private axisGraphicsContext: Selection; + private xAxisGraphicsContext: Selection; + private y1AxisGraphicsContext: Selection; + private y2AxisGraphicsContext: Selection; + private svg: Selection; + private clearCatcher: Selection; + + private margin: IMargin = { + top: 1, + right: 1, + bottom: 1, + left: 1 + }; + + private type: MekkoChartType; + private visualHost: IVisualHost; + private layers: IColumnChart[] = []; + private legend: ILegend; + private categoryLegends: ILegend[]; + private legendMargins: IViewport; + private layerLegendData: ILegendData; + private hasSetData: boolean; + private visualInitOptions: VisualConstructorOptions; + + private borderObjectProperties: powerbi.DataViewObject; + private legendObjectProperties: powerbi.DataViewObject; + private categoryAxisProperties: powerbi.DataViewObject; + + private valueAxisProperties: powerbi.DataViewObject; + private cartesianSmallViewPortProperties: MekkoChartSmallViewPortProperties; + private interactivityService: IInteractivityService; + private behavior: IInteractiveBehavior; + private y2AxisExists: boolean; + private categoryAxisHasUnitType: boolean; + private valueAxisHasUnitType: boolean; + private hasCategoryAxis: boolean; + private yAxisIsCategorical: boolean; + private secValueAxisHasUnitType: boolean; + private axes: MekkoChartAxisProperties; + private yAxisOrientation: string; + private bottomMarginLimit: number; + private leftRightMarginLimit: number; + + private isScrollable: boolean = false; + private scrollY: boolean; + private scrollX: boolean; + private isXScrollBarVisible: boolean; + private isYScrollBarVisible: boolean; + private svgScrollable: Selection; + private axisGraphicsContextScrollable: Selection; + private labelGraphicsContextScrollable: Selection; + private brushGraphicsContext: Selection; + + private dataViews: DataView[]; + private currentViewport: IViewport; + + private brush: BrushBehavior; + + constructor(options: VisualConstructorOptions) { + this.init(options); + } - private type: MekkoChartType; - private visualHost: IVisualHost; - private layers: IColumnChart[] = []; - private legend: ILegend; - private categoryLegends: ILegend[]; - private legendMargins: IViewport; - private layerLegendData: ILegendData; - private hasSetData: boolean; - private visualInitOptions: VisualConstructorOptions; - - private borderObjectProperties: DataViewObject; - private legendObjectProperties: DataViewObject; - private categoryAxisProperties: DataViewObject; - - private valueAxisProperties: DataViewObject; - private cartesianSmallViewPortProperties: MekkoChartSmallViewPortProperties; - private interactivityService: IInteractivityService; - private behavior: IInteractiveBehavior; - private y2AxisExists: boolean; - private categoryAxisHasUnitType: boolean; - private valueAxisHasUnitType: boolean; - private hasCategoryAxis: boolean; - private yAxisIsCategorical: boolean; - private secValueAxisHasUnitType: boolean; - private axes: MekkoChartAxisProperties; - private yAxisOrientation: string; - private bottomMarginLimit: number; - private leftRightMarginLimit: number; - - private isScrollable: boolean = false; - private scrollY: boolean; - private scrollX: boolean; - private isXScrollBarVisible: boolean; - private isYScrollBarVisible: boolean; - private svgScrollable: Selection; - private axisGraphicsContextScrollable: Selection; - private labelGraphicsContextScrollable: Selection; - private brushGraphicsContext: Selection; - private brush: Brush; - - private dataViews: DataView[]; - private currentViewport: IViewport; - - constructor(options: VisualConstructorOptions) { - this.init(options); - } - - public init(options: VisualConstructorOptions) { - this.visualInitOptions = options; - this.visualHost = options.host; - - d3.select("body").style({ - "-webkit-tap-highlight-color": "transparent" - }); + public init(options: VisualConstructorOptions) { + this.visualInitOptions = options; + this.visualHost = options.host; - this.rootElement = d3.select(options.element) - .append("div") - .classed(MekkoChart.ClassName, true); + select("body").style( + "-webkit-tap-highlight-color", "transparent" + ); - this.behavior = new CustomVisualBehavior([new VisualBehavior()]); + this.rootElement = select(options.element) + .append("div") + .classed(MekkoChart.ClassName, true); - this.brush = d3.svg.brush(); - this.yAxisOrientation = axis.position.left; + this.behavior = new CustomVisualBehavior([new VisualBehavior()]); - this.svg = this.rootElement - .append("svg") - .classed(MekkoChart.RootSvgSelector.className, true); + this.brush = brushX(); + this.yAxisOrientation = axisPosition.left; - this.axisGraphicsContext = this.svg - .append("g") - .classed(MekkoChart.AxisGraphicsContextClassName, true); + this.svg = this.rootElement + .append("svg") + .classed(MekkoChart.RootSvgSelector.className, true); - this.svgScrollable = this.svg - .append("svg") - .classed(MekkoChart.SvgScrollableSelector.className, true); + this.axisGraphicsContext = this.svg + .append("g") + .classed(MekkoChart.AxisGraphicsContextClassName, true); - this.axisGraphicsContextScrollable = this.svgScrollable - .append("g") - .classed(MekkoChart.AxisGraphicsContextClassName, true); + this.svgScrollable = this.svg + .append("svg") + .classed(MekkoChart.SvgScrollableSelector.className, true); - this.labelGraphicsContextScrollable = this.svgScrollable - .append("g") - .classed(MekkoChart.LabelGraphicsContextClass.className, true); + this.axisGraphicsContextScrollable = this.svgScrollable + .append("g") + .classed(MekkoChart.AxisGraphicsContextClassName, true); - this.clearCatcher = appendClearCatcher(this.axisGraphicsContextScrollable); + this.labelGraphicsContextScrollable = this.svgScrollable + .append("g") + .classed(MekkoChart.LabelGraphicsContextClass.className, true); - this.xAxisGraphicsContext = this.axisGraphicsContext - .append("g") - .classed(MekkoChart.XAxisSelector.className, true); + this.clearCatcher = appendClearCatcher(this.axisGraphicsContextScrollable); - this.y1AxisGraphicsContext = this.axisGraphicsContextScrollable - .append("g") - .classed(MekkoChart.YAxisSelector.className, true); + this.xAxisGraphicsContext = this.axisGraphicsContext + .append("g") + .classed(MekkoChart.XAxisSelector.className, true); - this.y2AxisGraphicsContext = this.axisGraphicsContextScrollable - .append("g") - .classed(MekkoChart.YAxisSelector.className, true); + this.y1AxisGraphicsContext = this.axisGraphicsContextScrollable + .append("g") + .classed(MekkoChart.YAxisSelector.className, true); - this.xAxisGraphicsContext - .classed(MekkoChart.ShowLinesOnAxisSelector.className, true) - .classed(MekkoChart.HideLinesOnAxisSelector.className, false); + this.y2AxisGraphicsContext = this.axisGraphicsContextScrollable + .append("g") + .classed(MekkoChart.YAxisSelector.className, true); - this.y1AxisGraphicsContext - .classed(MekkoChart.ShowLinesOnAxisSelector.className, true) - .classed(MekkoChart.HideLinesOnAxisSelector.className, false); + this.xAxisGraphicsContext + .classed(MekkoChart.ShowLinesOnAxisSelector.className, true) + .classed(MekkoChart.HideLinesOnAxisSelector.className, false); - this.y2AxisGraphicsContext - .classed(MekkoChart.ShowLinesOnAxisSelector.className, true) - .classed(MekkoChart.HideLinesOnAxisSelector.className, false); + this.y1AxisGraphicsContext + .classed(MekkoChart.ShowLinesOnAxisSelector.className, true) + .classed(MekkoChart.HideLinesOnAxisSelector.className, false); - this.interactivityService = createInteractivityService(this.visualHost); + this.y2AxisGraphicsContext + .classed(MekkoChart.ShowLinesOnAxisSelector.className, true) + .classed(MekkoChart.HideLinesOnAxisSelector.className, false); - let legendParent = d3.select(this.rootElement.node()).append("div").classed("legendParentDefault", true); + this.interactivityService = createInteractivityService(this.visualHost); - this.legend = createLegend( - legendParent.node(), - false, - this.interactivityService, - true); - } + let legendParent = select(this.rootElement.node()).append("div").classed("legendParentDefault", true); - private calculateXAxisAdditionalHeight(categories: PrimitiveValue[]): number { - let sortedByLength: PrimitiveValue[] = _.sortBy(categories, "length"); - let longestCategory: PrimitiveValue = sortedByLength[categories.length - 1] || ""; - let shortestCategory: PrimitiveValue = sortedByLength[0] || ""; + this.legend = createLegend( + legendParent.node(), + false, + this.interactivityService, + true); + } - if (longestCategory instanceof Date) { - let metadataColumn: DataViewMetadataColumn = this.dataViews[0].categorical.categories[0].source; - let formatString: string = valueFormatter.getFormatStringByColumn(metadataColumn); + private calculateXAxisAdditionalHeight(categories: PrimitiveValue[]): number { + let sortedByLength: PrimitiveValue[] = categories.sort((a, b) => a["length"] > b["length"] ? 1 : -1); + let longestCategory: PrimitiveValue = sortedByLength[categories.length - 1] || ""; + let shortestCategory: PrimitiveValue = sortedByLength[0] || ""; + + if (longestCategory instanceof Date) { + let metadataColumn: DataViewMetadataColumn = this.dataViews[0].categorical.categories[0].source; + let formatString: string = valueFormatter.getFormatStringByColumn(metadataColumn); + + let formatter = valueFormatter.create({ + format: formatString, + value: shortestCategory, + value2: longestCategory, + columnType: { + dateTime: true + } + }); - let formatter = valueFormatter.create({ - format: formatString, - value: shortestCategory, - value2: longestCategory, - columnType: { - dateTime: true - } - }); + longestCategory = formatter.format(longestCategory); + } - longestCategory = formatter.format(longestCategory); - } + const xAxisTextProperties: TextProperties = MekkoChart.getTextProperties(this.categoryAxisProperties + && PixelConverter.fromPointToPixel( + parseFloat(this.categoryAxisProperties["fontSize"])) || undefined); - const xAxisTextProperties: TextProperties = MekkoChart.getTextProperties(this.categoryAxisProperties - && PixelConverter.fromPointToPixel( - parseFloat(this.categoryAxisProperties["fontSize"])) || undefined); + let longestCategoryWidth = textMeasurementService.measureSvgTextWidth(xAxisTextProperties, longestCategory.toString()); + let requiredHeight = longestCategoryWidth * Math.tan(MekkoChart.CategoryTextRotataionDegree * Math.PI / 180); + return requiredHeight; + } - let longestCategoryWidth = textMeasurementService.measureSvgTextWidth(xAxisTextProperties, longestCategory.toString()); + public static getTranslation(transform): [number, number, number] { + let g = document.createElementNS("http://www.w3.org/2000/svg", "g"); - let requiredHeight = longestCategoryWidth * Math.tan(MekkoChart.CategoryTextRotataionDegree * Math.PI / 180); + g.setAttributeNS(null, "transform", transform); - return requiredHeight; - } + let matrix = g.transform.baseVal.consolidate().matrix; - private renderAxesLabels(options: MekkoAxisRenderingOptions, xFontSize: number): void { - this.axisGraphicsContext - .selectAll(MekkoChart.XAxisLabelSelector.selectorName) - .remove(); + return [matrix.e, matrix.f, -Math.asin(matrix.a) * 180 / Math.PI]; + } - this.axisGraphicsContext - .selectAll(MekkoChart.YAxisLabelSelector.selectorName) - .remove(); + private renderAxesLabels(options: MekkoAxisRenderingOptions, xFontSize: number): void { + this.axisGraphicsContext + .selectAll(MekkoChart.XAxisLabelSelector.selectorName) + .remove(); - const margin: IMargin = this.margin, - width: number = options.viewport.width - (margin.left + margin.right), - height: number = options.viewport.height, - fontSize: number = MekkoChart.FontSize; + this.axisGraphicsContext + .selectAll(MekkoChart.YAxisLabelSelector.selectorName) + .remove(); - const showOnRight: boolean = this.yAxisOrientation === axis.position.right; + const margin: IMargin = this.margin, + width: number = options.viewport.width - (margin.left + margin.right), + height: number = options.viewport.height, + fontSize: number = MekkoChart.FontSize; - if (!options.hideXAxisTitle && (this.categoryAxisProperties["show"] === undefined || this.categoryAxisProperties["show"])) { - const xAxisYPosition: number = d3.transform(this.xAxisGraphicsContext.attr("transform")).translate[1] - - fontSize + xFontSize + MekkoChart.XAxisYPositionOffset; + const showOnRight: boolean = this.yAxisOrientation === axisPosition.right; - const rotataionEnabled = (this.layers[0]).getXAxisLabelsSettings().enableRotataion; + if (!options.hideXAxisTitle && (this.categoryAxisProperties["show"] === undefined || this.categoryAxisProperties["show"])) { + const xAxisYPosition: number = MekkoChart.getTranslation(this.xAxisGraphicsContext.attr("transform"))[1] + - fontSize + xFontSize + MekkoChart.XAxisYPositionOffset; - let shiftTitle: number = 0; - if (rotataionEnabled) { - let axes: MekkoChartAxisProperties = this.axes = axis.utils.calculateAxes( - this.layers, - options.viewport, - this.margin, - this.categoryAxisProperties, - this.valueAxisProperties, - this.isXScrollBarVisible || this.isYScrollBarVisible, - null); + const rotataionEnabled = (this.layers[0]).getXAxisLabelsSettings().enableRotataion; - shiftTitle = this.calculateXAxisAdditionalHeight(axes.x.values); - } + let shiftTitle: number = 0; + if (rotataionEnabled) { + let axes: MekkoChartAxisProperties = this.axes = axisUtils.calculateAxes( + this.layers, + options.viewport, + this.margin, + this.categoryAxisProperties, + this.valueAxisProperties, + this.isXScrollBarVisible || this.isYScrollBarVisible, + null); + shiftTitle = this.calculateXAxisAdditionalHeight(axes.x.values); + } + + const xAxisLabel: Selection = this.axisGraphicsContext.append("text") + .attr( + "x", width / MekkoChart.WidthDelimiter + ) + .attr( + "y", xAxisYPosition + shiftTitle + ) + .style( + "fill", options.xLabelColor + ? options.xLabelColor.solid.color + : null + ) + .text(options.axisLabels.x) + .classed(MekkoChart.XAxisLabelSelector.className, true); + + xAxisLabel.call( + AxisHelper.LabelLayoutStrategy.clip, + width, + textMeasurementService.svgEllipsis); + } - const xAxisLabel: Selection = this.axisGraphicsContext.append("text") - .attr({ - x: width / MekkoChart.WidthDelimiter, - y: xAxisYPosition + shiftTitle - }) - .style({ - "fill": options.xLabelColor - ? options.xLabelColor.solid.color - : null - }) - .text(options.axisLabels.x) - .classed(MekkoChart.XAxisLabelSelector.className, true); - - xAxisLabel.call( - AxisHelper.LabelLayoutStrategy.clip, - width, - textMeasurementService.svgEllipsis); - } + if (!options.hideYAxisTitle) { + const yAxisLabel: Selection = this.axisGraphicsContext.append("text") + .style( + "fill", options.yLabelColor + ? options.yLabelColor.solid.color + : null + ) + .text(options.axisLabels.y) + .attr("transform", MekkoChart.TransformRotate) + .attr( + "y", showOnRight + ? width + margin.right - fontSize + : -margin.left + ) + .attr("x", -((height - margin.top - options.legendMargin) / MekkoChart.XDelimiter)) + .attr("dy", MekkoChart.DefaultDy) + .classed(MekkoChart.YAxisLabelSelector.className, true); + + yAxisLabel.call(AxisHelper.LabelLayoutStrategy.clip, + height - (margin.bottom + margin.top), + textMeasurementService.svgEllipsis); + } - if (!options.hideYAxisTitle) { - const yAxisLabel: Selection = this.axisGraphicsContext.append("text") - .style({ - "fill": options.yLabelColor - ? options.yLabelColor.solid.color - : null - }) - .text(options.axisLabels.y) - .attr({ - "transform": MekkoChart.TransformRotate, - "y": showOnRight - ? width + margin.right - fontSize - : -margin.left, - "x": -((height - margin.top - options.legendMargin) / MekkoChart.XDelimiter), - "dy": MekkoChart.DefaultDy - }) - .classed(MekkoChart.YAxisLabelSelector.className, true); - - yAxisLabel.call(AxisHelper.LabelLayoutStrategy.clip, - height - (margin.bottom + margin.top), - textMeasurementService.svgEllipsis); - } + if (!options.hideY2AxisTitle && options.axisLabels.y2) { + const y2AxisLabel: Selection = this.axisGraphicsContext.append("text") + .text(options.axisLabels.y2) + .attr("transform", MekkoChart.TransformRotate) + .attr("y", showOnRight ? -margin.left : width + margin.right - fontSize) + .attr("x", -((height - margin.top - options.legendMargin) / MekkoChart.XDelimiter)) + .attr("dy", MekkoChart.DefaultDy) + .style( + "fill", options.y2LabelColor + ? options.y2LabelColor.solid.color + : null + ) + .classed(MekkoChart.YAxisLabelSelector.className, true); - if (!options.hideY2AxisTitle && options.axisLabels.y2) { - const y2AxisLabel: Selection = this.axisGraphicsContext.append("text") - .text(options.axisLabels.y2) - .attr({ - "transform": MekkoChart.TransformRotate, - "y": showOnRight ? -margin.left : width + margin.right - fontSize, - "x": -((height - margin.top - options.legendMargin) / MekkoChart.XDelimiter), - "dy": MekkoChart.DefaultDy - }) - .style({ - "fill": options.y2LabelColor - ? options.y2LabelColor.solid.color - : null - }) - .classed(MekkoChart.YAxisLabelSelector.className, true); - - y2AxisLabel.call(AxisHelper.LabelLayoutStrategy.clip, - height - (margin.bottom + margin.top), - textMeasurementService.svgEllipsis); - } + y2AxisLabel.call(AxisHelper.LabelLayoutStrategy.clip, + height - (margin.bottom + margin.top), + textMeasurementService.svgEllipsis); } + } - private adjustMargins(viewport: IViewport): void { - const width: number = viewport.width - (this.margin.left + this.margin.right), - height: number = viewport.height - (this.margin.top + this.margin.bottom); + private adjustMargins(viewport: IViewport): void { + const width: number = viewport.width - (this.margin.left + this.margin.right), + height: number = viewport.height - (this.margin.top + this.margin.bottom); - const xAxis: Selection = this.rootElement - .selectAll(MekkoChart.BaseXAxisSelector.selectorName); + const xAxis: Selection = this.rootElement + .selectAll(MekkoChart.BaseXAxisSelector.selectorName); - if (AxisHelper.getRecommendedNumberOfTicksForXAxis(width) === 0 - && AxisHelper.getRecommendedNumberOfTicksForYAxis(height) === 0) { + if (AxisHelper.getRecommendedNumberOfTicksForXAxis(width) === 0 + && AxisHelper.getRecommendedNumberOfTicksForYAxis(height) === 0) { - this.margin = { - top: 0, - right: 0, - bottom: 0, - left: 0 - }; + this.margin = { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; - xAxis.style("display", "none"); - } else { - xAxis.style("display", null); - } + xAxis.style("display", "none"); + } else { + xAxis.style("display", null); } + } - private translateAxes(viewport: IViewport): void { - this.adjustMargins(viewport); + private translateAxes(viewport: IViewport): void { + this.adjustMargins(viewport); - const margin: IMargin = this.margin, - width: number = viewport.width - (margin.left + margin.right), - height: number = viewport.height - (margin.top + margin.bottom), - showY1OnRight: boolean = this.yAxisOrientation === axis.position.right; + const margin: IMargin = this.margin, + width: number = viewport.width - (margin.left + margin.right), + height: number = viewport.height - (margin.top + margin.bottom), + showY1OnRight: boolean = this.yAxisOrientation === axisPosition.right; - this.xAxisGraphicsContext - .attr("transform", SVGUtil.translate(0, height)); + this.xAxisGraphicsContext + .attr("transform", manipulation.translate(0, height)); - this.y1AxisGraphicsContext - .attr("transform", SVGUtil.translate(showY1OnRight ? width : 0, 0)); + this.y1AxisGraphicsContext + .attr("transform", manipulation.translate(showY1OnRight ? width : 0, 0)); - this.y2AxisGraphicsContext - .attr("transform", SVGUtil.translate(showY1OnRight ? 0 : width, 0)); + this.y2AxisGraphicsContext + .attr("transform", manipulation.translate(showY1OnRight ? 0 : width, 0)); - this.svg.attr({ - "width": viewport.width, - "height": viewport.height - }); + this.svg.attr("width", viewport.width); + this.svg.attr("height", viewport.height); - this.svg.style("top", () => { - return this.legend.isVisible() || this.categoryLegends.length > 0 && this.categoryLegends[0].isVisible() ? PixelConverter.toString(this.legendMargins.height) : 0; - }); + this.svg.style("top", () => { + return this.legend.isVisible() || this.categoryLegends.length > 0 && this.categoryLegends[0].isVisible() ? PixelConverter.toString(this.legendMargins.height) : 0; + }); - this.svgScrollable.attr({ - "width": viewport.width, - "height": viewport.height - }); + this.svgScrollable.attr("width", viewport.width); + this.svgScrollable.attr("height", viewport.height); - this.svgScrollable.attr({ - "x": 0 - }); + this.svgScrollable.attr("x", 0); - this.axisGraphicsContext.attr( - "transform", - SVGUtil.translate(margin.left, margin.top)); + this.axisGraphicsContext.attr( + "transform", + manipulation.translate(margin.left, margin.top)); + + this.axisGraphicsContextScrollable.attr( + "transform", + manipulation.translate(margin.left, margin.top)); + + this.labelGraphicsContextScrollable.attr( + "transform", + manipulation.translate(margin.left, margin.top)); + + if (this.isXScrollBarVisible) { + this.svgScrollable.attr("x", this.margin.left); this.axisGraphicsContextScrollable.attr( "transform", - SVGUtil.translate(margin.left, margin.top)); + manipulation.translate(0, margin.top)); this.labelGraphicsContextScrollable.attr( "transform", - SVGUtil.translate(margin.left, margin.top)); + manipulation.translate(0, margin.top)); - if (this.isXScrollBarVisible) { - this.svgScrollable.attr({ - "x": this.margin.left - }); + this.svgScrollable.attr("width", width); - this.axisGraphicsContextScrollable.attr( - "transform", - SVGUtil.translate(0, margin.top)); + this.svg.attr("width", viewport.width); + this.svg.attr("height", viewport.height + MekkoChart.ScrollBarWidth); + } + else if (this.isYScrollBarVisible) { + this.svgScrollable.attr("height", height + margin.top); - this.labelGraphicsContextScrollable.attr( - "transform", - SVGUtil.translate(0, margin.top)); + this.svg.attr("height", viewport.height); + this.svg.attr("width", viewport.width + MekkoChart.ScrollBarWidth); + } + } - this.svgScrollable.attr("width", width); + /** + * Returns preferred Category span if the visual is scrollable. + */ + public static getPreferredCategorySpan( + categoryCount: number, + categoryThickness: number, + noOuterPadding?: boolean): number { - this.svg.attr({ - "width": viewport.width, - "height": viewport.height + MekkoChart.ScrollBarWidth - }); - } - else if (this.isYScrollBarVisible) { - this.svgScrollable.attr("height", height + margin.top); + const span: number = (categoryThickness * categoryCount); - this.svg.attr({ - "height": viewport.height, - "width": viewport.width + MekkoChart.ScrollBarWidth - }); - } + if (noOuterPadding) { + return span; } - /** - * Returns preferred Category span if the visual is scrollable. - */ - public static getPreferredCategorySpan( - categoryCount: number, - categoryThickness: number, - noOuterPadding?: boolean): number { + return span + + categoryThickness * MekkoChart.OuterPaddingRatio * MekkoChart.OuterPaddingRatioFactor; + } - const span: number = (categoryThickness * categoryCount); + public static getIsScalar( + objects: powerbi.DataViewObjects, + propertyId: DataViewObjectPropertyIdentifier, + type: ValueType): boolean { - if (noOuterPadding) { - return span; - } + const axisTypeValue: any = DataViewObjects.getValue(objects, propertyId); - return span - + categoryThickness * MekkoChart.OuterPaddingRatio * MekkoChart.OuterPaddingRatioFactor; + if (!objects || axisTypeValue === undefined) { + return !AxisHelper.isOrdinal(type); } - public static getIsScalar( - objects: IDataViewObjects, - propertyId: DataViewObjectPropertyIdentifier, - type: ValueType): boolean { + return (axisTypeValue === axisType.scalar) && !AxisHelper.isOrdinal(type); + } - const axisTypeValue: any = DataViewObjects.getValue(objects, propertyId); + private populateObjectProperties(dataViews: DataView[]) { + if (dataViews && dataViews.length > 0) { + const dataViewMetadata: DataViewMetadata = dataViews[0].metadata; - if (!objects || axisTypeValue === undefined) { - return !AxisHelper.isOrdinal(type); - } + if (dataViewMetadata) { + this.legendObjectProperties = DataViewObjects.getObject( + dataViewMetadata.objects, + "legend", + {}); - return (axisTypeValue === axis.type.scalar) && !AxisHelper.isOrdinal(type); - } + this.borderObjectProperties = DataViewObjects.getObject( + dataViewMetadata.objects, + "columnBorder", + {}); + } + else { + this.legendObjectProperties = {}; + this.borderObjectProperties = {}; + } - private populateObjectProperties(dataViews: DataView[]) { - if (dataViews && dataViews.length > 0) { - const dataViewMetadata: DataViewMetadata = dataViews[0].metadata; + this.categoryAxisProperties = getCategoryAxisProperties(dataViewMetadata); + this.valueAxisProperties = getValueAxisProperties(dataViewMetadata); - if (dataViewMetadata) { - this.legendObjectProperties = DataViewObjects.getObject( - dataViewMetadata.objects, - "legend", - {}); + if (dataViewMetadata && + dataViewMetadata.objects) { + const categoryAxis: powerbi.DataViewObject = dataViewMetadata.objects["categoryAxis"], + valueAxis: powerbi.DataViewObject = dataViewMetadata.objects["valueAxis"]; - this.borderObjectProperties = DataViewObjects.getObject( - dataViewMetadata.objects, - "columnBorder", - {}); - } - else { - this.legendObjectProperties = {}; - this.borderObjectProperties = {}; + if (categoryAxis) { + this.categoryAxisProperties["showBorder"] = categoryAxis["showBorder"]; + this.categoryAxisProperties["fontSize"] = categoryAxis["fontSize"]; } - this.categoryAxisProperties = getCategoryAxisProperties(dataViewMetadata); - this.valueAxisProperties = getValueAxisProperties(dataViewMetadata); - - if (dataViewMetadata && - dataViewMetadata.objects) { - const categoryAxis: DataViewObject = dataViewMetadata.objects["categoryAxis"], - valueAxis: DataViewObject = dataViewMetadata.objects["valueAxis"]; - - if (categoryAxis) { - this.categoryAxisProperties["showBorder"] = categoryAxis["showBorder"]; - this.categoryAxisProperties["fontSize"] = categoryAxis["fontSize"]; - } - - if (valueAxis) { - this.valueAxisProperties["fontSize"] = valueAxis["fontSize"]; - } + if (valueAxis) { + this.valueAxisProperties["fontSize"] = valueAxis["fontSize"]; } + } - const axisPosition: DataViewPropertyValue = this.valueAxisProperties["position"]; + const axisPos: DataViewPropertyValue = this.valueAxisProperties["position"]; - this.yAxisOrientation = axisPosition - ? axisPosition.toString() - : axis.position.left; - } + this.yAxisOrientation = axisPos + ? axisPos.toString() + : axisPosition["left"]; } + } - public checkDataset(): boolean { - if (!this.dataViews || - !this.dataViews[0] || - !this.dataViews[0].categorical || - !this.dataViews[0].categorical.categories || - !this.dataViews[0].categorical.categories[0] || - !this.dataViews[0].categorical.categories[0].values[0] - ) { - return false; - } - - return true; + public checkDataset(): boolean { + if (!this.dataViews || + !this.dataViews[0] || + !this.dataViews[0].categorical || + !this.dataViews[0].categorical.categories || + !this.dataViews[0].categorical.categories[0] || + !this.dataViews[0].categorical.categories[0].values[0] + ) { + return false; } - public update(options: VisualUpdateOptions) { - this.dataViews = options.dataViews; - this.currentViewport = options.viewport; - if (!this.checkDataset()) { - this.clearViewport(); - return; - } + return true; + } - if (this.layers.length === 0) { - this.layers = this.createAndInitLayers(this.dataViews); - } + public update(options: VisualUpdateOptions) { + this.dataViews = options.dataViews; + this.currentViewport = options.viewport; + if (!this.checkDataset()) { + this.clearViewport(); + return; + } - if (this.dataViews && this.dataViews.length > 0) { - this.populateObjectProperties(this.dataViews); - } + if (this.layers.length === 0) { + this.layers = this.createAndInitLayers(this.dataViews); + } - for (let layerIndex: number = 0, length: number = this.layers.length; layerIndex < length; layerIndex++) { - this.layers[layerIndex].setData(dataViewUtils.getLayerData(this.dataViews, layerIndex, length)); - } + if (this.dataViews && this.dataViews.length > 0) { + this.populateObjectProperties(this.dataViews); + } - const rotataionEnabled = (this.layers[0]).getXAxisLabelsSettings().enableRotataion; - let additionHeight: number = 0; + for (let layerIndex: number = 0, length: number = this.layers.length; layerIndex < length; layerIndex++) { + this.layers[layerIndex].setData(dataViewUtils.getLayerData(this.dataViews, layerIndex, length)); + } - if (rotataionEnabled) { - let axes: MekkoChartAxisProperties = this.axes = axis.utils.calculateAxes( - this.layers, - this.currentViewport, - this.margin, - this.categoryAxisProperties, - this.valueAxisProperties, - this.isXScrollBarVisible || this.isYScrollBarVisible, - null); + const rotataionEnabled = (this.layers[0]).getXAxisLabelsSettings().enableRotataion; + let additionHeight: number = 0; + if (rotataionEnabled) { + let axes: MekkoChartAxisProperties = this.axes = axisUtils.calculateAxes( + this.layers, + this.currentViewport, + this.margin, + this.categoryAxisProperties, + this.valueAxisProperties, + this.isXScrollBarVisible || this.isYScrollBarVisible, + null); + additionHeight += this.calculateXAxisAdditionalHeight(axes.x.values); + } - additionHeight += this.calculateXAxisAdditionalHeight(axes.x.values); - } + if ((this.currentViewport.width < MekkoChart.MinWidth) + || (this.currentViewport.height < MekkoChart.MinHeight + additionHeight)) { + this.clearViewport(); + return; + } - if ((this.currentViewport.width < MekkoChart.MinWidth) - || (this.currentViewport.height < MekkoChart.MinHeight + additionHeight)) { + this.renderLegend(); - this.clearViewport(); + this.render(); - return; - } + this.hasSetData = this.hasSetData + || (this.dataViews && this.dataViews.length > 0); + } - this.renderLegend(); - this.render(); + /** + * Clear the viewport area + */ + private clearViewport(): void { + this.legend.reset(); + this.setVisibility(false); + } - this.hasSetData = this.hasSetData - || (this.dataViews && this.dataViews.length > 0); - } + private setVisibility(isVisible: boolean = true): void { + this.svg.style("display", isVisible ? "block" : "none"); - /** - * Clear the viewport area - */ - private clearViewport(): void { - this.legend.reset(); - this.setVisibility(false); - } + this.rootElement + .selectAll(MekkoChart.LegendSelector.selectorName) + .style("display", isVisible ? null : "none"); + } - private setVisibility(isVisible: boolean = true): void { - this.svg.style("display", isVisible ? "block" : "none"); + public static getLayout(data: MekkoChartData, options: MekkoChartCategoryLayoutOptions): MekkoChartCategoryLayout { + const categoryCount: number = options.categoryCount, + availableWidth: number = options.availableWidth, + domain: number[] = options.domain, + trimOrdinalDataOnOverflow: boolean = options.trimOrdinalDataOnOverflow, + isScalar: boolean = !!options.isScalar, + isScrollable: boolean = !!options.isScrollable; - this.rootElement - .selectAll(MekkoChart.LegendSelector.selectorName) - .style("display", isVisible ? null : "none"); - } + const categoryThickness: number = MekkoChart.getCategoryThickness( + data + ? data.series + : null, + categoryCount, + availableWidth, + domain, + isScalar, + trimOrdinalDataOnOverflow); - public static getLayout(data: MekkoChartData, options: MekkoChartCategoryLayoutOptions): MekkoChartCategoryLayout { - const categoryCount: number = options.categoryCount, - availableWidth: number = options.availableWidth, - domain: number[] = options.domain, - trimOrdinalDataOnOverflow: boolean = options.trimOrdinalDataOnOverflow, - isScalar: boolean = !!options.isScalar, - isScrollable: boolean = !!options.isScrollable; + const totalOuterPadding: number = categoryThickness + * MekkoChart.OuterPaddingRatio + * MekkoChart.OuterPaddingRatioFactor; - const categoryThickness: number = MekkoChart.getCategoryThickness( - data - ? data.series - : null, - categoryCount, - availableWidth, - domain, - isScalar, - trimOrdinalDataOnOverflow); + const calculatedBarCount: number + = Double.floorWithPrecision((availableWidth - totalOuterPadding) / categoryThickness); - const totalOuterPadding: number = categoryThickness - * MekkoChart.OuterPaddingRatio - * MekkoChart.OuterPaddingRatioFactor; + let visibleCategoryCount: number = Math.min(calculatedBarCount, categoryCount); - const calculatedBarCount: number - = Double.floorWithPrecision((availableWidth - totalOuterPadding) / categoryThickness); + const willScroll: boolean = visibleCategoryCount < categoryCount && isScrollable; - let visibleCategoryCount: number = Math.min(calculatedBarCount, categoryCount); + let outerPaddingRatio: number = MekkoChart.OuterPaddingRatio; - const willScroll: boolean = visibleCategoryCount < categoryCount && isScrollable; + if (!isScalar && !willScroll) { + const oneOuterPadding: number = (availableWidth - (categoryThickness * visibleCategoryCount)) + / MekkoChart.OuterPaddingRatioDelimiter; - let outerPaddingRatio: number = MekkoChart.OuterPaddingRatio; + outerPaddingRatio = oneOuterPadding / categoryThickness; + } - if (!isScalar && !willScroll) { - const oneOuterPadding: number = (availableWidth - (categoryThickness * visibleCategoryCount)) - / MekkoChart.OuterPaddingRatioDelimiter; + if (!isScalar && isScrollable) { + visibleCategoryCount = categoryCount; + } - outerPaddingRatio = oneOuterPadding / categoryThickness; - } + return { + categoryThickness, + outerPaddingRatio, + isScalar, + categoryCount: visibleCategoryCount + }; + } - if (!isScalar && isScrollable) { - visibleCategoryCount = categoryCount; + /** + * Returns the thickness for each category. + * For clustered charts, you still need to divide by + * the number of series to get column width after calling this method. + * For linear or time scales, category thickness accomodates for + * the minimum interval between consequtive points. + * For all types, return value has accounted for outer padding, + * but not inner padding. + */ + public static getCategoryThickness( + seriesList: MekkoChartBaseSeries[], + numCategories: number, + plotLength: number, + domain: number[], + isScalar: boolean, + trimOrdinalDataOnOverflow: boolean): number { + + let thickness: number; + + if (numCategories < 2) { + thickness = plotLength * (1 - MekkoChart.OuterPaddingRatio); + } else if (isScalar && domain && domain.length > 1) { + const minInterval: number = MekkoChart.getMinInterval(seriesList), + domainSpan: number = domain[domain.length - 1] - domain[0], + ratio: number = minInterval + / (domainSpan + + (minInterval + * MekkoChart.OuterPaddingRatio + * MekkoChart.OuterPaddingRatioFactor)); + + thickness = plotLength * ratio; + thickness = Math.max(thickness, MekkoChart.MinScalarRectThickness); + } else { + thickness = plotLength + / (numCategories + + (MekkoChart.OuterPaddingRatio * MekkoChart.OuterPaddingRatioFactor)); + + if (trimOrdinalDataOnOverflow) { + thickness = Math.max(thickness, MekkoChart.MinOrdinalRectThickness); } - - return { - categoryThickness, - outerPaddingRatio, - isScalar, - categoryCount: visibleCategoryCount - }; } - /** - * Returns the thickness for each category. - * For clustered charts, you still need to divide by - * the number of series to get column width after calling this method. - * For linear or time scales, category thickness accomodates for - * the minimum interval between consequtive points. - * For all types, return value has accounted for outer padding, - * but not inner padding. - */ - public static getCategoryThickness( - seriesList: MekkoChartBaseSeries[], - numCategories: number, - plotLength: number, - domain: number[], - isScalar: boolean, - trimOrdinalDataOnOverflow: boolean): number { - - let thickness: number; - - if (numCategories < 2) { - thickness = plotLength * (1 - MekkoChart.OuterPaddingRatio); - } else if (isScalar && domain && domain.length > 1) { - const minInterval: number = MekkoChart.getMinInterval(seriesList), - domainSpan: number = domain[domain.length - 1] - domain[0], - ratio: number = minInterval - / (domainSpan - + (minInterval - * MekkoChart.OuterPaddingRatio - * MekkoChart.OuterPaddingRatioFactor)); - - thickness = plotLength * ratio; - thickness = Math.max(thickness, MekkoChart.MinScalarRectThickness); - } else { - thickness = plotLength - / (numCategories - + (MekkoChart.OuterPaddingRatio * MekkoChart.OuterPaddingRatioFactor)); + const maxRectThickness: number = plotLength + / (MekkoChart.OuterPaddingRatioOffset + + (MekkoChart.OuterPaddingRatio + * MekkoChart.OuterPaddingRatioFactor)); - if (trimOrdinalDataOnOverflow) { - thickness = Math.max(thickness, MekkoChart.MinOrdinalRectThickness); - } - } + thickness = Math.min(thickness, maxRectThickness); - const maxRectThickness: number = plotLength - / (MekkoChart.OuterPaddingRatioOffset - + (MekkoChart.OuterPaddingRatio - * MekkoChart.OuterPaddingRatioFactor)); + if (!isScalar && numCategories >= 3 && trimOrdinalDataOnOverflow) { + return Math.max(thickness, MekkoChart.MinOrdinalRectThickness); + } + + return thickness; + } - thickness = Math.min(thickness, maxRectThickness); + private static getMinInterval(seriesList: MekkoChartBaseSeries[]): number { + let minInterval: number = Number.MAX_VALUE; - if (!isScalar && numCategories >= 3 && trimOrdinalDataOnOverflow) { - return Math.max(thickness, MekkoChart.MinOrdinalRectThickness); - } + if (seriesList.length > 0) { + const series0data: MekkoChartDataPoint[] = seriesList[0].data + .filter((dataPoint: MekkoChartDataPoint) => { + return !dataPoint.highlight; + }); - return thickness; + for (let i: number = 0; i < series0data.length - 1; i++) { + minInterval = Math.min( + minInterval, + Math.abs(series0data[i + 1].categoryValue - series0data[i].categoryValue)); + } } - private static getMinInterval(seriesList: MekkoChartBaseSeries[]): number { - let minInterval: number = Number.MAX_VALUE; + return minInterval; + } - if (seriesList.length > 0) { - const series0data: MekkoChartDataPoint[] = seriesList[0].data - .filter((dataPoint: MekkoChartDataPoint) => { - return !dataPoint.highlight; - }); + public static parseLabelSettings(objects: powerbi.DataViewObjects): VisualDataLabelsSettings { + const labelSettings: VisualDataLabelsSettings = dataLabelUtils.getDefaultColumnLabelSettings(true), + labelsObj: MekkoChartDataLabelObject = objects["labels"] as any, + minPrecision: number = MekkoChart.DefaultSettings.labelSettings.minPrecision, + maxPrecision: number = MekkoChart.DefaultSettings.labelSettings.maxPrecision; - for (let i: number = 0; i < series0data.length - 1; i++) { - minInterval = Math.min( - minInterval, - Math.abs(series0data[i + 1].categoryValue - series0data[i].categoryValue)); - } - } + (labelSettings).forceDisplay = false; + dataLabelUtils.updateLabelSettingsFromLabelsObject(labelsObj, labelSettings); + (labelSettings).forceDisplay = (labelsObj || { forceDisplay: false }).forceDisplay; - return minInterval; + if (labelSettings.precision < minPrecision) { + labelSettings.precision = minPrecision; } - public static parseLabelSettings(objects: IDataViewObjects): VisualDataLabelsSettings { - const labelSettings: VisualDataLabelsSettings = dataLabelUtils.getDefaultColumnLabelSettings(true), - labelsObj: MekkoChartDataLabelObject = objects["labels"] as MekkoChartDataLabelObject, - minPrecision: number = MekkoChart.DefaultSettings.labelSettings.minPrecision, - maxPrecision: number = MekkoChart.DefaultSettings.labelSettings.maxPrecision; + if (labelSettings.precision > maxPrecision) { + labelSettings.precision = maxPrecision; + } - (labelSettings).forceDisplay = false; - dataLabelUtils.updateLabelSettingsFromLabelsObject(labelsObj, labelSettings); - (labelSettings).forceDisplay = (labelsObj || { forceDisplay: false }).forceDisplay; + return labelSettings; + } - if (labelSettings.precision < minPrecision) { - labelSettings.precision = minPrecision; - } + public static parseXAxisLabelsSettings(objects: powerbi.DataViewObjects): MekkoXAxisLabelsSettings { + const enableRotataion: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["xAxisLabels"]["enableRotataion"], + MekkoChart.DefaultSettings.xAxisLabels.enableRotataion); - if (labelSettings.precision > maxPrecision) { - labelSettings.precision = maxPrecision; - } + return { + enableRotataion + }; + } - return labelSettings; - } + public static parseDataPointSettings(objects: powerbi.DataViewObjects): MekkoDataPointSettings { + const categoryGradient: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["dataPoint"]["categoryGradient"], + MekkoChart.DefaultSettings.dataPoint.categoryGradient); + + const colorGradientEndColor: string = DataViewObjects.getValue( + objects, + MekkoChart.Properties["dataPoint"]["colorGradientEndColor"], + MekkoChart.DefaultSettings.dataPoint.colorGradientEndColor); + + const colorDistribution: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["dataPoint"]["colorDistribution"], + MekkoChart.DefaultSettings.dataPoint.colorDistribution); + + return { + categoryGradient, + colorGradientEndColor, + colorDistribution + }; + } + public static parseSeriesSortSettings(objects: powerbi.DataViewObjects): MekkoSeriesSortSettings { + const enabled: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["sortSeries"]["enabled"], + MekkoChart.DefaultSettings.sortSeries.enabled); + + const direction: string = DataViewObjects.getValue( + objects, + MekkoChart.Properties["sortSeries"]["direction"], + MekkoChart.DefaultSettings.sortSeries.direction); + + const displayPercents: string = DataViewObjects.getValue( + objects, + MekkoChart.Properties["sortSeries"]["displayPercents"], + MekkoChart.DefaultSettings.sortSeries.displayPercents); + + return { + enabled, + direction, + displayPercents + }; + } - public static parseXAxisLabelsSettings(objects: IDataViewObjects): MekkoXAxisLabelsSettings { - const enableRotataion: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["xAxisLabels"]["enableRotataion"], - MekkoChart.DefaultSettings.xAxisLabels.enableRotataion); + public static parseLegendSortSettings(objects: powerbi.DataViewObjects): MekkoLegendSortSettings { + const enabled: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["sortLegend"]["enabled"], + MekkoChart.DefaultSettings.sortLegend.enabled); + + const direction: string = DataViewObjects.getValue( + objects, + MekkoChart.Properties["sortLegend"]["direction"], + MekkoChart.DefaultSettings.sortLegend.direction); + + const groupByCategory: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["sortLegend"]["groupByCategory"], + MekkoChart.DefaultSettings.sortLegend.groupByCategory); + + const groupByCategoryDirection: string = DataViewObjects.getValue( + objects, + MekkoChart.Properties["sortLegend"]["groupByCategoryDirection"], + MekkoChart.DefaultSettings.sortLegend.groupByCategoryDirection); + + return { + enabled, + direction, + groupByCategory, + groupByCategoryDirection + }; + } - return { - enableRotataion - }; - } + public static parseBorderSettings(objects: powerbi.DataViewObjects): MekkoBorderSettings { + const show: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["columnBorder"]["show"], + MekkoChart.DefaultSettings.columnBorder.show); - public static parseDataPointSettings(objects: IDataViewObjects): MekkoDataPointSettings { - const categoryGradient: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["dataPoint"]["categoryGradient"], - MekkoChart.DefaultSettings.dataPoint.categoryGradient); + const color: string = DataViewObjects.getFillColor( + objects, + MekkoChart.Properties["columnBorder"]["color"], + MekkoChart.DefaultSettings.columnBorder.color); - const colorGradientEndColor: string = DataViewObjects.getValue( - objects, - MekkoChart.Properties["dataPoint"]["colorGradientEndColor"], - MekkoChart.DefaultSettings.dataPoint.colorGradientEndColor); + let width: number = DataViewObjects.getValue( + objects, + MekkoChart.Properties["columnBorder"]["width"], + MekkoChart.DefaultSettings.columnBorder.width); - const colorDistribution: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["dataPoint"]["colorDistribution"], - MekkoChart.DefaultSettings.dataPoint.colorDistribution); + const maxWidth: number = MekkoChart.DefaultSettings.columnBorder.maxWidth; - return { - categoryGradient, - colorGradientEndColor, - colorDistribution - }; - } - public static parseSeriesSortSettings(objects: IDataViewObjects): MekkoSeriesSortSettings { - const enabled: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["sortSeries"]["enabled"], - MekkoChart.DefaultSettings.sortSeries.enabled); - - const direction: string = DataViewObjects.getValue( - objects, - MekkoChart.Properties["sortSeries"]["direction"], - MekkoChart.DefaultSettings.sortSeries.direction); - - const displayPercents: string = DataViewObjects.getValue( - objects, - MekkoChart.Properties["sortSeries"]["displayPercents"], - MekkoChart.DefaultSettings.sortSeries.displayPercents); - - return { - enabled, - direction, - displayPercents - }; + if (width > maxWidth) { + width = maxWidth; + } else if (width < 0) { + width = 0; } - public static parseLegendSortSettings(objects: IDataViewObjects): MekkoLegendSortSettings { - const enabled: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["sortLegend"]["enabled"], - MekkoChart.DefaultSettings.sortLegend.enabled); - - const direction: string = DataViewObjects.getValue( - objects, - MekkoChart.Properties["sortLegend"]["direction"], - MekkoChart.DefaultSettings.sortLegend.direction); - - const groupByCategory: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["sortLegend"]["groupByCategory"], - MekkoChart.DefaultSettings.sortLegend.groupByCategory); - - const groupByCategoryDirection: string = DataViewObjects.getValue( - objects, - MekkoChart.Properties["sortLegend"]["groupByCategoryDirection"], - MekkoChart.DefaultSettings.sortLegend.groupByCategoryDirection); - - return { - enabled, - direction, - groupByCategory, - groupByCategoryDirection - }; + if (!show) { + width = 0; } - public static parseBorderSettings(objects: IDataViewObjects): MekkoBorderSettings { - const show: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["columnBorder"]["show"], - MekkoChart.DefaultSettings.columnBorder.show); + return { + show, + color, + width + }; + } - const color: string = DataViewObjects.getFillColor( - objects, - MekkoChart.Properties["columnBorder"]["color"], - MekkoChart.DefaultSettings.columnBorder.color); + private enumerateBorder(instances: VisualObjectInstance[]): void { + const objects: powerbi.DataViewObjects = { + columnBorder: this.borderObjectProperties + }; - let width: number = DataViewObjects.getValue( - objects, - MekkoChart.Properties["columnBorder"]["width"], - MekkoChart.DefaultSettings.columnBorder.width); + const show: boolean = DataViewObjects.getValue( + objects, + MekkoChart.Properties["columnBorder"]["show"], + MekkoChart.DefaultSettings.columnBorder.show); - const maxWidth: number = MekkoChart.DefaultSettings.columnBorder.maxWidth; + const color: string = DataViewObjects.getFillColor( + objects, + MekkoChart.Properties["columnBorder"]["color"], + MekkoChart.DefaultSettings.columnBorder.color); - if (width > maxWidth) { - width = maxWidth; - } else if (width < 0) { - width = 0; - } + let width: number = DataViewObjects.getValue( + objects, + MekkoChart.Properties["columnBorder"]["width"], + MekkoChart.DefaultSettings.columnBorder.width); - if (!show) { - width = 0; - } + const maxWidth: number = MekkoChart.DefaultSettings.columnBorder.maxWidth; + + if (width > maxWidth) { + width = maxWidth; + } else if (width < 0) { + width = 0; + } - return { + const instance: VisualObjectInstance = { + objectName: "columnBorder", + selector: null, + properties: { show, color, width - }; - } + }, + }; - private enumerateBorder(instances: VisualObjectInstance[]): void { - const objects: IDataViewObjects = { - columnBorder: this.borderObjectProperties - }; + instances.push(instance); + } - const show: boolean = DataViewObjects.getValue( - objects, - MekkoChart.Properties["columnBorder"]["show"], - MekkoChart.DefaultSettings.columnBorder.show); + public enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstanceEnumeration { + const instances: VisualObjectInstance[] = []; + const layersLength: number = this.layers + ? this.layers.length + : 0; - const color: string = DataViewObjects.getFillColor( - objects, - MekkoChart.Properties["columnBorder"]["color"], - MekkoChart.DefaultSettings.columnBorder.color); + if (options.objectName === "columnBorder") { + this.enumerateBorder(instances); + } + else if (options.objectName === "legend") { + if (!this.shouldShowLegendCard()) { + return; + } - let width: number = DataViewObjects.getValue( - objects, - MekkoChart.Properties["columnBorder"]["width"], - MekkoChart.DefaultSettings.columnBorder.width); + this.enumerateLegend(options, instances); + } + else if (options.objectName === "categoryAxis" && this.hasCategoryAxis) { + this.getCategoryAxisValues(instances); + } + else if (options.objectName === "valueAxis") { + this.getValueAxisValues(instances); + } - const maxWidth: number = MekkoChart.DefaultSettings.columnBorder.maxWidth; + for (let i: number = 0; i < layersLength; i++) { + const layer: IColumnChart = this.layers[i]; - if (width > maxWidth) { - width = maxWidth; - } else if (width < 0) { - width = 0; + if (layer.enumerateObjectInstances) { + layer.enumerateObjectInstances(instances, options); } - - const instance: VisualObjectInstance = { - objectName: "columnBorder", - selector: null, - properties: { - show, - color, - width - }, - }; - - instances.push(instance); } - public enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstanceEnumeration { - const instances: VisualObjectInstance[] = []; - const layersLength: number = this.layers - ? this.layers.length - : 0; + return instances; + } - if (options.objectName === "columnBorder") { - this.enumerateBorder(instances); - } - else if (options.objectName === "legend") { - if (!this.shouldShowLegendCard()) { - return; - } + private enumerateLegend( + options: EnumerateVisualObjectInstancesOptions, + instances: VisualObjectInstance[]): void { + + let show: boolean, + showTitle: boolean, + titleText: string, + fontSize: number, + position: string; + + show = DataViewObject.getValue( + this.legendObjectProperties, + legendProps.show, + this.legend.isVisible()); + + showTitle = DataViewObject.getValue( + this.legendObjectProperties, + legendProps.showTitle, + true); + + titleText = DataViewObject.getValue( + this.legendObjectProperties, + legendProps.titleText, + this.layerLegendData && this.layerLegendData.title + ? this.layerLegendData.title + : ""); + + fontSize = DataViewObject.getValue( + this.legendObjectProperties, + legendProps.fontSize, + this.layerLegendData && this.layerLegendData.fontSize + ? this.layerLegendData.fontSize + : MekkoChart.DefaultLabelFontSizeInPt); + + position = DataViewObject.getValue( + this.legendObjectProperties, + legendProps.position, + legendPosition.top); + + instances.push({ + selector: null, + properties: { + show, + position, + showTitle, + titleText, + fontSize + }, + objectName: options.objectName + }); + } - this.enumerateLegend(options, instances); - } - else if (options.objectName === "categoryAxis" && this.hasCategoryAxis) { - this.getCategoryAxisValues(instances); - } - else if (options.objectName === "valueAxis") { - this.getValueAxisValues(instances); - } + private shouldShowLegendCard(): boolean { + const layers: IColumnChart[] = this.layers, + dataViews: DataView[] = this.dataViews; - for (let i: number = 0; i < layersLength; i++) { - const layer: IColumnChart = this.layers[i]; + if (layers && dataViews) { + let layersWithValuesCtr: number = 0; - if (layer.enumerateObjectInstances) { - layer.enumerateObjectInstances(instances, options); + for (let i: number = 0; i < layers.length; i++) { + if (layers[i].hasLegend()) { + return true; } - } - return instances; - } - - private enumerateLegend( - options: EnumerateVisualObjectInstancesOptions, - instances: VisualObjectInstance[]): void { - - let show: boolean, - showTitle: boolean, - titleText: string, - fontSize: number, - position: string; - - show = DataViewObject.getValue( - this.legendObjectProperties, - legendProps.show, - this.legend.isVisible()); - - showTitle = DataViewObject.getValue( - this.legendObjectProperties, - legendProps.showTitle, - true); - - titleText = DataViewObject.getValue( - this.legendObjectProperties, - legendProps.titleText, - this.layerLegendData && this.layerLegendData.title - ? this.layerLegendData.title - : ""); - - fontSize = DataViewObject.getValue( - this.legendObjectProperties, - legendProps.fontSize, - this.layerLegendData && this.layerLegendData.fontSize - ? this.layerLegendData.fontSize - : MekkoChart.DefaultLabelFontSizeInPt); - - position = DataViewObject.getValue( - this.legendObjectProperties, - legendProps.position, - legendPosition.top); - - instances.push({ - selector: null, - properties: { - show, - position, - showTitle, - titleText, - fontSize - }, - objectName: options.objectName - }); - } + const dataView: DataView = dataViews[i]; - private shouldShowLegendCard(): boolean { - const layers: IColumnChart[] = this.layers, - dataViews: DataView[] = this.dataViews; + if (dataView + && dataView.categorical + && dataView.categorical.values + && dataView.categorical.values.length > 0) { - if (layers && dataViews) { - let layersWithValuesCtr: number = 0; + layersWithValuesCtr++; - for (let i: number = 0; i < layers.length; i++) { - if (layers[i].hasLegend()) { + if (layersWithValuesCtr > 1) { return true; } + } + } + } - const dataView: DataView = dataViews[i]; + return false; + } - if (dataView - && dataView.categorical - && dataView.categorical.values - && dataView.categorical.values.length > 0) { + private getCategoryAxisValues(instances: VisualObjectInstance[]): void { + let supportedType: string = axisType.both, + isValueScalar: boolean = false, + logPossible: boolean = !!this.axes.x.isLogScaleAllowed, + scaleOptions: string[] = [axisScale.log, axisScale.linear]; - layersWithValuesCtr++; + if (this.layers && this.layers[0].getSupportedCategoryAxisType) { + supportedType = this.layers[0].getSupportedCategoryAxisType(); - if (layersWithValuesCtr > 1) { - return true; - } - } - } + if (supportedType === axisType.scalar) { + isValueScalar = true; + } + else { + isValueScalar = isScalar( + supportedType === axisType.both, + this.categoryAxisProperties); } - - return false; } - private getCategoryAxisValues(instances: VisualObjectInstance[]): void { - let supportedType: string = axis.type.both, - isValueScalar: boolean = false, - logPossible: boolean = !!this.axes.x.isLogScaleAllowed, - scaleOptions: string[] = [axisScale.log, axisScale.linear]; + if (!isValueScalar) { + if (this.categoryAxisProperties) { + this.categoryAxisProperties["start"] = null; + this.categoryAxisProperties["end"] = null; + } + } - if (this.layers && this.layers[0].getSupportedCategoryAxisType) { - supportedType = this.layers[0].getSupportedCategoryAxisType(); - - if (supportedType === axis.type.scalar) { - isValueScalar = true; - } - else { - isValueScalar = isScalar( - supportedType === axis.type.both, - this.categoryAxisProperties); - } + const instance: VisualObjectInstance = { + selector: null, + properties: {}, + objectName: "categoryAxis", + validValues: { + axisScale: scaleOptions } + }; - if (!isValueScalar) { - if (this.categoryAxisProperties) { - this.categoryAxisProperties["start"] = null; - this.categoryAxisProperties["end"] = null; - } - } + instance.properties["show"] = this.categoryAxisProperties && this.categoryAxisProperties["show"] != null + ? this.categoryAxisProperties["show"] + : true; - const instance: VisualObjectInstance = { - selector: null, - properties: {}, - objectName: "categoryAxis", - validValues: { - axisScale: scaleOptions - } - }; + if (this.yAxisIsCategorical) + instance.properties["position"] = this.valueAxisProperties && this.valueAxisProperties["position"] != null + ? this.valueAxisProperties["position"] + : axisPosition.left; - instance.properties["show"] = this.categoryAxisProperties && this.categoryAxisProperties["show"] != null - ? this.categoryAxisProperties["show"] - : true; + if (supportedType === axisType.both) { + instance.properties["axisType"] = isValueScalar + ? axisType.scalar + : axisType.categorical; + } - if (this.yAxisIsCategorical) - instance.properties["position"] = this.valueAxisProperties && this.valueAxisProperties["position"] != null - ? this.valueAxisProperties["position"] - : axis.position.left; + if (isValueScalar) { + instance.properties["axisScale"] = (this.categoryAxisProperties && this.categoryAxisProperties["axisScale"] != null && logPossible) + ? this.categoryAxisProperties["axisScale"] + : axisScale.linear; - if (supportedType === axis.type.both) { - instance.properties["axisType"] = isValueScalar - ? axis.type.scalar - : axis.type.categorical; - } + instance.properties["start"] = this.categoryAxisProperties + ? this.categoryAxisProperties["start"] + : null; - if (isValueScalar) { - instance.properties["axisScale"] = (this.categoryAxisProperties && this.categoryAxisProperties["axisScale"] != null && logPossible) - ? this.categoryAxisProperties["axisScale"] - : axisScale.linear; + instance.properties["end"] = this.categoryAxisProperties + ? this.categoryAxisProperties["end"] + : null; + } - instance.properties["start"] = this.categoryAxisProperties - ? this.categoryAxisProperties["start"] - : null; + instance.properties["showAxisTitle"] = this.categoryAxisProperties && this.categoryAxisProperties["showAxisTitle"] != null + ? this.categoryAxisProperties["showAxisTitle"] + : false; - instance.properties["end"] = this.categoryAxisProperties - ? this.categoryAxisProperties["end"] - : null; - } + instance.properties["showBorder"] = this.categoryAxisProperties && this.categoryAxisProperties["showBorder"] != null + ? this.categoryAxisProperties["showAxisTitle"] + : false; - instance.properties["showAxisTitle"] = this.categoryAxisProperties && this.categoryAxisProperties["showAxisTitle"] != null - ? this.categoryAxisProperties["showAxisTitle"] - : false; - - instance.properties["showBorder"] = this.categoryAxisProperties && this.categoryAxisProperties["showBorder"] != null - ? this.categoryAxisProperties["showAxisTitle"] - : false; - - instance.properties["fontSize"] = this.categoryAxisProperties && this.categoryAxisProperties["fontSize"] != null - ? this.categoryAxisProperties["fontSize"] - : MekkoChart.DefaultLabelFontSizeInPt; - - instances - .push(instance); - - instances - .push({ - selector: null, - properties: { - axisStyle: this.categoryAxisProperties && this.categoryAxisProperties["axisStyle"] - ? this.categoryAxisProperties["axisStyle"] - : axisStyle.showTitleOnly, - labelColor: this.categoryAxisProperties - ? this.categoryAxisProperties["labelColor"] - : null - }, - objectName: "categoryAxis", - validValues: { - axisStyle: this.categoryAxisHasUnitType - ? [ - axisStyle.showTitleOnly, - axisStyle.showUnitOnly, - axisStyle.showBoth - ] - : [axisStyle.showTitleOnly], - } - }); - } + instance.properties["fontSize"] = this.categoryAxisProperties && this.categoryAxisProperties["fontSize"] != null + ? this.categoryAxisProperties["fontSize"] + : MekkoChart.DefaultLabelFontSizeInPt; - private getValueAxisValues(instances: VisualObjectInstance[]): void { - const scaleOptions: string[] = [axisScale.log, axisScale.linear], - logPossible: boolean = !!this.axes.y1.isLogScaleAllowed; + instances + .push(instance); - const instance: VisualObjectInstance = { + instances + .push({ selector: null, - properties: {}, - objectName: "valueAxis", + properties: { + axisStyle: this.categoryAxisProperties && this.categoryAxisProperties["axisStyle"] + ? this.categoryAxisProperties["axisStyle"] + : axisStyle.showTitleOnly, + labelColor: this.categoryAxisProperties && this.categoryAxisProperties["labelColor"] + ? this.categoryAxisProperties["labelColor"] + : MekkoChart.DefaultSettings.categoryAxis.labelColor + }, + objectName: "categoryAxis", validValues: { - axisScale: scaleOptions, - secAxisScale: scaleOptions + axisStyle: this.categoryAxisHasUnitType + ? [ + axisStyle.showTitleOnly, + axisStyle.showUnitOnly, + axisStyle.showBoth + ] + : [axisStyle.showTitleOnly], } - }; + }); + } - instance.properties["show"] = this.valueAxisProperties && this.valueAxisProperties["show"] != null - ? this.valueAxisProperties["show"] - : true; + private getValueAxisValues(instances: VisualObjectInstance[]): void { + const scaleOptions: string[] = [axisScale.log, axisScale.linear], + logPossible: boolean = !!this.axes.y1.isLogScaleAllowed; - if (!this.yAxisIsCategorical) { - instance.properties["position"] = this.valueAxisProperties && this.valueAxisProperties["position"] != null - ? this.valueAxisProperties["position"] - : axis.position.left; + const instance: VisualObjectInstance = { + selector: null, + properties: {}, + objectName: "valueAxis", + validValues: { + axisScale: scaleOptions, + secAxisScale: scaleOptions } + }; - instance.properties["axisScale"] = (this.valueAxisProperties && this.valueAxisProperties["axisScale"] != null && logPossible) - ? this.valueAxisProperties["axisScale"] - : axisScale.linear; + instance.properties["show"] = this.valueAxisProperties && this.valueAxisProperties["show"] != null + ? this.valueAxisProperties["show"] + : true; - instance.properties["start"] = this.valueAxisProperties - ? this.valueAxisProperties["start"] - : null; + if (!this.yAxisIsCategorical) { + instance.properties["position"] = this.valueAxisProperties && this.valueAxisProperties["position"] != null + ? this.valueAxisProperties["position"] + : axisPosition.left; + } - instance.properties["end"] = this.valueAxisProperties - ? this.valueAxisProperties["end"] - : null; + instance.properties["axisScale"] = (this.valueAxisProperties && this.valueAxisProperties["axisScale"] != null && logPossible) + ? this.valueAxisProperties["axisScale"] + : axisScale.linear; - instance.properties["showAxisTitle"] = this.valueAxisProperties && this.valueAxisProperties["showAxisTitle"] != null - ? this.valueAxisProperties["showAxisTitle"] - : false; - - instance.properties["fontSize"] = this.valueAxisProperties && this.valueAxisProperties["fontSize"] != null - ? this.valueAxisProperties["fontSize"] - : MekkoChart.DefaultLabelFontSizeInPt; - - instances - .push(instance); - - instances - .push({ - selector: null, - properties: { - axisStyle: this.valueAxisProperties && this.valueAxisProperties["axisStyle"] != null - ? this.valueAxisProperties["axisStyle"] - : axisStyle.showTitleOnly, - labelColor: this.valueAxisProperties - ? this.valueAxisProperties["labelColor"] - : null - }, - objectName: "valueAxis", - validValues: { - axisStyle: this.valueAxisHasUnitType - ? [ - axisStyle.showTitleOnly, - axisStyle.showUnitOnly, - axisStyle.showBoth - ] - : [axisStyle.showTitleOnly] - }, - }); + instance.properties["start"] = this.valueAxisProperties + ? this.valueAxisProperties["start"] + : null; - if (this.layers.length === 2) { - instance.properties["secShow"] = this.valueAxisProperties && this.valueAxisProperties["secShow"] != null - ? this.valueAxisProperties["secShow"] - : this.y2AxisExists; + instance.properties["end"] = this.valueAxisProperties + ? this.valueAxisProperties["end"] + : null; - if (instance.properties["secShow"]) { - instance.properties["axisLabel"] = ""; - } + instance.properties["showAxisTitle"] = this.valueAxisProperties && this.valueAxisProperties["showAxisTitle"] != null + ? this.valueAxisProperties["showAxisTitle"] + : false; + + instance.properties["fontSize"] = this.valueAxisProperties && this.valueAxisProperties["fontSize"] != null + ? this.valueAxisProperties["fontSize"] + : MekkoChart.DefaultLabelFontSizeInPt; + + instances + .push(instance); + + instances + .push({ + selector: null, + properties: { + axisStyle: this.valueAxisProperties && this.valueAxisProperties["axisStyle"] != null + ? this.valueAxisProperties["axisStyle"] + : axisStyle.showTitleOnly, + labelColor: this.valueAxisProperties && this.valueAxisProperties["labelColor"] + ? this.valueAxisProperties["labelColor"] + : MekkoChart.DefaultSettings.valueAxis.labelColor + }, + objectName: "valueAxis", + validValues: { + axisStyle: this.valueAxisHasUnitType + ? [ + axisStyle.showTitleOnly, + axisStyle.showUnitOnly, + axisStyle.showBoth + ] + : [axisStyle.showTitleOnly] + }, + }); + + if (this.layers.length === 2) { + instance.properties["secShow"] = this.valueAxisProperties && this.valueAxisProperties["secShow"] != null + ? this.valueAxisProperties["secShow"] + : this.y2AxisExists; + + if (instance.properties["secShow"]) { + instance.properties["axisLabel"] = ""; } } + } - public onClearSelection(): void { - if (this.hasSetData) { - for (let layer of this.layers) { - layer.onClearSelection(); - layer.render(true); - } + public onClearSelection(): void { + if (this.hasSetData) { + for (let layer of this.layers) { + layer.onClearSelection(); + layer.render(true); } } + } - private createAndInitLayers(dataViews: DataView[]): IColumnChart[] { - let objects: IDataViewObjects; + private createAndInitLayers(dataViews: DataView[]): IColumnChart[] { + let objects: powerbi.DataViewObjects; - if (dataViews && dataViews.length > 0) { - const dataViewMetadata: DataViewMetadata = dataViews[0].metadata; + if (dataViews && dataViews.length > 0) { + const dataViewMetadata: DataViewMetadata = dataViews[0].metadata; - if (dataViewMetadata) { - objects = dataViewMetadata.objects; - } + if (dataViewMetadata) { + objects = dataViewMetadata.objects; } + } - const layers: IColumnChart[] = createLayers( - this.type, - objects, - this.interactivityService, - this.isScrollable); + const layers: IColumnChart[] = createLayers( + this.type, + objects, + this.interactivityService, + this.isScrollable); - let cartesianOptions: MekkoChartVisualInitOptions - = Prototype.inherit(this.visualInitOptions) as MekkoChartVisualInitOptions; + let cartesianOptions: MekkoChartVisualInitOptions + = Prototype.inherit(this.visualInitOptions) as MekkoChartVisualInitOptions; - cartesianOptions.svg = this.axisGraphicsContextScrollable; + cartesianOptions.svg = this.axisGraphicsContextScrollable; - cartesianOptions.cartesianHost = { - updateLegend: data => { - this.legend.drawLegend(data, this.currentViewport); - }, - getSharedColors: () => this.visualHost.colorPalette, - triggerRender: undefined, - }; - - for (let i: number = 0; i < layers.length; i++) { - layers[i].init(cartesianOptions); - } + cartesianOptions.cartesianHost = { + updateLegend: data => { + this.legend.drawLegend(data, this.currentViewport); + }, + getSharedColors: () => this.visualHost.colorPalette, + triggerRender: undefined, + }; - return layers; + for (let i: number = 0; i < layers.length; i++) { + layers[i].init(cartesianOptions); } - private renderLegend(): void { - let layers: IColumnChart[] = this.layers, - legendData: ILegendData = { - title: "", - dataPoints: [] - }; - - for (let i: number = 0; i < layers.length; i++) { - this.layerLegendData = layers[i].calculateLegend(); + return layers; + } - if (this.layerLegendData) { - legendData.title = i === 0 - ? this.layerLegendData.title || "" - : legendData.title; + private renderLegend(): void { + let layers: IColumnChart[] = this.layers, + legendData: ILegendData = { + title: "", + dataPoints: [] + }; - legendData.dataPoints = legendData.dataPoints - .concat(this.layerLegendData.dataPoints || []); + for (let i: number = 0; i < layers.length; i++) { + this.layerLegendData = layers[i].calculateLegend(); - if (this.layerLegendData.grouped) { - legendData.grouped = true; - } - } - } + if (this.layerLegendData) { + legendData.title = i === 0 + ? this.layerLegendData.title || "" + : legendData.title; - const legendProperties: DataViewObject = this.legendObjectProperties; + legendData.dataPoints = legendData.dataPoints + .concat(this.layerLegendData.dataPoints || []); - if (legendProperties) { - if (!legendProperties["fontSize"]) { - legendProperties["fontSize"] = MekkoChart.DefaultLabelFontSizeInPt; + if (this.layerLegendData.grouped) { + legendData.grouped = true; } + } + } - LegendData.update(legendData, legendProperties); - - const position: string = legendProperties[legendProps.position] as string; + const legendProperties: powerbi.DataViewObject = this.legendObjectProperties; - if (position) { - this.legend.changeOrientation(LegendPosition[position]); - } - } - else { - this.legend.changeOrientation(LegendPosition.Top); + if (legendProperties) { + if (!legendProperties["fontSize"]) { + legendProperties["fontSize"] = MekkoChart.DefaultLabelFontSizeInPt; } - if ((legendData.dataPoints.length === 1 && !legendData.grouped) || this.hideLegends()) { - legendData.dataPoints = []; - } + LegendData.update(legendData, legendProperties); - let reducedLegends: IGrouppedLegendData[] = []; - let legendSortSettings: MekkoLegendSortSettings = (this.layers[0]).getLegendSortSettings(); - if (legendSortSettings.enabled) { - if (legendSortSettings.groupByCategory) { - let mappedLegends = legendData.dataPoints.map((dataPoint: MekkoLegendDataPoint) => { - let maxVal = d3.max(dataPoint.categoryValues as Number[]); - let index = dataPoint.categoryValues.indexOf(maxVal as PrimitiveValue); - return { - categoryIndex: index, - data: dataPoint, - categoryValue: 0 - }; - }); - - mappedLegends.forEach(element => { - reducedLegends[element.categoryIndex] = - reducedLegends[element.categoryIndex] || { - category: this.layers[0].getData().categories[element.categoryIndex], - index: element.categoryIndex, - data: [], - dataValues: 0, - categorySorting: null - }; - reducedLegends[element.categoryIndex].data.push(element.data); - }); - reducedLegends.forEach(element => { - element.dataValues = d3.sum(element.data.map((d) => d.valueSum)); - }); - - reducedLegends.forEach(legend => { - if (legend === undefined) { - return; - } - legend.data = _.sortBy(legend.data, "valueSum"); - if (legendSortSettings.groupByCategoryDirection === MekkoChart.SortDirectionDescending) { - legend.data = legend.data.reverse(); - } - }); - - reducedLegends = _.sortBy(reducedLegends, "categorySort"); - - if (legendSortSettings.direction === MekkoChart.SortDirectionDescending) { - reducedLegends = reducedLegends.reverse(); - } + const position: string = legendProperties[legendProps.position] as string; - legendData.dataPoints = []; - reducedLegends.forEach(legend => { - if (legend === undefined) { - return; - } - legendData.dataPoints = legendData.dataPoints.concat(legend.data); - }); - } - else { - legendData.dataPoints = _.sortBy(legendData.dataPoints, "valueSum"); - if (legendSortSettings.direction === MekkoChart.SortDirectionDescending) { - legendData.dataPoints = legendData.dataPoints.reverse(); - } - } + if (position) { + this.legend.changeOrientation(LegendPosition[position]); } + } + else { + this.legend.changeOrientation(LegendPosition.Top); + } - let svgHeight: number = textMeasurementService.estimateSvgTextHeight({ - fontFamily: MekkoChart.LegendBarTextFont, - fontSize: PixelConverter.toString(+legendProperties["fontSize"] + MekkoChart.LegendBarHeightMargin), - text: "AZ" - }); + if ((legendData.dataPoints.length === 1 && !legendData.grouped) || this.hideLegends()) { + legendData.dataPoints = []; + } - d3.select(this.rootElement.node()).selectAll("div.legendParent").remove(); - this.categoryLegends = []; - let legendParents = d3.select(this.rootElement.node()).selectAll("div.legendParent"); - - let legendParentsWithData = legendParents.data(reducedLegends.filter((l: IGrouppedLegendData) => l !== undefined)); - let legendParentsWithChilds = legendParentsWithData.enter().append("div"); - let legendParentsWithChildsAttr = legendParentsWithChilds.classed("legendParent", true) - .style({ - position: "absolute", - top: function (data) { - return PixelConverter.toString(svgHeight * data.index); - } + let reducedLegends: IGrouppedLegendData[] = []; + let legendSortSettings: MekkoLegendSortSettings = (this.layers[0]).getLegendSortSettings(); + if (legendSortSettings.enabled) { + if (legendSortSettings.groupByCategory) { + let mappedLegends = legendData.dataPoints.map((dataPoint: MekkoLegendDataPoint) => { + let maxVal = max(dataPoint.categoryValues as Number[]); + let index = dataPoint.categoryValues.indexOf(maxVal as PrimitiveValue); + return { + categoryIndex: index, + data: dataPoint, + categoryValue: 0 + }; }); - let mekko = this; - this.categoryLegends = this.categoryLegends || []; - legendParentsWithChildsAttr.each(function (data, index) { - let legendSvg = d3.select(this); - if (legendSvg.select("svg").node() === null) { - let legend: ILegend = createLegend( - this, - false, - mekko.interactivityService, - true); - - mekko.categoryLegends[index] = legend; - } - }); - - if (reducedLegends.length > 0) { - this.categoryLegends.forEach((legend: ILegend, index: number) => { - (legend).position = +d3.select((legend).element).style("top").replace("px", ""); + mappedLegends.forEach(element => { + reducedLegends[element.categoryIndex] = + reducedLegends[element.categoryIndex] || { + category: this.layers[0].getData().categories[element.categoryIndex], + index: element.categoryIndex, + data: [], + dataValues: 0, + categorySorting: null + }; + reducedLegends[element.categoryIndex].data.push(element.data); + }); + reducedLegends.forEach(element => { + element.dataValues = sum(element.data.map((d) => d.valueSum)); }); - this.categoryLegends = _.sortBy(this.categoryLegends, "position").reverse(); - this.categoryLegends.forEach((legend, index) => { - if (reducedLegends[index] === undefined) { - LegendData.update({ - dataPoints: [] - }, legendProperties); - legend.changeOrientation(LegendPosition.None); - legend.drawLegend({ - dataPoints: [] - }, this.currentViewport); + reducedLegends.forEach(legend => { + if (legend === undefined) { return; } + legend.data = legend.data.sort((a, b) => a["valueSum"] > b["valueSum"] ? 1 : -1); + if (legendSortSettings.groupByCategoryDirection === MekkoChart.SortDirectionDescending) { + legend.data = legend.data.reverse(); + } + }); - let legendData: ILegendData = { - title: reducedLegends[index].category, - dataPoints: reducedLegends[index].data - }; + reducedLegends = reducedLegends.sort((a, b) => a["categorySort"] > b["categorySort"] ? 1 : -1); - LegendData.update(legendData, legendProperties); - legend.drawLegend(legendData, this.currentViewport); + if (legendSortSettings.direction === MekkoChart.SortDirectionDescending) { + reducedLegends = reducedLegends.reverse(); + } - if (index === 0) { - if (legendParentsWithChildsAttr.node() === null) { - svgHeight = +legendParents.select("svg").attr("height").replace("px", ""); - } else { - svgHeight = +d3.select(legendParentsWithChildsAttr.node()).select("svg").attr("height").replace("px", ""); - } + legendData.dataPoints = []; + reducedLegends.forEach(legend => { + if (legend === undefined) { + return; } + legendData.dataPoints = legendData.dataPoints.concat(legend.data); }); } - legendParentsWithData.exit().remove(); - - if (legendProperties["show"] === false) { - legendData.dataPoints = []; - this.categoryLegends.forEach(legend => { - legend.changeOrientation(LegendPosition.None); - LegendData.update(legendData, legendProperties); - legend.drawLegend(legendData, this.currentViewport); - }); + else { + legendData.dataPoints = legendData.dataPoints.sort((a, b) => a["valueSum"] > b["valueSum"] ? 1 : -1); + if (legendSortSettings.direction === MekkoChart.SortDirectionDescending) { + legendData.dataPoints = legendData.dataPoints.reverse(); + } } + } - if (reducedLegends.length > 0) { - this.legend.changeOrientation(LegendPosition.None); + let svgHeight: number = textMeasurementService.estimateSvgTextHeight({ + fontFamily: MekkoChart.LegendBarTextFont, + fontSize: PixelConverter.toString(+legendProperties["fontSize"] + MekkoChart.LegendBarHeightMargin), + text: "AZ" + }); + + select(this.rootElement.node()).selectAll("div.legendParent").remove(); + this.categoryLegends = []; + let legendParents = select(this.rootElement.node()).selectAll("div.legendParent"); + + reducedLegends = reducedLegends.filter((l: IGrouppedLegendData) => l !== undefined); + let legendParentsWithData = legendParents.data(reducedLegends); + let legendParentsWithChilds = legendParentsWithData.enter().append("div"); + let legendParentsWithChildsAttr = legendParentsWithChilds.classed("legendParent", true) + .style("position", "absolute") + .style("top", (data, index) => PixelConverter.toString(svgHeight * index)); + + let mekko = this; + this.categoryLegends = this.categoryLegends || []; + legendParentsWithChildsAttr.each(function (data, index) { + let legendSvg = select(this); + if (legendSvg.select("svg").node() === null) { + let legend: ILegend = createLegend( + this, + false, + mekko.interactivityService, + true); + + mekko.categoryLegends[index] = legend; } + }); - this.legend.drawLegend(legendData, this.currentViewport); + if (reducedLegends.length) { + this.legendMargins = this.categoryLegends[0].getMargins(); + this.legendMargins.height = this.legendMargins.height - MekkoChart.LegendBarHeightMargin; + this.legendMargins.height = this.legendMargins.height * reducedLegends.length; } + if (reducedLegends.length > 0) { + this.categoryLegends.forEach((legend: ILegend, index: number) => { + (legend).position = +select((legend).element).style("top").replace("px", ""); + }); + this.categoryLegends = this.categoryLegends.sort((a, b) => a["position"] > b["position"] ? 1 : -1).reverse(); + this.categoryLegends.forEach((legend, index) => { + if (reducedLegends[index] === undefined) { + LegendData.update({ + dataPoints: [] + }, legendProperties); + legend.changeOrientation(LegendPosition.None); + legend.drawLegend({ + dataPoints: [] + }, this.currentViewport); - private hideLegends(): boolean { - if (this.cartesianSmallViewPortProperties) { - if (this.cartesianSmallViewPortProperties.hideLegendOnSmallViewPort - && (this.currentViewport.height < this.cartesianSmallViewPortProperties.MinHeightLegendVisible)) { - return true; + return; } - } - return false; + let legendData: ILegendData = { + title: reducedLegends[index].category, + dataPoints: reducedLegends[index].data + }; + + LegendData.update(legendData, legendProperties); + legend.drawLegend(legendData, this.currentViewport); + + if (index === 0) { + if (legendParentsWithChildsAttr.node() === null) { + svgHeight = +legendParents.select("svg").attr("height").replace("px", ""); + } else { + svgHeight = +select(legendParentsWithChildsAttr.node()).select("svg").attr("height").replace("px", ""); + } + } + }); } + legendParentsWithData.exit().remove(); - private addUnitTypeToAxisLabel(axes: MekkoChartAxisProperties): void { - let unitType: string = MekkoChart.getUnitType( - axes, - (axis: MekkoChartAxisProperties) => axis.x); + if (legendProperties["show"] === false) { + legendData.dataPoints = []; + this.categoryLegends.forEach(legend => { + legend.changeOrientation(LegendPosition.None); + LegendData.update(legendData, legendProperties); + legend.drawLegend(legendData, this.currentViewport); + }); + } + if (reducedLegends.length > 0) { + this.legend.changeOrientation(LegendPosition.None); + } + + this.legend.drawLegend(legendData, this.currentViewport); + } + + private hideLegends(): boolean { + if (this.cartesianSmallViewPortProperties) { + if (this.cartesianSmallViewPortProperties.hideLegendOnSmallViewPort + && (this.currentViewport.height < this.cartesianSmallViewPortProperties.MinHeightLegendVisible)) { + return true; + } + } + + return false; + } + + private addUnitTypeToAxisLabel(axes: MekkoChartAxisProperties): void { + let unitType: string = MekkoChart.getUnitType( + axes, + (axis: MekkoChartAxisProperties) => axis.x); + + if (axes.x.isCategoryAxis) { + this.categoryAxisHasUnitType = unitType !== null; + } + else { + this.valueAxisHasUnitType = unitType !== null; + } + + if (axes.x.axisLabel && unitType) { if (axes.x.isCategoryAxis) { - this.categoryAxisHasUnitType = unitType !== null; + axes.x.axisLabel = AxisHelper.createAxisLabel( + this.categoryAxisProperties, + axes.x.axisLabel, + unitType); } else { - this.valueAxisHasUnitType = unitType !== null; + axes.x.axisLabel = AxisHelper.createAxisLabel( + this.valueAxisProperties, + axes.x.axisLabel, + unitType); } + } - if (axes.x.axisLabel && unitType) { - if (axes.x.isCategoryAxis) { - axes.x.axisLabel = AxisHelper.createAxisLabel( - this.categoryAxisProperties, - axes.x.axisLabel, - unitType); - } - else { - axes.x.axisLabel = AxisHelper.createAxisLabel( - this.valueAxisProperties, - axes.x.axisLabel, - unitType); - } - } + unitType = MekkoChart.getUnitType( + axes, + (axis: MekkoChartAxisProperties) => axis.y1); - unitType = MekkoChart.getUnitType( - axes, - (axis: MekkoChartAxisProperties) => axis.y1); + if (!axes.y1.isCategoryAxis) { + this.valueAxisHasUnitType = unitType !== null; + } + else { + this.categoryAxisHasUnitType = unitType !== null; + } + if (axes.y1.axisLabel && unitType) { if (!axes.y1.isCategoryAxis) { - this.valueAxisHasUnitType = unitType !== null; + axes.y1.axisLabel = AxisHelper.createAxisLabel( + this.valueAxisProperties, + axes.y1.axisLabel, + unitType); } else { - this.categoryAxisHasUnitType = unitType !== null; + axes.y1.axisLabel = AxisHelper.createAxisLabel( + this.categoryAxisProperties, + axes.y1.axisLabel, + unitType); } + } - if (axes.y1.axisLabel && unitType) { - if (!axes.y1.isCategoryAxis) { - axes.y1.axisLabel = AxisHelper.createAxisLabel( - this.valueAxisProperties, - axes.y1.axisLabel, - unitType); - } - else { - axes.y1.axisLabel = AxisHelper.createAxisLabel( - this.categoryAxisProperties, - axes.y1.axisLabel, - unitType); - } - } + if (axes.y2) { + let unitType: string = MekkoChart.getUnitType( + axes, + (axis: MekkoChartAxisProperties) => axis.y2); + + this.secValueAxisHasUnitType = unitType !== null; - if (axes.y2) { - let unitType: string = MekkoChart.getUnitType( - axes, - (axis: MekkoChartAxisProperties) => axis.y2); - - this.secValueAxisHasUnitType = unitType !== null; - - if (axes.y2.axisLabel && unitType) { - if (this.valueAxisProperties && this.valueAxisProperties["secAxisStyle"]) { - if (this.valueAxisProperties["secAxisStyle"] === axisStyle.showBoth) { - axes.y2.axisLabel = `${axes.y2.axisLabel} (${unitType})`; - } - else if (this.valueAxisProperties["secAxisStyle"] === axisStyle.showUnitOnly) { - axes.y2.axisLabel = unitType; - } + if (axes.y2.axisLabel && unitType) { + if (this.valueAxisProperties && this.valueAxisProperties["secAxisStyle"]) { + if (this.valueAxisProperties["secAxisStyle"] === axisStyle.showBoth) { + axes.y2.axisLabel = `${axes.y2.axisLabel} (${unitType})`; + } + else if (this.valueAxisProperties["secAxisStyle"] === axisStyle.showUnitOnly) { + axes.y2.axisLabel = unitType; } } } } + } - private shouldRenderSecondaryAxis(axisProperties: IAxisProperties): boolean { - if (axisProperties - && (!this.valueAxisProperties - || this.valueAxisProperties["secShow"] == null - || this.valueAxisProperties["secShow"])) { - - return axisProperties.values && axisProperties.values.length > 0; - } + private shouldRenderSecondaryAxis(axisProperties: IAxisProperties): boolean { + if (axisProperties + && (!this.valueAxisProperties + || this.valueAxisProperties["secShow"] == null + || this.valueAxisProperties["secShow"])) { - return false; + return axisProperties.values && axisProperties.values.length > 0; } - private shouldRenderAxis( - axisProperties: IAxisProperties, - propertyName: string = "show"): boolean { + return false; + } - if (axisProperties) { - if (axisProperties.isCategoryAxis - && (!this.categoryAxisProperties - || this.categoryAxisProperties[propertyName] == null - || this.categoryAxisProperties[propertyName])) { + private shouldRenderAxis( + axisProperties: IAxisProperties, + propertyName: string = "show"): boolean { - return axisProperties.values - && axisProperties.values.length > 0; - } - else if (!axisProperties.isCategoryAxis - && (!this.valueAxisProperties - || this.valueAxisProperties[propertyName] == null - || this.valueAxisProperties[propertyName])) { + if (axisProperties) { + if (axisProperties.isCategoryAxis + && (!this.categoryAxisProperties + || this.categoryAxisProperties[propertyName] == null + || this.categoryAxisProperties[propertyName])) { - return axisProperties.values - && axisProperties.values.length > 0; - } + return axisProperties.values + && axisProperties.values.length > 0; } + else if (!axisProperties.isCategoryAxis + && (!this.valueAxisProperties + || this.valueAxisProperties[propertyName] == null + || this.valueAxisProperties[propertyName])) { - return false; + return axisProperties.values + && axisProperties.values.length > 0; + } } - private render(suppressAnimations: boolean = true): void { - this.setVisibility(true); + return false; + } - this.legendMargins = this.legend.getMargins(); + private render(suppressAnimations: boolean = true): void { + this.setVisibility(true); - if (this.categoryLegends.length > 0 && this.categoryLegends[0].isVisible()) { - this.legendMargins = this.categoryLegends[0].getMargins(); - this.legendMargins.height = this.legendMargins.height - MekkoChart.LegendBarHeightMargin; - this.legendMargins.height = this.legendMargins.height * this.dataViews[0].categorical.categories[0].values.length; - } - if (this.legend.isVisible()) { - this.legendMargins = this.legend.getMargins(); - } + this.legendMargins = this.legendMargins || this.legend.getMargins(); - const viewport: IViewport = { - height: this.currentViewport.height - this.legendMargins.height, - width: this.currentViewport.width - this.legendMargins.width - }; + if (this.legend.isVisible()) { + this.legendMargins = this.legend.getMargins(); + } - const maxMarginFactor: number = this.getMaxMarginFactor(), - leftRightMarginLimit: number - = this.leftRightMarginLimit - = viewport.width * maxMarginFactor; + const viewport: IViewport = { + height: this.currentViewport.height - this.legendMargins.height, + width: this.currentViewport.width - this.legendMargins.width + }; - this.bottomMarginLimit = Math.max( - MekkoChart.MinBottomMargin, - Math.ceil(viewport.height * maxMarginFactor)); + const maxMarginFactor: number = this.getMaxMarginFactor(), + leftRightMarginLimit: number + = this.leftRightMarginLimit + = viewport.width * maxMarginFactor; - const xAxisTextProperties: TextProperties = MekkoChart.getTextProperties(this.categoryAxisProperties - && PixelConverter.fromPointToPixel( - parseFloat(this.categoryAxisProperties["fontSize"])) || undefined); + this.bottomMarginLimit = Math.max( + MekkoChart.MinBottomMargin, + Math.ceil(viewport.height * maxMarginFactor)); - const y1AxisTextProperties: TextProperties = MekkoChart.getTextProperties(this.valueAxisProperties - && PixelConverter.fromPointToPixel( - parseFloat(this.valueAxisProperties["fontSize"])) || undefined); + const xAxisTextProperties: TextProperties = MekkoChart.getTextProperties(this.categoryAxisProperties + && PixelConverter.fromPointToPixel( + parseFloat(this.categoryAxisProperties["fontSize"])) || undefined); - const margin: IMargin = this.margin; + const y1AxisTextProperties: TextProperties = MekkoChart.getTextProperties(this.valueAxisProperties + && PixelConverter.fromPointToPixel( + parseFloat(this.valueAxisProperties["fontSize"])) || undefined); - // reset defaults - margin.top = parseFloat(y1AxisTextProperties.fontSize) / MekkoChart.MarginTopFactor; - margin.bottom = MekkoChart.MinBottomMargin; - margin.right = 0; + const margin: IMargin = this.margin; - let axes: MekkoChartAxisProperties = this.axes = axis.utils.calculateAxes( - this.layers, - viewport, - margin, - this.categoryAxisProperties, - this.valueAxisProperties, - this.isXScrollBarVisible || this.isYScrollBarVisible, - null); + // reset defaults + margin.top = parseFloat(y1AxisTextProperties.fontSize) / MekkoChart.MarginTopFactor; + margin.bottom = MekkoChart.MinBottomMargin; + margin.right = 0; - this.yAxisIsCategorical = axes.y1.isCategoryAxis; + let axes: MekkoChartAxisProperties = this.axes = axisUtils.calculateAxes( + this.layers, + viewport, + margin, + this.categoryAxisProperties, + this.valueAxisProperties, + this.isXScrollBarVisible || this.isYScrollBarVisible, + null); - this.hasCategoryAxis = this.yAxisIsCategorical - ? axes.y1 && axes.y1.values.length > 0 - : axes.x && axes.x.values.length > 0; + this.yAxisIsCategorical = axes.y1.isCategoryAxis; - const renderXAxis: boolean = this.shouldRenderAxis(axes.x), - renderY1Axis: boolean = this.shouldRenderAxis(axes.y1), - renderY2Axis: boolean = this.shouldRenderSecondaryAxis(axes.y2); + this.hasCategoryAxis = this.yAxisIsCategorical + ? axes.y1 && axes.y1.values.length > 0 + : axes.x && axes.x.values.length > 0; - let width: number = viewport.width - (margin.left + margin.right), - isScalar: boolean = false, - mainAxisScale, - preferredViewport: IViewport; + const renderXAxis: boolean = this.shouldRenderAxis(axes.x), + renderY1Axis: boolean = this.shouldRenderAxis(axes.y1), + renderY2Axis: boolean = this.shouldRenderSecondaryAxis(axes.y2); - this.isXScrollBarVisible = false; - this.isYScrollBarVisible = false; + let width: number = viewport.width - (margin.left + margin.right), + isScalar: boolean = false, + mainAxisScale, + preferredViewport: IViewport; - const yAxisOrientation: string = this.yAxisOrientation, - showY1OnRight: boolean = yAxisOrientation === axis.position.right; + this.isXScrollBarVisible = false; + this.isYScrollBarVisible = false; - if (this.layers) { - if (this.layers[0].getVisualCategoryAxisIsScalar) { - isScalar = this.layers[0].getVisualCategoryAxisIsScalar(); - } + const yAxisOrientation: string = this.yAxisOrientation, + showY1OnRight: boolean = yAxisOrientation === axisPosition.right; - if (!isScalar && this.isScrollable && this.layers[0].getPreferredPlotArea) { - const categoryThickness: number = this.scrollX - ? axes.x.categoryThickness - : axes.y1.categoryThickness; + if (this.layers) { + if (this.layers[0].getVisualCategoryAxisIsScalar) { + isScalar = this.layers[0].getVisualCategoryAxisIsScalar(); + } - const categoryCount: number = this.scrollX - ? axes.x.values.length - : axes.y1.values.length; + if (!isScalar && this.isScrollable && this.layers[0].getPreferredPlotArea) { + const categoryThickness: number = this.scrollX + ? axes.x.categoryThickness + : axes.y1.categoryThickness; - preferredViewport = this.layers[0].getPreferredPlotArea( - isScalar, - categoryCount, - categoryThickness); + const categoryCount: number = this.scrollX + ? axes.x.values.length + : axes.y1.values.length; - if (this.scrollX - && preferredViewport - && preferredViewport.width > viewport.width) { + preferredViewport = this.layers[0].getPreferredPlotArea( + isScalar, + categoryCount, + categoryThickness); - this.isXScrollBarVisible = true; + if (this.scrollX + && preferredViewport + && preferredViewport.width > viewport.width) { - viewport.height -= MekkoChart.ScrollBarWidth; - } + this.isXScrollBarVisible = true; - if (this.scrollY - && preferredViewport - && preferredViewport.height > viewport.height) { + viewport.height -= MekkoChart.ScrollBarWidth; + } - this.isYScrollBarVisible = true; + if (this.scrollY + && preferredViewport + && preferredViewport.height > viewport.height) { - viewport.width -= MekkoChart.ScrollBarWidth; - width = viewport.width - (margin.left + margin.right); - } - } - } + this.isYScrollBarVisible = true; - // Only create the g tag where there is a scrollbar - if (this.isXScrollBarVisible || this.isYScrollBarVisible) { - if (!this.brushGraphicsContext) { - this.brushGraphicsContext = this.svg.append("g") - .classed(MekkoChart.XBrushSelector.className, true); + viewport.width -= MekkoChart.ScrollBarWidth; + width = viewport.width - (margin.left + margin.right); } } - else { - // clear any existing brush if no scrollbar is shown - this.svg - .selectAll(MekkoChart.BrushSelector.selectorName) - .remove(); + } - this.brushGraphicsContext = undefined; + // Only create the g tag where there is a scrollbar + if (this.isXScrollBarVisible || this.isYScrollBarVisible) { + if (!this.brushGraphicsContext) { + this.brushGraphicsContext = this.svg.append("g") + .classed(MekkoChart.XBrushSelector.className, true); } + } + else { + // clear any existing brush if no scrollbar is shown + this.svg + .selectAll(MekkoChart.BrushSelector.selectorName) + .remove(); - // Recalculate axes now that scrollbar visible variables have been set - axes = axis.utils.calculateAxes( - this.layers, - viewport, - margin, - this.categoryAxisProperties, - this.valueAxisProperties, - this.isXScrollBarVisible || this.isYScrollBarVisible, - null); - - // we need to make two passes because the margin changes affect the chosen tick values, which then affect the margins again. - // after the second pass the margins are correct. - let doneWithMargins: boolean = false, - maxIterations: number = 2, - numIterations: number = 0, - tickLabelMargins: TickLabelMargins = undefined, - chartHasAxisLabels: boolean = undefined, - axisLabels: MekkoChartAxesLabels = undefined; - - while (!doneWithMargins && numIterations < maxIterations) { - numIterations++; - - tickLabelMargins = labelUtils.getTickLabelMargins( - { width, height: viewport.height }, - leftRightMarginLimit, - textMeasurementService.measureSvgTextWidth, - textMeasurementService.estimateSvgTextHeight, - axes, - this.bottomMarginLimit, - xAxisTextProperties, - y1AxisTextProperties, - null, - false, - this.isXScrollBarVisible || this.isYScrollBarVisible, - showY1OnRight, - renderXAxis, - renderY1Axis, - renderY2Axis); - - // We look at the y axes as main and second sides, if the y axis orientation is right so the main side represents the right side - let maxMainYaxisSide: number = showY1OnRight - ? tickLabelMargins.yRight - : tickLabelMargins.yLeft; + this.brushGraphicsContext = undefined; + } - let maxSecondYaxisSide: number = showY1OnRight - ? tickLabelMargins.yLeft - : tickLabelMargins.yRight; + // Recalculate axes now that scrollbar visible variables have been set + axes = axisUtils.calculateAxes( + this.layers, + viewport, + margin, + this.categoryAxisProperties, + this.valueAxisProperties, + this.isXScrollBarVisible || this.isYScrollBarVisible, + null); + + // we need to make two passes because the margin changes affect the chosen tick values, which then affect the margins again. + // after the second pass the margins are correct. + let doneWithMargins: boolean = false, + maxIterations: number = 2, + numIterations: number = 0, + tickLabelMargins: TickLabelMargins = undefined, + chartHasAxisLabels: boolean = undefined, + axisLabels: MekkoChartAxesLabels = undefined; + + while (!doneWithMargins && numIterations < maxIterations) { + numIterations++; + + tickLabelMargins = labelUtils.getTickLabelMargins( + { width, height: viewport.height }, + leftRightMarginLimit, + textMeasurementService.measureSvgTextWidth, + textMeasurementService.estimateSvgTextHeight, + axes, + this.bottomMarginLimit, + xAxisTextProperties, + y1AxisTextProperties, + null, + false, + this.isXScrollBarVisible || this.isYScrollBarVisible, + showY1OnRight, + renderXAxis, + renderY1Axis, + renderY2Axis); + + // We look at the y axes as main and second sides, if the y axis orientation is right so the main side represents the right side + let maxMainYaxisSide: number = showY1OnRight + ? tickLabelMargins.yRight + : tickLabelMargins.yLeft; + + let maxSecondYaxisSide: number = showY1OnRight + ? tickLabelMargins.yLeft + : tickLabelMargins.yRight; + + let xMax: number = renderXAxis + ? (tickLabelMargins.xMax / MekkoChart.TickLabelMarginsXMaxFactor) + : 0; - let xMax: number = renderXAxis - ? (tickLabelMargins.xMax / MekkoChart.TickLabelMarginsXMaxFactor) - : 0; + maxMainYaxisSide += MekkoChart.LeftPadding; + maxSecondYaxisSide += MekkoChart.RightPadding; + xMax += MekkoChart.BottomPadding; - maxMainYaxisSide += MekkoChart.LeftPadding; - maxSecondYaxisSide += MekkoChart.RightPadding; - xMax += MekkoChart.BottomPadding; + const rotataionEnabled = (this.layers[0]).getXAxisLabelsSettings().enableRotataion; - const rotataionEnabled = (this.layers[0]).getXAxisLabelsSettings().enableRotataion; + if (rotataionEnabled) { + let axes: MekkoChartAxisProperties = this.axes = axisUtils.calculateAxes( + this.layers, + this.currentViewport, + this.margin, + this.categoryAxisProperties, + this.valueAxisProperties, + this.isXScrollBarVisible || this.isYScrollBarVisible, + null); - if (rotataionEnabled) { - xMax += this.calculateXAxisAdditionalHeight(axes.x.values); - } + xMax += this.calculateXAxisAdditionalHeight(axes.x.values); + } - if (this.hideAxisLabels(this.legendMargins)) { - axes.x.axisLabel = null; - axes.y1.axisLabel = null; + if (this.hideAxisLabels(this.legendMargins)) { + axes.x.axisLabel = null; + axes.y1.axisLabel = null; - if (axes.y2) { - axes.y2.axisLabel = null; - } + if (axes.y2) { + axes.y2.axisLabel = null; } + } - this.addUnitTypeToAxisLabel(axes); - - axisLabels = { - x: axes.x.axisLabel, - y: axes.y1.axisLabel, - y2: axes.y2 - ? axes.y2.axisLabel - : null - }; + this.addUnitTypeToAxisLabel(axes); + axisLabels = { + x: axes.x.axisLabel, + y: axes.y1.axisLabel, + y2: axes.y2 + ? axes.y2.axisLabel + : null + }; - chartHasAxisLabels = (axisLabels.x != null) - || (axisLabels.y != null || axisLabels.y2 != null); + chartHasAxisLabels = (axisLabels.x != null) + || (axisLabels.y != null || axisLabels.y2 != null); - if (axisLabels.x != null) { - xMax += MekkoChart.XAxisLabelPadding; - } + if (axisLabels.x != null) { + xMax += MekkoChart.XAxisLabelPadding; + } - if (axisLabels.y != null) { - maxMainYaxisSide += MekkoChart.YAxisLabelPadding; - } + if (axisLabels.y != null) { + maxMainYaxisSide += MekkoChart.YAxisLabelPadding; + } - if (axisLabels.y2 != null) { - maxSecondYaxisSide += MekkoChart.YAxisLabelPadding; - } + if (axisLabels.y2 != null) { + maxSecondYaxisSide += MekkoChart.YAxisLabelPadding; + } - margin.left = showY1OnRight - ? maxSecondYaxisSide - : maxMainYaxisSide; + margin.left = showY1OnRight + ? maxSecondYaxisSide + : maxMainYaxisSide; - margin.right = showY1OnRight - ? maxMainYaxisSide - : maxSecondYaxisSide; + margin.right = showY1OnRight + ? maxMainYaxisSide + : maxSecondYaxisSide; - margin.bottom = xMax; + margin.bottom = xMax; - this.margin = margin; + this.margin = margin; - width = viewport.width - (margin.left + margin.right); + width = viewport.width - (margin.left + margin.right); - // re-calculate the axes with the new margins - const previousTickCountY1: number = axes.y1.values.length, - previousTickCountY2: number = axes.y2 && axes.y2.values.length; + // re-calculate the axes with the new margins + const previousTickCountY1: number = axes.y1.values.length, + previousTickCountY2: number = axes.y2 && axes.y2.values.length; - axes = axis.utils.calculateAxes( - this.layers, - viewport, - margin, - this.categoryAxisProperties, - this.valueAxisProperties, - this.isXScrollBarVisible || this.isYScrollBarVisible, - axes); + axes = axisUtils.calculateAxes( + this.layers, + viewport, + margin, + this.categoryAxisProperties, + this.valueAxisProperties, + this.isXScrollBarVisible || this.isYScrollBarVisible, + axes); - if (axes.y1.values.length === previousTickCountY1 - && (!axes.y2 || axes.y2.values.length === previousTickCountY2)) { - doneWithMargins = true; - } + if (axes.y1.values.length === previousTickCountY1 + && (!axes.y2 || axes.y2.values.length === previousTickCountY2)) { + doneWithMargins = true; } - - const renderChartOptions: MekkoChartRenderOptions = { - axes: axes, - width: width, - tickLabelMargins: tickLabelMargins, - chartHasAxisLabels: chartHasAxisLabels, - axisLabels: axisLabels, - viewport: viewport, - suppressAnimations: suppressAnimations - }; - - this.renderChart(renderChartOptions); } - private hideAxisLabels(legendMargins: IViewport): boolean { - if (this.cartesianSmallViewPortProperties) { - if (this.cartesianSmallViewPortProperties.hideAxesOnSmallViewPort - && ((this.currentViewport.height + legendMargins.height) - < this.cartesianSmallViewPortProperties.MinHeightAxesVisible)) { + this.renderChart( + mainAxisScale, + axes, + width, + tickLabelMargins, + chartHasAxisLabels, + axisLabels, + viewport, + suppressAnimations); + } - return true; - } - } + private hideAxisLabels(legendMargins: IViewport): boolean { + if (this.cartesianSmallViewPortProperties) { + if (this.cartesianSmallViewPortProperties.hideAxesOnSmallViewPort + && ((this.currentViewport.height + legendMargins.height) + < this.cartesianSmallViewPortProperties.MinHeightAxesVisible)) { - return false; + return true; + } } - private static getUnitType( - axis: MekkoChartAxisProperties, - axisPropertiesLookup: (axis: MekkoChartAxisProperties) => IAxisProperties): string { + return false; + } - if (axisPropertiesLookup(axis).formatter && - axisPropertiesLookup(axis).formatter.displayUnit && - axisPropertiesLookup(axis).formatter.displayUnit.value > 1) { + private static getUnitType( + axis: MekkoChartAxisProperties, + axisPropertiesLookup: (axis: MekkoChartAxisProperties) => IAxisProperties): string { - return axisPropertiesLookup(axis).formatter.displayUnit.title; - } + if (axisPropertiesLookup(axis).formatter && + axisPropertiesLookup(axis).formatter.displayUnit && + axisPropertiesLookup(axis).formatter.displayUnit.value > 1) { - return null; + return axisPropertiesLookup(axis).formatter.displayUnit.title; } - private getMaxMarginFactor(): number { - return MekkoChart.MaxMarginFactor; - } + return null; + } - private static getChartViewport( - viewport: IViewport, - margin: IMargin): IViewport { + private getMaxMarginFactor(): number { + return MekkoChart.MaxMarginFactor; + } - return { - width: viewport.width - margin.left - margin.right, - height: viewport.height - margin.top - margin.bottom - }; - } + private static getChartViewport( + viewport: IViewport, + margin: IMargin): IViewport { - private static wordBreak( - text: Selection, - axisProperties: IAxisProperties, - columnsWidth: number[], - maxHeight: number, - borderWidth: number): void { + return { + width: viewport.width - margin.left - margin.right, + height: viewport.height - margin.top - margin.bottom + }; + } - text.each(function (data: any, index: number) { - let width: number, - allowedLength: number; + private static wordBreak( + text: Selection, + axisProperties: IAxisProperties, + columnsWidth: number[], + maxHeight: number, + borderWidth: number): void { - const node: Selection = d3.select(this); + text.each(function (data: any, index: number) { + let width: number, + allowedLength: number; - if (columnsWidth.length >= index) { - width = columnsWidth[index]; - allowedLength = axisProperties.scale(width); - } else { - allowedLength = axisProperties.xLabelMaxWidth; - } + const node: Selection = select(this); - node - .classed(MekkoChart.LabelMiddleSelector.className, true) - .attr({ - "dx": MekkoChart.DefaultLabelDx, - "dy": MekkoChart.DefaultLabelDy, - "transform": MekkoChart.DefaultLabelRotate - }); - - textMeasurementService.wordBreak( - this, - allowedLength, - axisProperties.willLabelsWordBreak - ? maxHeight - : 0); - }); - } + if (columnsWidth.length >= index) { + width = columnsWidth[index]; + allowedLength = axisProperties.scale(width); + } else { + allowedLength = axisProperties.xLabelMaxWidth; + } + + node + .classed(MekkoChart.LabelMiddleSelector.className, true) + .attr("dx", MekkoChart.DefaultLabelDx) + .attr("dy", MekkoChart.DefaultLabelDy) + .attr("transform", MekkoChart.DefaultLabelRotate); + + textMeasurementService.wordBreak( + this, + allowedLength, + axisProperties.willLabelsWordBreak + ? maxHeight + : 0); + }); + } - private renderChart(options: MekkoChartRenderOptions) { - - const bottomMarginLimit: number = this.bottomMarginLimit, - leftRightMarginLimit: number = this.leftRightMarginLimit, - layers: IColumnChart[] = this.layers, - duration: number = MekkoChart.AnimationDuration, - chartViewport: IViewport = MekkoChart.getChartViewport(options.viewport, this.margin); - - let xLabelColor: Fill, - yLabelColor: Fill, - y2LabelColor: Fill, - xFontSize: any, - yFontSize: any; - - if (this.shouldRenderAxis(options.axes.x)) { - if (options.axes.x.isCategoryAxis) { - xLabelColor = this.categoryAxisProperties - && this.categoryAxisProperties["labelColor"] - ? this.categoryAxisProperties["labelColor"] - : null; - - xFontSize = this.categoryAxisProperties - && this.categoryAxisProperties["fontSize"] != null - ? this.categoryAxisProperties["fontSize"] - : MekkoChart.DefaultLabelFontSizeInPt; - } else { - xLabelColor = this.valueAxisProperties - && this.valueAxisProperties["labelColor"] - ? this.valueAxisProperties["labelColor"] - : null; - - xFontSize = this.valueAxisProperties - && this.valueAxisProperties["fontSize"] - ? this.valueAxisProperties["fontSize"] - : MekkoChart.DefaultLabelFontSizeInPt; - } + private renderChart( + mainAxisScale: any, + axes: MekkoChartAxisProperties, + width: number, + tickLabelMargins: any, + chartHasAxisLabels: boolean, + axisLabels: MekkoChartAxesLabels, + viewport: IViewport, + suppressAnimations: boolean, + scrollScale?: any, + extent?: number[]) { + + const bottomMarginLimit: number = this.bottomMarginLimit, + leftRightMarginLimit: number = this.leftRightMarginLimit, + layers: IColumnChart[] = this.layers, + duration: number = MekkoChart.AnimationDuration, + chartViewport: IViewport = MekkoChart.getChartViewport(viewport, this.margin); + + let xLabelColor: Fill, + yLabelColor: Fill, + y2LabelColor: Fill, + xFontSize: any, + yFontSize: any; + + if (this.shouldRenderAxis(axes.x)) { + if (axes.x.isCategoryAxis) { + xLabelColor = this.categoryAxisProperties + && this.categoryAxisProperties["labelColor"] + ? this.categoryAxisProperties["labelColor"] + : MekkoChart.DefaultSettings.categoryAxis.labelColor; + + xFontSize = this.categoryAxisProperties + && this.categoryAxisProperties["fontSize"] != null + ? this.categoryAxisProperties["fontSize"] + : MekkoChart.DefaultLabelFontSizeInPt; + } else { + xLabelColor = this.valueAxisProperties + && this.valueAxisProperties["labelColor"] + ? this.valueAxisProperties["labelColor"] + : MekkoChart.DefaultSettings.valueAxis.labelColor; - xFontSize = PixelConverter.fromPointToPixel(xFontSize); + xFontSize = this.valueAxisProperties + && this.valueAxisProperties["fontSize"] + ? this.valueAxisProperties["fontSize"] + : MekkoChart.DefaultLabelFontSizeInPt; + } - options.axes.x.axis.orient("bottom"); - if (!options.axes.x.willLabelsFit) { - options.axes.x.axis.tickPadding(MekkoChart.TickPaddingRotatedX); - } + xFontSize = PixelConverter.fromPointToPixel(xFontSize); - const xAxisGraphicsElement: Selection = this.xAxisGraphicsContext; + // axes.x.axis.orient("bottom"); + if (!axes.x.willLabelsFit) { + axes.x.axis.tickPadding(MekkoChart.TickPaddingRotatedX); + } - if (duration) { - xAxisGraphicsElement - .transition() - .duration(duration) - .call(options.axes.x.axis); - } - else { - xAxisGraphicsElement - .call(options.axes.x.axis); - } + const xAxisGraphicsElement: Selection = this.xAxisGraphicsContext; + if (duration) { xAxisGraphicsElement - .call(MekkoChart.darkenZeroLine) - .call(MekkoChart.setAxisLabelColor, xLabelColor) - .call(MekkoChart.setAxisLabelFontSize, xFontSize); + .transition() + .duration(duration) + .call(axes.x.axis); + } + else { + xAxisGraphicsElement + .call(axes.x.axis); + } - const xAxisTextNodes: Selection = xAxisGraphicsElement.selectAll("text"); + xAxisGraphicsElement + .call(MekkoChart.darkenZeroLine) + .call(MekkoChart.setAxisLabelColor, xLabelColor) + .call(MekkoChart.setAxisLabelFontSize, xFontSize); - let columnWidth: number[] = [], - borderWidth: number = 0; + const xAxisTextNodes: Selection = xAxisGraphicsElement.selectAll("text"); - if (this.layers && this.layers.length) { - columnWidth = this.layers[0].getColumnsWidth(); - borderWidth = this.layers[0].getBorderWidth(); - } + let columnWidth: number[] = [], + borderWidth: number = 0; - xAxisGraphicsElement + if (this.layers && this.layers.length) { + columnWidth = this.layers[0].getColumnsWidth(); + borderWidth = this.layers[0].getBorderWidth(); + } + + xAxisGraphicsElement + .call( + MekkoChart.moveBorder, + axes.x.scale, + borderWidth, + xFontSize / MekkoChart.XFontSizeDelimiter - MekkoChart.XFontSizeOffset); + + let xAxisLabelssettings: MekkoXAxisLabelsSettings = (this.layers[0]).getXAxisLabelsSettings(); + if (!xAxisLabelssettings.enableRotataion) { + xAxisTextNodes .call( - MekkoChart.moveBorder, - options.axes.x.scale, - borderWidth, - xFontSize / MekkoChart.XFontSizeDelimiter - MekkoChart.XFontSizeOffset); - - let xAxisLabelssettings: MekkoXAxisLabelsSettings = (this.layers[0]).getXAxisLabelsSettings(); - if (!xAxisLabelssettings.enableRotataion) { - xAxisTextNodes - .call( - MekkoChart.wordBreak, - options.axes.x, - columnWidth, - bottomMarginLimit, - borderWidth); - } - else { - xAxisTextNodes - .classed(MekkoChart.LabelMiddleSelector.className, true) - .attr({ - "dx": MekkoChart.DefaultLabelDx, - "dy": MekkoChart.DefaultLabelDy, - "transform": `rotate(-${MekkoChart.CategoryTextRotataionDegree})` + MekkoChart.wordBreak, + axes.x, + columnWidth, + bottomMarginLimit, + borderWidth); + } + else { + xAxisTextNodes + .classed(MekkoChart.LabelMiddleSelector.className, true) + .attr("dx", MekkoChart.DefaultLabelDx) + .attr("dy", MekkoChart.DefaultLabelDy) + .attr("transform", `rotate(-${MekkoChart.CategoryTextRotataionDegree})`); + + // fix positions + let categoryLabels = xAxisGraphicsElement.selectAll(".tick"); + categoryLabels.each(function (tick, index) { + let shiftX: number = (this).getBBox().width / Math.tan(MekkoChart.CategoryTextRotataionDegree * Math.PI / 180) / 2.0; + let shiftY: number = (this).getBBox().width * Math.tan(MekkoChart.CategoryTextRotataionDegree * Math.PI / 180) / 2.0; + let currTransform: string = (this).attributes.transform.value; + let translate: [number, number, number] = MekkoChart.getTranslation(currTransform); + select(this) + .attr("transform", (value: number, index: number) => { + return manipulation.translate(+translate[0] - shiftX, +translate[1] + shiftY); }); + }); + } + } + else { + this.xAxisGraphicsContext + .selectAll("*") + .remove(); + } - // fix positions - let categoryLabels = xAxisGraphicsElement.selectAll(".tick"); - categoryLabels.each(function (tick, index) { - let shiftX: number = this.getBBox().width / Math.tan(MekkoChart.CategoryTextRotataionDegree * Math.PI / 180) / 2.0; - let shiftY: number = this.getBBox().width * Math.tan(MekkoChart.CategoryTextRotataionDegree * Math.PI / 180) / 2.0; - let currTransform: string = this.attributes.transform.value; - let translate: [number, number] = d3.transform(currTransform).translate; - d3.select(this) - .attr("transform", (value: number, index: number) => { - return SVGUtil.translate(+translate[0] - shiftX, +translate[1] + shiftY); - }); - }); - } + if (this.shouldRenderAxis(axes.y1)) { + if (axes.y1.isCategoryAxis) { + yLabelColor = this.categoryAxisProperties && this.categoryAxisProperties["labelColor"] + ? this.categoryAxisProperties["labelColor"] + : null; + + yFontSize = this.categoryAxisProperties && this.categoryAxisProperties["fontSize"] != null + ? this.categoryAxisProperties["fontSize"] + : MekkoChart.DefaultLabelFontSizeInPt; + } else { + yLabelColor = this.valueAxisProperties && this.valueAxisProperties["labelColor"] + ? this.valueAxisProperties["labelColor"] + : null; + + yFontSize = this.valueAxisProperties && this.valueAxisProperties["fontSize"] != null + ? this.valueAxisProperties["fontSize"] + : MekkoChart.DefaultLabelFontSizeInPt; + } + + yFontSize = PixelConverter.fromPointToPixel(yFontSize); + + const yAxisOrientation: string = this.yAxisOrientation, + showY1OnRight: boolean = yAxisOrientation === axisPosition.right; + + axes.y1.axis + .tickSize(-width) + .tickPadding(MekkoChart.TickPaddingY); + + const y1AxisGraphicsElement: Selection = this.y1AxisGraphicsContext; + + if (duration) { + y1AxisGraphicsElement + .transition() + .duration(duration) + .call(axes.y1.axis); } else { - this.xAxisGraphicsContext - .selectAll("*") - .remove(); + y1AxisGraphicsElement + .call(axes.y1.axis); } - if (this.shouldRenderAxis(options.axes.y1)) { - if (options.axes.y1.isCategoryAxis) { - yLabelColor = this.categoryAxisProperties && this.categoryAxisProperties["labelColor"] - ? this.categoryAxisProperties["labelColor"] - : null; - - yFontSize = this.categoryAxisProperties && this.categoryAxisProperties["fontSize"] != null - ? this.categoryAxisProperties["fontSize"] - : MekkoChart.DefaultLabelFontSizeInPt; - } else { - yLabelColor = this.valueAxisProperties && this.valueAxisProperties["labelColor"] - ? this.valueAxisProperties["labelColor"] - : null; - - yFontSize = this.valueAxisProperties && this.valueAxisProperties["fontSize"] != null - ? this.valueAxisProperties["fontSize"] - : MekkoChart.DefaultLabelFontSizeInPt; - } + y1AxisGraphicsElement + .call(MekkoChart.darkenZeroLine) + .call(MekkoChart.setAxisLabelColor, yLabelColor) + .call(MekkoChart.setAxisLabelFontSize, yFontSize); - yFontSize = PixelConverter.fromPointToPixel(yFontSize); + if (tickLabelMargins.yLeft >= leftRightMarginLimit) { + y1AxisGraphicsElement + .selectAll("text") + .call(AxisHelper.LabelLayoutStrategy.clip, + leftRightMarginLimit - MekkoChart.LeftPadding, + textMeasurementService.svgEllipsis); + } - const yAxisOrientation: string = this.yAxisOrientation, - showY1OnRight: boolean = yAxisOrientation === axis.position.right; + if (axes.y2 + && (!this.valueAxisProperties + || this.valueAxisProperties["secShow"] == null + || this.valueAxisProperties["secShow"])) { - options.axes.y1.axis - .tickSize(-options.width) - .tickPadding(MekkoChart.TickPaddingY) - .orient(yAxisOrientation.toLowerCase()); + y2LabelColor = this.valueAxisProperties && this.valueAxisProperties["secLabelColor"] + ? this.valueAxisProperties["secLabelColor"] + : null; - const y1AxisGraphicsElement: Selection = this.y1AxisGraphicsContext; + axes.y2.axis + .tickPadding(MekkoChart.TickPaddingY); if (duration) { - y1AxisGraphicsElement + this.y2AxisGraphicsContext .transition() .duration(duration) - .call(options.axes.y1.axis); + .call(axes.y2.axis); } else { - y1AxisGraphicsElement - .call(options.axes.y1.axis); + this.y2AxisGraphicsContext + .call(axes.y2.axis); } - y1AxisGraphicsElement + this.y2AxisGraphicsContext .call(MekkoChart.darkenZeroLine) - .call(MekkoChart.setAxisLabelColor, yLabelColor) - .call(MekkoChart.setAxisLabelFontSize, yFontSize); + .call(MekkoChart.setAxisLabelColor, y2LabelColor); - if (options.tickLabelMargins.yLeft >= leftRightMarginLimit) { - y1AxisGraphicsElement + if (tickLabelMargins.yRight >= leftRightMarginLimit) { + this.y2AxisGraphicsContext .selectAll("text") .call(AxisHelper.LabelLayoutStrategy.clip, - leftRightMarginLimit - MekkoChart.LeftPadding, + leftRightMarginLimit - MekkoChart.RightPadding, textMeasurementService.svgEllipsis); } - - if (options.axes.y2 - && (!this.valueAxisProperties - || this.valueAxisProperties["secShow"] == null - || this.valueAxisProperties["secShow"])) { - - y2LabelColor = this.valueAxisProperties && this.valueAxisProperties["secLabelColor"] - ? this.valueAxisProperties["secLabelColor"] - : null; - - options.axes.y2.axis - .tickPadding(MekkoChart.TickPaddingY) - .orient(showY1OnRight - ? axis.position.left.toLowerCase() - : axis.position.right.toLowerCase()); - - if (duration) { - this.y2AxisGraphicsContext - .transition() - .duration(duration) - .call(options.axes.y2.axis); - } - else { - this.y2AxisGraphicsContext - .call(options.axes.y2.axis); - } - - this.y2AxisGraphicsContext - .call(MekkoChart.darkenZeroLine) - .call(MekkoChart.setAxisLabelColor, y2LabelColor); - - if (options.tickLabelMargins.yRight >= leftRightMarginLimit) { - this.y2AxisGraphicsContext - .selectAll("text") - .call(AxisHelper.LabelLayoutStrategy.clip, - leftRightMarginLimit - MekkoChart.RightPadding, - textMeasurementService.svgEllipsis); - } - } - else { - this.y2AxisGraphicsContext - .selectAll("*") - .remove(); - } } else { - this.y1AxisGraphicsContext - .selectAll("*") - .remove(); - this.y2AxisGraphicsContext .selectAll("*") .remove(); } + } + else { + this.y1AxisGraphicsContext + .selectAll("*") + .remove(); - this.translateAxes(options.viewport); - - // Axis labels - if (options.chartHasAxisLabels) { - const hideXAxisTitle: boolean = !this.shouldRenderAxis( - options.axes.x, - MekkoChart.ShowAxisTitlePropertyName); - - const hideYAxisTitle: boolean = !this.shouldRenderAxis( - options.axes.y1, - MekkoChart.ShowAxisTitlePropertyName); - - const hideY2AxisTitle: boolean = this.valueAxisProperties - && this.valueAxisProperties[MekkoChart.SecondShowAxisTitlePropertyName] != null - && this.valueAxisProperties[MekkoChart.SecondShowAxisTitlePropertyName] === false; - - const renderAxisOptions: MekkoAxisRenderingOptions = { - axisLabels: options.axisLabels, - legendMargin: this.legendMargins.height, - viewport: options.viewport, - hideXAxisTitle: hideXAxisTitle, - hideYAxisTitle: hideYAxisTitle, - hideY2AxisTitle: hideY2AxisTitle, - xLabelColor: xLabelColor, - yLabelColor: yLabelColor, - y2LabelColor: y2LabelColor, - margin: undefined - }; + this.y2AxisGraphicsContext + .selectAll("*") + .remove(); + } - this.renderAxesLabels(renderAxisOptions, xFontSize); - } - else { - this.axisGraphicsContext - .selectAll(MekkoChart.XAxisLabelSelector.selectorName) - .remove(); + this.translateAxes(viewport); - this.axisGraphicsContext - .selectAll(MekkoChart.XAxisLabelSelector.selectorName) - .selectAll(MekkoChart.YAxisLabelSelector.selectorName) - .remove(); - } + // Axis labels + if (chartHasAxisLabels) { + const hideXAxisTitle: boolean = !this.shouldRenderAxis( + axes.x, + MekkoChart.ShowAxisTitlePropertyName); - let dataPoints: SelectableDataPoint[] = [], - layerBehaviorOptions: any[] = []; + const hideYAxisTitle: boolean = !this.shouldRenderAxis( + axes.y1, + MekkoChart.ShowAxisTitlePropertyName); - if (this.behavior) { - let resultsLabelDataPoints: LabelDataPoint[] = []; + const hideY2AxisTitle: boolean = this.valueAxisProperties + && this.valueAxisProperties[MekkoChart.SecondShowAxisTitlePropertyName] != null + && this.valueAxisProperties[MekkoChart.SecondShowAxisTitlePropertyName] === false; - for (let layerIndex: number = 0; layerIndex < layers.length; layerIndex++) { - const result: MekkoVisualRenderResult = layers[layerIndex].render(options.suppressAnimations); + const renderAxisOptions: MekkoAxisRenderingOptions = { + axisLabels: axisLabels, + legendMargin: this.legendMargins.height, + viewport: viewport, + hideXAxisTitle: hideXAxisTitle, + hideYAxisTitle: hideYAxisTitle, + hideY2AxisTitle: hideY2AxisTitle, + xLabelColor: xLabelColor, + yLabelColor: yLabelColor, + y2LabelColor: y2LabelColor, + margin: undefined + }; - if (result) { - dataPoints = dataPoints.concat(result.dataPoints); - layerBehaviorOptions.push(result.behaviorOptions); + this.renderAxesLabels(renderAxisOptions, xFontSize); + } + else { + this.axisGraphicsContext + .selectAll(MekkoChart.XAxisLabelSelector.selectorName) + .remove(); - resultsLabelDataPoints = resultsLabelDataPoints.concat(result.labelDataPoints); - } - } + this.axisGraphicsContext + .selectAll(MekkoChart.XAxisLabelSelector.selectorName) + .selectAll(MekkoChart.YAxisLabelSelector.selectorName) + .remove(); + } - let forceDisplay: boolean = ((layers[0].getData()).labelSettings).forceDisplay; + let dataPoints: SelectableDataPoint[] = [], + layerBehaviorOptions: any[] = []; - drawDefaultLabelsForDataPointChart( - resultsLabelDataPoints, - this.labelGraphicsContextScrollable, - this.getLabelLayout(forceDisplay), - this.currentViewport, false, 0, false, !forceDisplay); + if (this.behavior) { + let resultsLabelDataPoints: LabelDataPoint[] = []; - if (this.interactivityService) { - const behaviorOptions: CustomVisualBehaviorOptions = { - layerOptions: layerBehaviorOptions, - clearCatcher: this.clearCatcher, - }; + for (let layerIndex: number = 0; layerIndex < layers.length; layerIndex++) { + const result: MekkoVisualRenderResult = layers[layerIndex].render(suppressAnimations); + + if (result) { + dataPoints = dataPoints.concat(result.dataPoints); + layerBehaviorOptions.push(result.behaviorOptions); - this.interactivityService.bind( - dataPoints, - this.behavior, - behaviorOptions); + resultsLabelDataPoints = resultsLabelDataPoints.concat(result.labelDataPoints); } } + + let forceDisplay: boolean = ((layers[0].getData()).labelSettings).forceDisplay; + + drawDefaultLabelsForDataPointChart( + resultsLabelDataPoints, + this.labelGraphicsContextScrollable, + this.getLabelLayout(forceDisplay), + this.currentViewport, false, 0, false, !forceDisplay); + + if (this.interactivityService) { + const behaviorOptions: CustomVisualBehaviorOptions = { + layerOptions: layerBehaviorOptions, + clearCatcher: this.clearCatcher, + }; + + this.interactivityService.bind( + dataPoints, + this.behavior, + behaviorOptions); + } } + } - private getLabelLayout(forceDisplay: boolean = false): ILabelLayout { - return { - labelText: (dataPoint: LabelDataPoint) => { - return dataPoint.text; - }, - labelLayout: { - x: (dataPoint: LabelDataPoint) => { - return dataPoint.parentRect.left - + dataPoint.parentRect.width / MekkoChart.WidthDelimiter; - }, - y: (dataPoint: LabelDataPoint) => { - return dataPoint.parentRect.top - + dataPoint.parentRect.height / MekkoChart.WidthDelimiter; - } - }, - filter: (dataPoint: LabelDataPoint) => { - return dataPoint != null - && dataPoint.size.height < dataPoint.parentRect.height - && dataPoint.size.width < dataPoint.parentRect.width || (forceDisplay && dataPoint.parentRect.height > 6 && dataPoint.size.height > 0); + private getLabelLayout(forceDisplay: boolean = false): ILabelLayout { + return { + labelText: (dataPoint: LabelDataPoint) => { + return dataPoint.text; + }, + labelLayout: { + x: (dataPoint: LabelDataPoint) => { + return dataPoint.parentRect.left + + dataPoint.parentRect.width / MekkoChart.WidthDelimiter; }, - style: { - "fill": (dataPoint: LabelDataPoint) => { - return dataPoint.fillColor; - } + y: (dataPoint: LabelDataPoint) => { + return dataPoint.parentRect.top + + dataPoint.parentRect.height / MekkoChart.WidthDelimiter; + } + }, + filter: (dataPoint: LabelDataPoint) => { + return dataPoint != null + && dataPoint.size.height < dataPoint.parentRect.height + && dataPoint.size.width < dataPoint.parentRect.width || (forceDisplay && dataPoint.parentRect.height > 6 && dataPoint.size.height > 0); + }, + style: { + "fill": (dataPoint: LabelDataPoint) => { + return dataPoint.fillColor; } - }; - } - - /** - * Within the context of the given selection (g), find the offset of - * the zero tick using the d3 attached datum of g.tick elements. - * "Classed" is undefined for transition selections - */ - private static darkenZeroLine(selection: Selection): void { - const zeroTick: Node = MekkoChart.getTicks(selection) - .filter((data: any) => data === 0) - .node(); - - if (zeroTick) { - d3.select(zeroTick) - .select("line") - .classed(MekkoChart.ZeroLineSelector.className, true); } - } + }; + } - private static getTicks(selection: Selection): Selection { - return selection.selectAll("g.tick"); + /** + * Within the context of the given selection (g), find the offset of + * the zero tick using the d3 attached datum of g.tick elements. + * "Classed" is undefined for transition selections + */ + private static darkenZeroLine(selection: Selection): void { + const zeroTick: any = MekkoChart.getTicks(selection) + .filter((data: any) => data === 0) + .node(); + + if (zeroTick) { + select(zeroTick) + .select("line") + .classed(MekkoChart.ZeroLineSelector.className, true); } + } - private static getTickText(selection: Selection): Selection { - return selection.selectAll("g.tick text"); - } + private static getTicks(selection: Selection): Selection { + return selection.selectAll("g.tick"); + } - private static setAxisLabelColor(selection: Selection, fill: Fill): void { - MekkoChart.getTickText(selection) - .style("fill", fill ? fill.solid.color : null); - } + private static getTickText(selection: Selection): Selection { + return selection.selectAll("g.tick text"); + } - private static setAxisLabelFontSize(selection: Selection, fontSize: number): void { - MekkoChart.getTickText(selection) - .attr("font-size", PixelConverter.toString(fontSize)); - } + private static setAxisLabelColor(selection: Selection, fill: Fill): void { + MekkoChart.getTickText(selection) + .style("fill", fill ? fill.solid.color : null); + } - private static moveBorder( - selection: Selection, - scale: LinearScale, - borderWidth: number, - yOffset: number = 0): void { + private static setAxisLabelFontSize(selection: Selection, fontSize: number): void { + MekkoChart.getTickText(selection) + .attr("font-size", PixelConverter.toString(fontSize)); + } - MekkoChart.getTicks(selection) - .attr("transform", (value: number, index: number) => { - return SVGUtil.translate(scale(value) + (borderWidth * index), yOffset); - }); - } + private static moveBorder( + selection: Selection, + scale: d3.ScaleLinear, + borderWidth: number, + yOffset: number = 0): void { + + MekkoChart.getTicks(selection) + .attr("transform", (value: number, index: number) => { + return manipulation.translate(scale(value) + (borderWidth * index), yOffset); + }); } +} - export function createLayers( - type: MekkoChartType, - objects: IDataViewObjects, - interactivityService: IInteractivityService, - isScrollable: boolean = true): IColumnChart[] { +export function createLayers( + type: MekkoChartType, + objects: powerbi.DataViewObjects, + interactivityService: IInteractivityService, + isScrollable: boolean = true): IColumnChart[] { - const layers: IColumnChart[] = []; + const layers: IColumnChart[] = []; - const cartesianOptions: MekkoChartConstructorBaseOptions = { - isScrollable, - interactivityService - }; + const cartesianOptions: MekkoChartConstructorBaseOptions = { + isScrollable, + interactivityService + }; - layers.push(createBaseColumnChartLayer( - MekkoVisualChartType.hundredPercentStackedColumn, - cartesianOptions)); + layers.push(createBaseColumnChartLayer( + MekkoVisualChartType.hundredPercentStackedColumn, + cartesianOptions)); - return layers; - } + return layers; } diff --git a/src/visualChartType.ts b/src/visualChartType.ts index bd2bb89..15449c9 100644 --- a/src/visualChartType.ts +++ b/src/visualChartType.ts @@ -24,7 +24,6 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual { export const flagBar: number = 1 << 1; export const flagColumn: number = 1 << 2; export const flagClustered: number = 1 << 3; @@ -43,4 +42,3 @@ module powerbi.extensibility.visual { export enum MekkoChartType { HundredPercentStackedColumn, } -} diff --git a/src/visualStrategy/baseVisualStrategy.ts b/src/visualStrategy/baseVisualStrategy.ts index e25ba6a..62e7731 100644 --- a/src/visualStrategy/baseVisualStrategy.ts +++ b/src/visualStrategy/baseVisualStrategy.ts @@ -24,791 +24,835 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.visualStrategy { - // d3 - import Axis = d3.svg.Axis; - import Selection = d3.Selection; - import LinearScale = d3.scale.Linear; - import UpdateSelection = d3.selection.Update; - - // powerbi.visuals - import ISelectionId = powerbi.visuals.ISelectionId; - - // powerbi.extensibility.utils.svg - import IRect = powerbi.extensibility.utils.svg.IRect; - import IMargin = powerbi.extensibility.utils.svg.IMargin; - import ClassAndSelector = powerbi.extensibility.utils.svg.CssConstants.ClassAndSelector; - import createClassAndSelector = powerbi.extensibility.utils.svg.CssConstants.createClassAndSelector; - - // powerbi.extensibility.utils.chart - import AxisHelper = powerbi.extensibility.utils.chart.axis; - import IAxisProperties = AxisHelper.IAxisProperties; - import CreateAxisOptionsBase = AxisHelper.CreateAxisOptions; - import getLabelPrecision = powerbi.extensibility.utils.chart.dataLabel.utils.getLabelPrecision; - import hundredPercentFormat = powerbi.extensibility.utils.chart.dataLabel.utils.hundredPercentFormat; - import VisualDataLabelsSettings = powerbi.extensibility.utils.chart.dataLabel.VisualDataLabelsSettings; - import IColumnFormatterCacheManager = powerbi.extensibility.utils.chart.dataLabel.IColumnFormatterCacheManager; - import createColumnFormatterCacheManager = powerbi.extensibility.utils.chart.dataLabel.utils.createColumnFormatterCacheManager; - - // powerbi.extensibility.utils.interactivity - import IInteractivityService = powerbi.extensibility.utils.interactivity.IInteractivityService; - - // powerbi.extensibility.utils.formatting - import TextProperties = powerbi.extensibility.utils.formatting.TextProperties; - import valueFormatter = powerbi.extensibility.utils.formatting.valueFormatter; - import IValueFormatter = powerbi.extensibility.utils.formatting.IValueFormatter; - import textMeasurementService = powerbi.extensibility.utils.formatting.textMeasurementService; - - // powerbi.extensibility.utils.type - import ValueType = powerbi.extensibility.utils.type.ValueType; - import PixelConverter = powerbi.extensibility.utils.type.PixelConverter; - - import ValueTypeDescriptor = powerbi.ValueTypeDescriptor; - - interface LayoutFunction { - (dataPoint: MekkoChartColumnDataPoint): number; - } +import powerbi from "powerbi-visuals-api"; - export class BaseVisualStrategy implements IVisualStrategy { - private static ItemSelector: ClassAndSelector = createClassAndSelector("column"); - private static BorderSelector: ClassAndSelector = createClassAndSelector("mekkoborder"); - private static InteractiveHoverLineSelector: ClassAndSelector = createClassAndSelector("interactive-hover-line"); - private static DragHandleSelector: ClassAndSelector = createClassAndSelector("drag-handle"); +import DataViewMetadataColumn = powerbi.DataViewMetadataColumn; +import DataViewPropertyValue = powerbi.DataViewPropertyValue; +import ValueRange = powerbi.ValueRange; - private static TickLabelPaddingFactor: number = 2; - private static ColumnDataPointValueDelimiter: number = 2; +import { DataWrapper } from "./../dataWrapper"; +import * as utils from "./../utils"; - private static DefaultInnerPaddingRatio: number = 1; +import { + IMargin, + CssConstants, + IRect +} + from "powerbi-visuals-utils-svgutils"; - private static CircleRadius: number = 6; +import { + interactivityService, +} + from "powerbi-visuals-utils-interactivityutils"; - private static CategoryWidthDelimiter: number = 2; +import { + valueFormatter as vf +} + from "powerbi-visuals-utils-formattingutils"; - private static DefaultLabelFillColor: string = "#ffffff"; +import { + axis as AxisHelper, + axisInterfaces, + dataLabelUtils, + dataLabelInterfaces, +} + from "powerbi-visuals-utils-chartutils"; + +import { + MekkoColumnChartData, + MekkoChartCategoryLayout, + MekkoChartSeries, + MekkoChartDrawInfo, + MekkoChartColumnDataPoint, + MekkoColumnChartContext, + CreateAxisOptions, + MekkoColumnAxisOptions, + IMekkoColumnLayout, + MekkoCreateAxisOptions, + MekkoChartData, + LabelDataPoint +} from "./../dataInterfaces"; + +import { IVisualStrategy } from "./visualStrategy"; + +import * as columnChart from "./../columnChart/baseColumnChart"; + +import { MekkoChart } from "./../visual"; + +import { valueType, pixelConverter as PixelConverter } from "powerbi-visuals-utils-typeutils"; + +// d3 +import * as d3selection from "d3-selection"; +import * as d3scale from "d3-scale"; +import { axisLeft, axisBottom } from "d3-axis"; +import Selection = d3selection.Selection; + +// powerbi.extensibility.utils.svg +import ClassAndSelector = CssConstants.ClassAndSelector; +import createClassAndSelector = CssConstants.createClassAndSelector; + +// powerbi.extensibility.utils.chart +import IAxisProperties = axisInterfaces.IAxisProperties; +import hundredPercentFormat = dataLabelUtils.hundredPercentFormat; +import VisualDataLabelsSettings = dataLabelInterfaces.VisualDataLabelsSettings; +import IColumnFormatterCacheManager = dataLabelInterfaces.IColumnFormatterCacheManager; +import createColumnFormatterCacheManager = dataLabelUtils.createColumnFormatterCacheManager; + +// powerbi.extensibility.utils.interactivity +import IInteractivityService = interactivityService.IInteractivityService; + +// powerbi.extensibility.utils.formatting +import valueFormatter = vf.valueFormatter; +import IValueFormatter = vf.IValueFormatter; + +// powerbi.extensibility.utils.type +import ValueType = valueType.ValueType; + +import ValueTypeDescriptor = powerbi.ValueTypeDescriptor; + +interface LayoutFunction { + (dataPoint: MekkoChartColumnDataPoint): number; +} - private static PercentageFormat: string = "#,0.##%"; +export class BaseVisualStrategy implements IVisualStrategy { + private static ItemSelector: ClassAndSelector = createClassAndSelector("column"); + private static BorderSelector: ClassAndSelector = createClassAndSelector("mekkoborder"); + private static InteractiveHoverLineSelector: ClassAndSelector = createClassAndSelector("interactive-hover-line"); + private static DragHandleSelector: ClassAndSelector = createClassAndSelector("drag-handle"); - private layout: IMekkoColumnLayout; - private data: MekkoColumnChartData; - private graphicsContext: MekkoColumnChartContext; - private width: number; - private height: number; - private margin: IMargin; - private xProps: IAxisProperties; - private yProps: IAxisProperties; - private categoryLayout: MekkoChartCategoryLayout; - private columnsCenters: number[]; - private columnSelectionLineHandle: Selection; + private static TickLabelPaddingFactor: number = 2; + private static ColumnDataPointValueDelimiter: number = 2; - private interactivityService: IInteractivityService; - private viewportHeight: number; + private static DefaultInnerPaddingRatio: number = 1; - private static validLabelPositions = [1]; + private static CircleRadius: number = 6; - public setupVisualProps(columnChartProps: MekkoColumnChartContext): void { - this.graphicsContext = columnChartProps; - this.margin = columnChartProps.margin; - this.width = this.graphicsContext.width; - this.height = this.graphicsContext.height; - this.categoryLayout = columnChartProps.layout; + private static CategoryWidthDelimiter: number = 2; - this.interactivityService = columnChartProps.interactivityService; - this.viewportHeight = columnChartProps.viewportHeight; - } + private static DefaultLabelFillColor: string = "#ffffff"; - public setData(data: MekkoColumnChartData): void { - this.data = data; - } + private static PercentageFormat: string = "#,0.##%"; - private static createFormatter( - scaleDomain: any[], - dataDomain: any[], - dataType, - isScalar: boolean, - formatString: string, - bestTickCount: number, - tickValues: any[], - getValueFn: any, - useTickIntervalForDisplayUnits: boolean = false): IValueFormatter { - - let formatter: IValueFormatter; - - if (dataType.dateTime) { - if (isScalar) { - let value: Date = new Date(scaleDomain[0]), - value2: Date = new Date(scaleDomain[1]); - - if (bestTickCount === 1) { - value = value2 = new Date(dataDomain[0]); - } + private layout: IMekkoColumnLayout; + private data: MekkoColumnChartData; + private graphicsContext: MekkoColumnChartContext; + private width: number; + private height: number; + private margin: IMargin; + private xProps: IAxisProperties; + private yProps: IAxisProperties; + private categoryLayout: MekkoChartCategoryLayout; + private columnsCenters: number[]; + private columnSelectionLineHandle: Selection; - formatter = valueFormatter.create({ - format: formatString, - value: value, - value2: value2, - tickCount: bestTickCount - }); - } - else { - const minDate: Date = getValueFn(dataDomain[0], dataType), - maxDate: Date = getValueFn(dataDomain[dataDomain.length - 1], dataType); - - formatter = valueFormatter.create({ - format: formatString, - value: minDate, - value2: maxDate, - tickCount: bestTickCount, - columnType: { - dateTime: true - } - }); + private interactivityService: IInteractivityService; + private viewportHeight: number; + + private static validLabelPositions = [1]; + + public setupVisualProps(columnChartProps: MekkoColumnChartContext): void { + this.graphicsContext = columnChartProps; + this.margin = columnChartProps.margin; + this.width = this.graphicsContext.width; + this.height = this.graphicsContext.height; + this.categoryLayout = columnChartProps.layout; + + this.interactivityService = columnChartProps.interactivityService; + this.viewportHeight = columnChartProps.viewportHeight; + } + + public setData(data: MekkoColumnChartData): void { + this.data = data; + } + + private static createFormatter( + scaleDomain: any[], + dataDomain: any[], + dataType, + isScalar: boolean, + formatString: string, + bestTickCount: number, + tickValues: any[], + getValueFn: any, + useTickIntervalForDisplayUnits: boolean = false): IValueFormatter { + + let formatter: IValueFormatter; + + if (dataType.dateTime) { + if (isScalar) { + let value: Date = new Date(scaleDomain[0]), + value2: Date = new Date(scaleDomain[1]); + + if (bestTickCount === 1) { + value = value2 = new Date(dataDomain[0]); } + + formatter = valueFormatter.create({ + format: formatString, + value: value, + value2: value2, + tickCount: bestTickCount + }); } else { - if (useTickIntervalForDisplayUnits && isScalar && tickValues.length > 1) { - const domainMin: number = tickValues[1] - tickValues[0]; - - formatter = valueFormatter.create({ - format: formatString, - value: domainMin, - value2: 0, - allowFormatBeautification: true - }); - } - else { - formatter = valueFormatter.createDefaultFormatter(formatString, true); - } + const minDate: Date = getValueFn(dataDomain[0], dataType), + maxDate: Date = getValueFn(dataDomain[dataDomain.length - 1], dataType); + + formatter = valueFormatter.create({ + format: formatString, + value: minDate, + value2: maxDate, + tickCount: bestTickCount, + columnType: { + dateTime: true + } + }); + } + } + else { + if (useTickIntervalForDisplayUnits && isScalar && tickValues.length > 1) { + const domainMin: number = tickValues[1] - tickValues[0]; + + formatter = valueFormatter.create({ + format: formatString, + value: domainMin, + value2: 0, + allowFormatBeautification: true + }); + } + else { + formatter = valueFormatter.createDefaultFormatter(formatString, true); } - - return formatter; } - /** - * Format the linear tick labels or the category labels. - */ - private static formatAxisTickValues( - axis: Axis, - tickValues: any[], - formatter: IValueFormatter, - dataType: ValueType, - isScalar: boolean, - getValueFn?: (index: number, type: ValueType) => any) { - - let formattedTickValues: any[] = []; - - if (formatter) { - if (getValueFn && !(dataType.numeric && isScalar)) { - axis.tickFormat((tickValue: any) => { - return formatter.format(getValueFn(tickValue, dataType)); - }); + return formatter; + } - formattedTickValues = tickValues.map((tickValue: any) => { - return formatter.format(getValueFn(tickValue, dataType)); - }); - } - else { - axis.tickFormat((tickValue: any) => { - return formatter.format(tickValue); - }); + /** + * Format the linear tick labels or the category labels. + */ + private static formatAxisTickValues( + axis: d3.Axis, + tickValues: any[], + formatter: IValueFormatter, + dataType: ValueType, + isScalar: boolean, + getValueFn?: (index: number, type: ValueType) => any) { + + let formattedTickValues: any[] = []; + + if (formatter) { + if (getValueFn && !(dataType.numeric && isScalar)) { + axis.tickFormat((tickValue: any) => { + return formatter.format(getValueFn(tickValue, dataType)); + }); - formattedTickValues = tickValues.map((tickValue: any) => { - return formatter.format(tickValue); - }); - } + formattedTickValues = tickValues.map((tickValue: any) => { + return formatter.format(getValueFn(tickValue, dataType)); + }); } else { + axis.tickFormat((tickValue: any) => { + return formatter.format(tickValue); + }); + formattedTickValues = tickValues.map((tickValue: any) => { - return getValueFn(tickValue, dataType); + return formatter.format(tickValue); }); } - - return formattedTickValues; + } + else { + formattedTickValues = tickValues.map((tickValue: any) => { + return getValueFn(tickValue, dataType); + }); } - /** - * Create a D3 axis including scale. Can be vertical or horizontal, and either datetime, numeric, or text. - * @param options The properties used to create the axis. - */ - private createAxis(options: CreateAxisOptions): IAxisProperties { - const pixelSpan: number = options.pixelSpan, - dataDomain: number[] = options.dataDomain, - metaDataColumn: DataViewMetadataColumn = options.metaDataColumn, - outerPadding: number = options.outerPadding || 0, - isCategoryAxis: boolean = !!options.isCategoryAxis, - isScalar: boolean = !!options.isScalar, - isVertical: boolean = !!options.isVertical, - useTickIntervalForDisplayUnits: boolean = !!options.useTickIntervalForDisplayUnits, - getValueFn: (index: number, type: ValueType) => any = options.getValueFn, - categoryThickness: number = options.categoryThickness, - formatString: string = valueFormatter.getFormatStringByColumn(metaDataColumn), - dataType: ValueType = AxisHelper.getCategoryValueType(metaDataColumn, isScalar), - isLogScaleAllowed: boolean = AxisHelper.isLogScalePossible(dataDomain, dataType), - scale: LinearScale = d3.scale.linear(), - scaleDomain: number[] = [0, 1], - bestTickCount: number = dataDomain.length || 1, - borderWidth: number = columnChart.BaseColumnChart.getBorderWidth(options.borderSettings); - - let chartWidth: number = pixelSpan - borderWidth * (bestTickCount - 1); - - if (chartWidth < MekkoChart.MinOrdinalRectThickness) { - chartWidth = MekkoChart.MinOrdinalRectThickness; - } + return formattedTickValues; + } + + /** + * Create a D3 axis including scale. Can be vertical or horizontal, and either datetime, numeric, or text. + * @param options The properties used to create the axis. + */ + private createAxis(options: CreateAxisOptions): IAxisProperties { + const pixelSpan: number = options.pixelSpan, + dataDomain: number[] = options.dataDomain, + metaDataColumn: DataViewMetadataColumn = options.metaDataColumn, + outerPadding: number = options.outerPadding || 0, + isCategoryAxis: boolean = !!options.isCategoryAxis, + isScalar: boolean = !!options.isScalar, + isVertical: boolean = !!options.isVertical, + useTickIntervalForDisplayUnits: boolean = !!options.useTickIntervalForDisplayUnits, + getValueFn: (index: number, type: ValueType) => any = options.getValueFn, + categoryThickness: number = options.categoryThickness, + formatString: string = valueFormatter.getFormatStringByColumn(metaDataColumn), + dataType: ValueType = AxisHelper.getCategoryValueType(metaDataColumn, isScalar), + isLogScaleAllowed: boolean = AxisHelper.isLogScalePossible(dataDomain, dataType), + scale: d3.ScaleLinear = d3scale.scaleLinear(), + scaleDomain: number[] = [0, 1], + bestTickCount: number = dataDomain.length || 1, + borderWidth: number = columnChart.BaseColumnChart.getBorderWidth(options.borderSettings); + + let chartWidth: number = pixelSpan - borderWidth * (bestTickCount - 1); + + if (chartWidth < MekkoChart.MinOrdinalRectThickness) { + chartWidth = MekkoChart.MinOrdinalRectThickness; + } - scale - .domain(scaleDomain) - .range([0, chartWidth]); + scale + .domain(scaleDomain) + .range([0, chartWidth]); - const formatter: IValueFormatter = BaseVisualStrategy.createFormatter( - scaleDomain, + const formatter: IValueFormatter = BaseVisualStrategy.createFormatter( + scaleDomain, + dataDomain, + dataType, + isScalar, + formatString, + bestTickCount, + dataDomain, + getValueFn, + useTickIntervalForDisplayUnits); + + let axisFn = isVertical ? axisLeft : axisBottom; + const axis: d3.Axis = axisFn(scale) + .tickSize(6) + .ticks(bestTickCount) + .tickValues(dataDomain); + + let formattedTickValues: any[] = []; + + if (metaDataColumn) { + formattedTickValues = BaseVisualStrategy.formatAxisTickValues( + axis, dataDomain, + formatter, dataType, isScalar, - formatString, - bestTickCount, - dataDomain, - getValueFn, - useTickIntervalForDisplayUnits); - - const axis: Axis = d3.svg.axis() - .scale(scale) - .tickSize(6, 0) - .orient(isVertical - ? "left" - : "bottom") - .ticks(bestTickCount) - .tickValues(dataDomain); - - let formattedTickValues: any[] = []; - - if (metaDataColumn) { - formattedTickValues = BaseVisualStrategy.formatAxisTickValues( - axis, - dataDomain, - formatter, - dataType, - isScalar, - getValueFn); - } - - let xLabelMaxWidth: any; - - if (!isScalar && categoryThickness) { - xLabelMaxWidth = Math.max( - 1, - categoryThickness - MekkoChart.TickLabelPadding * BaseVisualStrategy.TickLabelPaddingFactor); - } - else { - const labelAreaCount: number = dataDomain.length > 1 - ? dataDomain.length + 1 - : dataDomain.length; - - xLabelMaxWidth = labelAreaCount > 1 - ? pixelSpan / labelAreaCount - : pixelSpan; + getValueFn); + } - xLabelMaxWidth = Math.max( - 1, - xLabelMaxWidth - MekkoChart.TickLabelPadding * BaseVisualStrategy.TickLabelPaddingFactor); - } + let xLabelMaxWidth: any; - return { - scale, - axis, - formatter, - isCategoryAxis, - xLabelMaxWidth, - categoryThickness, - outerPadding, - isLogScaleAllowed, - values: formattedTickValues, - axisType: dataType, - axisLabel: null, - usingDefaultDomain: false - }; + if (!isScalar && categoryThickness) { + xLabelMaxWidth = Math.max( + 1, + categoryThickness - MekkoChart.TickLabelPadding * BaseVisualStrategy.TickLabelPaddingFactor); + } + else { + const labelAreaCount: number = dataDomain.length > 1 + ? dataDomain.length + 1 + : dataDomain.length; + + xLabelMaxWidth = labelAreaCount > 1 + ? pixelSpan / labelAreaCount + : pixelSpan; + + xLabelMaxWidth = Math.max( + 1, + xLabelMaxWidth - MekkoChart.TickLabelPadding * BaseVisualStrategy.TickLabelPaddingFactor); } - private getCategoryAxis( - data: MekkoColumnChartData, - size: number, - layout: MekkoChartCategoryLayout, - isVertical: boolean, - forcedXMin?: DataViewPropertyValue, - forcedXMax?: DataViewPropertyValue, - axisScaleType?: string): IAxisProperties { - - const categoryThickness: number = layout.categoryThickness, - isScalar: boolean = layout.isScalar, - outerPaddingRatio: number = layout.outerPaddingRatio, - dataWrapper: DataWrapper = new DataWrapper(data, isScalar); - - let domain: number[] = []; - - if (data.series - && (data.series.length > 0) - && data.series[0].data - && (data.series[0].data.length > 0)) { - - const domainDoubles: number[] = data.series[0].data - .map((item: MekkoChartColumnDataPoint) => { - return item.originalPosition + item.value / BaseVisualStrategy.ColumnDataPointValueDelimiter; - }); + return { + scale, + axis, + formatter, + isCategoryAxis, + xLabelMaxWidth, + categoryThickness, + outerPadding, + isLogScaleAllowed, + values: formattedTickValues, + axisType: dataType, + axisLabel: null, + usingDefaultDomain: false + }; + } - domain = domainDoubles.filter((item: number, position: number) => { - return domainDoubles.indexOf(item) === position; + private getCategoryAxis( + data: MekkoColumnChartData, + size: number, + layout: MekkoChartCategoryLayout, + isVertical: boolean, + forcedXMin?: DataViewPropertyValue, + forcedXMax?: DataViewPropertyValue, + axisScaleType?: string): IAxisProperties { + + const categoryThickness: number = layout.categoryThickness, + isScalar: boolean = layout.isScalar, + outerPaddingRatio: number = layout.outerPaddingRatio, + dataWrapper: DataWrapper = new DataWrapper(data, isScalar); + + let domain: number[] = []; + + if (data.series + && (data.series.length > 0) + && data.series[0].data + && (data.series[0].data.length > 0)) { + + const domainDoubles: number[] = data.series[0].data + .map((item: MekkoChartColumnDataPoint) => { + return item.originalPosition + item.value / BaseVisualStrategy.ColumnDataPointValueDelimiter; }); - } - const axisProperties: IAxisProperties = this.createAxis({ - isScalar, - isVertical, - formatString: undefined, - pixelSpan: size, - dataDomain: domain, - metaDataColumn: data.categoryMetadata, - outerPadding: categoryThickness * outerPaddingRatio, - isCategoryAxis: true, - categoryThickness: categoryThickness, - useTickIntervalForDisplayUnits: true, - getValueFn: (index: number, type: ValueType) => { - const domainIndex: number = domain.indexOf(index), - value: number = dataWrapper.lookupXValue(domainIndex, type); - - return value; - }, - scaleType: axisScaleType, - borderSettings: data.borderSettings + domain = domainDoubles.filter((item: number, position: number) => { + return domainDoubles.indexOf(item) === position; }); - - // intentionally updating the input layout by ref - layout.categoryThickness = axisProperties.categoryThickness; - - return axisProperties; } - public setXScale( - is100Pct: boolean, - forcedTickCount?: number, - forcedXDomain?: any[], - axisScaleType?: string): IAxisProperties { - - let forcedXMin: any, - forcedXMax: any; + const axisProperties: IAxisProperties = this.createAxis({ + isScalar, + isVertical, + formatString: undefined, + pixelSpan: size, + dataDomain: domain, + metaDataColumn: data.categoryMetadata, + outerPadding: categoryThickness * outerPaddingRatio, + isCategoryAxis: true, + categoryThickness: categoryThickness, + useTickIntervalForDisplayUnits: true, + getValueFn: (index: number, type: ValueType) => { + const domainIndex: number = domain.indexOf(index), + value: number = dataWrapper.lookupXValue(domainIndex, type); + + return value; + }, + scaleType: axisScaleType, + borderSettings: data.borderSettings + }); + + // intentionally updating the input layout by ref + layout.categoryThickness = axisProperties.categoryThickness; + + return axisProperties; + } - if (forcedXDomain && forcedXDomain.length === 2) { - forcedXMin = forcedXDomain[0]; - forcedXMax = forcedXDomain[1]; - } + public setXScale( + is100Pct: boolean, + forcedTickCount?: number, + forcedXDomain?: any[], + axisScaleType?: string): IAxisProperties { - const properties: IAxisProperties = this.xProps = this.getCategoryAxis( - this.data, - this.width, - this.categoryLayout, - false, - forcedXMin, - forcedXMax, - axisScaleType); + let forcedXMin: any, + forcedXMax: any; - return properties; + if (forcedXDomain && forcedXDomain.length === 2) { + forcedXMin = forcedXDomain[0]; + forcedXMax = forcedXDomain[1]; } - public setYScale( - is100Pct: boolean, - forcedTickCount?: number, - forcedYDomain?: any[], - axisScaleType?: string): IAxisProperties { - - const height: number = this.viewportHeight, - valueDomain: ValueRange = utils.calcValueDomain(this.data.series, is100Pct), - valueDomainArr: number[] = [valueDomain.min, valueDomain.max], - combinedDomain: any[] = AxisHelper.combineDomain(forcedYDomain, valueDomainArr), - shouldClamp: boolean = AxisHelper.scaleShouldClamp(combinedDomain, valueDomainArr), - metadataColumn: DataViewMetadataColumn = this.data.valuesMetadata[0]; - - const formatString: string = is100Pct - ? BaseVisualStrategy.PercentageFormat - : valueFormatter.getFormatStringByColumn(metadataColumn); - - const createAxisOptions: MekkoCreateAxisOptions = { - pixelSpan: height, - dataDomain: combinedDomain, - metaDataColumn: metadataColumn, - formatString: formatString, - outerPadding: 0, - isScalar: true, - isVertical: true, - forcedTickCount: forcedTickCount, - useTickIntervalForDisplayUnits: true, - isCategoryAxis: false, - scaleType: axisScaleType, - axisDisplayUnits: 0, - axisPrecision: 0, - is100Pct: is100Pct, - shouldClamp: shouldClamp, - formatStringProp: undefined, - }; - - this.yProps = AxisHelper.createAxis(createAxisOptions); - - return this.yProps; - } + const properties: IAxisProperties = this.xProps = this.getCategoryAxis( + this.data, + this.width, + this.categoryLayout, + false, + forcedXMin, + forcedXMax, + axisScaleType); - public drawColumns(useAnimation: boolean): MekkoChartDrawInfo { - const data: MekkoColumnChartData = this.data; + return properties; + } - this.columnsCenters = null; + public setYScale( + is100Pct: boolean, + forcedTickCount?: number, + forcedYDomain?: any[], + axisScaleType?: string): IAxisProperties { + + const height: number = this.viewportHeight, + valueDomain: ValueRange = utils.calcValueDomain(this.data.series, is100Pct), + valueDomainArr: number[] = [valueDomain.min, valueDomain.max], + combinedDomain: any[] = AxisHelper.combineDomain(forcedYDomain, valueDomainArr), + shouldClamp: boolean = AxisHelper.scaleShouldClamp(combinedDomain, valueDomainArr), + metadataColumn: DataViewMetadataColumn = this.data.valuesMetadata[0]; + + const formatString: string = is100Pct + ? BaseVisualStrategy.PercentageFormat + : valueFormatter.getFormatStringByColumn(metadataColumn); + + const createAxisOptions: MekkoCreateAxisOptions = { + pixelSpan: height, + dataDomain: combinedDomain, + metaDataColumn: metadataColumn, + formatString: formatString, + outerPadding: 0, + isScalar: true, + isVertical: true, + forcedTickCount: forcedTickCount, + useTickIntervalForDisplayUnits: true, + isCategoryAxis: false, + scaleType: axisScaleType, + axisDisplayUnits: 0, + axisPrecision: 0, + is100Pct: is100Pct, + shouldClamp: shouldClamp, + formatStringProp: undefined, + }; + + this.yProps = AxisHelper.createAxis(createAxisOptions); + + return this.yProps; + } - const axisOptions: MekkoColumnAxisOptions = { - columnWidth: 0, - xScale: this.xProps.scale, - yScale: this.yProps.scale, - isScalar: this.categoryLayout.isScalar, - margin: this.margin, - }; + public drawColumns(useAnimation: boolean): MekkoChartDrawInfo { + const data: MekkoColumnChartData = this.data; - const stackedColumnLayout: IMekkoColumnLayout = BaseVisualStrategy.getLayout(data, axisOptions); + this.columnsCenters = null; - this.layout = stackedColumnLayout; + const axisOptions: MekkoColumnAxisOptions = { + columnWidth: 0, + xScale: this.xProps.scale, + yScale: this.yProps.scale, + isScalar: this.categoryLayout.isScalar, + margin: this.margin, + }; - const labelDataPoints: LabelDataPoint[] = this.createMekkoLabelDataPoints(), - series: UpdateSelection = utils.drawSeries( - data, - this.graphicsContext.mainGraphicsContext, - axisOptions); + const stackedColumnLayout: IMekkoColumnLayout = BaseVisualStrategy.getLayout(data, axisOptions); - let shapes: UpdateSelection; + this.layout = stackedColumnLayout; - if (!useAnimation) { - shapes = BaseVisualStrategy.drawDefaultShapes(data, - series, - stackedColumnLayout, - BaseVisualStrategy.ItemSelector, - this.interactivityService && this.interactivityService.hasSelection()); - } + const labelDataPoints: LabelDataPoint[] = this.createMekkoLabelDataPoints(), + series: Selection = utils.drawSeries( + data, + this.graphicsContext.mainGraphicsContext, + axisOptions); - utils.applyInteractivity(shapes, this.graphicsContext.onDragStart); + let shapes: Selection; - return { - axisOptions, - labelDataPoints, - shapesSelection: shapes, - viewport: { - height: this.height, - width: this.width - } - }; + if (!useAnimation) { + shapes = BaseVisualStrategy.drawDefaultShapes(data, + series, + stackedColumnLayout, + BaseVisualStrategy.ItemSelector, + this.interactivityService && this.interactivityService.hasSelection()); } - private static drawDefaultShapes( - data: MekkoColumnChartData, - series: UpdateSelection, - layout: IMekkoColumnLayout, - itemCS: ClassAndSelector, - hasSelection: boolean): UpdateSelection { - - const dataSelector: (dataPoint: MekkoChartSeries) => any[] = - (dataPoint: MekkoChartSeries) => dataPoint.data; - - - const shapeSelection: UpdateSelection = series.selectAll(itemCS.selectorName), - shapes: UpdateSelection = shapeSelection.data( - dataSelector, - (dataPoint: MekkoChartColumnDataPoint) => dataPoint.key); - - shapes - .enter() - .append("rect") - .attr("class", (dataPoint: MekkoChartColumnDataPoint) => { - return itemCS.className.concat(dataPoint.highlight - ? " highlight" - : ""); - }); + utils.applyInteractivity(shapes, this.graphicsContext.onDragStart); - shapes - .style({ - "fill": (dataPoint: MekkoChartColumnDataPoint) => data.showAllDataPoints - ? dataPoint.color - : data.defaultDataPointColor, - "fill-opacity": (dataPoint: MekkoChartColumnDataPoint) => utils.getFillOpacity( - dataPoint.selected, - dataPoint.highlight, - hasSelection, - data.hasHighlights) - }) - .attr(layout.shapeLayout as any); - - shapes - .exit() - .remove(); - - const borderSelection: UpdateSelection = series.selectAll(BaseVisualStrategy.BorderSelector.selectorName), - borders: UpdateSelection = borderSelection.data( - dataSelector, - (dataPoint: MekkoChartColumnDataPoint) => dataPoint.key); - - const borderColor: string = columnChart.BaseColumnChart.getBorderColor(data.borderSettings); - - borders - .enter() - .append("rect") - .classed(BaseVisualStrategy.BorderSelector.className, true); - - borders - .style({ - "fill": borderColor, - "fill-opacity": (dataPoint: MekkoChartColumnDataPoint) => { - return data.hasHighlights - ? utils.DimmedOpacity - : utils.DefaultOpacity; - } - }) - .attr(layout.shapeBorder as any); + return { + axisOptions, + labelDataPoints, + shapesSelection: shapes, + viewport: { + height: this.height, + width: this.width + } + }; + } - borders - .exit() - .remove(); + private static drawDefaultShapes( + data: MekkoColumnChartData, + series: Selection, + layout: IMekkoColumnLayout, + itemCS: ClassAndSelector, + hasSelection: boolean): Selection { + + const dataSelector: (dataPoint: MekkoChartSeries) => any[] = + (dataPoint: MekkoChartSeries) => dataPoint.data; + + const shapeSelection: Selection = series.selectAll(itemCS.selectorName), + shapes: Selection = shapeSelection.data( + dataSelector, + (dataPoint: MekkoChartColumnDataPoint) => dataPoint.key); + + let allShapes = shapes + .enter() + .append("rect") + .attr("class", (dataPoint: MekkoChartColumnDataPoint) => { + return itemCS.className.concat(dataPoint.highlight + ? " highlight" + : ""); + }) + .merge(shapeSelection) + .style( + "fill", (dataPoint: MekkoChartColumnDataPoint) => data.showAllDataPoints + ? dataPoint.color + : data.defaultDataPointColor + ) + .style( + "fill-opacity", (dataPoint: MekkoChartColumnDataPoint) => utils.getFillOpacity( + dataPoint.selected, + dataPoint.highlight, + hasSelection, + data.hasHighlights) + ) + .attr("height", layout.shapeLayout.height) + .attr("width", layout.shapeLayout.width) + .attr("x", layout.shapeLayout.x) + .attr("y", layout.shapeLayout.y); + + shapes + .exit() + .remove(); + + const borderSelection: Selection = series.selectAll(BaseVisualStrategy.BorderSelector.selectorName), + borders: Selection = borderSelection.data( + dataSelector, + (dataPoint: MekkoChartColumnDataPoint) => dataPoint.key); + + const borderColor: string = columnChart.BaseColumnChart.getBorderColor(data.borderSettings); + + borders + .enter() + .append("rect") + .classed(BaseVisualStrategy.BorderSelector.className, true) + .merge(borders) + .style( + "fill", borderColor + ) + .style( + "fill-opacity", (dataPoint: MekkoChartColumnDataPoint) => { + return data.hasHighlights + ? utils.DimmedOpacity + : utils.DefaultOpacity; + } + ) + .attr("height", layout.shapeBorder.height) + .attr("width", layout.shapeBorder.width) + .attr("x", layout.shapeBorder.x) + .attr("y", layout.shapeBorder.y); - return shapes; - } - public selectColumn(selectedColumnIndex: number, lastSelectedColumnIndex: number): void { - utils.setChosenColumnOpacity( - this.graphicsContext.mainGraphicsContext, - BaseVisualStrategy.ItemSelector.selectorName, - selectedColumnIndex, - lastSelectedColumnIndex); - this.moveHandle(selectedColumnIndex); - } + borders + .exit() + .remove(); - public getClosestColumnIndex(x: number): number { - return utils.getClosestColumnIndex(x, this.getColumnsCenters()); - } + return allShapes; + } - /** - * Get the chart's columns centers (x value). - */ - private getColumnsCenters(): number[] { - if (!this.columnsCenters) { - const categoryWidth: number = this.categoryLayout.categoryThickness - * (BaseVisualStrategy.DefaultInnerPaddingRatio - MekkoChart.InnerPaddingRatio); + public selectColumn(selectedColumnIndex: number, lastSelectedColumnIndex: number): void { + utils.setChosenColumnOpacity( + this.graphicsContext.mainGraphicsContext, + BaseVisualStrategy.ItemSelector.selectorName, + selectedColumnIndex, + lastSelectedColumnIndex); - if (this.data.series.length > 0) { - let xScaleOffset: number = 0; + this.moveHandle(selectedColumnIndex); + } - if (!this.categoryLayout.isScalar) { - xScaleOffset = categoryWidth / BaseVisualStrategy.CategoryWidthDelimiter; - } + public getClosestColumnIndex(x: number): number { + return utils.getClosestColumnIndex(x, this.getColumnsCenters()); + } - const firstSeries: MekkoChartSeries = this.data.series[0]; + /** + * Get the chart's columns centers (x value). + */ + private getColumnsCenters(): number[] { + if (!this.columnsCenters) { + const categoryWidth: number = this.categoryLayout.categoryThickness + * (BaseVisualStrategy.DefaultInnerPaddingRatio - MekkoChart.InnerPaddingRatio); - if (firstSeries && firstSeries.data) { - this.columnsCenters = firstSeries.data.map((dataPoint: MekkoChartColumnDataPoint) => { - const value: number = this.categoryLayout.isScalar - ? dataPoint.categoryValue - : dataPoint.categoryIndex; + if (this.data.series.length > 0) { + let xScaleOffset: number = 0; - return this.xProps.scale(value) + xScaleOffset; - }); - } + if (!this.categoryLayout.isScalar) { + xScaleOffset = categoryWidth / BaseVisualStrategy.CategoryWidthDelimiter; } - } - return this.columnsCenters; - } - - private moveHandle(selectedColumnIndex: number) { - const columnCenters: number[] = this.getColumnsCenters(), - x: number = columnCenters[selectedColumnIndex]; + const firstSeries: MekkoChartSeries = this.data.series[0]; - if (!this.columnSelectionLineHandle) { - const handleSelection: Selection = this.graphicsContext.mainGraphicsContext.append("g"); + if (firstSeries && firstSeries.data) { + this.columnsCenters = firstSeries.data.map((dataPoint: MekkoChartColumnDataPoint) => { + const value: number = this.categoryLayout.isScalar + ? dataPoint.categoryValue + : dataPoint.categoryIndex; - this.columnSelectionLineHandle = handleSelection; - - handleSelection - .append("line") - .classed(BaseVisualStrategy.InteractiveHoverLineSelector.className, true) - .attr({ - x1: x, - x2: x, - y1: 0, - y2: this.height, + return this.xProps.scale(value) + xScaleOffset; }); - - handleSelection - .append("circle") - .attr({ - cx: x, - cy: this.height, - r: PixelConverter.toString(BaseVisualStrategy.CircleRadius) - }) - .classed(BaseVisualStrategy.DragHandleSelector.className, true); + } } - else { - const handleSelection: Selection = this.columnSelectionLineHandle; + } - handleSelection - .select("line") - .attr({ - x1: x, - x2: x - }); + return this.columnsCenters; + } - handleSelection - .select("circle") - .attr({ cx: x }); - } + private moveHandle(selectedColumnIndex: number) { + const columnCenters: number[] = this.getColumnsCenters(), + x: number = columnCenters[selectedColumnIndex]; + + if (!this.columnSelectionLineHandle) { + const handleSelection: Selection = this.graphicsContext.mainGraphicsContext.append("g"); + + this.columnSelectionLineHandle = handleSelection; + + handleSelection + .append("line") + .classed(BaseVisualStrategy.InteractiveHoverLineSelector.className, true) + .attr("x1", x) + .attr("x2", x) + .attr("y1", 0) + .attr("y2", this.height); + + handleSelection + .append("circle") + .attr("cx", x) + .attr("cy", this.height) + .attr("r", PixelConverter.toString(BaseVisualStrategy.CircleRadius)) + .classed(BaseVisualStrategy.DragHandleSelector.className, true); } + else { + const handleSelection: Selection = this.columnSelectionLineHandle; - public static getLayout( - data: MekkoColumnChartData, - axisOptions: MekkoColumnAxisOptions): IMekkoColumnLayout { - - const xScale: LinearScale = axisOptions.xScale, - yScale: LinearScale = axisOptions.yScale, - scaledY0: number = yScale(0), - scaledX0: number = xScale(0), - borderWidth: number = columnChart.BaseColumnChart.getBorderWidth(data.borderSettings); - - const columnWidthScale: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { - return AxisHelper.diffScaled(xScale, dataPoint.value, 0); - }; - - const columnStart: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { - return scaledX0 - + AxisHelper.diffScaled(xScale, dataPoint.originalPosition, 0) - + borderWidth * dataPoint.categoryIndex; - }; - - const borderStart: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { - return scaledX0 - + AxisHelper.diffScaled(xScale, dataPoint.originalPosition, 0) - + AxisHelper.diffScaled(xScale, dataPoint.value, 0) - + borderWidth * dataPoint.categoryIndex; - }; - - const yPosition: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { - return scaledY0 + AxisHelper.diffScaled(yScale, dataPoint.position, 0); - }; - - const height: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { - return utils.getSize(yScale, dataPoint.valueAbsolute); - }; - - return { - shapeLayout: { - width: columnWidthScale, - x: columnStart, - y: yPosition, - height: height - }, - shapeBorder: { - width: () => borderWidth, - x: borderStart, - y: yPosition, - height: height - }, - shapeLayoutWithoutHighlights: { - width: columnWidthScale, - x: columnStart, - y: yPosition, - height: (dataPoint: MekkoChartColumnDataPoint) => { - return utils.getSize(yScale, dataPoint.originalValueAbsolute); - } - }, - zeroShapeLayout: { - width: columnWidthScale, - x: columnStart, - y: (dataPoint: MekkoChartColumnDataPoint) => { - return scaledY0 + AxisHelper.diffScaled(yScale, dataPoint.position, 0) - + utils.getSize(yScale, dataPoint.valueAbsolute); - }, - height: () => 0 - }, - shapeXAxis: { - width: columnWidthScale, - x: columnStart, - y: yPosition, - height: height - }, - }; + handleSelection + .select("line") + .attr("x1", x) + .attr("x2", x); + + handleSelection + .select("circle") + .attr("cx", x); } + } + + public static getLayout( + data: MekkoColumnChartData, + axisOptions: MekkoColumnAxisOptions): IMekkoColumnLayout { + + const xScale: d3.ScaleLinear = axisOptions.xScale, + yScale: d3.ScaleLinear = axisOptions.yScale, + scaledY0: number = yScale(0), + scaledX0: number = xScale(0), + borderWidth: number = columnChart.BaseColumnChart.getBorderWidth(data.borderSettings); + + const columnWidthScale: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { + return AxisHelper.diffScaled(xScale, dataPoint.value, 0); + }; + + const columnStart: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { + return scaledX0 + + AxisHelper.diffScaled(xScale, dataPoint.originalPosition, 0) + + borderWidth * dataPoint.categoryIndex; + }; + + const borderStart: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { + return scaledX0 + + AxisHelper.diffScaled(xScale, dataPoint.originalPosition, 0) + + AxisHelper.diffScaled(xScale, dataPoint.value, 0) + + borderWidth * dataPoint.categoryIndex; + }; + + const yPosition: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { + return scaledY0 + AxisHelper.diffScaled(yScale, dataPoint.position, 0); + }; + + const height: LayoutFunction = (dataPoint: MekkoChartColumnDataPoint) => { + return utils.getSize(yScale, dataPoint.valueAbsolute); + }; + + return { + shapeLayout: { + width: columnWidthScale, + x: columnStart, + y: yPosition, + height: height + }, + shapeBorder: { + width: () => borderWidth, + x: borderStart, + y: yPosition, + height: height + }, + shapeLayoutWithoutHighlights: { + width: columnWidthScale, + x: columnStart, + y: yPosition, + height: (dataPoint: MekkoChartColumnDataPoint) => { + return utils.getSize(yScale, dataPoint.originalValueAbsolute); + } + }, + zeroShapeLayout: { + width: columnWidthScale, + x: columnStart, + y: (dataPoint: MekkoChartColumnDataPoint) => { + return scaledY0 + AxisHelper.diffScaled(yScale, dataPoint.position, 0) + + utils.getSize(yScale, dataPoint.valueAbsolute); + }, + height: () => 0 + }, + shapeXAxis: { + width: columnWidthScale, + x: columnStart, + y: yPosition, + height: height + }, + }; + } - protected createMekkoLabelDataPoints(): LabelDataPoint[] { - const labelDataPoints: LabelDataPoint[] = [], - data: MekkoChartData = this.data, - dataSeries: MekkoChartSeries[] = data.series, - formattersCache: IColumnFormatterCacheManager = createColumnFormatterCacheManager(), - shapeLayout = this.layout.shapeLayout; + protected createMekkoLabelDataPoints(): LabelDataPoint[] { + const labelDataPoints: LabelDataPoint[] = [], + data: MekkoChartData = this.data, + dataSeries: MekkoChartSeries[] = data.series, + formattersCache: IColumnFormatterCacheManager = createColumnFormatterCacheManager(), + shapeLayout = this.layout.shapeLayout; - for (let currentSeries of dataSeries) { - const labelSettings: VisualDataLabelsSettings = currentSeries.labelSettings - ? currentSeries.labelSettings - : data.labelSettings; + for (let currentSeries of dataSeries) { + const labelSettings: VisualDataLabelsSettings = currentSeries.labelSettings + ? currentSeries.labelSettings + : data.labelSettings; - if (!labelSettings.show || !currentSeries.data) { - continue; - } + if (!labelSettings.show || !currentSeries.data) { + continue; + } - const displayUnitValue: number = getDisplayUnitValueFromAxisFormatter( - this.yProps.formatter, - labelSettings); + const displayUnitValue: number = getDisplayUnitValueFromAxisFormatter( + this.yProps.formatter, + labelSettings); - for (let dataPoint of currentSeries.data) { - if ((data.hasHighlights && !dataPoint.highlight) - || dataPoint.value == null) { - continue; - } + for (let dataPoint of currentSeries.data) { + if ((data.hasHighlights && !dataPoint.highlight) + || dataPoint.value == null) { + continue; + } - const parentRect: IRect = { - left: shapeLayout.x(dataPoint), - top: shapeLayout.y(dataPoint), - width: shapeLayout.width(dataPoint), - height: shapeLayout.height(dataPoint), - }; - - let formatString: string = null, - value: number = dataPoint.valueOriginal; - - if (!labelSettings.displayUnits) { - formatString = hundredPercentFormat; - if (this.data.sortSeries.displayPercents === "category") { - value = dataPoint.valueAbsolute; - } else { - value = dataPoint.originalValueAbsoluteByAlLData; - } + const parentRect: IRect = { + left: shapeLayout.x(dataPoint), + top: shapeLayout.y(dataPoint), + width: shapeLayout.width(dataPoint), + height: shapeLayout.height(dataPoint), + }; + + let formatString: string = null, + value: number = dataPoint.valueOriginal; + + if (!labelSettings.displayUnits) { + formatString = hundredPercentFormat; + if (this.data.sortSeries.displayPercents === "category") { + value = dataPoint.valueAbsolute; + } else { + value = dataPoint.originalValueAbsoluteByAlLData; } - - const formatter: IValueFormatter = formattersCache.getOrCreate( - formatString, - labelSettings, - displayUnitValue); - - labelDataPoints.push({ - parentRect, - text: formatter.format(value), - fillColor: labelSettings.labelColor - ? labelSettings.labelColor - : BaseVisualStrategy.DefaultLabelFillColor - }); } - } - return labelDataPoints; + const formatter: IValueFormatter = formattersCache.getOrCreate( + formatString, + labelSettings, + displayUnitValue); + + labelDataPoints.push({ + parentRect, + text: formatter.format(value), + fillColor: labelSettings.labelColor + ? labelSettings.labelColor + : BaseVisualStrategy.DefaultLabelFillColor + }); + } } - } - export function getDisplayUnitValueFromAxisFormatter( - axisFormatter: IValueFormatter, - labelSettings: VisualDataLabelsSettings): number { + return labelDataPoints; + } +} - if (axisFormatter - && axisFormatter.displayUnit - && labelSettings.displayUnits === 0) { +export function getDisplayUnitValueFromAxisFormatter( + axisFormatter: IValueFormatter, + labelSettings: VisualDataLabelsSettings): number { - return axisFormatter.displayUnit.value; - } + if (axisFormatter + && axisFormatter.displayUnit + && labelSettings.displayUnits === 0) { - return null; + return axisFormatter.displayUnit.value; } + + return null; } diff --git a/src/visualStrategy/visualStrategy.ts b/src/visualStrategy/visualStrategy.ts index e088e09..dbbfc3c 100644 --- a/src/visualStrategy/visualStrategy.ts +++ b/src/visualStrategy/visualStrategy.ts @@ -24,30 +24,38 @@ * THE SOFTWARE. */ -module powerbi.extensibility.visual.visualStrategy { - import IAxisProperties = powerbi.extensibility.utils.chart.axis.IAxisProperties; +import { axisInterfaces } from "powerbi-visuals-utils-chartutils"; +import NumberRange = powerbi.NumberRange; - export interface IVisualStrategy { - setData(data: MekkoChartData): void; - setupVisualProps(columnChartProps: MekkoChartContext): void; - setXScale( - is100Pct: boolean, - forcedTickCount?: number, - forcedXDomain?: any[], - axisScaleType?: string, - axisDisplayUnits?: number, - axisPrecision?: number, - ensureXDomain?: NumberRange): IAxisProperties; - setYScale( - is100Pct: boolean, - forcedTickCount?: number, - forcedYDomain?: any[], - axisScaleType?: string, - axisDisplayUnits?: number, - axisPrecision?: number, - ensureYDomain?: NumberRange): IAxisProperties; - drawColumns(useAnimation: boolean): MekkoChartDrawInfo; - selectColumn(selectedColumnIndex: number, lastSelectedColumnIndex: number): void; - getClosestColumnIndex(x: number): number; - } +import { + MekkoChartData, + MekkoChartContext, + MekkoChartDrawInfo +} from "./../dataInterfaces"; + +import IAxisProperties = axisInterfaces.IAxisProperties; +import powerbi from "powerbi-visuals-api"; + +export interface IVisualStrategy { + setData(data: MekkoChartData): void; + setupVisualProps(columnChartProps: MekkoChartContext): void; + setXScale( + is100Pct: boolean, + forcedTickCount?: number, + forcedXDomain?: any[], + axisScaleType?: string, + axisDisplayUnits?: number, + axisPrecision?: number, + ensureXDomain?: NumberRange): IAxisProperties; + setYScale( + is100Pct: boolean, + forcedTickCount?: number, + forcedYDomain?: any[], + axisScaleType?: string, + axisDisplayUnits?: number, + axisPrecision?: number, + ensureYDomain?: NumberRange): IAxisProperties; + drawColumns(useAnimation: boolean): MekkoChartDrawInfo; + selectColumn(selectedColumnIndex: number, lastSelectedColumnIndex: number): void; + getClosestColumnIndex(x: number): number; } diff --git a/test.tsconfig.json b/test.tsconfig.json new file mode 100644 index 0000000..ab33376 --- /dev/null +++ b/test.tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "allowJs": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "module": "es6", + "target": "es6", + "sourceMap": true, + "outDir": "./.tmp/build/", + "sourceRoot": "../../src/", + "moduleResolution": "node", + "declaration": true, + "lib": [ + "es2015", + "dom" + ] + }, + "files": [ + "./test/visualTest.ts" + ], + "include": [ + "src/*.ts" + ] +} diff --git a/test.webpack.config.js b/test.webpack.config.js new file mode 100644 index 0000000..fac0038 --- /dev/null +++ b/test.webpack.config.js @@ -0,0 +1,50 @@ +const path = require('path'); +const webpack = require("webpack"); + +module.exports = { + devtool: 'source-map', + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/ + }, + { + test: /\.json$/, + loader: 'json-loader' + }, + { + test: /\.less$/, + use: [ + { + loader: 'style-loader' + }, + { + loader: 'css-loader' + }, + { + loader: 'less-loader', + options: { + paths: [path.resolve(__dirname, 'node_modules')] + } + } + ] + } + ] + }, + externals: { + "powerbi-visuals-api": '{}' + }, + resolve: { + extensions: ['.tsx', '.ts', '.js','.css'] + }, + output: { + path: path.resolve(__dirname, ".tmp/test") + }, + plugins: [ + new webpack.ProvidePlugin({ + 'powerbi-visuals-api': null + }) + ] +}; diff --git a/test/_references.ts b/test/_references.ts deleted file mode 100644 index 9c72edc..0000000 --- a/test/_references.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -// External -/// -/// -/// -/// -/// - -// Power BI API -/// - -// Power BI Extensibility -/// -/// -/// -/// -/// -/// -/// -/// -/// - -// The visual -/// - -// Test -/// -/// -/// diff --git a/test/globals.ts b/test/globals.ts new file mode 100644 index 0000000..df1c0d5 --- /dev/null +++ b/test/globals.ts @@ -0,0 +1,2 @@ +// tslint:disable-next-line +var powerbi = {}; \ No newline at end of file diff --git a/test/helpers/helpers.ts b/test/helpers/helpers.ts index ad96a8d..2a9d0fc 100644 --- a/test/helpers/helpers.ts +++ b/test/helpers/helpers.ts @@ -1,60 +1,56 @@ /* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -/// - -module powerbi.extensibility.visual.test.helpers { - // powerbi.extensibility.utils.svg - import IRect = powerbi.extensibility.utils.svg.IRect; - - export type compareValues = (value1: number, value2) => boolean; - - export function isRectangleInOrOutRectangle( - mainRect: IRect, - rect: IRect, - compareValues: compareValues): boolean { - - return compareValues(rect.left, mainRect.left) - && compareValues(rect.top, mainRect.top) - && compareValues(mainRect.left + mainRect.width, rect.left + rect.width) - && compareValues(mainRect.top + mainRect.height, rect.top + rect.height); - } +* Power BI Visualizations +* +* Copyright (c) Microsoft Corporation +* All rights reserved. +* MIT License +* +* 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. +*/ + +// powerbi.extensibility.utils.svg +import { IRect } from "powerbi-visuals-utils-svgutils"; + +export type compareValues = (value1: number, value2) => boolean; + +export function isRectangleInOrOutRectangle( + mainRect: IRect, + rect: IRect, + compareValues: compareValues): boolean { + + return compareValues(rect.left, mainRect.left) + && compareValues(rect.top, mainRect.top) + && compareValues(mainRect.left + mainRect.width, rect.left + rect.width) + && compareValues(mainRect.top + mainRect.height, rect.top + rect.height); +} - export function isTextElementInOrOutElement( - mainElement: Element, - textElement: Element, - compareValues: compareValues): boolean { +export function isTextElementInOrOutElement( + mainElement: Element, + textElement: Element, + compareValues: compareValues): boolean { - return isRectangleInOrOutRectangle( - mainElement.getBoundingClientRect(), - textElement.getBoundingClientRect(), - compareValues); - } + return isRectangleInOrOutRectangle( + mainElement.getBoundingClientRect(), + textElement.getBoundingClientRect(), + compareValues); +} - export function getSolidColorStructuralObject(color: string): any { - return { solid: { color: color } }; - } +export function getSolidColorStructuralObject(color: string): any { + return { solid: { color: color } }; } diff --git a/test/visualBuilder.ts b/test/visualBuilder.ts index 549f9a2..26e8017 100644 --- a/test/visualBuilder.ts +++ b/test/visualBuilder.ts @@ -1,152 +1,148 @@ /* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -/// - -module powerbi.extensibility.visual.test { - // powerbi.extensibility.utils.test - import VisualBuilderBase = powerbi.extensibility.utils.test.VisualBuilderBase; - - // MekkoChart1449744733038 - import VisualClass = powerbi.extensibility.visual.MekkoChart1449744733038.MekkoChart; - - export class MekkoChartBuilder extends VisualBuilderBase { - constructor(width: number, height: number) { - super(width, height, "MekkoChart1449744733038"); - } - - protected build(options: VisualConstructorOptions) { - return new VisualClass(options); - } - - public get rootElement(): JQuery { - return this.element.find(".mekkoChart"); - } - - public get mainElement(): JQuery { - return this.rootElement - .children("svg"); - } - - public get categoriesAxis(): JQuery { - return this.mainElement - .children("g.axisGraphicsContext") - .children("g.x.axis.showLinesOnAxis"); - } - - public get categoriesAxisTicks(): JQuery { - return this.categoriesAxis.children("g.tick"); - } - - public get rootAxisGraphicsContext(): JQuery { - return this.mainElement.children("g.axisGraphicsContext"); - } - - public get svgScrollableAxisGraphicsContext(): JQuery { - return this.mainElement - .children("svg.svgScrollable") - .children("g.axisGraphicsContext"); - } - - public get xAxisTicks(): JQuery { - return this.rootAxisGraphicsContext - .children("g.x.axis") - .children("g.tick"); - } - - public get yAxisTicks(): JQuery { - return this.svgScrollableAxisGraphicsContext - .children("g.y.axis") - .children("g.tick"); - } - - public get xAxisLabel(): JQuery { - return this.rootAxisGraphicsContext - .children("text.xAxisLabel"); - } - - public get yAxisLabel(): JQuery { - return this.rootAxisGraphicsContext - .children("text.yAxisLabel"); - } - - public get columnElement(): JQuery { - return this.mainElement - .find("svg.svgScrollable g.axisGraphicsContext .columnChartMainGraphicsContext"); - } - - public get series(): JQuery { - return this.columnElement.children("g.series"); - } - - public get columns(): JQuery { - return this.series.children("rect.column"); - } - - public get borders(): JQuery { - return this.series.children("rect.mekkoborder"); - } - - public get dataLabels(): JQuery { - return this.mainElement - .children("svg.svgScrollable") - .find(".labels") - .children(".data-labels"); - } - - public get columnsWithSize(): JQuery { - return this.series - .children("rect.column") - .filter((i, element: Element) => { - return parseFloat($(element).attr("height")) > 0; - }); - } - - public get legendGroup(): JQuery { - return this.rootElement - .children(".legendParentDefault") - .children("svg.legend") - .children("g#legendGroup"); - } - - public get categoryLegendGroup(): JQuery { - return this.rootElement - .children(".legendParent") - .children("svg.legend") - .children("g#legendGroup"); - } - - public get legendTitle(): JQuery { - return this.legendGroup.children(".legendTitle"); - } - - public get legendItemText(): JQuery { - return this.legendGroup - .children(".legendItem") - .children("text.legendText"); - } - } -} +* Power BI Visualizations +* +* Copyright (c) Microsoft Corporation +* All rights reserved. +* MIT License +* +* 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. +*/ + +import powerbi from "powerbi-visuals-api"; +import VisualConstructorOptions = powerbi.extensibility.visual.VisualConstructorOptions; +// powerbi.extensibility.utils.test +import { VisualBuilderBase } from "powerbi-visuals-utils-testutils"; +// MekkoChart1449744733038 +import { MekkoChart } from "./../src/visual"; +export class MekkoChartBuilder extends VisualBuilderBase { + constructor(width: number, height: number) { + super(width, height, "MekkoChart1449744733038"); + } + + protected build(options: VisualConstructorOptions) { + return new MekkoChart(options); + } + + public get rootElement(): JQuery { + return this.element.find(".mekkoChart"); + } + + public get mainElement(): JQuery { + return this.rootElement + .children("svg"); + } + + public get categoriesAxis(): JQuery { + return this.mainElement + .children("g.axisGraphicsContext") + .children("g.x.axis.showLinesOnAxis"); + } + + public get categoriesAxisTicks(): JQuery { + return this.categoriesAxis.children("g.tick"); + } + + public get rootAxisGraphicsContext(): JQuery { + return this.mainElement.children("g.axisGraphicsContext"); + } + + public get svgScrollableAxisGraphicsContext(): JQuery { + return this.mainElement + .children("svg.svgScrollable") + .children("g.axisGraphicsContext"); + } + + public get xAxisTicks(): JQuery { + return this.rootAxisGraphicsContext + .children("g.x.axis") + .children("g.tick"); + } + + public get yAxisTicks(): JQuery { + return this.svgScrollableAxisGraphicsContext + .children("g.y.axis") + .children("g.tick"); + } + + public get xAxisLabel(): JQuery { + return this.rootAxisGraphicsContext + .children("text.xAxisLabel"); + } + + public get yAxisLabel(): JQuery { + return this.rootAxisGraphicsContext + .children("text.yAxisLabel"); + } + + public get columnElement(): JQuery { + return this.mainElement + .find("svg.svgScrollable g.axisGraphicsContext .columnChartMainGraphicsContext"); + } + + public get series(): JQuery { + return this.columnElement.children("g.series"); + } + + public get columns(): JQuery { + return this.series.children("rect.column"); + } + + public get borders(): JQuery { + return this.series.children("rect.mekkoborder"); + } + + public get dataLabels(): JQuery { + return this.mainElement + .children("svg.svgScrollable") + .find(".labels") + .children(".data-labels"); + } + + public get columnsWithSize(): JQuery { + return this.series + .children("rect.column") + .filter((i, element: Element) => { + return parseFloat($(element).attr("height")) > 0; + }); + } + + public get legendGroup(): JQuery { + return this.rootElement + .children(".legendParentDefault") + .children("svg.legend") + .children("g#legendGroup"); + } + + public get categoryLegendGroup(): JQuery { + return this.rootElement + .children(".legendParent") + .children("svg.legend") + .children("g#legendGroup"); + } + + public get legendTitle(): JQuery { + return this.legendGroup.children(".legendTitle"); + } + + public get legendItemText(): JQuery { + return this.legendGroup + .children(".legendItem") + .children("text.legendText"); + } +} \ No newline at end of file diff --git a/test/visualData.ts b/test/visualData.ts index 7eed3f7..fbf0b0c 100644 --- a/test/visualData.ts +++ b/test/visualData.ts @@ -1,187 +1,188 @@ /* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ +* Power BI Visualizations +* +* Copyright (c) Microsoft Corporation +* All rights reserved. +* MIT License +* +* 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. +*/ -/// +import powerbi from "powerbi-visuals-api"; -module powerbi.extensibility.visual.test { - // powerbi.extensibility.utils.type - import ValueType = powerbi.extensibility.utils.type.ValueType; +// powerbi.extensibility.utils.type +import { valueType } from "powerbi-visuals-utils-typeutils"; +import ValueType = valueType.ValueType; +import ExtendedType = valueType.ExtendedType; - // powerbi.extensibility.utils.test - import getRandomNumbers = powerbi.extensibility.utils.test.helpers.getRandomNumbers; - import TestDataViewBuilder = powerbi.extensibility.utils.test.dataViewBuilder.TestDataViewBuilder; +import { getRandomNumbers, testDataViewBuilder } from "powerbi-visuals-utils-testutils"; - export class MekkoChartData extends TestDataViewBuilder { - private static DefaultFormat: string = "\"$\"#,##0;\\(\"$\"#,##0\\)"; +// powerbi.extensibility.utils.test +import TestDataViewBuilder = testDataViewBuilder.TestDataViewBuilder; - private static MinValue: number = 1000; - private static MaxValue: number = 100000; +export class MekkoChartData extends TestDataViewBuilder { + private static DefaultFormat: string = "\"$\"#,##0;\\(\"$\"#,##0\\)"; - public static ColumnCategory: string = "Name"; - public static ColumnSeries: string = "Territory"; - public static ColumnY: string = "This Year Sales"; - public static ColumnWidth: string = "Sum Total Units This Year"; + private static MinValue: number = 1000; + private static MaxValue: number = 100000; - public valuesCategorySeries: string[][] = [ - ["William", "DE"], - ["James", "GA"], - ["Harper", "KY"], - ["Aiden", "MD"], - ["Lucas", "NC"], - ["Daniel", "OH"], - ["Henry", "PA"], - ["Olivia", "SC"], - ["Ella", "TN"], - ["Carter", "VA"], - ["Logan", "WV"], - ["James", "TN"], - ["Aiden", "DE"], - ["Daniel", "KY"], - ["Henry", "SC"], - ["Olivia", "NC"], - ["Ella", "VA"], - ["Logan", "MD"], - ]; + public static ColumnCategory: string = "Name"; + public static ColumnSeries: string = "Territory"; + public static ColumnY: string = "This Year Sales"; + public static ColumnWidth: string = "Sum Total Units This Year"; - public valuesY: number[] = getRandomNumbers( - this.valuesCategorySeries.length, - MekkoChartData.MinValue, - MekkoChartData.MaxValue); + public valuesCategorySeries: string[][] = [ + ["William", "DE"], + ["James", "GA"], + ["Harper", "KY"], + ["Aiden", "MD"], + ["Lucas", "NC"], + ["Daniel", "OH"], + ["Henry", "PA"], + ["Olivia", "SC"], + ["Ella", "TN"], + ["Carter", "VA"], + ["Logan", "WV"], + ["James", "TN"], + ["Aiden", "DE"], + ["Daniel", "KY"], + ["Henry", "SC"], + ["Olivia", "NC"], + ["Ella", "VA"], + ["Logan", "MD"], + ]; - public valuesWidth: number[] = getRandomNumbers( - this.valuesCategorySeries.length, - MekkoChartData.MinValue, - MekkoChartData.MaxValue); + public valuesY: number[] = getRandomNumbers( + this.valuesCategorySeries.length, + MekkoChartData.MinValue, + MekkoChartData.MaxValue); - // the data set with unique items in each category - // one series value belongs to only one category - public specificValuesCategorySeries: string[][] = [ - ["Russia", "Moscow"], - ["Russia", "St. Petersburg"], - ["Russia", "Kazan"], - ["Germany", "Berlin"], - ["Germany", "Cologne"], - ["Germany", "Frankfurt am Main"], - ["USA", "Redmond"], - ["USA", "Seattle"], - ["USA", "Bellevue"], - ]; + public valuesWidth: number[] = getRandomNumbers( + this.valuesCategorySeries.length, + MekkoChartData.MinValue, + MekkoChartData.MaxValue); - public specificValuesY: number[] = getRandomNumbers( - this.specificValuesCategorySeries.length, - MekkoChartData.MinValue, - MekkoChartData.MaxValue); + // the data set with unique items in each category + // one series value belongs to only one category + public specificValuesCategorySeries: string[][] = [ + ["Russia", "Moscow"], + ["Russia", "St. Petersburg"], + ["Russia", "Kazan"], + ["Germany", "Berlin"], + ["Germany", "Cologne"], + ["Germany", "Frankfurt am Main"], + ["USA", "Redmond"], + ["USA", "Seattle"], + ["USA", "Bellevue"], + ]; - public specificValuesWidth: number[] = getRandomNumbers( - this.specificValuesCategorySeries.length, - MekkoChartData.MinValue, - MekkoChartData.MaxValue); + public specificValuesY: number[] = getRandomNumbers( + this.specificValuesCategorySeries.length, + MekkoChartData.MinValue, + MekkoChartData.MaxValue); - public getDataView(columnNames?: string[]): powerbi.DataView { - return this.createCategoricalDataViewBuilder([ + public specificValuesWidth: number[] = getRandomNumbers( + this.specificValuesCategorySeries.length, + MekkoChartData.MinValue, + MekkoChartData.MaxValue); + + public getDataView(columnNames?: string[]): powerbi.DataView { + return this.createCategoricalDataViewBuilder([ + { + source: { + displayName: MekkoChartData.ColumnCategory, + roles: { Category: true }, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Text }) + }, + values: this.valuesCategorySeries.map((values: string[]) => values[0]) + }, + { + isGroup: true, + source: { + displayName: MekkoChartData.ColumnSeries, + roles: { Series: true }, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Text }) + }, + values: this.valuesCategorySeries.map((values: string[]) => values[1]), + } + ], [ { source: { - displayName: MekkoChartData.ColumnCategory, - roles: { Category: true }, - type: ValueType.fromDescriptor({ text: true }) + displayName: MekkoChartData.ColumnY, + format: MekkoChartData.DefaultFormat, + roles: { Y: true }, + isMeasure: true, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Numeric }) }, - values: this.valuesCategorySeries.map((values: string[]) => values[0]) + values: this.valuesY }, { - isGroup: true, source: { - displayName: MekkoChartData.ColumnSeries, - roles: { Series: true }, - type: ValueType.fromDescriptor({ text: true }) - }, - values: this.valuesCategorySeries.map((values: string[]) => values[1]), - } - ], [ - { - source: { - displayName: MekkoChartData.ColumnY, - format: MekkoChartData.DefaultFormat, - roles: { Y: true }, - isMeasure: true, - type: ValueType.fromDescriptor({ numeric: true }) - }, - values: this.valuesY + displayName: MekkoChartData.ColumnWidth, + format: MekkoChartData.DefaultFormat, + roles: { Width: true }, + isMeasure: true, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Numeric }) }, - { - source: { - displayName: MekkoChartData.ColumnWidth, - format: MekkoChartData.DefaultFormat, - roles: { Width: true }, - isMeasure: true, - type: ValueType.fromDescriptor({ numeric: true }) - }, - values: this.valuesWidth - }], columnNames).build(); - } + values: this.valuesWidth + }], columnNames).build(); + } - public getSpecificDataView(columnNames?: string[]): powerbi.DataView { - return this.createCategoricalDataViewBuilder([ + public getSpecificDataView(columnNames?: string[]): powerbi.DataView { + return this.createCategoricalDataViewBuilder([ + { + source: { + displayName: MekkoChartData.ColumnCategory, + roles: { Category: true }, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Numeric }) + }, + values: this.specificValuesCategorySeries.map((values: string[]) => values[0]) + }, + { + isGroup: true, + source: { + displayName: MekkoChartData.ColumnSeries, + roles: { Series: true }, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Numeric }) + }, + values: this.specificValuesCategorySeries.map((values: string[]) => values[1]), + } + ], [ { source: { - displayName: MekkoChartData.ColumnCategory, - roles: { Category: true }, - type: ValueType.fromDescriptor({ text: true }) + displayName: MekkoChartData.ColumnY, + format: MekkoChartData.DefaultFormat, + roles: { Y: true }, + isMeasure: true, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Numeric }) }, - values: this.specificValuesCategorySeries.map((values: string[]) => values[0]) + values: this.specificValuesY }, { - isGroup: true, source: { - displayName: MekkoChartData.ColumnSeries, - roles: { Series: true }, - type: ValueType.fromDescriptor({ text: true }) - }, - values: this.specificValuesCategorySeries.map((values: string[]) => values[1]), - } - ], [ - { - source: { - displayName: MekkoChartData.ColumnY, - format: MekkoChartData.DefaultFormat, - roles: { Y: true }, - isMeasure: true, - type: ValueType.fromDescriptor({ numeric: true }) - }, - values: this.specificValuesY + displayName: MekkoChartData.ColumnWidth, + format: MekkoChartData.DefaultFormat, + roles: { Width: true }, + isMeasure: true, + type: ValueType.fromDescriptor({ extendedType: ExtendedType.Numeric }) }, - { - source: { - displayName: MekkoChartData.ColumnWidth, - format: MekkoChartData.DefaultFormat, - roles: { Width: true }, - isMeasure: true, - type: ValueType.fromDescriptor({ numeric: true }) - }, - values: this.specificValuesWidth - }], columnNames).build(); - } + values: this.specificValuesWidth + }], columnNames).build(); } -} +} \ No newline at end of file diff --git a/test/visualTest.ts b/test/visualTest.ts index 1672ee3..ab80da4 100644 --- a/test/visualTest.ts +++ b/test/visualTest.ts @@ -1,136 +1,157 @@ /* - * Power BI Visualizations - * - * Copyright (c) Microsoft Corporation - * All rights reserved. - * MIT License - * - * 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. - */ - -/// - -module powerbi.extensibility.visual.test { - // powerbi.extensibility.utils.type - import toString = powerbi.extensibility.utils.type.PixelConverter.toString; - import fromPointToPixel = powerbi.extensibility.utils.type.PixelConverter.fromPointToPixel; - - // powerbi.extensibility.utils.test - import clickElement = powerbi.extensibility.utils.test.helpers.clickElement; - import createVisualHost = powerbi.extensibility.utils.test.mocks.createVisualHost; - import MockISelectionId = powerbi.extensibility.utils.test.mocks.MockISelectionId; - import assertColorsMatch = powerbi.extensibility.utils.test.helpers.color.assertColorsMatch; - - // powerbi.extensibility.visual.test - import MekkoChartData = powerbi.extensibility.visual.test.MekkoChartData; - import MekkoChartBuilder = powerbi.extensibility.visual.test.MekkoChartBuilder; - import isTextElementInOrOutElement = powerbi.extensibility.visual.test.helpers.isTextElementInOrOutElement; - import getSolidColorStructuralObject = powerbi.extensibility.visual.test.helpers.getSolidColorStructuralObject; - - // MekkoChart1449744733038 - import MekkoChartSeries = powerbi.extensibility.visual.MekkoChart1449744733038.MekkoChartSeries; - import MekkoVisualChartType = powerbi.extensibility.visual.MekkoChart1449744733038.MekkoVisualChartType; - import MekkoColumnChartData = powerbi.extensibility.visual.MekkoChart1449744733038.MekkoColumnChartData; - import BaseColumnChart = powerbi.extensibility.visual.MekkoChart1449744733038.columnChart.BaseColumnChart; - - describe("MekkoChart", () => { - let visualBuilder: MekkoChartBuilder, - defaultDataViewBuilder: MekkoChartData, - dataView: DataView; - - beforeEach(() => { - let selectionIndex: number = 0; - - visualBuilder = new MekkoChartBuilder(1000, 500); - defaultDataViewBuilder = new MekkoChartData(); +* Power BI Visualizations +* +* Copyright (c) Microsoft Corporation +* All rights reserved. +* MIT License +* +* 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. +*/ +import powerbi from "powerbi-visuals-api"; +import DataView = powerbi.DataView; +import DataViewValueColumnGroup = powerbi.DataViewValueColumnGroup; +import IVisualHost = powerbi.extensibility.visual.IVisualHost; + +// powerbi.extensibility.utils.type +import { pixelConverter } from "powerbi-visuals-utils-typeutils"; +import toString = pixelConverter.toString; +import fromPointToPixel = pixelConverter.fromPointToPixel; +import { d3Click } from "powerbi-visuals-utils-testutils"; + +// powerbi.extensibility.utils.test +import { + createVisualHost, + assertColorsMatch, +} from "powerbi-visuals-utils-testutils"; + +import { + MekkoChartSeries, + MekkoColumnChartData +} from "./../src/dataInterfaces"; + +import { + MekkoChartData +} from "./visualData"; + +import { + MekkoVisualChartType +} from "./../src/visualChartType"; + +import { + BaseColumnChart +} from "./../src/columnChart/baseColumnChart"; + +import { MekkoChartBuilder } from "./visualBuilder"; + +import { + getSolidColorStructuralObject, + isTextElementInOrOutElement +} from "./helpers/helpers"; + +import * as _ from "lodash"; +import { select } from "d3-selection"; +import { ClickEventType } from "powerbi-visuals-utils-testutils"; +import { MekkoChart } from "../src/visual"; + +describe("MekkoChart", () => { + let visualBuilder: MekkoChartBuilder; + let defaultDataViewBuilder: MekkoChartData; + let dataView: DataView; + + beforeEach(() => { + let selectionIndex: number = 0; + + visualBuilder = new MekkoChartBuilder(1000, 500); + defaultDataViewBuilder = new MekkoChartData(); + + dataView = defaultDataViewBuilder.getDataView(); + + // powerbi.extensibility.utils.test.mocks.createSelectionId = () => { + // return new MockISelectionId(`${++selectionIndex}`); + // }; + }); - dataView = defaultDataViewBuilder.getDataView(); + describe("DOM tests", () => { - powerbi.extensibility.utils.test.mocks.createSelectionId = () => { - return new MockISelectionId(`${++selectionIndex}`); - }; + it("main element created", () => { + visualBuilder.updateRenderTimeout(dataView, () => { + expect(visualBuilder.mainElement[0]).toBeInDOM(); + }); }); - describe("DOM tests", () => { - it("main element created", () => { - visualBuilder.updateRenderTimeout(dataView, () => { - expect(visualBuilder.mainElement[0]).toBeInDOM(); - }); - }); + it("update", (done) => { + visualBuilder.updateRenderTimeout(dataView, () => { + expect(visualBuilder.categoriesAxis).toBeInDOM(); + expect(visualBuilder.categoriesAxis.children("g.tick").length) + .toBe(dataView.categorical.categories[0].values.length); - it("update", (done) => { - visualBuilder.updateRenderTimeout(dataView, () => { - expect(visualBuilder.categoriesAxis).toBeInDOM(); - expect(visualBuilder.categoriesAxis.children("g.tick").length) - .toBe(dataView.categorical.categories[0].values.length); + expect(visualBuilder.columnElement).toBeInDOM(); - expect(visualBuilder.columnElement).toBeInDOM(); + let series: JQuery = visualBuilder.columnElement.children("g.series"), + grouped: DataViewValueColumnGroup[] = dataView.categorical.values.grouped(); - let series: JQuery = visualBuilder.columnElement.children("g.series"), - grouped: DataViewValueColumnGroup[] = dataView.categorical.values.grouped(); + expect(series.length).toBe(grouped.length); - expect(series.length).toBe(grouped.length); - - for (let i: number = 0, length = series.length; i < length; i++) { - expect($(series[i]).children("rect.column").length) - .toBe((i === 0 - ? grouped[i].values[0].values - : grouped[i].values[0].values.filter(_.isNumber)).length); - } + for (let i: number = 0, length = series.length; i < length; i++) { + expect($(series[i]).children("rect.column").length) + .toBe((i === 0 + ? grouped[i].values[0].values + : grouped[i].values[0].values.filter(_.isNumber)).length); + } - done(); - }); + done(); }); + }); - it("validate that labels are not cut off", (done) => { - const fontSize: number = 40; + it("validate that labels are not cut off", (done) => { + const fontSize: number = 40; - dataView.metadata.objects = { - categoryAxis: { fontSize }, - valueAxis: { fontSize } - }; + dataView.metadata.objects = { + categoryAxis: { fontSize }, + valueAxis: { fontSize } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - const xTicksElements: HTMLElement[] = visualBuilder.categoriesAxisTicks - .children("text") - .toArray(); + visualBuilder.updateRenderTimeout(dataView, () => { + const xTicksElements: HTMLElement[] = visualBuilder.categoriesAxisTicks + .children("text") + .toArray(); - const columnsBottomPosition: number = visualBuilder.columnElement[0] - .getBoundingClientRect() - .bottom; + const columnsBottomPosition: number = visualBuilder.columnElement[0] + .getBoundingClientRect() + .bottom; - const xTicksElementsTopPosition: number[] = xTicksElements.map((element: HTMLElement) => { - return element.getBoundingClientRect().bottom - - parseFloat(window.getComputedStyle(element).fontSize); - }); + const xTicksElementsTopPosition: number[] = xTicksElements.map((element: HTMLElement) => { + return element.getBoundingClientRect().bottom + - parseFloat(window.getComputedStyle(element).fontSize); + }); - expect(xTicksElementsTopPosition.every((position: number) => { - return position > columnsBottomPosition; - })).toBeTruthy(); + expect(xTicksElementsTopPosition.every((position: number) => { + return position > columnsBottomPosition; + })).toBeTruthy(); - done(); - }); + done(); }); + }); - it("visual is hidden when chart height is less than minimum height", (done) => { - visualBuilder.viewport = { - height: 79, + it("visual is hidden when chart height is less than minimum height", (done) => { + visualBuilder.viewport = { + height: 49, width: 350 }; @@ -159,8 +180,8 @@ module powerbi.extensibility.visual.test { it("visual is hidden when chart height greater than minimum height because of rotation", (done) => { visualBuilder.viewport = { height: 90, - width: 350 - }; + width: 350 + }; dataView.metadata.objects = { xAxisLabels: { @@ -168,656 +189,657 @@ module powerbi.extensibility.visual.test { } }; - visualBuilder.updateRenderTimeout(dataView, () => { - expect(visualBuilder.element.find(".legend")).toHaveCss({ display: "none" }); - expect(visualBuilder.mainElement[0]).toHaveCss({ display: "none" }); + visualBuilder.updateRenderTimeout(dataView, () => { + expect(visualBuilder.element.find(".legend")).toHaveCss({ display: "none" }); + expect(visualBuilder.mainElement[0]).toHaveCss({ display: "none" }); - done(); - }); + done(); }); + }); - it("visual is hidden when chart width is less than minimum width", (done) => { - visualBuilder.viewport = { - height: 350, - width: 49 - }; + it("visual is hidden when chart width is less than minimum width", (done) => { + visualBuilder.viewport = { + height: 350, + width: 49 + }; - visualBuilder.updateRenderTimeout(dataView, () => { - expect($(visualBuilder.mainElement[0])).toHaveCss({ display: "none" }); - expect(visualBuilder.element.find(".legend")).toHaveCss({ display: "none" }); + visualBuilder.updateRenderTimeout(dataView, () => { + expect($(visualBuilder.mainElement[0])).toHaveCss({ display: "none" }); + expect(visualBuilder.element.find(".legend")).toHaveCss({ display: "none" }); - done(); - }); + done(); }); + }); - it("X axis lable should not be visible if axis off", (done) => { - dataView.metadata.objects = { - categoryAxis: { - showAxisTitle: true, - show: false - }, - valueAxis: { - show: true, - showAxisTitle: true - } - }; + it("X axis lable should not be visible if axis off", (done) => { + dataView.metadata.objects = { + categoryAxis: { + showAxisTitle: true, + show: false + }, + valueAxis: { + show: true, + showAxisTitle: true + } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - expect(visualBuilder.xAxisLabel).not.toBeInDOM(); - done(); - }, 300); - }); + visualBuilder.updateRenderTimeout(dataView, () => { + expect(visualBuilder.xAxisLabel).not.toBeInDOM(); + done(); + }, 300); + }); - it("axes labels shouldn't be cut off", (done) => { - dataView.metadata.objects = { - categoryAxis: { - show: true, - showAxisTitle: true - }, - valueAxis: { - show: true, - showAxisTitle: true - } - }; + it("axes labels shouldn't be cut off", (done) => { + dataView.metadata.objects = { + categoryAxis: { + show: true, + showAxisTitle: true + }, + valueAxis: { + show: true, + showAxisTitle: true + } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - checkAxisLabels( - visualBuilder.mainElement[0], - visualBuilder.xAxisLabel[0]); + visualBuilder.updateRenderTimeout(dataView, () => { + checkAxisLabels( + visualBuilder.mainElement[0], + visualBuilder.xAxisLabel[0]); - checkAxisLabels( - visualBuilder.mainElement[0], - visualBuilder.yAxisLabel[0]); + checkAxisLabels( + visualBuilder.mainElement[0], + visualBuilder.yAxisLabel[0]); - done(); - }, 300); - }); + done(); + }, 300); + }); - function checkAxisLabels(mainElement: Element, textElement: Element): void { - expect(isTextElementInOrOutElement( - visualBuilder.mainElement[0], - visualBuilder.xAxisLabel[0], - (firstValue: number, secondValue: number) => firstValue >= secondValue)).toBeTruthy(); - } + function checkAxisLabels(mainElement: Element, textElement: Element): void { + expect(isTextElementInOrOutElement( + visualBuilder.mainElement[0], + visualBuilder.xAxisLabel[0], + (firstValue: number, secondValue: number) => firstValue >= secondValue)).toBeTruthy(); + } - it("multi-selection test", () => { - dataView = defaultDataViewBuilder.getDataView([ - MekkoChartData.ColumnCategory, - MekkoChartData.ColumnY - ]); + // test case requires new powerbi-visuals-utils-testutils with API 2.1.0 support + it("multi-selection test", () => { + dataView = defaultDataViewBuilder.getDataView([ + MekkoChartData.ColumnCategory, + MekkoChartData.ColumnY + ]); - visualBuilder.updateFlushAllD3Transitions(dataView); + visualBuilder.updateFlushAllD3Transitions(dataView); - const columns: JQuery = visualBuilder.columnsWithSize; + const columns: JQuery = visualBuilder.columnsWithSize; - const firstColumn: JQuery = columns.eq(0), - secondColumn: JQuery = columns.eq(1), - thirdColumn: JQuery = columns.eq(2); + const firstColumn: JQuery = columns.eq(0), + secondColumn: JQuery = columns.eq(1), + thirdColumn: JQuery = columns.eq(2); - clickElement(firstColumn); - clickElement(secondColumn, true); + d3Click(firstColumn, 1, 1, ClickEventType.Default, 0); + d3Click(secondColumn, 1, 1, ClickEventType.CtrlKey, 0); - expect(parseFloat(firstColumn.css("fill-opacity"))).toBe(1); - expect(parseFloat(secondColumn.css("fill-opacity"))).toBe(1); - expect(parseFloat(thirdColumn.css("fill-opacity"))).toBeLessThan(1); - }); + expect(parseFloat(firstColumn.css("fill-opacity"))).toBe(1); + expect(parseFloat(secondColumn.css("fill-opacity"))).toBe(1); + expect(parseFloat(thirdColumn.css("fill-opacity"))).toBeLessThan(1); }); + }); - describe("Format settings test", () => { - describe("Column border", () => { - beforeEach(() => { - dataView.metadata.objects = { - columnBorder: { - show: true - } - }; - }); + describe("Format settings test", () => { + describe("Column border", () => { + beforeEach(() => { + dataView.metadata.objects = { + columnBorder: { + show: true + } + }; + }); - it("show", () => { - visualBuilder.updateFlushAllD3Transitions(dataView); + it("show", () => { + visualBuilder.updateFlushAllD3Transitions(dataView); - visualBuilder.borders - .toArray() - .forEach((element: Element) => { - expect(parseFloat($(element).attr("width"))).toBeGreaterThan(0); - }); + visualBuilder.borders + .toArray() + .forEach((element: Element) => { + expect(parseFloat($(element).attr("width"))).toBeGreaterThan(0); + }); - (dataView.metadata.objects as any).columnBorder.show = false; + (dataView.metadata.objects as any).columnBorder.show = false; - visualBuilder.updateFlushAllD3Transitions(dataView); + visualBuilder.updateFlushAllD3Transitions(dataView); - visualBuilder.borders - .toArray() - .forEach((element: Element) => { - expect(parseFloat($(element).attr("width"))).toBe(0); - }); - }); + visualBuilder.borders + .toArray() + .forEach((element: Element) => { + expect(parseFloat($(element).attr("width"))).toBe(0); + }); }); + }); - describe("Data labels", () => { - beforeEach(() => { - dataView.metadata.objects = { - labels: { - show: true - } - }; - }); + describe("Data labels", () => { + beforeEach(() => { + dataView.metadata.objects = { + labels: { + show: true + } + }; + }); - it("show", () => { - visualBuilder.updateFlushAllD3Transitions(dataView); + it("show", () => { + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.dataLabels).toBeInDOM(); + expect(visualBuilder.dataLabels).toBeInDOM(); - (dataView.metadata.objects as any).labels.show = false; + (dataView.metadata.objects as any).labels.show = false; - visualBuilder.updateFlushAllD3Transitions(dataView); + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.dataLabels).not.toBeInDOM(); - }); + expect(visualBuilder.dataLabels).not.toBeInDOM(); + }); - it("color", () => { - const color: string = "#ABCDEF"; + it("color", () => { + const color: string = "#ABCDEF"; - (dataView.metadata.objects as any).labels.color = getSolidColorStructuralObject(color); - visualBuilder.updateFlushAllD3Transitions(dataView); + (dataView.metadata.objects as any).labels.color = getSolidColorStructuralObject(color); + visualBuilder.updateFlushAllD3Transitions(dataView); - visualBuilder.dataLabels - .toArray() - .forEach((element: Element) => { - assertColorsMatch($(element).css("fill"), color); - }); - }); + visualBuilder.dataLabels + .toArray() + .forEach((element: Element) => { + assertColorsMatch($(element).css("fill"), color); + }); }); + }); - describe("Legend", () => { - beforeEach(() => { - dataView.metadata.objects = { - legend: { - show: true - } - }; - }); + describe("Legend", () => { + beforeEach(() => { + dataView.metadata.objects = { + legend: { + show: true + } + }; + }); - it("show", () => { - visualBuilder.updateFlushAllD3Transitions(dataView); + it("show", () => { + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.legendGroup.children()).toBeInDOM(); + expect(visualBuilder.legendGroup.children()).toBeInDOM(); - (dataView.metadata.objects as any).legend.show = false; - visualBuilder.updateFlushAllD3Transitions(dataView); + (dataView.metadata.objects as any).legend.show = false; + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.legendGroup.children()).not.toBeInDOM(); - }); + expect(visualBuilder.legendGroup.children()).not.toBeInDOM(); }); + }); - describe("X-axis", () => { - beforeEach(() => { - dataView.metadata.objects = { - categoryAxis: { - show: true - } - }; - }); + describe("X-axis", () => { + beforeEach(() => { + dataView.metadata.objects = { + categoryAxis: { + show: true + } + }; + }); - it("show", () => { - visualBuilder.updateFlushAllD3Transitions(dataView); + it("show", () => { + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.xAxisTicks).toBeInDOM(); + expect(visualBuilder.xAxisTicks).toBeInDOM(); - (dataView.metadata.objects as any).categoryAxis.show = false; - visualBuilder.updateFlushAllD3Transitions(dataView); + (dataView.metadata.objects as any).categoryAxis.show = false; + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.xAxisTicks).not.toBeInDOM(); - }); + expect(visualBuilder.xAxisTicks).not.toBeInDOM(); + }); - it("show title", () => { - (dataView.metadata.objects as any).categoryAxis.showAxisTitle = true; - visualBuilder.updateFlushAllD3Transitions(dataView); + it("show title", () => { + (dataView.metadata.objects as any).categoryAxis.showAxisTitle = true; + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.xAxisLabel).toBeInDOM(); + expect(visualBuilder.xAxisLabel).toBeInDOM(); - (dataView.metadata.objects as any).categoryAxis.showAxisTitle = false; - visualBuilder.updateFlushAllD3Transitions(dataView); + (dataView.metadata.objects as any).categoryAxis.showAxisTitle = false; + visualBuilder.updateFlushAllD3Transitions(dataView); - expect(visualBuilder.xAxisLabel).not.toBeInDOM(); - }); + expect(visualBuilder.xAxisLabel).not.toBeInDOM(); + }); - it("color", () => { - const color: string = "#ABCDEF"; + it("color", () => { + const color: string = "#ABCDEF"; - (dataView.metadata.objects as any).categoryAxis.labelColor = getSolidColorStructuralObject(color); - visualBuilder.updateFlushAllD3Transitions(dataView); + (dataView.metadata.objects as any).categoryAxis.labelColor = getSolidColorStructuralObject(color); + visualBuilder.updateFlushAllD3Transitions(dataView); - visualBuilder.xAxisTicks - .children("text") - .toArray() - .forEach((element: Element) => { - assertColorsMatch($(element).css("fill"), color); - }); - }); + visualBuilder.xAxisTicks + .children("text") + .toArray() + .forEach((element: Element) => { + assertColorsMatch($(element).css("fill"), color); + }); + }); + }); + + describe("Y-axis", () => { + beforeEach(() => { + dataView.metadata.objects = { + valueAxis: { + show: true + } + }; }); - describe("Y-axis", () => { - beforeEach(() => { - dataView.metadata.objects = { - valueAxis: { - show: true - } - }; - }); + it("show", () => { + visualBuilder.updateFlushAllD3Transitions(dataView); - it("show", () => { - visualBuilder.updateFlushAllD3Transitions(dataView); + expect(visualBuilder.yAxisTicks).toBeInDOM(); - expect(visualBuilder.yAxisTicks).toBeInDOM(); + (dataView.metadata.objects as any).valueAxis.show = false; + visualBuilder.updateFlushAllD3Transitions(dataView); - (dataView.metadata.objects as any).valueAxis.show = false; - visualBuilder.updateFlushAllD3Transitions(dataView); + expect(visualBuilder.yAxisTicks).not.toBeInDOM(); + }); - expect(visualBuilder.yAxisTicks).not.toBeInDOM(); + it("show title", () => { + (dataView.metadata.objects as any).valueAxis.showAxisTitle = true; + visualBuilder.updateFlushAllD3Transitions(dataView); + + expect(visualBuilder.yAxisLabel).toBeInDOM(); + + (dataView.metadata.objects as any).valueAxis.showAxisTitle = false; + visualBuilder.updateRenderTimeout(dataView, () => { + expect(visualBuilder.yAxisLabel).not.toBeInDOM(); }); + }); - it("show title", () => { - (dataView.metadata.objects as any).valueAxis.showAxisTitle = true; - visualBuilder.updateFlushAllD3Transitions(dataView); + it("color", () => { + const color: string = "#ABCDEF"; - expect(visualBuilder.yAxisLabel).toBeInDOM(); + (dataView.metadata.objects as any).valueAxis.labelColor = getSolidColorStructuralObject(color); + visualBuilder.updateFlushAllD3Transitions(dataView); - (dataView.metadata.objects as any).valueAxis.showAxisTitle = false; - visualBuilder.updateRenderTimeout(dataView, () => { - expect(visualBuilder.yAxisLabel).not.toBeInDOM(); + visualBuilder.yAxisTicks + .children("text") + .toArray() + .forEach((element: Element) => { + assertColorsMatch($(element).css("fill"), color); }); - }); + }); + }); + }); - it("color", () => { - const color: string = "#ABCDEF"; + describe("MekkoColumnChartData", () => { + describe("converter", () => { + let mekkoColumnChartData: MekkoColumnChartData; - (dataView.metadata.objects as any).valueAxis.labelColor = getSolidColorStructuralObject(color); - visualBuilder.updateFlushAllD3Transitions(dataView); + beforeEach(() => { + const visualHost: IVisualHost = createVisualHost(); + + mekkoColumnChartData = BaseColumnChart.converter( + visualHost, + dataView.categorical, + visualHost.colorPalette, + true, + false, + false, + dataView.metadata, + null, + MekkoVisualChartType.hundredPercentStackedBar); + }); - visualBuilder.yAxisTicks - .children("text") - .toArray() - .forEach((element: Element) => { - assertColorsMatch($(element).css("fill"), color); - }); - }); + it("mekkoColumnChartData is defined", () => { + expect(mekkoColumnChartData).toBeDefined(); + expect(mekkoColumnChartData).not.toBeNull(); }); - }); - describe("MekkoColumnChartData", () => { - describe("converter", () => { - let mekkoColumnChartData: MekkoColumnChartData; + describe("series", () => { + let series: MekkoChartSeries[]; beforeEach(() => { - const visualHost: IVisualHost = createVisualHost(); - - mekkoColumnChartData = BaseColumnChart.converter( - visualHost, - dataView.categorical, - visualHost.colorPalette, - true, - false, - false, - dataView.metadata, - MekkoVisualChartType.hundredPercentStackedBar); + series = mekkoColumnChartData.series; }); - it("mekkoColumnChartData is defined", () => { - expect(mekkoColumnChartData).toBeDefined(); - expect(mekkoColumnChartData).not.toBeNull(); + it("series are defined", () => { + expect(series).toBeDefined(); + expect(series).not.toBeNull(); }); - describe("series", () => { - let series: MekkoChartSeries[]; - - beforeEach(() => { - series = mekkoColumnChartData.series; - }); - - it("series are defined", () => { - expect(series).toBeDefined(); - expect(series).not.toBeNull(); + it("each element of series is defined", () => { + series.map((columnChartSeries: MekkoChartSeries) => { + expect(columnChartSeries).toBeDefined(); + expect(columnChartSeries).not.toBeNull(); }); + }); - it("each element of series is defined", () => { + describe("identity", () => { + it("identity is defined", () => { series.map((columnChartSeries: MekkoChartSeries) => { - expect(columnChartSeries).toBeDefined(); - expect(columnChartSeries).not.toBeNull(); + expect(columnChartSeries.identity).toBeDefined(); + expect(columnChartSeries.identity).not.toBeNull(); }); }); - describe("identity", () => { - it("identity is defined", () => { - series.map((columnChartSeries: MekkoChartSeries) => { - expect(columnChartSeries.identity).toBeDefined(); - expect(columnChartSeries.identity).not.toBeNull(); - }); - }); - - it("identity has key", () => { - series.map((columnChartSeries: MekkoChartSeries) => { - expect(columnChartSeries.identity.getKey()).toBeDefined(); - }); + it("identity has key", () => { + series.map((columnChartSeries: MekkoChartSeries) => { + expect(columnChartSeries.identity.getKey()).toBeDefined(); }); }); }); + }); - describe("MekkoColumnChartData", () => { - describe("converter", () => { - it("nodes border change color", done => { - let color: string = "#123123"; - - dataView.metadata.objects = { - columnBorder: { - color: getSolidColorStructuralObject(color) - } - }; + describe("MekkoColumnChartData", () => { + describe("converter", () => { + it("nodes border change color", done => { + let color: string = "#123123"; - visualBuilder.updateRenderTimeout(dataView, () => { - const fillColor: string = visualBuilder.mainElement - .find("rect.mekkoborder") - .first() - .css("fill"); + dataView.metadata.objects = { + columnBorder: { + color: getSolidColorStructuralObject(color) + } + }; - assertColorsMatch(fillColor, color); + visualBuilder.updateRenderTimeout(dataView, () => { + const fillColor: string = visualBuilder.mainElement + .find("rect.mekkoborder") + .first() + .css("fill"); - done(); - }); + assertColorsMatch(fillColor, color); + done(); }); - it("category axes label font-size", done => { - const categoryAxisFontSize: number = 17, - valueAxisFontSize: number = 15; - - dataView.metadata.objects = { - categoryAxis: { - fontSize: categoryAxisFontSize - }, - valueAxis: { - fontSize: valueAxisFontSize - } - }; + }); - visualBuilder.updateRenderTimeout(dataView, () => { - const xAxisFontSize: string = visualBuilder.mainElement - .find(".x.axis g.tick text") - .first() - .attr("font-size"); + it("category axes label font-size", done => { + const categoryAxisFontSize: number = 17, + valueAxisFontSize: number = 15; + + dataView.metadata.objects = { + categoryAxis: { + fontSize: categoryAxisFontSize + }, + valueAxis: { + fontSize: valueAxisFontSize + } + }; - expect(xAxisFontSize).toBe(toString(fromPointToPixel(categoryAxisFontSize))); + visualBuilder.updateRenderTimeout(dataView, () => { + const xAxisFontSize: string = visualBuilder.mainElement + .find(".x.axis g.tick text") + .first() + .attr("font-size"); - const yAxisFontSize: string = visualBuilder.mainElement - .find(".y.axis g.tick text") - .first() - .attr("font-size"); + expect(xAxisFontSize).toBe(toString(fromPointToPixel(categoryAxisFontSize))); - expect(yAxisFontSize).toBe(toString(fromPointToPixel(valueAxisFontSize))); + const yAxisFontSize: string = visualBuilder.mainElement + .find(".y.axis g.tick text") + .first() + .attr("font-size"); - done(); - }); + expect(yAxisFontSize).toBe(toString(fromPointToPixel(valueAxisFontSize))); + done(); }); - it("Display units - millions", done => { - dataView.metadata.objects = { - labels: { - show: true, - labelDisplayUnits: 1000000 - } - }; + }); + + it("Display units - millions", done => { + dataView.metadata.objects = { + labels: { + show: true, + labelDisplayUnits: 1000000 + } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - const firstLabelText: string = visualBuilder.dataLabels - .first() - .text(); + visualBuilder.updateRenderTimeout(dataView, () => { + const firstLabelText: string = visualBuilder.dataLabels + .first() + .text(); - expect(firstLabelText).toMatch(/[0-9.]*M/); + expect(firstLabelText).toMatch(/[0-9.]*M/); - done(); - }); + done(); }); + }); - it("Display units - thousands", done => { - dataView.metadata.objects = { - labels: { - show: true, - labelDisplayUnits: 1000 - } - }; - - visualBuilder.updateRenderTimeout(dataView, () => { - const firstLabelText: string = visualBuilder.dataLabels - .first() - .text(); + it("Display units - thousands", done => { + dataView.metadata.objects = { + labels: { + show: true, + labelDisplayUnits: 1000 + } + }; - expect(firstLabelText).toMatch(/[0-9.]*K/); + visualBuilder.updateRenderTimeout(dataView, () => { + const firstLabelText: string = visualBuilder.dataLabels + .first() + .text(); - done(); - }); + expect(firstLabelText).toMatch(/[0-9.]*K/); + done(); }); - it("Limit Decimal Places value", done => { - dataView.metadata.objects = { - labels: { - show: true, - labelDisplayUnits: 0, - labelPrecision: 99 - } - }; + }); + + it("Limit Decimal Places value", done => { + dataView.metadata.objects = { + labels: { + show: true, + labelDisplayUnits: 0, + labelPrecision: 99 + } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - const firstLabelText: string = visualBuilder.dataLabels - .first() - .text(); + visualBuilder.updateRenderTimeout(dataView, () => { + const firstLabelText: string = visualBuilder.dataLabels + .first() + .text(); - expect(firstLabelText).toMatch(/\d*[.]\d{4}%/); + expect(firstLabelText).toMatch(/\d*[.]\d{4}%/); - done(); - }); + done(); }); }); }); }); }); + }); - describe("Mekko chart legend features:", () => { - beforeEach(() => { - dataView = defaultDataViewBuilder.getSpecificDataView(); - }); - - it("sort legend by value", (done) => { - dataView.metadata.objects = { - sortLegend: { - enabled: true, - direction: "asc", - groupByCategory: false, - groupByCategoryDirection: "asc" - } - }; - - let data = dataView.categorical.values.grouped().map(v => { return { key: v.name, data: _.sum(v.values[0].values) }; }); - - let reduced = {}; - data.forEach(d => { - reduced[d.key.toString()] = reduced[d.key.toString()] || { data: 0 }; - reduced[d.key.toString()].data += d.data; - }); + describe("Mekko chart legend features:", () => { + beforeEach(() => { + dataView = defaultDataViewBuilder.getSpecificDataView(); + }); - let index = 0; - let array = []; - for (let key in reduced) { - array[index++] = { - key: key, - data: reduced[key].data - }; + it("sort legend by value", (done) => { + dataView.metadata.objects = { + sortLegend: { + enabled: true, + direction: "asc", + groupByCategory: false, + groupByCategoryDirection: "asc" } + }; - array = _.sortBy(array, "data"); - visualBuilder.updateRenderTimeout(dataView, () => { - expect(visualBuilder.legendGroup).toBeInDOM(); - array.forEach((element, index) => { - let textElements = visualBuilder.legendGroup.children("g").children("text"); - expect(element.key).toEqual(textElements[index].textContent); - }); - done(); - }, 300); + let data = dataView.categorical.values.grouped().map(v => { return { key: v.name, data: _.sum(v.values[0].values) }; }); + + let reduced = {}; + data.forEach(d => { + reduced[d.key.toString()] = reduced[d.key.toString()] || { data: 0 }; + reduced[d.key.toString()].data += d.data; }); - it("group legend by category", (done) => { - dataView.metadata.objects = { - sortLegend: { - enabled: true, - direction: "asc", - groupByCategory: true, - groupByCategoryDirection: "asc" - } + let index = 0; + let array = []; + for (let key in reduced) { + array[index++] = { + key: key, + data: reduced[key].data }; + } - let data = dataView.categorical.values.grouped(); - let categorized = data.map(d => { return { name: d.name, values: d.values[0].values, category: _.findIndex(d.values[0].values, i => i !== null) }; }); - categorized = _.sortBy(categorized, "values"); + array = _.sortBy(array, "data"); + visualBuilder.updateRenderTimeout(dataView, () => { + expect(visualBuilder.legendGroup).toBeInDOM(); + array.forEach((element, index) => { + let textElements = visualBuilder.legendGroup.children("g").children("text"); + expect(element.key).toEqual(textElements[index].textContent); + }); + done(); + }, 300); + }); - interface CategoryLegendDom { - position: string; - dom: Element; + it("group legend by category", (done) => { + dataView.metadata.objects = { + sortLegend: { + enabled: true, + direction: "asc", + groupByCategory: true, + groupByCategoryDirection: "asc" } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - expect(visualBuilder.categoryLegendGroup).toBeInDOM(); - expect(visualBuilder.categoryLegendGroup.length).toEqual(dataView.categorical.categories[0].values.length); + let data = dataView.categorical.values.grouped(); + let catigoried = data.map(d => { return { name: d.name, values: d.values[0].values, category: _.findIndex(d.values[0].values, i => i !== null) }; }); + catigoried = _.sortBy(catigoried, "values"); - let mappedCategoryLegendGroup: JQuery = visualBuilder.categoryLegendGroup.map((index, clg) => { - return { - position: clg.parentElement.parentElement.style.top.replace("px", ""), - dom: clg - }; - }); + interface CategoryLegendDom { + position: string; + dom: Element; + } - dataView.categorical.categories[0].values.forEach((category, index) => { - let filteredByCategory = categorized.filter(cat => cat.category === index); - filteredByCategory = _.sortBy(filteredByCategory, "values"); - let categoryDOM: any = mappedCategoryLegendGroup.filter((val: any) => { return $((mappedCategoryLegendGroup[val]).dom).children("text.legendTitle").children("title").text() === category; }); - let legentItem = $((categoryDOM[0].dom)).children("g").children("text"); - expect(filteredByCategory.length).toEqual(legentItem.length); - filteredByCategory.forEach((categoryItem, index) => { - expect(legentItem[index].textContent).toEqual(categoryItem.name); - }); + visualBuilder.updateRenderTimeout(dataView, () => { + expect(visualBuilder.categoryLegendGroup).toBeInDOM(); + expect(visualBuilder.categoryLegendGroup.length).toEqual(dataView.categorical.categories[0].values.length); + + let mappedCategoryLegendGroup: JQuery = visualBuilder.categoryLegendGroup.map((index, clg) => { + return { + position: clg.parentElement.parentElement.style.top.replace("px", ""), + dom: clg + }; + }); + + dataView.categorical.categories[0].values.forEach((category, index) => { + let filteredByCategory = catigoried.filter(cat => cat.category === index); + filteredByCategory = _.sortBy(filteredByCategory, "values"); + let categoryDOM: any = mappedCategoryLegendGroup.filter((val: any) => { return $((mappedCategoryLegendGroup[val]).dom).children("text.legendTitle").children("title").text() === category; }); + let legentItem = $((categoryDOM[0].dom)).children("g").children("text"); + expect(filteredByCategory.length).toEqual(legentItem.length); + filteredByCategory.forEach((categoryItem, index) => { + expect(legentItem[index].textContent).toEqual(categoryItem.name); }); - done(); - }, 300); - }); + }); + done(); + }, 300); }); + }); - describe("Mekko chart label features:", () => { - beforeEach(() => { - dataView = defaultDataViewBuilder.getSpecificDataView(); - }); + describe("Mekko chart label features:", () => { + beforeEach(() => { + dataView = defaultDataViewBuilder.getSpecificDataView(); + }); - it("force display", (done) => { - dataView.metadata.objects = { - labels: { - show: true, - forceDisplay: true - } - }; + it("force display", (done) => { + dataView.metadata.objects = { + labels: { + show: true, + forceDisplay: true + } + }; - let countBefore: number = 0; - visualBuilder.updateRenderTimeout(dataView, () => { - countBefore = visualBuilder.dataLabels.length; - }); + let countBefore: number = 0; + visualBuilder.updateRenderTimeout(dataView, () => { + countBefore = visualBuilder.dataLabels.length; + }); - dataView.metadata.objects = { - labels: { - show: true, - forceDisplay: false - } - }; + dataView.metadata.objects = { + labels: { + show: true, + forceDisplay: false + } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - expect(countBefore).toBeGreaterThanOrEqual(visualBuilder.dataLabels.length); - done(); - }); + visualBuilder.updateRenderTimeout(dataView, () => { + expect(countBefore).toBeGreaterThanOrEqual(visualBuilder.dataLabels.length); + done(); }); + }); - it("rotate category label to 45 degrees", (done) => { - dataView.metadata.objects = { - xAxisLabels: { - enableRotataion: true - }, - categoryAxis: { - showAxisTitle: true, - show: true - }, - valueAxis: { - show: true, - showAxisTitle: true - } - }; + it("rotate category label to 45 degrees", (done) => { + dataView.metadata.objects = { + xAxisLabels: { + enableRotataion: true + }, + categoryAxis: { + showAxisTitle: true, + show: true + }, + valueAxis: { + show: true, + showAxisTitle: true + } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - let expectedDegree: number = -45; - visualBuilder.xAxisTicks.children("text").each((index, element) => { - expect(d3.transform(d3.select(element).attr("transform")).rotate).toBe(expectedDegree); - }); - done(); - }, 300); - }); + visualBuilder.updateRenderTimeout(dataView, () => { + let expectedDegree: number = -45; + visualBuilder.xAxisTicks.children("text").each((index, element) => { + expect(MekkoChart.getTranslation(select(element).attr("transform"))[2]).toBeCloseTo(expectedDegree); + }); + done(); + }, 300); }); + }); - describe("Mekko chart series features:", () => { - beforeEach(() => { - dataView = defaultDataViewBuilder.getSpecificDataView(); - }); + describe("Mekko chart series features:", () => { + beforeEach(() => { + dataView = defaultDataViewBuilder.getSpecificDataView(); + }); - it("sort series by value", (done) => { - dataView.metadata.objects = { - labels: { - show: true, - forceDisplay: true - }, - sortSeries: { - enabled: true, - direction: "asc", - displayPercents: "category" - } - }; + it("sort series by value", (done) => { + dataView.metadata.objects = { + labels: { + show: true, + forceDisplay: true + }, + sortSeries: { + enabled: true, + direction: "asc", + displayPercents: "category" + } + }; - visualBuilder.updateRenderTimeout(dataView, () => { - let seriesElements = visualBuilder.mainElement.find(".columnChartMainGraphicsContext")[0].children; - let mappedSeries = []; - const firstCtegory: number = 0; - const secondCtegory: number = 1; - const thirdCtegory: number = 2; - const seriesMainRectanglePositionIndex: number = 0; - // first category elements - mappedSeries[firstCtegory] = []; - mappedSeries[firstCtegory].push(seriesElements[0].children[seriesMainRectanglePositionIndex]); - mappedSeries[firstCtegory].push(seriesElements[1].children[seriesMainRectanglePositionIndex]); - mappedSeries[firstCtegory].push(seriesElements[2].children[seriesMainRectanglePositionIndex]); - - // second category elements - mappedSeries[secondCtegory] = []; - mappedSeries[secondCtegory].push(seriesElements[3].children[seriesMainRectanglePositionIndex]); - mappedSeries[secondCtegory].push(seriesElements[4].children[seriesMainRectanglePositionIndex]); - mappedSeries[secondCtegory].push(seriesElements[5].children[seriesMainRectanglePositionIndex]); - - // third category elements - mappedSeries[thirdCtegory] = []; - mappedSeries[thirdCtegory].push(seriesElements[6].children[seriesMainRectanglePositionIndex]); - mappedSeries[thirdCtegory].push(seriesElements[7].children[seriesMainRectanglePositionIndex]); - mappedSeries[thirdCtegory].push(seriesElements[8].children[seriesMainRectanglePositionIndex]); - - mappedSeries.forEach((element: any[]) => { - let sortedByHeight = _.sortBy(element, "height"); - let sortedByPosition = _.sortBy(element, "y"); - sortedByHeight.forEach((el, index) => expect(sortedByHeight[index] === sortedByPosition[index]).toBeTruthy()); - }); - done(); - }, 300); - }); + visualBuilder.updateRenderTimeout(dataView, () => { + let seriesElements = visualBuilder.mainElement.find(".columnChartMainGraphicsContext")[0].children; + let mappedSeries = []; + const firstCtegory: number = 0; + const secondCtegory: number = 1; + const thirdCtegory: number = 2; + const seriesMainRectanglePositionIndex: number = 0; + // first category elements + mappedSeries[firstCtegory] = []; + mappedSeries[firstCtegory].push(seriesElements[0].children[seriesMainRectanglePositionIndex]); + mappedSeries[firstCtegory].push(seriesElements[1].children[seriesMainRectanglePositionIndex]); + mappedSeries[firstCtegory].push(seriesElements[2].children[seriesMainRectanglePositionIndex]); + + // second category elements + mappedSeries[secondCtegory] = []; + mappedSeries[secondCtegory].push(seriesElements[3].children[seriesMainRectanglePositionIndex]); + mappedSeries[secondCtegory].push(seriesElements[4].children[seriesMainRectanglePositionIndex]); + mappedSeries[secondCtegory].push(seriesElements[5].children[seriesMainRectanglePositionIndex]); + + // third category elements + mappedSeries[thirdCtegory] = []; + mappedSeries[thirdCtegory].push(seriesElements[6].children[seriesMainRectanglePositionIndex]); + mappedSeries[thirdCtegory].push(seriesElements[7].children[seriesMainRectanglePositionIndex]); + mappedSeries[thirdCtegory].push(seriesElements[8].children[seriesMainRectanglePositionIndex]); + + mappedSeries.forEach((element: any[]) => { + let sortedByHeight = _.sortBy(element, "height"); + let sortedByPosition = _.sortBy(element, "y"); + sortedByHeight.forEach((el, index) => expect(sortedByHeight[index] === sortedByPosition[index]).toBeTruthy()); + }); + done(); + }, 300); }); }); -} +}); diff --git a/tsconfig.json b/tsconfig.json index ccbfbaf..3b46be3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,48 +3,14 @@ "allowJs": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "target": "ES5", + "module": "es6", + "target": "ES6", "sourceMap": true, - "out": "./.tmp/build/visual.js", - "sourceRoot": "../../src/", + "outDir": "./.tmp/build/", + "moduleResolution": "node", "declaration": true }, "files": [ - "node_modules/@types/d3/index.d.ts", - "node_modules/@types/jquery/index.d.ts", - "node_modules/@types/lodash/index.d.ts", - ".api/v1.11.0/PowerBI-visuals.d.ts", - "node_modules/powerbi-models/dist/models-noexports.d.ts", - "node_modules/powerbi-visuals-utils-dataviewutils/lib/index.d.ts", - "node_modules/powerbi-visuals-utils-formattingutils/lib/index.d.ts", - "node_modules/powerbi-visuals-utils-interactivityutils/lib/index.d.ts", - "node_modules/powerbi-visuals-utils-svgutils/lib/index.d.ts", - "node_modules/powerbi-visuals-utils-typeutils/lib/index.d.ts", - "node_modules/powerbi-visuals-utils-chartutils/lib/index.d.ts", - "node_modules/powerbi-visuals-utils-tooltiputils/lib/index.d.ts", - "node_modules/powerbi-visuals-utils-colorutils/lib/index.d.ts", - "src/dataIntrefaces.ts", - "src/roleNames.ts", - "src/visualChartType.ts", - "src/formattingUtils.ts", - "src/behavior/customVisualBehaviorOptions.ts", - "src/behavior/customVisualBehavior.ts", - "src/behavior/visualBehaviorOptions.ts", - "src/behavior/visualBehavior.ts", - "src/dataWrapper.ts", - "src/utils.ts", - "src/axis/utils.ts", - "src/axis/type.ts", - "src/axis/position.ts", - "src/labelUtils.ts", - "src/dataViewUtils.ts", - "src/visualStrategy/visualStrategy.ts", - "src/visualStrategy/baseVisualStrategy.ts", - "src/converterStrategy/converterStrategy.ts", - "src/converterStrategy/baseConverterStrategy.ts", - "src/tooltip.ts", - "src/columnChart/columnChartVisual.ts", - "src/columnChart/baseColumnChart.ts", - "src/visual.ts" + "./src/visual.ts" ] -} +} \ No newline at end of file diff --git a/typings.json b/typings.json deleted file mode 100644 index df115f0..0000000 --- a/typings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "globalDependencies": { - "d3": "registry:dt/d3#0.0.0+20160907005744", - "jquery": "registry:dt/jquery#1.10.0+20160929162922", - "lodash": "registry:dt/lodash#4.14.0+20161110215204" - } -}